@gadmin2n/prisma-nest-generator 0.0.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +177 -0
- package/README.md +2 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +4 -0
- package/dist/generator/annotations.d.ts +14 -0
- package/dist/generator/annotations.js +28 -0
- package/dist/generator/compute-model-params/compute-connect-dto-params.d.ts +7 -0
- package/dist/generator/compute-model-params/compute-connect-dto-params.js +14 -0
- package/dist/generator/compute-model-params/compute-create-dto-params.d.ts +9 -0
- package/dist/generator/compute-model-params/compute-create-dto-params.js +80 -0
- package/dist/generator/compute-model-params/compute-entity-params.d.ts +9 -0
- package/dist/generator/compute-model-params/compute-entity-params.js +74 -0
- package/dist/generator/compute-model-params/compute-update-dto-params.d.ts +9 -0
- package/dist/generator/compute-model-params/compute-update-dto-params.js +72 -0
- package/dist/generator/compute-model-params/index.d.ts +9 -0
- package/dist/generator/compute-model-params/index.js +22 -0
- package/dist/generator/field-classifiers.d.ts +14 -0
- package/dist/generator/field-classifiers.js +51 -0
- package/dist/generator/generate-connect-dto.d.ts +7 -0
- package/dist/generator/generate-connect-dto.js +14 -0
- package/dist/generator/generate-controller-spec.d.ts +8 -0
- package/dist/generator/generate-controller-spec.js +28 -0
- package/dist/generator/generate-controller.d.ts +8 -0
- package/dist/generator/generate-controller.js +207 -0
- package/dist/generator/generate-create-dto.d.ts +8 -0
- package/dist/generator/generate-create-dto.js +15 -0
- package/dist/generator/generate-entity.d.ts +7 -0
- package/dist/generator/generate-entity.js +16 -0
- package/dist/generator/generate-form-validator-class.d.ts +8 -0
- package/dist/generator/generate-form-validator-class.js +42 -0
- package/dist/generator/generate-module.d.ts +8 -0
- package/dist/generator/generate-module.js +18 -0
- package/dist/generator/generate-modules-index.d.ts +8 -0
- package/dist/generator/generate-modules-index.js +13 -0
- package/dist/generator/generate-service-spec.d.ts +8 -0
- package/dist/generator/generate-service-spec.js +406 -0
- package/dist/generator/generate-service.d.ts +8 -0
- package/dist/generator/generate-service.js +91 -0
- package/dist/generator/generate-types-dto.d.ts +7 -0
- package/dist/generator/generate-types-dto.js +160 -0
- package/dist/generator/generate-update-dto.d.ts +8 -0
- package/dist/generator/generate-update-dto.js +12 -0
- package/dist/generator/helpers.d.ts +32 -0
- package/dist/generator/helpers.js +167 -0
- package/dist/generator/index.d.ts +17 -0
- package/dist/generator/index.js +187 -0
- package/dist/generator/template-helpers.d.ts +56 -0
- package/dist/generator/template-helpers.js +138 -0
- package/dist/generator/types.d.ts +56 -0
- package/dist/generator/types.js +2 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +77 -0
- package/package.json +71 -0
|
@@ -0,0 +1,406 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateServiceSpec = void 0;
|
|
4
|
+
const case_1 = require("case");
|
|
5
|
+
const getFieldMockValue = (field) => {
|
|
6
|
+
if (field.hasDefaultValue && field.default !== undefined) {
|
|
7
|
+
if (typeof field.default === 'object' && field.default !== null) {
|
|
8
|
+
const defaultObj = field.default;
|
|
9
|
+
if (defaultObj.name === 'autoincrement') {
|
|
10
|
+
return field.type === 'BigInt' ? 'BigInt(1)' : '1';
|
|
11
|
+
}
|
|
12
|
+
if (defaultObj.name === 'now') {
|
|
13
|
+
return 'new Date()';
|
|
14
|
+
}
|
|
15
|
+
if (defaultObj.name === 'uuid' || defaultObj.name === 'cuid') {
|
|
16
|
+
return "'test-id-123'";
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
if (typeof field.default === 'string') {
|
|
20
|
+
return `'${field.default}'`;
|
|
21
|
+
}
|
|
22
|
+
if (typeof field.default === 'number') {
|
|
23
|
+
return String(field.default);
|
|
24
|
+
}
|
|
25
|
+
if (typeof field.default === 'boolean') {
|
|
26
|
+
return String(field.default);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
switch (field.type) {
|
|
30
|
+
case 'String':
|
|
31
|
+
return `'test_${field.name}'`;
|
|
32
|
+
case 'Int':
|
|
33
|
+
return '1';
|
|
34
|
+
case 'BigInt':
|
|
35
|
+
return 'BigInt(1)';
|
|
36
|
+
case 'Float':
|
|
37
|
+
case 'Decimal':
|
|
38
|
+
return '1.0';
|
|
39
|
+
case 'Boolean':
|
|
40
|
+
return 'true';
|
|
41
|
+
case 'DateTime':
|
|
42
|
+
return 'new Date()';
|
|
43
|
+
case 'Json':
|
|
44
|
+
return '{}';
|
|
45
|
+
case 'Bytes':
|
|
46
|
+
return "Buffer.from('test')";
|
|
47
|
+
default:
|
|
48
|
+
if (field.kind === 'enum') {
|
|
49
|
+
return `'ENUM_VALUE'`;
|
|
50
|
+
}
|
|
51
|
+
return `'test_${field.name}'`;
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
const generateCreateMockData = (model) => {
|
|
55
|
+
const fields = model.fields.filter((f) => f.kind === 'scalar' || f.kind === 'enum');
|
|
56
|
+
const createFields = fields.filter((f) => f.name !== 'id' &&
|
|
57
|
+
f.name !== 'createdAt' &&
|
|
58
|
+
f.name !== 'updatedAt' &&
|
|
59
|
+
!f.isReadOnly);
|
|
60
|
+
if (createFields.length === 0) {
|
|
61
|
+
return '{}';
|
|
62
|
+
}
|
|
63
|
+
const fieldStrings = createFields.slice(0, 5).map((f) => {
|
|
64
|
+
return ` ${f.name}: ${getFieldMockValue(f)}`;
|
|
65
|
+
});
|
|
66
|
+
return `{\n${fieldStrings.join(',\n')},\n }`;
|
|
67
|
+
};
|
|
68
|
+
const getIdMockValue = (model) => {
|
|
69
|
+
const idField = model.fields.find((f) => f.isId);
|
|
70
|
+
if (!idField)
|
|
71
|
+
return '1';
|
|
72
|
+
if (idField.type === 'BigInt') {
|
|
73
|
+
return 'BigInt(1)';
|
|
74
|
+
}
|
|
75
|
+
if (idField.type === 'String') {
|
|
76
|
+
return "'test-id-123'";
|
|
77
|
+
}
|
|
78
|
+
return '1';
|
|
79
|
+
};
|
|
80
|
+
const getIdParamValue = (model) => {
|
|
81
|
+
const idField = model.fields.find((f) => f.isId);
|
|
82
|
+
if (!idField)
|
|
83
|
+
return '1';
|
|
84
|
+
if (idField.type === 'BigInt') {
|
|
85
|
+
return 'BigInt(1)';
|
|
86
|
+
}
|
|
87
|
+
if (idField.type === 'String') {
|
|
88
|
+
return "'test-id-123'";
|
|
89
|
+
}
|
|
90
|
+
return '1';
|
|
91
|
+
};
|
|
92
|
+
const generateServiceSpec = ({ model, templateHelpers: t, }) => {
|
|
93
|
+
const instanceName = (0, case_1.camel)(model.name);
|
|
94
|
+
const createMockData = generateCreateMockData(model);
|
|
95
|
+
const idMockValue = getIdMockValue(model);
|
|
96
|
+
const idParamValue = getIdParamValue(model);
|
|
97
|
+
return `/// <reference types="jest" />
|
|
98
|
+
import { Test, TestingModule } from '@nestjs/testing';
|
|
99
|
+
import { ConfigService } from '@nestjs/config';
|
|
100
|
+
import { WINSTON_MODULE_PROVIDER } from 'nest-winston';
|
|
101
|
+
|
|
102
|
+
// Mock nestjs-prisma 模块
|
|
103
|
+
jest.mock('nestjs-prisma', () => ({
|
|
104
|
+
PrismaService: jest.fn(),
|
|
105
|
+
}));
|
|
106
|
+
|
|
107
|
+
import { PrismaService } from 'nestjs-prisma';
|
|
108
|
+
import { ${model.name}Service } from './${instanceName}.service';
|
|
109
|
+
|
|
110
|
+
// Mock PrismaService
|
|
111
|
+
const mockPrismaService = {
|
|
112
|
+
${instanceName}: {
|
|
113
|
+
create: jest.fn(),
|
|
114
|
+
createMany: jest.fn(),
|
|
115
|
+
findMany: jest.fn(),
|
|
116
|
+
findUnique: jest.fn(),
|
|
117
|
+
update: jest.fn(),
|
|
118
|
+
updateMany: jest.fn(),
|
|
119
|
+
delete: jest.fn(),
|
|
120
|
+
deleteMany: jest.fn(),
|
|
121
|
+
count: jest.fn(),
|
|
122
|
+
groupBy: jest.fn(),
|
|
123
|
+
aggregate: jest.fn(),
|
|
124
|
+
},
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
// Mock Logger
|
|
128
|
+
const mockLogger = {
|
|
129
|
+
child: jest.fn().mockReturnThis(),
|
|
130
|
+
info: jest.fn(),
|
|
131
|
+
error: jest.fn(),
|
|
132
|
+
warn: jest.fn(),
|
|
133
|
+
debug: jest.fn(),
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
// Mock ConfigService
|
|
137
|
+
const mockConfigService = {
|
|
138
|
+
get: jest.fn(),
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
describe('${model.name}Service', () => {
|
|
142
|
+
let service: ${model.name}Service;
|
|
143
|
+
let prisma: typeof mockPrismaService;
|
|
144
|
+
|
|
145
|
+
beforeEach(async () => {
|
|
146
|
+
// 每个测试前重置所有 mock
|
|
147
|
+
jest.clearAllMocks();
|
|
148
|
+
|
|
149
|
+
const module: TestingModule = await Test.createTestingModule({
|
|
150
|
+
providers: [
|
|
151
|
+
${model.name}Service,
|
|
152
|
+
{ provide: PrismaService, useValue: mockPrismaService },
|
|
153
|
+
{ provide: ConfigService, useValue: mockConfigService },
|
|
154
|
+
{ provide: WINSTON_MODULE_PROVIDER, useValue: mockLogger },
|
|
155
|
+
],
|
|
156
|
+
}).compile();
|
|
157
|
+
|
|
158
|
+
service = module.get<${model.name}Service>(${model.name}Service);
|
|
159
|
+
prisma = mockPrismaService;
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
it('should be defined', () => {
|
|
163
|
+
expect(service).toBeDefined();
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
describe('createOne', () => {
|
|
167
|
+
it('should create a single ${instanceName} record', async () => {
|
|
168
|
+
const createArgs = {
|
|
169
|
+
data: ${createMockData},
|
|
170
|
+
};
|
|
171
|
+
const expectedResult = { id: ${idMockValue}, ...createArgs.data };
|
|
172
|
+
|
|
173
|
+
prisma.${instanceName}.create.mockResolvedValue(expectedResult);
|
|
174
|
+
|
|
175
|
+
const result = await service.createOne(createArgs);
|
|
176
|
+
|
|
177
|
+
expect(prisma.${instanceName}.create).toHaveBeenCalledWith(createArgs);
|
|
178
|
+
expect(prisma.${instanceName}.create).toHaveBeenCalledTimes(1);
|
|
179
|
+
expect(result).toEqual(expectedResult);
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
it('should throw error when create fails', async () => {
|
|
183
|
+
const createArgs = {
|
|
184
|
+
data: ${createMockData},
|
|
185
|
+
};
|
|
186
|
+
const error = new Error('Database connection failed');
|
|
187
|
+
|
|
188
|
+
prisma.${instanceName}.create.mockRejectedValue(error);
|
|
189
|
+
|
|
190
|
+
await expect(service.createOne(createArgs)).rejects.toThrow(
|
|
191
|
+
'Database connection failed',
|
|
192
|
+
);
|
|
193
|
+
});
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
describe('createMany', () => {
|
|
197
|
+
it('should create multiple ${instanceName} records with skipDuplicates', async () => {
|
|
198
|
+
const data = [
|
|
199
|
+
${createMockData},
|
|
200
|
+
${createMockData},
|
|
201
|
+
];
|
|
202
|
+
const expectedResult = { count: 2 };
|
|
203
|
+
|
|
204
|
+
prisma.${instanceName}.createMany.mockResolvedValue(expectedResult);
|
|
205
|
+
|
|
206
|
+
const result = await service.createMany(data);
|
|
207
|
+
|
|
208
|
+
expect(prisma.${instanceName}.createMany).toHaveBeenCalledWith({
|
|
209
|
+
data,
|
|
210
|
+
skipDuplicates: true,
|
|
211
|
+
});
|
|
212
|
+
expect(result).toEqual(expectedResult);
|
|
213
|
+
});
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
describe('findMany', () => {
|
|
217
|
+
it('should return entities with itemCount', async () => {
|
|
218
|
+
const findArgs = {
|
|
219
|
+
where: {},
|
|
220
|
+
take: 10,
|
|
221
|
+
skip: 0,
|
|
222
|
+
};
|
|
223
|
+
const mockEntities = [
|
|
224
|
+
{ id: ${idMockValue} },
|
|
225
|
+
{ id: ${idMockValue} },
|
|
226
|
+
];
|
|
227
|
+
|
|
228
|
+
prisma.${instanceName}.count.mockResolvedValue(2);
|
|
229
|
+
prisma.${instanceName}.findMany.mockResolvedValue(mockEntities);
|
|
230
|
+
|
|
231
|
+
const result = await service.findMany(findArgs);
|
|
232
|
+
|
|
233
|
+
expect(prisma.${instanceName}.count).toHaveBeenCalledWith({ where: findArgs.where });
|
|
234
|
+
expect(prisma.${instanceName}.findMany).toHaveBeenCalledWith(findArgs);
|
|
235
|
+
expect(result).toEqual({
|
|
236
|
+
itemCount: 2,
|
|
237
|
+
entities: mockEntities,
|
|
238
|
+
});
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
it('should return empty result when no records found', async () => {
|
|
242
|
+
const findArgs = { where: {} };
|
|
243
|
+
|
|
244
|
+
prisma.${instanceName}.count.mockResolvedValue(0);
|
|
245
|
+
prisma.${instanceName}.findMany.mockResolvedValue([]);
|
|
246
|
+
|
|
247
|
+
const result = await service.findMany(findArgs);
|
|
248
|
+
|
|
249
|
+
expect(result).toEqual({ itemCount: 0, entities: [] });
|
|
250
|
+
});
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
describe('findUnique', () => {
|
|
254
|
+
it('should find a single ${instanceName} record by id', async () => {
|
|
255
|
+
const id = ${idParamValue};
|
|
256
|
+
const select = { id: true };
|
|
257
|
+
const expectedResult = { id: ${idMockValue} };
|
|
258
|
+
|
|
259
|
+
prisma.${instanceName}.findUnique.mockResolvedValue(expectedResult);
|
|
260
|
+
|
|
261
|
+
const result = await service.findUnique(id, select);
|
|
262
|
+
|
|
263
|
+
expect(prisma.${instanceName}.findUnique).toHaveBeenCalledWith({
|
|
264
|
+
where: { id },
|
|
265
|
+
select,
|
|
266
|
+
});
|
|
267
|
+
expect(result).toEqual(expectedResult);
|
|
268
|
+
});
|
|
269
|
+
|
|
270
|
+
it('should return null when record not found', async () => {
|
|
271
|
+
prisma.${instanceName}.findUnique.mockResolvedValue(null);
|
|
272
|
+
|
|
273
|
+
const result = await service.findUnique(${idParamValue}, { id: true });
|
|
274
|
+
|
|
275
|
+
expect(result).toBeNull();
|
|
276
|
+
});
|
|
277
|
+
});
|
|
278
|
+
|
|
279
|
+
describe('updateUnique', () => {
|
|
280
|
+
it('should update a single ${instanceName} record', async () => {
|
|
281
|
+
const id = ${idParamValue};
|
|
282
|
+
const data = ${createMockData};
|
|
283
|
+
const expectedResult = { id: ${idMockValue}, ...data };
|
|
284
|
+
|
|
285
|
+
prisma.${instanceName}.update.mockResolvedValue(expectedResult);
|
|
286
|
+
|
|
287
|
+
const result = await service.updateUnique(id, data);
|
|
288
|
+
|
|
289
|
+
expect(prisma.${instanceName}.update).toHaveBeenCalledWith({
|
|
290
|
+
where: { id },
|
|
291
|
+
data,
|
|
292
|
+
});
|
|
293
|
+
expect(result).toEqual(expectedResult);
|
|
294
|
+
});
|
|
295
|
+
});
|
|
296
|
+
|
|
297
|
+
describe('updateMany', () => {
|
|
298
|
+
it('should update multiple ${instanceName} records', async () => {
|
|
299
|
+
const updateArgs = {
|
|
300
|
+
where: {},
|
|
301
|
+
data: ${createMockData},
|
|
302
|
+
};
|
|
303
|
+
const expectedResult = { count: 5 };
|
|
304
|
+
|
|
305
|
+
prisma.${instanceName}.updateMany.mockResolvedValue(expectedResult);
|
|
306
|
+
|
|
307
|
+
const result = await service.updateMany(updateArgs);
|
|
308
|
+
|
|
309
|
+
expect(prisma.${instanceName}.updateMany).toHaveBeenCalledWith(updateArgs);
|
|
310
|
+
expect(result).toEqual(expectedResult);
|
|
311
|
+
});
|
|
312
|
+
});
|
|
313
|
+
|
|
314
|
+
describe('deleteUnique', () => {
|
|
315
|
+
it('should delete a single ${instanceName} record and return count', async () => {
|
|
316
|
+
const id = ${idParamValue};
|
|
317
|
+
|
|
318
|
+
prisma.${instanceName}.delete.mockResolvedValue({ id: ${idMockValue} });
|
|
319
|
+
|
|
320
|
+
const result = await service.deleteUnique(id);
|
|
321
|
+
|
|
322
|
+
expect(prisma.${instanceName}.delete).toHaveBeenCalledWith({ where: { id } });
|
|
323
|
+
expect(result).toEqual({ count: 1 });
|
|
324
|
+
});
|
|
325
|
+
});
|
|
326
|
+
|
|
327
|
+
describe('deleteMany', () => {
|
|
328
|
+
it('should delete multiple ${instanceName} records', async () => {
|
|
329
|
+
const deleteArgs = { where: {} };
|
|
330
|
+
const expectedResult = { count: 3 };
|
|
331
|
+
|
|
332
|
+
prisma.${instanceName}.deleteMany.mockResolvedValue(expectedResult);
|
|
333
|
+
|
|
334
|
+
const result = await service.deleteMany(deleteArgs);
|
|
335
|
+
|
|
336
|
+
expect(prisma.${instanceName}.deleteMany).toHaveBeenCalledWith(deleteArgs);
|
|
337
|
+
expect(result).toEqual(expectedResult);
|
|
338
|
+
});
|
|
339
|
+
});
|
|
340
|
+
|
|
341
|
+
describe('count', () => {
|
|
342
|
+
it('should count ${instanceName} records with filter', async () => {
|
|
343
|
+
const countArgs = { where: {} };
|
|
344
|
+
|
|
345
|
+
prisma.${instanceName}.count.mockResolvedValue(10);
|
|
346
|
+
|
|
347
|
+
const result = await service.count(countArgs);
|
|
348
|
+
|
|
349
|
+
expect(prisma.${instanceName}.count).toHaveBeenCalledWith(countArgs);
|
|
350
|
+
expect(result).toBe(10);
|
|
351
|
+
});
|
|
352
|
+
|
|
353
|
+
it('should count all records when no filter provided', async () => {
|
|
354
|
+
prisma.${instanceName}.count.mockResolvedValue(100);
|
|
355
|
+
|
|
356
|
+
const result = await service.count();
|
|
357
|
+
|
|
358
|
+
expect(prisma.${instanceName}.count).toHaveBeenCalledWith(undefined);
|
|
359
|
+
expect(result).toBe(100);
|
|
360
|
+
});
|
|
361
|
+
});
|
|
362
|
+
|
|
363
|
+
describe('groupBy', () => {
|
|
364
|
+
it('should group ${instanceName} records by specified field', async () => {
|
|
365
|
+
const groupByArgs = {
|
|
366
|
+
by: ['id'],
|
|
367
|
+
_count: { id: true },
|
|
368
|
+
};
|
|
369
|
+
const expectedResult = [
|
|
370
|
+
{ id: ${idMockValue}, _count: { id: 50 } },
|
|
371
|
+
];
|
|
372
|
+
|
|
373
|
+
prisma.${instanceName}.groupBy.mockResolvedValue(expectedResult);
|
|
374
|
+
|
|
375
|
+
const result = await service.groupBy(groupByArgs as any);
|
|
376
|
+
|
|
377
|
+
expect(prisma.${instanceName}.groupBy).toHaveBeenCalledWith(groupByArgs);
|
|
378
|
+
expect(result).toEqual(expectedResult);
|
|
379
|
+
});
|
|
380
|
+
});
|
|
381
|
+
|
|
382
|
+
describe('aggregate', () => {
|
|
383
|
+
it('should aggregate ${instanceName} records', async () => {
|
|
384
|
+
const aggregateArgs = {
|
|
385
|
+
_count: true,
|
|
386
|
+
_max: { id: true },
|
|
387
|
+
_min: { id: true },
|
|
388
|
+
} as const;
|
|
389
|
+
const expectedResult = {
|
|
390
|
+
_count: 100,
|
|
391
|
+
_max: { id: ${idMockValue} },
|
|
392
|
+
_min: { id: ${idMockValue} },
|
|
393
|
+
};
|
|
394
|
+
|
|
395
|
+
prisma.${instanceName}.aggregate.mockResolvedValue(expectedResult);
|
|
396
|
+
|
|
397
|
+
const result = await service.aggregate(aggregateArgs);
|
|
398
|
+
|
|
399
|
+
expect(prisma.${instanceName}.aggregate).toHaveBeenCalledWith(aggregateArgs);
|
|
400
|
+
expect(result).toEqual(expectedResult);
|
|
401
|
+
});
|
|
402
|
+
});
|
|
403
|
+
});
|
|
404
|
+
`;
|
|
405
|
+
};
|
|
406
|
+
exports.generateServiceSpec = generateServiceSpec;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { TemplateHelpers } from './template-helpers';
|
|
2
|
+
import { DMMF } from '@prisma/generator-helper';
|
|
3
|
+
interface GenerateServiceParam {
|
|
4
|
+
model: DMMF.Model;
|
|
5
|
+
templateHelpers: TemplateHelpers;
|
|
6
|
+
}
|
|
7
|
+
export declare const generateService: ({ model, templateHelpers: t, }: GenerateServiceParam) => string;
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateService = void 0;
|
|
4
|
+
const case_1 = require("case");
|
|
5
|
+
const generateService = ({ model, templateHelpers: t, }) => {
|
|
6
|
+
const instanceName = (0, case_1.camel)(model.name);
|
|
7
|
+
return `
|
|
8
|
+
import { Injectable, Inject } from '@nestjs/common';
|
|
9
|
+
import { PrismaService } from 'nestjs-prisma';
|
|
10
|
+
import { Prisma, ${model.name} } from '@prisma/client';
|
|
11
|
+
import { WINSTON_MODULE_PROVIDER } from 'nest-winston';
|
|
12
|
+
import { Logger } from 'winston';
|
|
13
|
+
|
|
14
|
+
import { ConfigService } from '@nestjs/config';
|
|
15
|
+
|
|
16
|
+
@Injectable()
|
|
17
|
+
export class ${model.name}Service {
|
|
18
|
+
constructor(
|
|
19
|
+
private prisma: PrismaService,
|
|
20
|
+
private readonly config: ConfigService,
|
|
21
|
+
@Inject(WINSTON_MODULE_PROVIDER) private readonly logger: Logger,
|
|
22
|
+
) {}
|
|
23
|
+
|
|
24
|
+
async createOne(${instanceName}CreateArgs: Prisma.${model.name}CreateArgs) {
|
|
25
|
+
return await this.prisma.${instanceName}.create(${instanceName}CreateArgs);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
async createMany(data: Prisma.${model.name}CreateManyArgs['data']) {
|
|
29
|
+
return await this.prisma.${instanceName}.createMany({
|
|
30
|
+
data,
|
|
31
|
+
skipDuplicates: true,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
async findMany(
|
|
36
|
+
${instanceName}FindManyArgs: Prisma.${model.name}FindManyArgs,
|
|
37
|
+
): Promise<{ itemCount: number; entities: ${model.name}[] }> {
|
|
38
|
+
const itemCount = await this.prisma.${instanceName}.count({ where: ${instanceName}FindManyArgs.where });
|
|
39
|
+
const entities = await this.prisma.${instanceName}.findMany(${instanceName}FindManyArgs);
|
|
40
|
+
return { itemCount, entities };
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
async findUnique(id: number, select: Prisma.${model.name}FindUniqueArgs['select']) {
|
|
44
|
+
return await this.prisma.${instanceName}.findUnique({
|
|
45
|
+
where: { id: id },
|
|
46
|
+
select
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
async updateMany(${instanceName}UpdateManyArgs: Prisma.${model.name}UpdateManyArgs) {
|
|
51
|
+
return await this.prisma.${instanceName}.updateMany(${instanceName}UpdateManyArgs);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
async updateUnique(
|
|
55
|
+
id: number,
|
|
56
|
+
data: Prisma.${model.name}UpdateManyArgs['data']
|
|
57
|
+
) {
|
|
58
|
+
return await this.prisma.${instanceName}.update({
|
|
59
|
+
where: { id: id },
|
|
60
|
+
data,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
async deleteMany(${instanceName}DeleteManyArgs: Prisma.${model.name}DeleteManyArgs) {
|
|
65
|
+
return await this.prisma.${instanceName}.deleteMany(${instanceName}DeleteManyArgs);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
async deleteUnique(id: number) {
|
|
69
|
+
await this.prisma.${instanceName}.delete({
|
|
70
|
+
where: { id: id },
|
|
71
|
+
});
|
|
72
|
+
return { count: 1 };
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
async count(${instanceName}CountArgs?: Prisma.${model.name}CountArgs) {
|
|
76
|
+
return await this.prisma.${instanceName}.count(${instanceName}CountArgs);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
async groupBy(${instanceName}GroupByArgs: Prisma.${model.name}GroupByArgs) {
|
|
80
|
+
return await this.prisma.${instanceName}.groupBy(${instanceName}GroupByArgs as any);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
async aggregate(${instanceName}AggregateArgs: Prisma.${model.name}AggregateArgs) {
|
|
84
|
+
return await this.prisma.${instanceName}.aggregate(${instanceName}AggregateArgs);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
`;
|
|
90
|
+
};
|
|
91
|
+
exports.generateService = generateService;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { TemplateHelpers } from './template-helpers';
|
|
2
|
+
import type { EntityParams } from './types';
|
|
3
|
+
interface GenerateEntityParam extends EntityParams {
|
|
4
|
+
templateHelpers: TemplateHelpers;
|
|
5
|
+
}
|
|
6
|
+
export declare const generateTypesDto: ({ model, fields, imports, apiExtraModels, templateHelpers: t, }: GenerateEntityParam) => string;
|
|
7
|
+
export {};
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateTypesDto = void 0;
|
|
4
|
+
const case_1 = require("case");
|
|
5
|
+
function fieldToSelectInput(field) {
|
|
6
|
+
if (['relation-input', 'object'].includes(field.kind)) {
|
|
7
|
+
return `@IsOptional()\n@ValidateNested()\n${field.name}?: SelectId\n`;
|
|
8
|
+
}
|
|
9
|
+
return `@IsOptional()\n${field.name}: true\n`;
|
|
10
|
+
}
|
|
11
|
+
const generateTypesDto = ({ model, fields, imports, apiExtraModels, templateHelpers: t, }) => `
|
|
12
|
+
import { ${t.updateDtoName(model.name)} } from './update-${(0, case_1.camel)(model.name)}.dto';
|
|
13
|
+
import { IsInt, IsOptional, Min, ValidateNested, IsUrl } from "class-validator";
|
|
14
|
+
|
|
15
|
+
class Id {
|
|
16
|
+
@IsOptional()
|
|
17
|
+
id?: true
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
class SelectId {
|
|
21
|
+
@IsOptional()
|
|
22
|
+
@ValidateNested()
|
|
23
|
+
select?: Id
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export class ${model.name}WhereSelect {
|
|
27
|
+
${t.each(fields, (field) => fieldToSelectInput(field), '\n')}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export class ${model.name}WhereInput {
|
|
31
|
+
@IsOptional()
|
|
32
|
+
AND?: object | object[]
|
|
33
|
+
|
|
34
|
+
@IsOptional()
|
|
35
|
+
OR?: object | object[]
|
|
36
|
+
|
|
37
|
+
@IsOptional()
|
|
38
|
+
NOT?: object | object[]
|
|
39
|
+
|
|
40
|
+
${t.fieldsToTypesProps(fields)}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export class ${model.name}FindManyArgs {
|
|
44
|
+
@IsOptional()
|
|
45
|
+
@IsInt()
|
|
46
|
+
@Min(0)
|
|
47
|
+
skip?: number;
|
|
48
|
+
|
|
49
|
+
@IsOptional()
|
|
50
|
+
@IsInt()
|
|
51
|
+
@Min(1)
|
|
52
|
+
take?: number;
|
|
53
|
+
|
|
54
|
+
@IsOptional()
|
|
55
|
+
@ValidateNested()
|
|
56
|
+
where?: ${model.name}WhereInput;
|
|
57
|
+
|
|
58
|
+
@IsOptional()
|
|
59
|
+
@ValidateNested()
|
|
60
|
+
select?: ${model.name}WhereSelect;
|
|
61
|
+
|
|
62
|
+
@IsOptional()
|
|
63
|
+
include?: object;
|
|
64
|
+
|
|
65
|
+
@IsOptional()
|
|
66
|
+
orderBy?: object;
|
|
67
|
+
|
|
68
|
+
@IsOptional()
|
|
69
|
+
distinct?: Array<string> | object;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export class ${model.name}DeleteManyArgs {
|
|
73
|
+
@ValidateNested()
|
|
74
|
+
where: ${model.name}WhereInput;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export class ${model.name}UpdateManyArgs {
|
|
78
|
+
@ValidateNested()
|
|
79
|
+
data: ${t.updateDtoName(model.name)};
|
|
80
|
+
|
|
81
|
+
@ValidateNested()
|
|
82
|
+
where: ${model.name}WhereInput;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export class EffectedCount {
|
|
86
|
+
@IsInt()
|
|
87
|
+
@Min(0)
|
|
88
|
+
count: number;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export class ${model.name}CountArgs {
|
|
92
|
+
@ValidateNested()
|
|
93
|
+
where: ${model.name}WhereInput;
|
|
94
|
+
|
|
95
|
+
@IsOptional()
|
|
96
|
+
orderBy?: object;
|
|
97
|
+
|
|
98
|
+
@IsOptional()
|
|
99
|
+
select?: object;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export class ${model.name}AggregateArgs {
|
|
103
|
+
@ValidateNested()
|
|
104
|
+
where: ${model.name}WhereInput;
|
|
105
|
+
|
|
106
|
+
@IsOptional()
|
|
107
|
+
orderBy?: object;
|
|
108
|
+
|
|
109
|
+
@IsOptional()
|
|
110
|
+
_count?: object | true;
|
|
111
|
+
|
|
112
|
+
@IsOptional()
|
|
113
|
+
_avg?: object;
|
|
114
|
+
|
|
115
|
+
@IsOptional()
|
|
116
|
+
_sum?: object;
|
|
117
|
+
|
|
118
|
+
@IsOptional()
|
|
119
|
+
_min?: object;
|
|
120
|
+
|
|
121
|
+
@IsOptional()
|
|
122
|
+
_max?: object;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
export class ${model.name}GroupByArgs {
|
|
126
|
+
@ValidateNested()
|
|
127
|
+
where: ${model.name}WhereInput;
|
|
128
|
+
|
|
129
|
+
@IsOptional()
|
|
130
|
+
orderBy?: object;
|
|
131
|
+
|
|
132
|
+
@IsOptional()
|
|
133
|
+
by?: object;
|
|
134
|
+
|
|
135
|
+
@IsOptional()
|
|
136
|
+
having?: string[];
|
|
137
|
+
|
|
138
|
+
@IsOptional()
|
|
139
|
+
_count?: object | true;
|
|
140
|
+
|
|
141
|
+
@IsOptional()
|
|
142
|
+
_avg?: object;
|
|
143
|
+
|
|
144
|
+
@IsOptional()
|
|
145
|
+
_sum?: object;
|
|
146
|
+
|
|
147
|
+
@IsOptional()
|
|
148
|
+
_min?: object;
|
|
149
|
+
|
|
150
|
+
@IsOptional()
|
|
151
|
+
_max?: object;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
export class UploudResponse {
|
|
155
|
+
@IsUrl()
|
|
156
|
+
url: string;
|
|
157
|
+
name: string;
|
|
158
|
+
}
|
|
159
|
+
`;
|
|
160
|
+
exports.generateTypesDto = generateTypesDto;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { TemplateHelpers } from './template-helpers';
|
|
2
|
+
import type { UpdateDtoParams } from './types';
|
|
3
|
+
interface GenerateUpdateDtoParam extends UpdateDtoParams {
|
|
4
|
+
exportRelationModifierClasses: boolean;
|
|
5
|
+
templateHelpers: TemplateHelpers;
|
|
6
|
+
}
|
|
7
|
+
export declare const generateUpdateDto: ({ model, fields, imports, extraClasses, apiExtraModels, exportRelationModifierClasses, templateHelpers: t, }: GenerateUpdateDtoParam) => string;
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateUpdateDto = void 0;
|
|
4
|
+
const generateUpdateDto = ({ model, fields, imports, extraClasses, apiExtraModels, exportRelationModifierClasses, templateHelpers: t, }) => `
|
|
5
|
+
${t.importStatements(imports)}
|
|
6
|
+
import { IsOptional, ValidateNested } from 'class-validator';
|
|
7
|
+
|
|
8
|
+
${t.each(extraClasses, exportRelationModifierClasses ? (content) => `export ${content}` : t.echo, '\n')}
|
|
9
|
+
|
|
10
|
+
export class ${t.updateDtoName(model.name)} extends PartialType(${t.createDtoName(model.name)}) {}
|
|
11
|
+
`;
|
|
12
|
+
exports.generateUpdateDto = generateUpdateDto;
|