@flusys/nestjs-form-builder 7.1.0 → 8.0.0-beta.1

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,341 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- Object.defineProperty(exports, "FormService", {
6
- enumerable: true,
7
- get: function() {
8
- return FormService;
9
- }
10
- });
11
- const _nestjscore = require("@flusys/nestjs-core");
12
- const _classes = require("@flusys/nestjs-shared/classes");
13
- const _modules = require("@flusys/nestjs-shared/modules");
14
- const _utils = require("@flusys/nestjs-shared/utils");
15
- const _common = require("@nestjs/common");
16
- const _typeorm = require("typeorm");
17
- const _config = require("../config");
18
- const _entities = require("../entities");
19
- const _formaccesstypeenum = require("../enums/form-access-type.enum");
20
- const _permissionutils = require("../utils/permission.utils");
21
- const _formbuilderconfigservice = require("./form-builder-config.service");
22
- const _formbuilderdatasourceprovider = require("./form-builder-datasource.provider");
23
- function _define_property(obj, key, value) {
24
- if (key in obj) {
25
- Object.defineProperty(obj, key, {
26
- value: value,
27
- enumerable: true,
28
- configurable: true,
29
- writable: true
30
- });
31
- } else {
32
- obj[key] = value;
33
- }
34
- return obj;
35
- }
36
- function _ts_decorate(decorators, target, key, desc) {
37
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
38
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
39
- 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;
40
- return c > 3 && r && Object.defineProperty(target, key, r), r;
41
- }
42
- function _ts_metadata(k, v) {
43
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
44
- }
45
- function _ts_param(paramIndex, decorator) {
46
- return function(target, key) {
47
- decorator(target, key, paramIndex);
48
- };
49
- }
50
- let FormService = class FormService extends _classes.ApiService {
51
- // Entity Conversion
52
- async convertSingleDtoToEntity(dto, user) {
53
- let form = {};
54
- let isUpdate = false;
55
- // NOTE: Using 'id' in dto check instead of instanceof - instanceof may not work after esbuild bundling
56
- if ('id' in dto && dto.id && typeof dto.id === 'string') {
57
- const dbData = await this.repository.findOne({
58
- where: {
59
- id: dto.id
60
- }
61
- });
62
- if (!dbData) {
63
- throw new _common.NotFoundException({
64
- message: 'Form not found',
65
- messageKey: _config.FORM_MESSAGES.NOT_FOUND
66
- });
67
- }
68
- form = dbData;
69
- isUpdate = true;
70
- // Auto-increment schema version if schema changed
71
- if (dto.schema && JSON.stringify(dto.schema) !== JSON.stringify(form.schema)) {
72
- dto.schemaVersion = form.schemaVersion + 1;
73
- }
74
- }
75
- // Merge DTO into form
76
- form = {
77
- ...form,
78
- ...dto
79
- };
80
- // Set company context if enabled
81
- const enableCompanyFeature = this.formBuilderConfig.isCompanyFeatureEnabled();
82
- if (enableCompanyFeature) {
83
- if (isUpdate) {
84
- // During update: Only set companyId if explicitly provided
85
- if (dto.companyId !== undefined) {
86
- form.companyId = dto.companyId;
87
- }
88
- // If companyId is not in form at all, set from user
89
- if (form.companyId === undefined) {
90
- form.companyId = user?.companyId ?? null;
91
- }
92
- } else {
93
- // During creation: Use DTO's companyId if provided, otherwise use user's
94
- form.companyId = dto.companyId ?? user?.companyId ?? null;
95
- }
96
- }
97
- return form;
98
- }
99
- async getSelectQuery(query, _user, select) {
100
- if (!select || !select.length) {
101
- select = [
102
- 'id',
103
- 'name',
104
- 'description',
105
- 'slug',
106
- 'schema',
107
- 'schemaVersion',
108
- 'accessType',
109
- 'actionGroups',
110
- 'tags',
111
- 'isActive',
112
- 'createdAt',
113
- 'updatedAt'
114
- ];
115
- }
116
- const selectFields = select.map((field)=>`${this.entityName}.${field}`);
117
- // Add company context fields if company feature is enabled
118
- if (this.formBuilderConfig.isCompanyFeatureEnabled()) {
119
- selectFields.push('form.companyId');
120
- }
121
- query.select(selectFields);
122
- return {
123
- query,
124
- isRaw: false
125
- };
126
- }
127
- // Supports filtering by one or more tags (array-contains-all) via the generic get-all filter,
128
- // e.g. { filter: { tags: ['survey', 'review'] } }, since tags is a JSON array column.
129
- async getFilterQuery(query, filter, user) {
130
- const { tags, ...rest } = filter;
131
- if (tags !== undefined && tags !== null) {
132
- const tagList = (Array.isArray(tags) ? tags : [
133
- tags
134
- ]).map(String);
135
- if (tagList.length > 0) {
136
- this.applyTagFilter(query, tagList);
137
- }
138
- }
139
- return super.getFilterQuery(query, rest, user);
140
- }
141
- applyTagFilter(query, tags) {
142
- const driver = _nestjscore.envConfig.getTypeOrmConfig().type;
143
- if (driver === 'postgres') {
144
- query.andWhere(`${this.entityName}.tags @> :tagValues::jsonb`, {
145
- tagValues: JSON.stringify(tags)
146
- });
147
- } else if (driver === 'mysql') {
148
- query.andWhere(`JSON_CONTAINS(${this.entityName}.tags, :tagValues)`, {
149
- tagValues: JSON.stringify(tags)
150
- });
151
- } else {
152
- tags.forEach((tag, index)=>{
153
- query.andWhere(`${this.entityName}.tags LIKE :tagValue${index}`, {
154
- [`tagValue${index}`]: `%"${tag}"%`
155
- });
156
- });
157
- }
158
- }
159
- async getExtraManipulateQuery(query, filterDto, user) {
160
- const result = await super.getExtraManipulateQuery(query, filterDto, user);
161
- // Apply company filter using shared utility
162
- (0, _utils.applyCompanyFilter)(query, {
163
- isCompanyFeatureEnabled: this.formBuilderConfig.isCompanyFeatureEnabled(),
164
- entityAlias: 'form'
165
- }, user);
166
- return result;
167
- }
168
- convertEntityToResponseDto(entity, _isRaw) {
169
- // Type guard for company-enabled entity
170
- const entityWithCompany = entity;
171
- return {
172
- id: entity.id,
173
- name: entity.name,
174
- description: entity.description,
175
- slug: entity.slug,
176
- schema: entity.schema,
177
- schemaVersion: entity.schemaVersion,
178
- accessType: entity.accessType,
179
- actionGroups: entity.actionGroups,
180
- tags: entity.tags,
181
- isActive: entity.isActive,
182
- companyId: entityWithCompany.companyId ?? null,
183
- createdAt: entity.createdAt,
184
- updatedAt: entity.updatedAt,
185
- deletedAt: entity.deletedAt,
186
- createdById: entity.createdById,
187
- updatedById: entity.updatedById,
188
- deletedById: entity.deletedById
189
- };
190
- }
191
- toPublicForm(form) {
192
- return {
193
- id: form.id,
194
- name: form.name,
195
- description: form.description,
196
- schema: form.schema,
197
- schemaVersion: form.schemaVersion
198
- };
199
- }
200
- async findPublicActiveForm(where) {
201
- await this.ensureDataSourceRepository();
202
- return await this.repository.findOne({
203
- where: {
204
- ...where,
205
- accessType: _formaccesstypeenum.FormAccessType.PUBLIC,
206
- isActive: true,
207
- deletedAt: (0, _typeorm.IsNull)()
208
- }
209
- });
210
- }
211
- // Public Form Access
212
- async getPublicForm(formId) {
213
- const form = await this.findPublicActiveForm({
214
- id: formId
215
- });
216
- if (!form) {
217
- throw new _common.NotFoundException({
218
- message: 'Form not found or not available for public access',
219
- messageKey: _config.FORM_MESSAGES.NOT_PUBLIC
220
- });
221
- }
222
- return this.toPublicForm(form);
223
- }
224
- async getFormForSubmission(formId, user) {
225
- await this.ensureDataSourceRepository();
226
- const form = await this.repository.findOne({
227
- where: {
228
- id: formId,
229
- isActive: true,
230
- deletedAt: (0, _typeorm.IsNull)()
231
- }
232
- });
233
- if (!form) {
234
- throw new _common.NotFoundException({
235
- message: 'Form not found or inactive',
236
- messageKey: _config.FORM_MESSAGES.NOT_FOUND
237
- });
238
- }
239
- // Access validation based on accessType
240
- if (form.accessType === _formaccesstypeenum.FormAccessType.PUBLIC) {
241
- return form; // Anyone can access
242
- }
243
- // All non-public forms require authentication
244
- if (!user) {
245
- throw new _common.UnauthorizedException({
246
- message: 'Authentication required to submit this form',
247
- messageKey: _config.FORM_MESSAGES.AUTH_REQUIRED
248
- });
249
- }
250
- if (form.accessType === _formaccesstypeenum.FormAccessType.AUTHENTICATED || form.accessType === _formaccesstypeenum.FormAccessType.ACTION_GROUP) {
251
- return form; // Permission check for ACTION_GROUP is handled by the controller/guard
252
- }
253
- throw new _common.BadRequestException({
254
- message: 'Invalid access type',
255
- messageKey: _config.FORM_MESSAGES.INVALID_ACCESS_TYPE
256
- });
257
- }
258
- async getBySlug(slug) {
259
- await this.ensureDataSourceRepository();
260
- const form = await this.repository.findOne({
261
- where: {
262
- slug,
263
- deletedAt: (0, _typeorm.IsNull)()
264
- }
265
- });
266
- return form ? this.convertEntityToResponseDto(form, false) : null;
267
- }
268
- /**
269
- * Get public form by slug (no authentication required)
270
- * Returns null if form doesn't exist, is not public, or is inactive
271
- */ async getPublicFormBySlug(slug) {
272
- const form = await this.findPublicActiveForm({
273
- slug
274
- });
275
- return form ? this.toPublicForm(form) : null;
276
- }
277
- async getFormAccessInfo(formId) {
278
- await this.ensureDataSourceRepository();
279
- const form = await this.repository.findOne({
280
- where: {
281
- id: formId,
282
- deletedAt: (0, _typeorm.IsNull)()
283
- },
284
- select: [
285
- 'id',
286
- 'name',
287
- 'description',
288
- 'accessType',
289
- 'actionGroups',
290
- 'isActive'
291
- ]
292
- });
293
- if (!form) {
294
- throw new _common.NotFoundException({
295
- message: 'Form not found',
296
- messageKey: _config.FORM_MESSAGES.NOT_FOUND
297
- });
298
- }
299
- return {
300
- id: form.id,
301
- name: form.name,
302
- description: form.description,
303
- accessType: form.accessType,
304
- actionGroups: form.actionGroups,
305
- isActive: form.isActive
306
- };
307
- }
308
- async getAuthenticatedForm(formId, user) {
309
- const form = await this.getFormForSubmission(formId, user);
310
- // For action_group access, check permissions from cache
311
- if (form.accessType === _formaccesstypeenum.FormAccessType.ACTION_GROUP && form.actionGroups?.length) {
312
- const hasPermission = await (0, _permissionutils.validateUserPermissions)(user, form.actionGroups, this.cacheManager, this.formBuilderConfig.isCompanyFeatureEnabled());
313
- if (!hasPermission) {
314
- throw new _common.ForbiddenException({
315
- message: 'You do not have permission to access this form',
316
- messageKey: _config.FORM_MESSAGES.ACCESS_DENIED
317
- });
318
- }
319
- }
320
- return this.toPublicForm(form);
321
- }
322
- constructor(cacheManager, utilsService, formBuilderConfig, dataSourceProvider){
323
- super(_config.FORM_BUILDER_EVENT_ENTITIES.FORM, cacheManager, utilsService, FormService.name, true, _config.FORM_BUILDER_EVENT_MODULE, dataSourceProvider, formBuilderConfig.isCompanyFeatureEnabled() ? _entities.FormWithCompany : _entities.Form), _define_property(this, "cacheManager", void 0), _define_property(this, "utilsService", void 0), _define_property(this, "formBuilderConfig", void 0), this.cacheManager = cacheManager, this.utilsService = utilsService, this.formBuilderConfig = formBuilderConfig;
324
- }
325
- };
326
- FormService = _ts_decorate([
327
- (0, _common.Injectable)({
328
- scope: _common.Scope.REQUEST
329
- }),
330
- _ts_param(0, (0, _common.Inject)('CACHE_INSTANCE')),
331
- _ts_param(1, (0, _common.Inject)(_modules.UtilsService)),
332
- _ts_param(2, (0, _common.Inject)(_formbuilderconfigservice.FormBuilderConfigService)),
333
- _ts_param(3, (0, _common.Inject)(_formbuilderdatasourceprovider.FormBuilderDataSourceProvider)),
334
- _ts_metadata("design:type", Function),
335
- _ts_metadata("design:paramtypes", [
336
- typeof _classes.HybridCache === "undefined" ? Object : _classes.HybridCache,
337
- typeof _modules.UtilsService === "undefined" ? Object : _modules.UtilsService,
338
- typeof _formbuilderconfigservice.FormBuilderConfigService === "undefined" ? Object : _formbuilderconfigservice.FormBuilderConfigService,
339
- typeof _formbuilderdatasourceprovider.FormBuilderDataSourceProvider === "undefined" ? Object : _formbuilderdatasourceprovider.FormBuilderDataSourceProvider
340
- ])
341
- ], FormService);