@flusys/nestjs-form-builder 7.1.0 → 8.0.0

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.
Files changed (118) hide show
  1. package/config/index.d.ts +3 -3
  2. package/controllers/form-result.controller.d.ts +3 -3
  3. package/controllers/form.controller.d.ts +3 -3
  4. package/controllers/index.d.ts +2 -2
  5. package/docs/form-builder-swagger.config.d.ts +2 -2
  6. package/docs/index.d.ts +1 -1
  7. package/dtos/form.dto.d.ts +1 -1
  8. package/dtos/index.d.ts +2 -2
  9. package/entities/form-with-company.entity.d.ts +1 -1
  10. package/entities/form.entity.d.ts +1 -1
  11. package/entities/index.d.ts +7 -7
  12. package/enums/index.d.ts +1 -1
  13. package/fesm/262.js +1841 -0
  14. package/fesm/98.js +807 -0
  15. package/fesm/config/index.js +98 -3
  16. package/fesm/controllers/index.js +14 -2
  17. package/fesm/docs/index.js +171 -1
  18. package/fesm/dtos/index.js +571 -2
  19. package/fesm/entities/index.js +342 -10
  20. package/fesm/enums/index.js +38 -1
  21. package/fesm/index.js +482 -10
  22. package/fesm/interfaces/index.js +17 -3
  23. package/fesm/modules/index.js +178 -1
  24. package/fesm/runtime.js +85 -0
  25. package/fesm/services/index.js +35 -4
  26. package/index.d.ts +10 -10
  27. package/interfaces/form-builder-module.interface.d.ts +3 -3
  28. package/interfaces/form-result.interface.d.ts +1 -1
  29. package/interfaces/form.interface.d.ts +2 -2
  30. package/interfaces/index.d.ts +3 -3
  31. package/modules/form-builder.module.d.ts +2 -2
  32. package/modules/index.d.ts +1 -1
  33. package/package.json +26 -36
  34. package/services/form-builder-config.service.d.ts +4 -4
  35. package/services/form-builder-datasource.provider.d.ts +3 -3
  36. package/services/form-result.service.d.ts +6 -6
  37. package/services/form.service.d.ts +7 -7
  38. package/services/index.d.ts +4 -4
  39. package/utils/index.d.ts +2 -2
  40. package/utils/permission.utils.d.ts +1 -1
  41. package/cjs/config/event-actions.js +0 -33
  42. package/cjs/config/form-builder.constants.js +0 -13
  43. package/cjs/config/index.js +0 -20
  44. package/cjs/config/message-keys.js +0 -38
  45. package/cjs/controllers/form-result.controller.js +0 -281
  46. package/cjs/controllers/form-result.controller.spec.js +0 -257
  47. package/cjs/controllers/form.controller.js +0 -231
  48. package/cjs/controllers/form.controller.spec.js +0 -212
  49. package/cjs/controllers/index.js +0 -19
  50. package/cjs/docs/form-builder-swagger.config.js +0 -150
  51. package/cjs/docs/form-builder-swagger.config.spec.js +0 -75
  52. package/cjs/docs/index.js +0 -11
  53. package/cjs/dtos/form-result.dto.js +0 -248
  54. package/cjs/dtos/form.dto.js +0 -270
  55. package/cjs/dtos/index.js +0 -19
  56. package/cjs/entities/form-result.entity.js +0 -100
  57. package/cjs/entities/form-with-company.entity.js +0 -65
  58. package/cjs/entities/form.entity.js +0 -127
  59. package/cjs/entities/index.js +0 -52
  60. package/cjs/entities/index.spec.js +0 -18
  61. package/cjs/enums/form-access-type.enum.js +0 -19
  62. package/cjs/enums/index.js +0 -18
  63. package/cjs/index.js +0 -28
  64. package/cjs/interfaces/form-builder-module.interface.js +0 -4
  65. package/cjs/interfaces/form-result.interface.js +0 -4
  66. package/cjs/interfaces/form.interface.js +0 -4
  67. package/cjs/interfaces/index.js +0 -20
  68. package/cjs/modules/form-builder.module.js +0 -136
  69. package/cjs/modules/form-builder.module.spec.js +0 -133
  70. package/cjs/modules/index.js +0 -18
  71. package/cjs/services/form-builder-config.service.js +0 -69
  72. package/cjs/services/form-builder-config.service.spec.js +0 -121
  73. package/cjs/services/form-builder-datasource.provider.js +0 -125
  74. package/cjs/services/form-builder-datasource.provider.spec.js +0 -147
  75. package/cjs/services/form-result.service.js +0 -366
  76. package/cjs/services/form-result.service.spec.js +0 -823
  77. package/cjs/services/form.service.js +0 -341
  78. package/cjs/services/form.service.spec.js +0 -746
  79. package/cjs/services/index.js +0 -21
  80. package/cjs/utils/computed-field.utils.js +0 -199
  81. package/cjs/utils/computed-field.utils.spec.js +0 -1205
  82. package/cjs/utils/index.js +0 -19
  83. package/cjs/utils/permission.utils.js +0 -44
  84. package/cjs/utils/permission.utils.spec.js +0 -118
  85. package/fesm/config/event-actions.js +0 -12
  86. package/fesm/config/form-builder.constants.js +0 -3
  87. package/fesm/config/message-keys.js +0 -20
  88. package/fesm/controllers/form-result.controller.js +0 -271
  89. package/fesm/controllers/form-result.controller.spec.js +0 -253
  90. package/fesm/controllers/form.controller.js +0 -221
  91. package/fesm/controllers/form.controller.spec.js +0 -208
  92. package/fesm/docs/form-builder-swagger.config.js +0 -146
  93. package/fesm/docs/form-builder-swagger.config.spec.js +0 -71
  94. package/fesm/dtos/form-result.dto.js +0 -215
  95. package/fesm/dtos/form.dto.js +0 -243
  96. package/fesm/entities/form-result.entity.js +0 -90
  97. package/fesm/entities/form-with-company.entity.js +0 -55
  98. package/fesm/entities/form.entity.js +0 -117
  99. package/fesm/entities/index.spec.js +0 -14
  100. package/fesm/enums/form-access-type.enum.js +0 -9
  101. package/fesm/interfaces/form-builder-module.interface.js +0 -3
  102. package/fesm/interfaces/form-result.interface.js +0 -6
  103. package/fesm/interfaces/form.interface.js +0 -3
  104. package/fesm/modules/form-builder.module.js +0 -126
  105. package/fesm/modules/form-builder.module.spec.js +0 -129
  106. package/fesm/services/form-builder-config.service.js +0 -59
  107. package/fesm/services/form-builder-config.service.spec.js +0 -117
  108. package/fesm/services/form-builder-datasource.provider.js +0 -74
  109. package/fesm/services/form-builder-datasource.provider.spec.js +0 -143
  110. package/fesm/services/form-result.service.js +0 -356
  111. package/fesm/services/form-result.service.spec.js +0 -778
  112. package/fesm/services/form.service.js +0 -331
  113. package/fesm/services/form.service.spec.js +0 -701
  114. package/fesm/utils/computed-field.utils.js +0 -195
  115. package/fesm/utils/computed-field.utils.spec.js +0 -1201
  116. package/fesm/utils/index.js +0 -2
  117. package/fesm/utils/permission.utils.js +0 -42
  118. package/fesm/utils/permission.utils.spec.js +0 -114
@@ -1,366 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- Object.defineProperty(exports, "FormResultService", {
6
- enumerable: true,
7
- get: function() {
8
- return FormResultService;
9
- }
10
- });
11
- const _classes = require("@flusys/nestjs-shared/classes");
12
- const _decorators = require("@flusys/nestjs-shared/decorators");
13
- const _interfaces = require("@flusys/nestjs-shared/interfaces");
14
- const _modules = require("@flusys/nestjs-shared/modules");
15
- const _common = require("@nestjs/common");
16
- const _typeorm = require("typeorm");
17
- const _config = require("../config");
18
- const _formresultdto = require("../dtos/form-result.dto");
19
- const _entities = require("../entities");
20
- const _formaccesstypeenum = require("../enums/form-access-type.enum");
21
- const _computedfieldutils = require("../utils/computed-field.utils");
22
- const _permissionutils = require("../utils/permission.utils");
23
- const _formbuilderconfigservice = require("./form-builder-config.service");
24
- const _formbuilderdatasourceprovider = require("./form-builder-datasource.provider");
25
- function _define_property(obj, key, value) {
26
- if (key in obj) {
27
- Object.defineProperty(obj, key, {
28
- value: value,
29
- enumerable: true,
30
- configurable: true,
31
- writable: true
32
- });
33
- } else {
34
- obj[key] = value;
35
- }
36
- return obj;
37
- }
38
- function _ts_decorate(decorators, target, key, desc) {
39
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
40
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
41
- else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
42
- return c > 3 && r && Object.defineProperty(target, key, r), r;
43
- }
44
- function _ts_metadata(k, v) {
45
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
46
- }
47
- function _ts_param(paramIndex, decorator) {
48
- return function(target, key) {
49
- decorator(target, key, paramIndex);
50
- };
51
- }
52
- let FormResultService = class FormResultService extends _classes.ApiService {
53
- async ensureFormRepositoryInitialized() {
54
- if (!this.formRepository) {
55
- const enableCompanyFeature = this.formBuilderConfig.isCompanyFeatureEnabled();
56
- const formEntity = enableCompanyFeature ? _entities.FormWithCompany : _entities.Form;
57
- this.formRepository = await this.dataSourceProvider.getRepository(formEntity);
58
- }
59
- }
60
- async getActiveForm(formId) {
61
- await this.ensureFormRepositoryInitialized();
62
- const form = await this.formRepository.findOne({
63
- where: {
64
- id: formId,
65
- isActive: true,
66
- deletedAt: (0, _typeorm.IsNull)()
67
- }
68
- });
69
- if (!form) {
70
- throw new _common.NotFoundException({
71
- message: 'Form not found or inactive',
72
- messageKey: _config.FORM_MESSAGES.NOT_FOUND
73
- });
74
- }
75
- return form;
76
- }
77
- applyCompanyFilterToQuery(query, user) {
78
- if (this.formBuilderConfig.isCompanyFeatureEnabled() && user?.companyId) {
79
- query.innerJoin('form', 'f', 'f.id = form_result.formId').andWhere('f.company_id = :companyId', {
80
- companyId: user.companyId
81
- });
82
- }
83
- }
84
- async validateSubmissionAccess(form, user, isPublic) {
85
- if (isPublic) {
86
- if (form.accessType !== _formaccesstypeenum.FormAccessType.PUBLIC) {
87
- throw new _common.UnauthorizedException({
88
- message: 'This form is not available for public submission',
89
- messageKey: _config.FORM_MESSAGES.NOT_PUBLIC
90
- });
91
- }
92
- return;
93
- }
94
- if (form.accessType === _formaccesstypeenum.FormAccessType.PUBLIC) return;
95
- if (!user) {
96
- throw new _common.UnauthorizedException({
97
- message: 'Authentication required to submit this form',
98
- messageKey: _config.FORM_MESSAGES.AUTH_REQUIRED
99
- });
100
- }
101
- if (form.accessType === _formaccesstypeenum.FormAccessType.ACTION_GROUP && form.actionGroups?.length) {
102
- const hasPermission = await (0, _permissionutils.validateUserPermissions)(user, form.actionGroups, this.cacheManager, this.formBuilderConfig.isCompanyFeatureEnabled());
103
- if (!hasPermission) {
104
- throw new _common.ForbiddenException({
105
- message: 'You do not have permission to submit this form',
106
- messageKey: _config.FORM_MESSAGES.ACCESS_DENIED
107
- });
108
- }
109
- } else if (form.accessType !== _formaccesstypeenum.FormAccessType.AUTHENTICATED) {
110
- throw new _common.BadRequestException({
111
- message: 'Invalid form access type',
112
- messageKey: _config.FORM_MESSAGES.INVALID_ACCESS_TYPE
113
- });
114
- }
115
- }
116
- buildUserDraftWhere(formId, userId) {
117
- return {
118
- formId,
119
- submittedById: userId,
120
- isDraft: true,
121
- deletedAt: (0, _typeorm.IsNull)()
122
- };
123
- }
124
- // Query Customization
125
- async getSelectQuery(query, _user, select) {
126
- if (!select || !select.length) {
127
- select = [
128
- 'id',
129
- 'formId',
130
- 'schemaVersionSnapshot',
131
- 'schemaVersion',
132
- 'data',
133
- 'submittedById',
134
- 'submittedAt',
135
- 'isDraft',
136
- 'createdAt',
137
- 'updatedAt'
138
- ];
139
- }
140
- const selectFields = select.map((field)=>`${this.entityName}.${field}`);
141
- query.select(selectFields);
142
- return {
143
- query,
144
- isRaw: false
145
- };
146
- }
147
- async getExtraManipulateQuery(query, filterDto, user) {
148
- const result = await super.getExtraManipulateQuery(query, filterDto, user);
149
- this.applyCompanyFilterToQuery(query, user);
150
- return result;
151
- }
152
- applyComputedFields(data, form, isDraft) {
153
- if (isDraft) {
154
- return data;
155
- }
156
- const schema = form.schema;
157
- const settings = schema?.settings;
158
- const computedFields = settings?.computedFields;
159
- if (!computedFields || computedFields.length === 0) {
160
- return data;
161
- }
162
- const computedValues = (0, _computedfieldutils.calculateComputedFields)(data, computedFields);
163
- return {
164
- ...data,
165
- _computed: computedValues
166
- };
167
- }
168
- convertEntityToResponseDto(entity, _isRaw) {
169
- return {
170
- id: entity.id,
171
- formId: entity.formId,
172
- schemaVersionSnapshot: entity.schemaVersionSnapshot,
173
- schemaVersion: entity.schemaVersion,
174
- data: entity.data,
175
- submittedById: entity.submittedById,
176
- submittedAt: entity.submittedAt,
177
- isDraft: entity.isDraft,
178
- createdAt: entity.createdAt,
179
- updatedAt: entity.updatedAt,
180
- deletedAt: entity.deletedAt,
181
- createdById: entity.createdById,
182
- updatedById: entity.updatedById,
183
- deletedById: entity.deletedById
184
- };
185
- }
186
- // Form Submission
187
- async submitForm(dto, user, isPublic = false) {
188
- await this.ensureDataSourceRepository();
189
- const form = await this.getActiveForm(dto.formId);
190
- await this.validateSubmissionAccess(form, user, isPublic);
191
- const isDraft = dto.isDraft ?? false;
192
- const staleResults = [];
193
- // Handle existing draft for authenticated users
194
- if (user?.id) {
195
- const existingDraft = await this.repository.findOne({
196
- where: this.buildUserDraftWhere(dto.formId, user.id)
197
- });
198
- if (existingDraft) {
199
- if (isDraft) {
200
- Object.assign(existingDraft, {
201
- data: dto.data,
202
- schemaVersionSnapshot: form.schema,
203
- schemaVersion: form.schemaVersion,
204
- submittedAt: new Date()
205
- });
206
- const saved = await this.repository.save(existingDraft);
207
- await this.invalidateResultCache([
208
- saved
209
- ]);
210
- await this.publishSubmissionEvent(saved, dto.formId, true, user);
211
- return this.convertEntityToResponseDto(saved, false);
212
- }
213
- await this.repository.softRemove(existingDraft);
214
- staleResults.push(existingDraft);
215
- }
216
- }
217
- const saved = await this.repository.save({
218
- formId: dto.formId,
219
- schemaVersionSnapshot: form.schema,
220
- schemaVersion: form.schemaVersion,
221
- data: this.applyComputedFields(dto.data, form, isDraft),
222
- submittedById: user?.id ?? null,
223
- submittedAt: new Date(),
224
- isDraft
225
- });
226
- await this.invalidateResultCache([
227
- ...staleResults,
228
- saved
229
- ]);
230
- await this.publishSubmissionEvent(saved, dto.formId, isDraft, user);
231
- return this.convertEntityToResponseDto(saved, false);
232
- }
233
- async getMyDraft(formId, user) {
234
- await this.ensureDataSourceRepository();
235
- const draft = await this.repository.findOne({
236
- where: this.buildUserDraftWhere(formId, user.id),
237
- order: {
238
- updatedAt: 'DESC'
239
- }
240
- });
241
- return draft ? this.convertEntityToResponseDto(draft, false) : null;
242
- }
243
- async updateDraft(draftId, dto, user) {
244
- await this.ensureDataSourceRepository();
245
- const draft = await this.repository.findOne({
246
- where: {
247
- id: draftId,
248
- submittedById: user.id,
249
- deletedAt: (0, _typeorm.IsNull)()
250
- }
251
- });
252
- if (!draft) {
253
- throw new _common.NotFoundException({
254
- message: 'Draft not found',
255
- messageKey: _config.FORM_RESULT_MESSAGES.NOT_FOUND
256
- });
257
- }
258
- const form = await this.getActiveForm(dto.formId);
259
- const isDraft = dto.isDraft ?? false;
260
- Object.assign(draft, {
261
- data: this.applyComputedFields(dto.data, form, isDraft),
262
- schemaVersionSnapshot: form.schema,
263
- schemaVersion: form.schemaVersion,
264
- submittedAt: new Date(),
265
- isDraft
266
- });
267
- const saved = await this.repository.save(draft);
268
- await this.invalidateResultCache([
269
- saved
270
- ]);
271
- await this.publishSubmissionEvent(saved, dto.formId, isDraft, user);
272
- return this.convertEntityToResponseDto(saved, false);
273
- }
274
- async publishSubmissionEvent(result, formId, isDraft, user) {
275
- await this.publishDomainAction(isDraft ? _config.FORM_BUILDER_EVENT_ACTIONS.DRAFT_SAVED : _config.FORM_BUILDER_EVENT_ACTIONS.SUBMITTED, {
276
- ids: [
277
- result.id
278
- ],
279
- data: result,
280
- metadata: {
281
- formId,
282
- isDraft,
283
- schemaVersion: result.schemaVersion
284
- },
285
- user
286
- });
287
- }
288
- async invalidateResultCache(results) {
289
- await Promise.all([
290
- this.clearCacheForAll(),
291
- this.clearCacheForId(results)
292
- ]);
293
- }
294
- async getByFormId(formId, user, pagination) {
295
- await this.ensureDataSourceRepository();
296
- const query = this.repository.createQueryBuilder(this.entityName).where('form_result.formId = :formId', {
297
- formId
298
- }).andWhere('form_result.deletedAt IS NULL');
299
- this.applyCompanyFilterToQuery(query, user);
300
- const page = pagination?.page ?? 0;
301
- const pageSize = pagination?.pageSize ?? 10;
302
- query.skip(page * pageSize).take(pageSize).orderBy('form_result.submittedAt', 'DESC');
303
- const [entities, total] = await query.getManyAndCount();
304
- return {
305
- data: entities.map((e)=>this.convertEntityToResponseDto(e, false)),
306
- total
307
- };
308
- }
309
- async hasUserSubmitted(formId, user) {
310
- await this.ensureDataSourceRepository();
311
- const count = await this.repository.count({
312
- where: {
313
- formId,
314
- submittedById: user.id,
315
- isDraft: false,
316
- deletedAt: (0, _typeorm.IsNull)()
317
- }
318
- });
319
- return count > 0;
320
- }
321
- constructor(cacheManager, utilsService, formBuilderConfig, dataSourceProvider){
322
- super(_config.FORM_BUILDER_EVENT_ENTITIES.FORM_RESULT, cacheManager, utilsService, FormResultService.name, true, _config.FORM_BUILDER_EVENT_MODULE, dataSourceProvider, _entities.FormResult), _define_property(this, "cacheManager", void 0), _define_property(this, "utilsService", void 0), _define_property(this, "formBuilderConfig", void 0), _define_property(this, "dataSourceProvider", void 0), _define_property(this, "formRepository", void 0), this.cacheManager = cacheManager, this.utilsService = utilsService, this.formBuilderConfig = formBuilderConfig, this.dataSourceProvider = dataSourceProvider, this.formRepository = null;
323
- }
324
- };
325
- _ts_decorate([
326
- (0, _decorators.LogAction)({
327
- action: 'formResult.submit',
328
- module: 'form-builder'
329
- }),
330
- _ts_metadata("design:type", Function),
331
- _ts_metadata("design:paramtypes", [
332
- typeof _formresultdto.SubmitFormDto === "undefined" ? Object : _formresultdto.SubmitFormDto,
333
- Object,
334
- void 0
335
- ]),
336
- _ts_metadata("design:returntype", Promise)
337
- ], FormResultService.prototype, "submitForm", null);
338
- _ts_decorate([
339
- (0, _decorators.LogAction)({
340
- action: 'formResult.updateDraft',
341
- module: 'form-builder'
342
- }),
343
- _ts_metadata("design:type", Function),
344
- _ts_metadata("design:paramtypes", [
345
- String,
346
- typeof _formresultdto.SubmitFormDto === "undefined" ? Object : _formresultdto.SubmitFormDto,
347
- typeof _interfaces.ILoggedUserInfo === "undefined" ? Object : _interfaces.ILoggedUserInfo
348
- ]),
349
- _ts_metadata("design:returntype", Promise)
350
- ], FormResultService.prototype, "updateDraft", null);
351
- FormResultService = _ts_decorate([
352
- (0, _common.Injectable)({
353
- scope: _common.Scope.REQUEST
354
- }),
355
- _ts_param(0, (0, _common.Inject)('CACHE_INSTANCE')),
356
- _ts_param(1, (0, _common.Inject)(_modules.UtilsService)),
357
- _ts_param(2, (0, _common.Inject)(_formbuilderconfigservice.FormBuilderConfigService)),
358
- _ts_param(3, (0, _common.Inject)(_formbuilderdatasourceprovider.FormBuilderDataSourceProvider)),
359
- _ts_metadata("design:type", Function),
360
- _ts_metadata("design:paramtypes", [
361
- typeof _classes.HybridCache === "undefined" ? Object : _classes.HybridCache,
362
- typeof _modules.UtilsService === "undefined" ? Object : _modules.UtilsService,
363
- typeof _formbuilderconfigservice.FormBuilderConfigService === "undefined" ? Object : _formbuilderconfigservice.FormBuilderConfigService,
364
- typeof _formbuilderdatasourceprovider.FormBuilderDataSourceProvider === "undefined" ? Object : _formbuilderdatasourceprovider.FormBuilderDataSourceProvider
365
- ])
366
- ], FormResultService);