Skip to content

Commit 65979a0

Browse files
committed
feat(code-gen): add support for transformContext with custom readable types in CRUD
- Fixes checks around custom readable types in `T.crud()` - Add `xxxTransformContext` as a hook. The returned `transformContext` is then passed to `xxxTransform`. This can be used to pass ctx based data to the transform function (like the base url). - Fixes using the custom readable type in the create route
1 parent 4ecd95d commit 65979a0

File tree

7 files changed

+75
-27
lines changed

7 files changed

+75
-27
lines changed

packages/code-gen/src/builders/CrudType.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ export class CrudType extends TypeBuilder {
130130
const { readable, writable } = fieldOptions;
131131

132132
if (readable instanceof TypeBuilder) {
133-
if (!readable.data.name) {
133+
if (!readable.data.name && !readable.data.reference?.name) {
134134
throw AppError.serverError({
135135
message:
136136
"A custom readable type should have a name, e.g 'T.object('item').keys(...)'.",

packages/code-gen/src/crud/events.js

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ import {
2323
crudPartialEventTransformer,
2424
crudPartialEventUpdate,
2525
} from "./partials/events.js";
26-
import { crudQueryBuilderGet } from "./query-builder.js";
2726

2827
/**
2928
* Generate events that are necessary for CRUD. This currently only works with js and Koa.
@@ -189,11 +188,6 @@ function crudEventsCreate(generateContext, file, crud) {
189188
writableType: crudInformationGetWritableType(crud),
190189

191190
inlineRelations: crudEventsGetInlineRelations(crud),
192-
builder: crudQueryBuilderGet(crud, {
193-
includeOwnParam: false,
194-
includeJoins: true,
195-
traverseParents: false,
196-
}),
197191
};
198192

199193
// @ts-expect-error

packages/code-gen/src/crud/handlers.js

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -123,14 +123,19 @@ function crudHandlersGetModifiers(crud) {
123123

124124
if (crudInformationGetHasCustomReadableType(crud)) {
125125
modifierDocs.push(
126-
`${crudName}Transform: (entity: QueryResult${modelUniqueName}) => ${upperCaseFirst(
126+
`${crudName}TransformContext?: (ctx: Context) => (any|Promise<any>),`,
127+
);
128+
modifierDocs.push(
129+
`${crudName}Transform: (entity: QueryResult${modelUniqueName}, transformContext?: any) => ${upperCaseFirst(
127130
// @ts-expect-error
128131
crud.fieldOptions.readableType.reference.group,
129132
)}${upperCaseFirst(
130133
// @ts-expect-error
131134
crud.fieldOptions.readableType.reference.name,
132135
)},`,
133136
);
137+
138+
modifierDestructure.push(`${crudName}TransformContext,`);
134139
modifierDestructure.push(`${crudName}Transform,`);
135140
}
136141

@@ -150,8 +155,8 @@ function crudHandlersGetModifiers(crud) {
150155

151156
if (crud.routeOptions.createRoute) {
152157
modifierDocs.push(
153-
`${crudName}CreatePreModifier?: (event: InsightEvent, ctx: ${upperCrudName}CreateCtx ${
154-
relation?.subType === "oneToMany"
158+
`${crudName}CreatePreModifier?: (event: InsightEvent, ctx: ${upperCrudName}CreateCtx, builder: ${modelUniqueName}QueryBuilder${
159+
relation?.subType !== "oneToOneReverse"
155160
? ""
156161
: `, singleBuilder: ${modelUniqueName}QueryBuilder`
157162
}) => void|Promise<void>,`,
@@ -238,6 +243,7 @@ function crudHandlersList(generateContext, file, crud) {
238243
crud,
239244
"list",
240245
)}`,
246+
hasTransformContext: crudInformationGetHasCustomReadableType(crud),
241247
crudName: crud.group + upperCaseFirst(crudInformationGetName(crud, "")),
242248
countBuilder: crudQueryBuilderGet(crud, {
243249
includeOwnParam: false,
@@ -290,6 +296,7 @@ function crudHandlersSingle(generateContext, file, crud) {
290296
"single",
291297
)}`,
292298
crudName: crud.group + upperCaseFirst(crudInformationGetName(crud, "")),
299+
hasTransformContext: crudInformationGetHasCustomReadableType(crud),
293300
builder: crudQueryBuilderGet(crud, {
294301
includeOwnParam: true,
295302
includeJoins: true,
@@ -326,12 +333,18 @@ function crudHandlersCreate(generateContext, file, crud) {
326333
"create",
327334
)}`,
328335
crudName: crud.group + upperCaseFirst(crudInformationGetName(crud, "")),
336+
hasTransformContext: crudInformationGetHasCustomReadableType(crud),
329337
applyParams: crud.fromParent
330338
? {
331339
bodyKey: relation.referencedKey,
332340
paramsKey: crudInformationGetParamName(parent),
333341
}
334342
: undefined,
343+
builder: crudQueryBuilderGet(crud, {
344+
includeOwnParam: false,
345+
includeJoins: true,
346+
traverseParents: false,
347+
}),
335348
oneToOneChecks:
336349
relation?.subType === "oneToOneReverse"
337350
? {

packages/code-gen/src/crud/partials/events.d.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ export function crudPartialEventCreate(data: {
1919
crudName: string;
2020
entityUniqueName: string;
2121
entityName: string;
22-
builder: string;
2322
primaryKey: string;
2423
writableType: {
2524
group: string;

packages/code-gen/src/crud/partials/events.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,6 @@ export async function ${data.crudName}Single(event, sql, builder) {
112112
* crudName: string,
113113
* entityUniqueName: string,
114114
* entityName: string,
115-
* builder: string,
116115
* primaryKey: string,
117116
* writableType: { group: string, name: string },
118117
* inlineRelations: {
@@ -137,9 +136,10 @@ export const crudPartialEventCreate = (data) => `
137136
* @param {${upperCaseFirst(data.writableType.group)}${upperCaseFirst(
138137
data.writableType.name,
139138
)}} body
139+
* @param {${data.entityUniqueName}QueryBuilder} builder
140140
* @returns {Promise<QueryResult${data.entityUniqueName}>}
141141
*/
142-
export async function ${data.crudName}Create(event, sql, body) {
142+
export async function ${data.crudName}Create(event, sql, body, builder) {
143143
eventStart(event, "${data.crudName}.create");
144144
145145
${partialAsString(
@@ -156,7 +156,6 @@ export async function ${data.crudName}Create(event, sql, body) {
156156
157157
${crudPartialInlineRelationInserts(data.inlineRelations, "result")}
158158
159-
const builder = ${data.builder};
160159
builder.where.${data.primaryKey} = result[0].${data.primaryKey};
161160
const _item = await ${
162161
data.crudName

packages/code-gen/src/crud/partials/routes.d.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,22 @@
11
export function crudPartialRouteList(data: {
22
handlerName: string;
33
crudName: string;
4+
hasTransformContext: boolean;
45
countBuilder: string;
56
listBuilder: string;
67
primaryKey: string;
78
}): string;
89
export function crudPartialRouteSingle(data: {
910
handlerName: string;
11+
hasTransformContext: boolean;
1012
crudName: string;
1113
builder: string;
1214
}): string;
1315
export function crudPartialRouteCreate(data: {
1416
handlerName: string;
1517
crudName: string;
18+
hasTransformContext: boolean;
19+
builder: string;
1620
applyParams?: {
1721
bodyKey: string;
1822
paramsKey: string;

packages/code-gen/src/crud/partials/routes.js

Lines changed: 52 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
* @param {{
33
* handlerName: string,
44
* crudName: string,
5+
* hasTransformContext: boolean,
56
* countBuilder: string,
67
* listBuilder: string,
78
* primaryKey: string,
@@ -19,24 +20,39 @@ ${data.handlerName} = async (ctx) => {
1920
2021
const listBuilder = ${data.listBuilder};
2122
22-
${data.crudName}ListPreModifier && await ${data.crudName}ListPreModifier(newEventFromEvent(ctx.event), ctx, countBuilder, listBuilder);
23+
${data.crudName}ListPreModifier && await ${
24+
data.crudName
25+
}ListPreModifier(newEventFromEvent(ctx.event), ctx, countBuilder, listBuilder);
2326
24-
const { total, ${data.primaryKey}In } = await ${data.crudName}Count(newEventFromEvent(ctx.event), sql, countBuilder, ctx.validatedQuery);
27+
const { total, ${data.primaryKey}In } = await ${
28+
data.crudName
29+
}Count(newEventFromEvent(ctx.event), sql, countBuilder, ctx.validatedQuery);
2530
2631
listBuilder.where.${data.primaryKey}In = ${data.primaryKey}In;
2732
28-
const result = await ${data.crudName}List(newEventFromEvent(ctx.event), sql, listBuilder);
33+
const result = await ${
34+
data.crudName
35+
}List(newEventFromEvent(ctx.event), sql, listBuilder);
36+
37+
${
38+
data.hasTransformContext
39+
? `const transformContext = ${data.crudName}TransformContext ? await ${data.crudName}TransformContext(ctx) : undefined;`
40+
: ""
41+
}
2942
3043
ctx.body = {
3144
total,
32-
list: result.map(it => ${data.crudName}Transform(it)),
45+
list: result.map(it => ${data.crudName}Transform(it${
46+
data.hasTransformContext ? ", transformContext" : ""
47+
})),
3348
};
3449
};
3550
`;
3651

3752
/**
3853
* @param {{
3954
* handlerName: string,
55+
* hasTransformContext: boolean,
4056
* crudName: string,
4157
* builder: string,
4258
* }} data
@@ -46,13 +62,25 @@ export const crudPartialRouteSingle = (data) => `
4662
${data.handlerName} = async (ctx) => {
4763
const builder = ${data.builder};
4864
49-
${data.crudName}SinglePreModifier && await ${data.crudName}SinglePreModifier(newEventFromEvent(ctx.event), ctx, builder);
65+
${data.crudName}SinglePreModifier && await ${
66+
data.crudName
67+
}SinglePreModifier(newEventFromEvent(ctx.event), ctx, builder);
5068
5169
52-
const item = await ${data.crudName}Single(newEventFromEvent(ctx.event), sql, builder);
70+
const item = await ${
71+
data.crudName
72+
}Single(newEventFromEvent(ctx.event), sql, builder);
73+
74+
${
75+
data.hasTransformContext
76+
? `const transformContext = ${data.crudName}TransformContext ? await ${data.crudName}TransformContext(ctx) : undefined;`
77+
: ""
78+
}
5379
5480
ctx.body = {
55-
item: ${data.crudName}Transform(item),
81+
item: ${data.crudName}Transform(item${
82+
data.hasTransformContext ? ", transformContext" : ""
83+
}),
5684
};
5785
};
5886
`;
@@ -61,6 +89,8 @@ ${data.handlerName} = async (ctx) => {
6189
* @param {{
6290
* handlerName: string,
6391
* crudName: string,
92+
* hasTransformContext: boolean,
93+
* builder: string,
6494
* applyParams?: {
6595
* bodyKey: string,
6696
* paramsKey: string,
@@ -73,15 +103,16 @@ ${data.handlerName} = async (ctx) => {
73103
*/
74104
export const crudPartialRouteCreate = (data) => `
75105
${data.handlerName} = async (ctx) => {
106+
const builder = ${data.builder};
76107
${
77108
data.oneToOneChecks
78-
? `const builder = ${data.oneToOneChecks.builder};`
109+
? `const oneToOneBuilder = ${data.oneToOneChecks.builder};`
79110
: ``
80111
}
81112
${data.crudName}CreatePreModifier && await ${
82113
data.crudName
83-
}CreatePreModifier(newEventFromEvent(ctx.event), ctx ${
84-
data.oneToOneChecks ? `, builder` : ""
114+
}CreatePreModifier(newEventFromEvent(ctx.event), ctx, builder${
115+
data.oneToOneChecks ? `, oneToOneBuilder` : ""
85116
});
86117
87118
${
@@ -93,7 +124,7 @@ ${data.handlerName} = async (ctx) => {
93124
data.oneToOneChecks
94125
? `
95126
try {
96-
const exists = await ${data.crudName}Single(newEventFromEvent(ctx.event), sql, builder);
127+
const exists = await ${data.crudName}Single(newEventFromEvent(ctx.event), sql, oneToOneBuilder);
97128
if (exists) {
98129
throw AppError.validationError("${data.crudName}.create.alreadyExists");
99130
}
@@ -108,10 +139,18 @@ ${data.handlerName} = async (ctx) => {
108139
109140
const item = await sql.begin(sql => ${
110141
data.crudName
111-
}Create(newEventFromEvent(ctx.event), sql, ctx.validatedBody));
142+
}Create(newEventFromEvent(ctx.event), sql, ctx.validatedBody, builder));
112143
144+
${
145+
data.hasTransformContext
146+
? `const transformContext = ${data.crudName}TransformContext ? await ${data.crudName}TransformContext(ctx) : undefined;`
147+
: ""
148+
}
149+
113150
ctx.body = {
114-
item: ${data.crudName}Transform(item),
151+
item: ${data.crudName}Transform(item${
152+
data.hasTransformContext ? ", transformContext" : ""
153+
}),
115154
};
116155
};
117156
`;

0 commit comments

Comments
 (0)