feat: prisma typed select (#347)
* feat: wip prisma gql select * feat: stronger api using decorator * feat: add PrismaSelect everywhere * fix: remove unused * fix: remove seed debug
This commit is contained in:
56
server/src/utils/prisma-select/index.ts
Normal file
56
server/src/utils/prisma-select/index.ts
Normal file
@ -0,0 +1,56 @@
|
||||
import { PrismaSelect as PalJSPrismaSelect } from '@paljs/plugins';
|
||||
import { DMMF } from '@prisma/client/runtime';
|
||||
import { GraphQLResolveInfo } from 'graphql';
|
||||
import { ModelSelectMap } from './model-select-map';
|
||||
|
||||
export type DefaultFieldsMap = {
|
||||
readonly [K in keyof ModelSelectMap]?:
|
||||
| ModelSelectMap[K]
|
||||
| ((select: any) => ModelSelectMap[K]);
|
||||
};
|
||||
|
||||
export { ModelSelectMap };
|
||||
|
||||
export class PrismaSelect<
|
||||
K extends keyof ModelSelectMap,
|
||||
> extends PalJSPrismaSelect {
|
||||
private modelName: K;
|
||||
|
||||
constructor(
|
||||
modelName: K,
|
||||
info: GraphQLResolveInfo,
|
||||
options?: {
|
||||
readonly defaultFields?: DefaultFieldsMap;
|
||||
readonly dmmf?: readonly Pick<DMMF.Document, 'datamodel'>[];
|
||||
},
|
||||
) {
|
||||
super(info, options as any);
|
||||
this.modelName = modelName;
|
||||
}
|
||||
|
||||
get value(): ModelSelectMap[K] {
|
||||
return super.value;
|
||||
}
|
||||
|
||||
valueOf(field: string, mergeObject?: any): ModelSelectMap[K];
|
||||
valueOf<SubKey extends keyof ModelSelectMap>(
|
||||
field: string,
|
||||
filterBy: SubKey,
|
||||
mergeObject?: any,
|
||||
): ModelSelectMap[SubKey];
|
||||
valueOf(
|
||||
field: string,
|
||||
filterByOrMergeObject?: keyof ModelSelectMap | any,
|
||||
mergeObject?: any,
|
||||
) {
|
||||
if (typeof filterByOrMergeObject === 'string') {
|
||||
return super.valueOf(field, filterByOrMergeObject, mergeObject);
|
||||
} else {
|
||||
return super.valueOf(field, this.modelName, filterByOrMergeObject);
|
||||
}
|
||||
}
|
||||
|
||||
valueWithFilter(modelName: K): ModelSelectMap[K] {
|
||||
return super.valueWithFilter(modelName).select;
|
||||
}
|
||||
}
|
||||
17
server/src/utils/prisma-select/model-select-map.ts
Normal file
17
server/src/utils/prisma-select/model-select-map.ts
Normal file
@ -0,0 +1,17 @@
|
||||
// THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
||||
import { Prisma } from '@prisma/client';
|
||||
|
||||
export type ModelSelectMap = {
|
||||
User: Prisma.UserSelect;
|
||||
Workspace: Prisma.WorkspaceSelect;
|
||||
WorkspaceMember: Prisma.WorkspaceMemberSelect;
|
||||
Company: Prisma.CompanySelect;
|
||||
Person: Prisma.PersonSelect;
|
||||
RefreshToken: Prisma.RefreshTokenSelect;
|
||||
CommentThread: Prisma.CommentThreadSelect;
|
||||
Comment: Prisma.CommentSelect;
|
||||
CommentThreadTarget: Prisma.CommentThreadTargetSelect;
|
||||
Pipeline: Prisma.PipelineSelect;
|
||||
PipelineStage: Prisma.PipelineStageSelect;
|
||||
PipelineProgress: Prisma.PipelineProgressSelect;
|
||||
};
|
||||
Reference in New Issue
Block a user