Skip to content
Draft
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
24 changes: 16 additions & 8 deletions src/crud-operations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,19 +38,23 @@ export interface CrudOperationsOpts<ID extends IdType = number, ROW extends RowT
}

export interface SelectOperations<ID extends IdType, ROW extends RowType> {
select(filter?: CrudFilter<ID, ROW>, sorts?: Array<Sort>, relations?: Array<Relation>): Promise<Array<ROW>>;
select(filter?: CrudFilter<ID, ROW>, sorts?: Array<Sort>, relations?: Array<Relation>): Promise<Array<Required<ROW>>>;
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

현재로썬 filter.projection을 사용해서 특정 컬럼들만 select하게되면 Required가 성립하지 않습니다.


count(filter?: CrudFilter<ID, ROW>): Promise<number>;

selectFirst(filter?: CrudFilter<ID, ROW>, sorts?: Array<Sort>, relations?: Array<Relation>): Promise<ROW | undefined>;
selectFirst(
filter?: CrudFilter<ID, ROW>,
sorts?: Array<Sort>,
relations?: Array<Relation>
): Promise<Required<ROW> | undefined>;

exist(filter?: CrudFilter<ID, ROW>): Promise<boolean>;

selectById(id: ID, relations?: Array<Relation>): Promise<ROW | undefined>;
selectById(id: ID, relations?: Array<Relation>): Promise<Required<ROW> | undefined>;
}

export interface InsertOperations<ROW extends RowType> {
insert(data: ROW | Array<ROW>): Promise<ROW>;
insert(data: ROW | Array<ROW>): Promise<Required<ROW>>;
}

export interface UpdateOperations<ID extends IdType, ROW extends RowType> {
Expand Down Expand Up @@ -107,7 +111,11 @@ export class CrudOperations<ID extends IdType = number, ROW extends RowType = Ro
//---------------------------------------------------------
// SelectOperation

async select(filter?: CrudFilter<ID, ROW>, sorts?: Array<Sort>, relations?: Array<Relation>): Promise<Array<ROW>> {
async select(
filter?: CrudFilter<ID, ROW>,
sorts?: Array<Sort>,
relations?: Array<Relation>
): Promise<Array<Required<ROW>>> {
const query = this.knexReplica(this.table).modify((queryBuilder) => {
this.applyFilter(queryBuilder, filter);
this.applySort(queryBuilder, sorts);
Expand Down Expand Up @@ -139,7 +147,7 @@ export class CrudOperations<ID extends IdType = number, ROW extends RowType = Ro
filter?: CrudFilter<ID, ROW>,
sorts?: Array<Sort>,
relations?: Array<Relation>
): Promise<ROW | undefined> {
): Promise<Required<ROW> | undefined> {
const rows = await this.select({ ...filter, limit: 1 }, sorts, relations);
return rows[0];
}
Expand All @@ -149,15 +157,15 @@ export class CrudOperations<ID extends IdType = number, ROW extends RowType = Ro
return row !== undefined;
}

async selectById(id: ID, relations?: Array<Relation>): Promise<ROW | undefined> {
async selectById(id: ID, relations?: Array<Relation>): Promise<Required<ROW> | undefined> {
const include = { [this.idColumn]: id } as CrudFilterColumns<ROW>;
return this.selectFirst({ include }, undefined, relations);
}

//---------------------------------------------------------
// InsertOperation

async insert(data: ROW | Array<ROW>): Promise<ROW> {
async insert(data: ROW | Array<ROW>): Promise<Required<ROW>> {
// result is varying on dialect
// mysql: the first one, sqlite3: the last one, ...
// see http://knexjs.org/#Builder-insert
Expand Down
6 changes: 3 additions & 3 deletions src/weaver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ export class Weaver<ID extends IdType = number, ROW extends RowType = RowType> {
this.logger = LoggerFactory.getLogger('fastdao:weaver');
}

async weave(rows?: Array<ROW>, relations?: Array<Relation>): Promise<Array<ROW>> {
async weave(rows?: Array<Required<ROW>>, relations?: Array<Relation>): Promise<Array<Required<ROW>>> {
if (!rows || rows.length === 0 || !relations || relations.length === 0) {
// nothing to weave
return [];
Expand Down Expand Up @@ -64,9 +64,9 @@ export class Weaver<ID extends IdType = number, ROW extends RowType = RowType> {
return rows;
}

async selectRelationByIds(relation: Relation, ids: Array<ID>): Promise<Array<ROW>> {
async selectRelationByIds(relation: Relation, ids: Array<ID>): Promise<Array<Required<ROW>>> {
const missedIds: Array<ID> = [];
const hitRows: Array<ROW> = [];
const hitRows: Array<Required<ROW>> = [];
if (this.cache) {
const cached: Array<string | null> =
ids && ids.length ? await this.cache.getAll(ids.map((id) => relation.table + ':' + id)) : [];
Expand Down