Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/examples/pg/02/data-access-layer/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export * as RepositoryManager from "./repository-manager.js";
export * as Repository from "./repository/index.js";
10 changes: 10 additions & 0 deletions src/examples/pg/02/data-access-layer/repository-manager.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { PG } from "../../../../index.js";

import * as Repository from "./repository/index.js";

export const create = (creds: PG.ModelTypes.TDBCreds) => new PG.RepositoryManager(
{
invType: Repository.InvType.domain(creds),
},
{ config: creds, isLoggerEnabled: false, logger: console },
);
1 change: 1 addition & 0 deletions src/examples/pg/02/data-access-layer/repository/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * as InvType from "./inv-type/index.js";
24 changes: 24 additions & 0 deletions src/examples/pg/02/data-access-layer/repository/inv-type/domain.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import { PG } from "../../../../../../index.js";

import * as Types from "./types.js";

export const domain = (dbCreds: PG.ModelTypes.TDBCreds) => {
return new PG.Repository.Table<{ CoreFields: Types.TableFields; }>({
dbCreds,
schema: {
tableName: "invTypes",

primaryKey: "\"typeID\"",

tableFields: [
"\"typeID\"",
"\"groupID\"",
"\"typeName\"",
"published",
],

createField: null,
updateField: null,
},
});
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export * from "./domain.js";
export * as Types from "./types.js";
23 changes: 23 additions & 0 deletions src/examples/pg/02/data-access-layer/repository/inv-type/types.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import type { PickRowFields } from "../../../../../../shared-types/index.js";

/** Fields allowed in SELECT via `selected`. Keys are SQL identifiers. */
export type EntityListed = Pick<TableFields,
| "\"typeID\""
| "\"typeName\""
>;

/** Row shape returned by node-pg for `EntityListed`. Keys are JS property names. */
export type RowEntityListed = PickRowFields<TableFields, keyof EntityListed>;

export type SearchFields = Partial<TableFields>;

/**
* SQL column identifiers as TypeScript keys.
* Use these keys in params, selected, orderBy and tableFields.
*/
export type TableFields = {
"\"typeID\"": number;
"\"groupID\"": number;
"\"typeName\"": string;
published: boolean | null;
};
46 changes: 46 additions & 0 deletions src/examples/pg/02/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
/* eslint-disable no-console */

import { RepositoryManager } from "./data-access-layer/index.js";

const creds = {
database: "eve",
host: "localhost",
password: "admin",
port: 5432,
user: "postgres",
};

const repositoryManager = RepositoryManager.create(creds);

await repositoryManager.init();

const invTypeRepository = repositoryManager.repository.invType;

// `selected` uses SQL keys from CoreFields (`"typeID"`), not JS keys (`typeID`).
const { one: invType } = await invTypeRepository.getOneByParams({
params: { "\"typeID\"": 34 },
selected: ["\"typeID\"", "\"typeName\""],
});

if (invType) {
// Row uses JS keys as returned by node-pg — no `as any`.
console.log({
name: invType.typeName,
typeId: invType.typeID,
});
} else {
console.log("invType not found");
}

const invTypes = await invTypeRepository.getArrByParams({
pagination: { limit: 10, offset: 0 },
params: { published: true },
selected: ["\"typeID\"", "\"typeName\""],
});

for (const row of invTypes) {
console.log({
name: row.typeName,
typeId: row.typeID,
});
}
14 changes: 7 additions & 7 deletions src/lib/mysql/domain/materialized-view.ts
Original file line number Diff line number Diff line change
Expand Up @@ -200,8 +200,8 @@ export class BaseMaterializedView<
orderBy: Extract<keyof BMVG["CoreFields"], string> | (BMVG["AdditionalSortingFields"] extends string ? BMVG["AdditionalSortingFields"] : never);
ordering: SharedTypes.TOrdering;
}[];
}): Promise<Array<Pick<BMVG["CoreFields"], T>>> {
return this.model.getArrByParams<Pick<BMVG["CoreFields"], T>>(
}): Promise<Array<SharedTypes.PickRowFields<BMVG["CoreFields"], T>>> {
return this.model.getArrByParams<SharedTypes.PickRowFields<BMVG["CoreFields"], T>>(
{ $and: options.params, $or: options.paramsOr },
options.selected as string[],
options.pagination,
Expand Down Expand Up @@ -239,8 +239,8 @@ export class BaseMaterializedView<
params: Types.TSearchParams<Types.TConditionalDomainFieldsType<BMVG["SearchFields"], BMVG["CoreFields"]>>;
paramsOr?: Types.TSearchParams<Types.TConditionalDomainFieldsType<BMVG["SearchFields"], BMVG["CoreFields"]>>[];
selected?: [T, ...T[]];
}): Promise<{ message?: string; one?: Pick<BMVG["CoreFields"], T>; }> {
const one = await this.model.getOneByParams<Pick<BMVG["CoreFields"], T>>(
}): Promise<{ message?: string; one?: SharedTypes.PickRowFields<BMVG["CoreFields"], T>; }> {
const one = await this.model.getOneByParams<SharedTypes.PickRowFields<BMVG["CoreFields"], T>>(
{ $and: options.params, $or: options.paramsOr },
options.selected as string[],
);
Expand Down Expand Up @@ -280,7 +280,7 @@ export class BaseMaterializedView<
* - `highWaterMark`: The max number of records buffered in the stream.
* - `objectMode`: If `true`, the stream operates in object mode (default for object streams).
*
* @returns A readable stream emitting records of type `Pick<VG["CoreFields"], T>` on the `"data"` event.
* @returns A readable stream emitting records of type `SharedTypes.PickRowFields<VG["CoreFields"], T>` on the `"data"` event.
*/
async streamArrByParams<T extends keyof BMVG["CoreFields"]>(
options: {
Expand All @@ -294,8 +294,8 @@ export class BaseMaterializedView<
}[];
},
streamOptions?: StreamOptions,
): Promise<SharedTypes.ITypedPgStream<Pick<BMVG["CoreFields"], T>>> {
return this.model.streamArrByParams<Pick<BMVG["CoreFields"], T>>(
): Promise<SharedTypes.ITypedPgStream<SharedTypes.PickRowFields<BMVG["CoreFields"], T>>> {
return this.model.streamArrByParams<SharedTypes.PickRowFields<BMVG["CoreFields"], T>>(
{ $and: options.params, $or: options.paramsOr },
options.selected as string[],
options.pagination,
Expand Down
18 changes: 9 additions & 9 deletions src/lib/mysql/domain/table.ts
Original file line number Diff line number Diff line change
Expand Up @@ -464,8 +464,8 @@ export class BaseTable<
orderBy: Extract<keyof BTG["CoreFields"], string> | (BTG["AdditionalSortingFields"] extends string ? BTG["AdditionalSortingFields"] : never);
ordering: SharedTypes.TOrdering;
}[];
}): Promise<Array<Pick<BTG["CoreFields"], T>>> {
return this.model.getArrByParams<Pick<BTG["CoreFields"], T>>(
}): Promise<Array<SharedTypes.PickRowFields<BTG["CoreFields"], T>>> {
return this.model.getArrByParams<SharedTypes.PickRowFields<BTG["CoreFields"], T>>(
{ $and: options.params, $or: options.paramsOr },
options.selected as string[],
options.pagination,
Expand Down Expand Up @@ -537,8 +537,8 @@ export class BaseTable<
params: Types.TSearchParams<Types.TConditionalDomainFieldsType<BTG["SearchFields"], BTG["CoreFields"]>>;
paramsOr?: Types.TSearchParams<Types.TConditionalDomainFieldsType<BTG["SearchFields"], BTG["CoreFields"]>>[];
selected?: [T, ...T[]];
}): Promise<{ message?: string; one?: Pick<BTG["CoreFields"], T>; }> {
const one = await this.model.getOneByParams<Pick<BTG["CoreFields"], T>>(
}): Promise<{ message?: string; one?: SharedTypes.PickRowFields<BTG["CoreFields"], T>; }> {
const one = await this.model.getOneByParams<SharedTypes.PickRowFields<BTG["CoreFields"], T>>(
{ $and: options.params, $or: options.paramsOr },
options.selected as string[],
);
Expand All @@ -558,8 +558,8 @@ export class BaseTable<
*
* @returns A promise that resolves to the retrieved record with the selected fields or a message if not found.
*/
async getOneByPk<T>(pk: T): Promise<{ message?: string; one?: BTG["CoreFields"]; }> {
const one = await this.model.getOneByPk<T, BTG["CoreFields"]>(pk);
async getOneByPk<T>(pk: T): Promise<{ message?: string; one?: SharedTypes.ResolveRowFields<BTG>; }> {
const one = await this.model.getOneByPk<T, SharedTypes.ResolveRowFields<BTG>>(pk);

if (!one) return { message: `Not found from ${this.model.tableName}` };

Expand All @@ -585,7 +585,7 @@ export class BaseTable<
* - `highWaterMark`: The max number of records buffered in the stream.
* - `objectMode`: If `true`, the stream operates in object mode (default for object streams).
*
* @returns A readable stream emitting records of type `Pick<VG["CoreFields"], T>` on the `"data"` event.
* @returns A readable stream emitting records of type `SharedTypes.PickRowFields<VG["CoreFields"], T>` on the `"data"` event.
*/
async streamArrByParams<T extends keyof BTG["CoreFields"]>(
options: {
Expand All @@ -599,8 +599,8 @@ export class BaseTable<
}[];
},
streamOptions?: StreamOptions,
): Promise<SharedTypes.ITypedPgStream<Pick<BTG["CoreFields"], T>>> {
return this.model.streamArrByParams<Pick<BTG["CoreFields"], T>>(
): Promise<SharedTypes.ITypedPgStream<SharedTypes.PickRowFields<BTG["CoreFields"], T>>> {
return this.model.streamArrByParams<SharedTypes.PickRowFields<BTG["CoreFields"], T>>(
{ $and: options.params, $or: options.paramsOr },
options.selected as string[],
options.pagination,
Expand Down
14 changes: 7 additions & 7 deletions src/lib/mysql/domain/view.ts
Original file line number Diff line number Diff line change
Expand Up @@ -175,8 +175,8 @@ export class BaseView<
orderBy: Extract<keyof BVG["CoreFields"], string> | (BVG["AdditionalSortingFields"] extends string ? BVG["AdditionalSortingFields"] : never);
ordering: SharedTypes.TOrdering;
}[];
}): Promise<Array<Pick<BVG["CoreFields"], T>>> {
return this.model.getArrByParams<Pick<BVG["CoreFields"], T>>(
}): Promise<Array<SharedTypes.PickRowFields<BVG["CoreFields"], T>>> {
return this.model.getArrByParams<SharedTypes.PickRowFields<BVG["CoreFields"], T>>(
{ $and: options.params, $or: options.paramsOr },
options.selected as string[],
options.pagination,
Expand Down Expand Up @@ -214,8 +214,8 @@ export class BaseView<
params: Types.TSearchParams<Types.TConditionalDomainFieldsType<BVG["SearchFields"], BVG["CoreFields"]>>;
paramsOr?: Types.TSearchParams<Types.TConditionalDomainFieldsType<BVG["SearchFields"], BVG["CoreFields"]>>[];
selected?: [T, ...T[]];
}): Promise<{ message?: string; one?: Pick<BVG["CoreFields"], T>; }> {
const one = await this.model.getOneByParams<Pick<BVG["CoreFields"], T>>(
}): Promise<{ message?: string; one?: SharedTypes.PickRowFields<BVG["CoreFields"], T>; }> {
const one = await this.model.getOneByParams<SharedTypes.PickRowFields<BVG["CoreFields"], T>>(
{ $and: options.params, $or: options.paramsOr },
options.selected as string[],
);
Expand Down Expand Up @@ -244,7 +244,7 @@ export class BaseView<
* - `highWaterMark`: The max number of records buffered in the stream.
* - `objectMode`: If `true`, the stream operates in object mode (default for object streams).
*
* @returns A readable stream emitting records of type `Pick<VG["CoreFields"], T>` on the `"data"` event.
* @returns A readable stream emitting records of type `SharedTypes.PickRowFields<VG["CoreFields"], T>` on the `"data"` event.
*/
async streamArrByParams<T extends keyof BVG["CoreFields"]>(
options: {
Expand All @@ -258,8 +258,8 @@ export class BaseView<
}[];
},
streamOptions?: StreamOptions,
): Promise<SharedTypes.ITypedPgStream<Pick<BVG["CoreFields"], T>>> {
return this.model.streamArrByParams<Pick<BVG["CoreFields"], T>>(
): Promise<SharedTypes.ITypedPgStream<SharedTypes.PickRowFields<BVG["CoreFields"], T>>> {
return this.model.streamArrByParams<SharedTypes.PickRowFields<BVG["CoreFields"], T>>(
{ $and: options.params, $or: options.paramsOr },
options.selected as string[],
options.pagination,
Expand Down
14 changes: 7 additions & 7 deletions src/lib/mysql/repository/materialized-view.ts
Original file line number Diff line number Diff line change
Expand Up @@ -218,8 +218,8 @@ export class MaterializedView<MVG extends MaterializedViewGeneric = Materialized
orderBy: Extract<keyof MVG["CoreFields"], string> | (MVG["AdditionalSortingFields"] extends string ? MVG["AdditionalSortingFields"] : never);
ordering: SharedTypes.TOrdering;
}[];
}): Promise<Array<Pick<MVG["CoreFields"], T>>> {
return this.model.getArrByParams<Pick<MVG["CoreFields"], T>>(
}): Promise<Array<SharedTypes.PickRowFields<MVG["CoreFields"], T>>> {
return this.model.getArrByParams<SharedTypes.PickRowFields<MVG["CoreFields"], T>>(
{ $and: options.params, $or: options.paramsOr },
options.selected as string[],
options.pagination,
Expand Down Expand Up @@ -257,8 +257,8 @@ export class MaterializedView<MVG extends MaterializedViewGeneric = Materialized
params: Types.TSearchParams<Types.TConditionalDomainFieldsType<MVG["SearchFields"], MVG["CoreFields"]>>;
paramsOr?: Types.TSearchParams<Types.TConditionalDomainFieldsType<MVG["SearchFields"], MVG["CoreFields"]>>[];
selected?: [T, ...T[]];
}): Promise<{ message?: string; one?: Pick<MVG["CoreFields"], T>; }> {
const one = await this.model.getOneByParams<Pick<MVG["CoreFields"], T>>(
}): Promise<{ message?: string; one?: SharedTypes.PickRowFields<MVG["CoreFields"], T>; }> {
const one = await this.model.getOneByParams<SharedTypes.PickRowFields<MVG["CoreFields"], T>>(
{ $and: options.params, $or: options.paramsOr },
options.selected as string[],
);
Expand Down Expand Up @@ -298,7 +298,7 @@ export class MaterializedView<MVG extends MaterializedViewGeneric = Materialized
* - `highWaterMark`: The max number of records buffered in the stream.
* - `objectMode`: If `true`, the stream operates in object mode (default for object streams).
*
* @returns A readable stream emitting records of type `Pick<VG["CoreFields"], T>` on the `"data"` event.
* @returns A readable stream emitting records of type `SharedTypes.PickRowFields<VG["CoreFields"], T>` on the `"data"` event.
*/
async streamArrByParams<T extends keyof MVG["CoreFields"]>(
options: {
Expand All @@ -312,8 +312,8 @@ export class MaterializedView<MVG extends MaterializedViewGeneric = Materialized
}[];
},
streamOptions?: StreamOptions,
): Promise<SharedTypes.ITypedPgStream<Pick<MVG["CoreFields"], T>>> {
return this.model.streamArrByParams<Pick<MVG["CoreFields"], T>>(
): Promise<SharedTypes.ITypedPgStream<SharedTypes.PickRowFields<MVG["CoreFields"], T>>> {
return this.model.streamArrByParams<SharedTypes.PickRowFields<MVG["CoreFields"], T>>(
{ $and: options.params, $or: options.paramsOr },
options.selected as string[],
options.pagination,
Expand Down
18 changes: 9 additions & 9 deletions src/lib/mysql/repository/table.ts
Original file line number Diff line number Diff line change
Expand Up @@ -486,8 +486,8 @@ export class Table<TG extends TableGeneric = TableGeneric> {
orderBy: Extract<keyof TG["CoreFields"], string> | (TG["AdditionalSortingFields"] extends string ? TG["AdditionalSortingFields"] : never);
ordering: SharedTypes.TOrdering;
}[];
}): Promise<Array<Pick<TG["CoreFields"], T>>> {
return this.model.getArrByParams<Pick<TG["CoreFields"], T>>(
}): Promise<Array<SharedTypes.PickRowFields<TG["CoreFields"], T>>> {
return this.model.getArrByParams<SharedTypes.PickRowFields<TG["CoreFields"], T>>(
{ $and: options.params, $or: options.paramsOr },
options.selected as string[],
options.pagination,
Expand Down Expand Up @@ -559,8 +559,8 @@ export class Table<TG extends TableGeneric = TableGeneric> {
params: Types.TSearchParams<Types.TConditionalDomainFieldsType<TG["SearchFields"], TG["CoreFields"]>>;
paramsOr?: Types.TSearchParams<Types.TConditionalDomainFieldsType<TG["SearchFields"], TG["CoreFields"]>>[];
selected?: [T, ...T[]];
}): Promise<{ message?: string; one?: Pick<TG["CoreFields"], T>; }> {
const one = await this.model.getOneByParams<Pick<TG["CoreFields"], T>>(
}): Promise<{ message?: string; one?: SharedTypes.PickRowFields<TG["CoreFields"], T>; }> {
const one = await this.model.getOneByParams<SharedTypes.PickRowFields<TG["CoreFields"], T>>(
{ $and: options.params, $or: options.paramsOr },
options.selected as string[],
);
Expand All @@ -580,8 +580,8 @@ export class Table<TG extends TableGeneric = TableGeneric> {
*
* @returns A promise that resolves to the retrieved record with the selected fields or a message if not found.
*/
async getOneByPk<T>(pk: T): Promise<{ message?: string; one?: TG["CoreFields"]; }> {
const one = await this.model.getOneByPk<T, TG["CoreFields"]>(pk);
async getOneByPk<T>(pk: T): Promise<{ message?: string; one?: SharedTypes.ResolveRowFields<TG>; }> {
const one = await this.model.getOneByPk<T, SharedTypes.ResolveRowFields<TG>>(pk);

if (!one) return { message: `Not found from ${this.model.tableName}` };

Expand All @@ -607,7 +607,7 @@ export class Table<TG extends TableGeneric = TableGeneric> {
* - `highWaterMark`: The max number of records buffered in the stream.
* - `objectMode`: If `true`, the stream operates in object mode (default for object streams).
*
* @returns A readable stream emitting records of type `Pick<VG["CoreFields"], T>` on the `"data"` event.
* @returns A readable stream emitting records of type `SharedTypes.PickRowFields<VG["CoreFields"], T>` on the `"data"` event.
*/
async streamArrByParams<T extends keyof TG["CoreFields"]>(
options: {
Expand All @@ -621,8 +621,8 @@ export class Table<TG extends TableGeneric = TableGeneric> {
}[];
},
streamOptions?: StreamOptions,
): Promise<SharedTypes.ITypedPgStream<Pick<TG["CoreFields"], T>>> {
return this.model.streamArrByParams<Pick<TG["CoreFields"], T>>(
): Promise<SharedTypes.ITypedPgStream<SharedTypes.PickRowFields<TG["CoreFields"], T>>> {
return this.model.streamArrByParams<SharedTypes.PickRowFields<TG["CoreFields"], T>>(
{ $and: options.params, $or: options.paramsOr },
options.selected as string[],
options.pagination,
Expand Down
14 changes: 7 additions & 7 deletions src/lib/mysql/repository/view.ts
Original file line number Diff line number Diff line change
Expand Up @@ -216,8 +216,8 @@ export class View<VG extends ViewGeneric = ViewGeneric> {
orderBy: Extract<keyof VG["CoreFields"], string> | (VG["AdditionalSortingFields"] extends string ? VG["AdditionalSortingFields"] : never);
ordering: SharedTypes.TOrdering;
}[];
}): Promise<Array<Pick<VG["CoreFields"], T>>> {
return this.#model.getArrByParams<Pick<VG["CoreFields"], T>>(
}): Promise<Array<SharedTypes.PickRowFields<VG["CoreFields"], T>>> {
return this.#model.getArrByParams<SharedTypes.PickRowFields<VG["CoreFields"], T>>(
{ $and: options.params, $or: options.paramsOr },
options.selected as string[],
options.pagination,
Expand Down Expand Up @@ -255,8 +255,8 @@ export class View<VG extends ViewGeneric = ViewGeneric> {
params: Types.TSearchParams<Types.TConditionalDomainFieldsType<VG["SearchFields"], VG["CoreFields"]>>;
paramsOr?: Types.TSearchParams<Types.TConditionalDomainFieldsType<VG["SearchFields"], VG["CoreFields"]>>[];
selected?: [T, ...T[]];
}): Promise<{ message?: string; one?: Pick<VG["CoreFields"], T>; }> {
const one = await this.#model.getOneByParams<Pick<VG["CoreFields"], T>>(
}): Promise<{ message?: string; one?: SharedTypes.PickRowFields<VG["CoreFields"], T>; }> {
const one = await this.#model.getOneByParams<SharedTypes.PickRowFields<VG["CoreFields"], T>>(
{ $and: options.params, $or: options.paramsOr },
options.selected as string[],
);
Expand Down Expand Up @@ -285,7 +285,7 @@ export class View<VG extends ViewGeneric = ViewGeneric> {
* - `highWaterMark`: The max number of records buffered in the stream.
* - `objectMode`: If `true`, the stream operates in object mode (default for object streams).
*
* @returns A readable stream emitting records of type `Pick<VG["CoreFields"], T>` on the `"data"` event.
* @returns A readable stream emitting records of type `SharedTypes.PickRowFields<VG["CoreFields"], T>` on the `"data"` event.
*/
async streamArrByParams<T extends keyof VG["CoreFields"]>(
options: {
Expand All @@ -299,8 +299,8 @@ export class View<VG extends ViewGeneric = ViewGeneric> {
}[];
},
streamOptions?: StreamOptions,
): Promise<SharedTypes.ITypedPgStream<Pick<VG["CoreFields"], T>>> {
return this.#model.streamArrByParams<Pick<VG["CoreFields"], T>>(
): Promise<SharedTypes.ITypedPgStream<SharedTypes.PickRowFields<VG["CoreFields"], T>>> {
return this.#model.streamArrByParams<SharedTypes.PickRowFields<VG["CoreFields"], T>>(
{ $and: options.params, $or: options.paramsOr },
options.selected as string[],
options.pagination,
Expand Down
Loading
Loading