@flusys/nestjs-form-builder 7.0.2 → 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,20 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- _export_star(require("./event-actions"), exports);
6
- _export_star(require("./form-builder.constants"), exports);
7
- _export_star(require("./message-keys"), exports);
8
- function _export_star(from, to) {
9
- Object.keys(from).forEach(function(k) {
10
- if (k !== "default" && !Object.prototype.hasOwnProperty.call(to, k)) {
11
- Object.defineProperty(to, k, {
12
- enumerable: true,
13
- get: function() {
14
- return from[k];
15
- }
16
- });
17
- }
18
- });
19
- return from;
20
- }
@@ -1,38 +0,0 @@
1
- // ==================== FORM BUILDER MODULE MESSAGE KEYS ====================
2
- "use strict";
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- function _export(target, all) {
7
- for(var name in all)Object.defineProperty(target, name, {
8
- enumerable: true,
9
- get: Object.getOwnPropertyDescriptor(all, name).get
10
- });
11
- }
12
- _export(exports, {
13
- get FORM_MESSAGES () {
14
- return FORM_MESSAGES;
15
- },
16
- get FORM_RESULT_MESSAGES () {
17
- return FORM_RESULT_MESSAGES;
18
- }
19
- });
20
- const FORM_MESSAGES = {
21
- NOT_FOUND: 'form.not.found',
22
- NOT_PUBLIC: 'form.not.public',
23
- AUTH_REQUIRED: 'form.auth.required',
24
- ACCESS_DENIED: 'form.access.denied',
25
- INVALID_ACCESS_TYPE: 'form.invalid.access.type',
26
- PERMISSION_CHECK_FAILED: 'form.permission.check.failed',
27
- GET_SUCCESS: 'form.get.success',
28
- GET_ACCESS_INFO_SUCCESS: 'form.get.access.info.success'
29
- };
30
- const FORM_RESULT_MESSAGES = {
31
- GET_ALL_SUCCESS: 'form.result.get.all.success',
32
- NOT_FOUND: 'form.result.not.found',
33
- HAS_SUBMITTED_SUCCESS: 'form.result.has.submitted.success',
34
- HAS_NOT_SUBMITTED_SUCCESS: 'form.result.has.not.submitted.success',
35
- SUBMIT_SUCCESS: 'form.result.submit.success',
36
- DRAFT_GET_SUCCESS: 'form.result.draft.get.success',
37
- DRAFT_UPDATE_SUCCESS: 'form.result.draft.update.success'
38
- };
@@ -1,281 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- Object.defineProperty(exports, "FormResultController", {
6
- enumerable: true,
7
- get: function() {
8
- return FormResultController;
9
- }
10
- });
11
- const _classes = require("@flusys/nestjs-shared/classes");
12
- const _decorators = require("@flusys/nestjs-shared/decorators");
13
- const _guards = require("@flusys/nestjs-shared/guards");
14
- const _interfaces = require("@flusys/nestjs-shared/interfaces");
15
- const _common = require("@nestjs/common");
16
- const _swagger = require("@nestjs/swagger");
17
- const _config = require("../config");
18
- const _dtos = require("../dtos");
19
- const _formresultservice = require("../services/form-result.service");
20
- function _define_property(obj, key, value) {
21
- if (key in obj) {
22
- Object.defineProperty(obj, key, {
23
- value: value,
24
- enumerable: true,
25
- configurable: true,
26
- writable: true
27
- });
28
- } else {
29
- obj[key] = value;
30
- }
31
- return obj;
32
- }
33
- function _ts_decorate(decorators, target, key, desc) {
34
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
35
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
36
- 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;
37
- return c > 3 && r && Object.defineProperty(target, key, r), r;
38
- }
39
- function _ts_metadata(k, v) {
40
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
41
- }
42
- function _ts_param(paramIndex, decorator) {
43
- return function(target, key) {
44
- decorator(target, key, paramIndex);
45
- };
46
- }
47
- let FormResultController = class FormResultController extends (0, _classes.createApiController)(_dtos.CreateFormResultDto, _dtos.UpdateFormResultDto, _dtos.FormResultResponseDto, {
48
- entityName: 'form.result',
49
- security: {
50
- insert: {
51
- level: 'permission',
52
- permissions: [
53
- _classes.FORM_RESULT_PERMISSIONS.CREATE
54
- ]
55
- },
56
- insertMany: {
57
- level: 'permission',
58
- permissions: [
59
- _classes.FORM_RESULT_PERMISSIONS.CREATE
60
- ]
61
- },
62
- getById: {
63
- level: 'permission',
64
- permissions: [
65
- _classes.FORM_RESULT_PERMISSIONS.READ
66
- ]
67
- },
68
- getAll: {
69
- level: 'permission',
70
- permissions: [
71
- _classes.FORM_RESULT_PERMISSIONS.READ
72
- ]
73
- },
74
- update: {
75
- level: 'permission',
76
- permissions: [
77
- _classes.FORM_RESULT_PERMISSIONS.UPDATE
78
- ]
79
- },
80
- updateMany: {
81
- level: 'permission',
82
- permissions: [
83
- _classes.FORM_RESULT_PERMISSIONS.UPDATE
84
- ]
85
- },
86
- delete: {
87
- level: 'permission',
88
- permissions: [
89
- _classes.FORM_RESULT_PERMISSIONS.DELETE
90
- ]
91
- }
92
- }
93
- }) {
94
- // Submit Endpoints
95
- /**
96
- * Submit form with authentication
97
- */ async submitForm(dto, user) {
98
- const data = await this.formResultService.submitForm(dto, user, false);
99
- return {
100
- success: true,
101
- message: 'Form submitted successfully',
102
- messageKey: _config.FORM_RESULT_MESSAGES.SUBMIT_SUCCESS,
103
- data
104
- };
105
- }
106
- async submitPublicForm(dto) {
107
- const data = await this.formResultService.submitForm(dto, null, true);
108
- return {
109
- success: true,
110
- message: 'Form submitted successfully',
111
- messageKey: _config.FORM_RESULT_MESSAGES.SUBMIT_SUCCESS,
112
- data
113
- };
114
- }
115
- // Draft Endpoints
116
- async getMyDraft(dto, user) {
117
- const data = await this.formResultService.getMyDraft(dto.formId, user);
118
- return {
119
- success: true,
120
- message: 'Draft retrieved',
121
- messageKey: _config.FORM_RESULT_MESSAGES.DRAFT_GET_SUCCESS,
122
- data
123
- };
124
- }
125
- async updateDraft(dto, user) {
126
- const data = await this.formResultService.updateDraft(dto.draftId, dto, user);
127
- return {
128
- success: true,
129
- message: 'Draft updated successfully',
130
- messageKey: _config.FORM_RESULT_MESSAGES.DRAFT_UPDATE_SUCCESS,
131
- data
132
- };
133
- }
134
- // Query Endpoints
135
- /**
136
- * Get results by form ID with pagination
137
- */ async getByFormId(dto, user) {
138
- const page = dto.page ?? 0;
139
- const pageSize = dto.pageSize ?? 10;
140
- const result = await this.formResultService.getByFormId(dto.formId, user, {
141
- page,
142
- pageSize
143
- });
144
- return {
145
- success: true,
146
- message: 'Form results retrieved successfully',
147
- messageKey: _config.FORM_RESULT_MESSAGES.GET_ALL_SUCCESS,
148
- data: result.data,
149
- meta: {
150
- total: result.total,
151
- page,
152
- pageSize,
153
- count: result.data.length
154
- }
155
- };
156
- }
157
- /**
158
- * Check if current user has already submitted this form (non-draft)
159
- * Used for single response mode
160
- */ async hasUserSubmitted(dto, user) {
161
- const hasSubmitted = await this.formResultService.hasUserSubmitted(dto.formId, user);
162
- return {
163
- success: true,
164
- message: hasSubmitted ? 'User has submitted this form' : 'User has not submitted this form',
165
- messageKey: hasSubmitted ? _config.FORM_RESULT_MESSAGES.HAS_SUBMITTED_SUCCESS : _config.FORM_RESULT_MESSAGES.HAS_NOT_SUBMITTED_SUCCESS,
166
- data: hasSubmitted
167
- };
168
- }
169
- constructor(formResultService){
170
- super(formResultService), _define_property(this, "formResultService", void 0), this.formResultService = formResultService;
171
- }
172
- };
173
- _ts_decorate([
174
- (0, _common.Post)('submit'),
175
- (0, _common.UseGuards)(_guards.JwtAuthGuard),
176
- (0, _swagger.ApiBearerAuth)(),
177
- (0, _common.HttpCode)(_common.HttpStatus.CREATED),
178
- (0, _swagger.ApiOperation)({
179
- summary: 'Submit form result (authenticated)'
180
- }),
181
- _ts_param(0, (0, _common.Body)()),
182
- _ts_param(1, (0, _decorators.CurrentUser)()),
183
- _ts_metadata("design:type", Function),
184
- _ts_metadata("design:paramtypes", [
185
- typeof _dtos.SubmitFormDto === "undefined" ? Object : _dtos.SubmitFormDto,
186
- typeof _interfaces.ILoggedUserInfo === "undefined" ? Object : _interfaces.ILoggedUserInfo
187
- ]),
188
- _ts_metadata("design:returntype", Promise)
189
- ], FormResultController.prototype, "submitForm", null);
190
- _ts_decorate([
191
- (0, _common.Post)('submit-public'),
192
- (0, _decorators.Public)(),
193
- (0, _common.HttpCode)(_common.HttpStatus.CREATED),
194
- (0, _swagger.ApiOperation)({
195
- summary: 'Submit public form (no auth required)'
196
- }),
197
- _ts_param(0, (0, _common.Body)()),
198
- _ts_metadata("design:type", Function),
199
- _ts_metadata("design:paramtypes", [
200
- typeof _dtos.SubmitFormDto === "undefined" ? Object : _dtos.SubmitFormDto
201
- ]),
202
- _ts_metadata("design:returntype", Promise)
203
- ], FormResultController.prototype, "submitPublicForm", null);
204
- _ts_decorate([
205
- (0, _common.Post)('my-draft'),
206
- (0, _common.UseGuards)(_guards.JwtAuthGuard),
207
- (0, _swagger.ApiBearerAuth)(),
208
- (0, _common.HttpCode)(_common.HttpStatus.OK),
209
- (0, _swagger.ApiOperation)({
210
- summary: 'Get my draft for a form'
211
- }),
212
- _ts_param(0, (0, _common.Body)()),
213
- _ts_param(1, (0, _decorators.CurrentUser)()),
214
- _ts_metadata("design:type", Function),
215
- _ts_metadata("design:paramtypes", [
216
- typeof _dtos.GetMyDraftDto === "undefined" ? Object : _dtos.GetMyDraftDto,
217
- typeof _interfaces.ILoggedUserInfo === "undefined" ? Object : _interfaces.ILoggedUserInfo
218
- ]),
219
- _ts_metadata("design:returntype", Promise)
220
- ], FormResultController.prototype, "getMyDraft", null);
221
- _ts_decorate([
222
- (0, _common.Post)('update-draft'),
223
- (0, _common.UseGuards)(_guards.JwtAuthGuard),
224
- (0, _swagger.ApiBearerAuth)(),
225
- (0, _common.HttpCode)(_common.HttpStatus.OK),
226
- (0, _swagger.ApiOperation)({
227
- summary: 'Update existing draft'
228
- }),
229
- _ts_param(0, (0, _common.Body)()),
230
- _ts_param(1, (0, _decorators.CurrentUser)()),
231
- _ts_metadata("design:type", Function),
232
- _ts_metadata("design:paramtypes", [
233
- typeof _dtos.UpdateDraftDto === "undefined" ? Object : _dtos.UpdateDraftDto,
234
- typeof _interfaces.ILoggedUserInfo === "undefined" ? Object : _interfaces.ILoggedUserInfo
235
- ]),
236
- _ts_metadata("design:returntype", Promise)
237
- ], FormResultController.prototype, "updateDraft", null);
238
- _ts_decorate([
239
- (0, _common.Post)('by-form'),
240
- (0, _common.UseGuards)(_guards.JwtAuthGuard, _guards.PermissionGuard),
241
- (0, _swagger.ApiBearerAuth)(),
242
- (0, _decorators.RequirePermission)(_classes.FORM_RESULT_PERMISSIONS.READ),
243
- (0, _common.HttpCode)(_common.HttpStatus.OK),
244
- (0, _swagger.ApiOperation)({
245
- summary: 'Get results by form ID'
246
- }),
247
- _ts_param(0, (0, _common.Body)()),
248
- _ts_param(1, (0, _decorators.CurrentUser)()),
249
- _ts_metadata("design:type", Function),
250
- _ts_metadata("design:paramtypes", [
251
- typeof _dtos.GetResultsByFormDto === "undefined" ? Object : _dtos.GetResultsByFormDto,
252
- typeof _interfaces.ILoggedUserInfo === "undefined" ? Object : _interfaces.ILoggedUserInfo
253
- ]),
254
- _ts_metadata("design:returntype", Promise)
255
- ], FormResultController.prototype, "getByFormId", null);
256
- _ts_decorate([
257
- (0, _common.Post)('has-submitted'),
258
- (0, _common.UseGuards)(_guards.JwtAuthGuard),
259
- (0, _swagger.ApiBearerAuth)(),
260
- (0, _common.HttpCode)(_common.HttpStatus.OK),
261
- (0, _swagger.ApiOperation)({
262
- summary: 'Check if user has submitted form'
263
- }),
264
- _ts_param(0, (0, _common.Body)()),
265
- _ts_param(1, (0, _decorators.CurrentUser)()),
266
- _ts_metadata("design:type", Function),
267
- _ts_metadata("design:paramtypes", [
268
- typeof _dtos.GetMyDraftDto === "undefined" ? Object : _dtos.GetMyDraftDto,
269
- typeof _interfaces.ILoggedUserInfo === "undefined" ? Object : _interfaces.ILoggedUserInfo
270
- ]),
271
- _ts_metadata("design:returntype", Promise)
272
- ], FormResultController.prototype, "hasUserSubmitted", null);
273
- FormResultController = _ts_decorate([
274
- (0, _swagger.ApiTags)('Form Builder - Results'),
275
- (0, _common.Controller)('form-builder/result'),
276
- _ts_param(0, (0, _common.Inject)(_formresultservice.FormResultService)),
277
- _ts_metadata("design:type", Function),
278
- _ts_metadata("design:paramtypes", [
279
- typeof _formresultservice.FormResultService === "undefined" ? Object : _formresultservice.FormResultService
280
- ])
281
- ], FormResultController);
@@ -1,257 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- const _testing = require("@nestjs/testing");
6
- const _modules = require("@flusys/nestjs-shared/modules");
7
- const _loggedusermock = require("@test-utils/mocks/logged-user.mock");
8
- const _formresultcontroller = require("./form-result.controller");
9
- const _formresultservice = require("../services/form-result.service");
10
- function buildResultDto(overrides = {}) {
11
- return {
12
- id: 'result-1',
13
- formId: 'form-1',
14
- schemaVersionSnapshot: {
15
- sections: []
16
- },
17
- schemaVersion: 1,
18
- data: {
19
- field1: 'value1'
20
- },
21
- submittedById: 'user-uuid-1',
22
- submittedAt: new Date(),
23
- isDraft: false,
24
- createdAt: new Date(),
25
- updatedAt: new Date(),
26
- deletedAt: null,
27
- createdById: null,
28
- updatedById: null,
29
- deletedById: null,
30
- ...overrides
31
- };
32
- }
33
- describe('FormResultController', ()=>{
34
- let controller;
35
- let mockService;
36
- beforeEach(async ()=>{
37
- mockService = {
38
- insert: jest.fn(),
39
- insertMany: jest.fn(),
40
- findById: jest.fn(),
41
- findByIds: jest.fn(),
42
- getAll: jest.fn(),
43
- update: jest.fn(),
44
- updateMany: jest.fn(),
45
- delete: jest.fn(),
46
- submitForm: jest.fn(),
47
- getMyDraft: jest.fn(),
48
- updateDraft: jest.fn(),
49
- getByFormId: jest.fn(),
50
- hasUserSubmitted: jest.fn()
51
- };
52
- const module = await _testing.Test.createTestingModule({
53
- controllers: [
54
- _formresultcontroller.FormResultController
55
- ],
56
- // UtilsService is a real (dependency-free) provider — required to satisfy the
57
- // Slug interceptor applied by the inherited insert/update endpoints.
58
- providers: [
59
- {
60
- provide: _formresultservice.FormResultService,
61
- useValue: mockService
62
- },
63
- _modules.UtilsService
64
- ]
65
- }).compile();
66
- controller = module.get(_formresultcontroller.FormResultController);
67
- });
68
- afterEach(()=>{
69
- jest.clearAllMocks();
70
- });
71
- describe('submitForm', ()=>{
72
- it('submits on behalf of the authenticated user (isPublic=false)', async ()=>{
73
- const user = (0, _loggedusermock.buildMockUser)();
74
- mockService.submitForm.mockResolvedValue(buildResultDto());
75
- const result = await controller.submitForm({
76
- formId: 'form-1',
77
- data: {
78
- field1: 'value1'
79
- }
80
- }, user);
81
- expect(mockService.submitForm).toHaveBeenCalledWith({
82
- formId: 'form-1',
83
- data: {
84
- field1: 'value1'
85
- }
86
- }, user, false);
87
- expect(result).toEqual({
88
- success: true,
89
- message: 'Form submitted successfully',
90
- messageKey: 'form.result.submit.success',
91
- data: expect.objectContaining({
92
- id: 'result-1'
93
- })
94
- });
95
- });
96
- it('propagates errors from the service (e.g. permission denied)', async ()=>{
97
- mockService.submitForm.mockRejectedValue(Object.assign(new Error('denied'), {
98
- messageKey: 'form.access.denied'
99
- }));
100
- await expect(controller.submitForm({
101
- formId: 'form-1',
102
- data: {}
103
- }, (0, _loggedusermock.buildMockUser)())).rejects.toThrow();
104
- });
105
- });
106
- describe('submitPublicForm', ()=>{
107
- it('submits without a user and marks the submission as public', async ()=>{
108
- mockService.submitForm.mockResolvedValue(buildResultDto({
109
- submittedById: null
110
- }));
111
- const result = await controller.submitPublicForm({
112
- formId: 'form-1',
113
- data: {}
114
- });
115
- expect(mockService.submitForm).toHaveBeenCalledWith({
116
- formId: 'form-1',
117
- data: {}
118
- }, null, true);
119
- expect(result.data.submittedById).toBeNull();
120
- });
121
- });
122
- describe('getMyDraft', ()=>{
123
- it('returns the current draft for the user', async ()=>{
124
- const user = (0, _loggedusermock.buildMockUser)();
125
- mockService.getMyDraft.mockResolvedValue(buildResultDto({
126
- isDraft: true
127
- }));
128
- const result = await controller.getMyDraft({
129
- formId: 'form-1'
130
- }, user);
131
- expect(mockService.getMyDraft).toHaveBeenCalledWith('form-1', user);
132
- expect(result.data?.isDraft).toBe(true);
133
- });
134
- it('returns null data when no draft exists', async ()=>{
135
- mockService.getMyDraft.mockResolvedValue(null);
136
- const result = await controller.getMyDraft({
137
- formId: 'form-1'
138
- }, (0, _loggedusermock.buildMockUser)());
139
- expect(result.data).toBeNull();
140
- });
141
- });
142
- describe('updateDraft', ()=>{
143
- it('updates the identified draft', async ()=>{
144
- const user = (0, _loggedusermock.buildMockUser)();
145
- mockService.updateDraft.mockResolvedValue(buildResultDto({
146
- isDraft: true
147
- }));
148
- const result = await controller.updateDraft({
149
- draftId: 'draft-1',
150
- formId: 'form-1',
151
- data: {
152
- field1: 'new'
153
- }
154
- }, user);
155
- expect(mockService.updateDraft).toHaveBeenCalledWith('draft-1', {
156
- draftId: 'draft-1',
157
- formId: 'form-1',
158
- data: {
159
- field1: 'new'
160
- }
161
- }, user);
162
- expect(result.success).toBe(true);
163
- });
164
- });
165
- describe('getByFormId', ()=>{
166
- it('returns paginated results with the requested page/pageSize', async ()=>{
167
- mockService.getByFormId.mockResolvedValue({
168
- data: [
169
- buildResultDto()
170
- ],
171
- total: 1
172
- });
173
- const result = await controller.getByFormId({
174
- formId: 'form-1',
175
- page: 1,
176
- pageSize: 5
177
- }, (0, _loggedusermock.buildMockUser)());
178
- expect(mockService.getByFormId).toHaveBeenCalledWith('form-1', expect.any(Object), {
179
- page: 1,
180
- pageSize: 5
181
- });
182
- expect(result.meta).toEqual({
183
- total: 1,
184
- page: 1,
185
- pageSize: 5,
186
- count: 1
187
- });
188
- });
189
- it('defaults to page 0 and pageSize 10 when not provided', async ()=>{
190
- mockService.getByFormId.mockResolvedValue({
191
- data: [],
192
- total: 0
193
- });
194
- const result = await controller.getByFormId({
195
- formId: 'form-1'
196
- }, (0, _loggedusermock.buildMockUser)());
197
- expect(mockService.getByFormId).toHaveBeenCalledWith('form-1', expect.any(Object), {
198
- page: 0,
199
- pageSize: 10
200
- });
201
- expect(result.meta).toEqual({
202
- total: 0,
203
- page: 0,
204
- pageSize: 10,
205
- count: 0
206
- });
207
- });
208
- });
209
- describe('hasUserSubmitted', ()=>{
210
- it('returns a truthy submitted message when the user has submitted', async ()=>{
211
- mockService.hasUserSubmitted.mockResolvedValue(true);
212
- const result = await controller.hasUserSubmitted({
213
- formId: 'form-1'
214
- }, (0, _loggedusermock.buildMockUser)());
215
- expect(result).toEqual({
216
- success: true,
217
- message: 'User has submitted this form',
218
- messageKey: 'form.result.has.submitted.success',
219
- data: true
220
- });
221
- });
222
- it('returns a not-submitted message when the user has not submitted', async ()=>{
223
- mockService.hasUserSubmitted.mockResolvedValue(false);
224
- const result = await controller.hasUserSubmitted({
225
- formId: 'form-1'
226
- }, (0, _loggedusermock.buildMockUser)());
227
- expect(result).toEqual({
228
- success: true,
229
- message: 'User has not submitted this form',
230
- messageKey: 'form.result.has.not.submitted.success',
231
- data: false
232
- });
233
- });
234
- });
235
- // ==========================================================================
236
- // Inherited base CRUD wiring (createApiController)
237
- // ==========================================================================
238
- describe('inherited CRUD endpoints', ()=>{
239
- it('delete delegates to FormResultService.delete', async ()=>{
240
- mockService.delete.mockResolvedValue(null);
241
- const user = (0, _loggedusermock.buildMockUser)();
242
- const result = await controller.delete({
243
- id: [
244
- 'result-1'
245
- ],
246
- type: 'delete'
247
- }, user);
248
- expect(mockService.delete).toHaveBeenCalledWith({
249
- id: [
250
- 'result-1'
251
- ],
252
- type: 'delete'
253
- }, user);
254
- expect(result.success).toBe(true);
255
- });
256
- });
257
- });