@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.
- package/config/index.d.ts +3 -3
- package/controllers/form-result.controller.d.ts +3 -3
- package/controllers/form.controller.d.ts +3 -3
- package/controllers/index.d.ts +2 -2
- package/docs/form-builder-swagger.config.d.ts +2 -2
- package/docs/index.d.ts +1 -1
- package/dtos/form.dto.d.ts +1 -1
- package/dtos/index.d.ts +2 -2
- package/entities/form-with-company.entity.d.ts +1 -1
- package/entities/form.entity.d.ts +1 -1
- package/entities/index.d.ts +7 -7
- package/enums/index.d.ts +1 -1
- package/fesm/262.js +1841 -0
- package/fesm/98.js +807 -0
- package/fesm/config/index.js +98 -3
- package/fesm/controllers/index.js +14 -2
- package/fesm/docs/index.js +171 -1
- package/fesm/dtos/index.js +571 -2
- package/fesm/entities/index.js +342 -10
- package/fesm/enums/index.js +38 -1
- package/fesm/index.js +482 -10
- package/fesm/interfaces/index.js +17 -3
- package/fesm/modules/index.js +178 -1
- package/fesm/runtime.js +85 -0
- package/fesm/services/index.js +35 -4
- package/index.d.ts +10 -10
- package/interfaces/form-builder-module.interface.d.ts +3 -3
- package/interfaces/form-result.interface.d.ts +1 -1
- package/interfaces/form.interface.d.ts +2 -2
- package/interfaces/index.d.ts +3 -3
- package/modules/form-builder.module.d.ts +2 -2
- package/modules/index.d.ts +1 -1
- package/package.json +26 -36
- package/services/form-builder-config.service.d.ts +4 -4
- package/services/form-builder-datasource.provider.d.ts +3 -3
- package/services/form-result.service.d.ts +6 -6
- package/services/form.service.d.ts +7 -7
- package/services/index.d.ts +4 -4
- package/utils/index.d.ts +2 -2
- package/utils/permission.utils.d.ts +1 -1
- package/cjs/config/event-actions.js +0 -33
- package/cjs/config/form-builder.constants.js +0 -13
- package/cjs/config/index.js +0 -20
- package/cjs/config/message-keys.js +0 -38
- package/cjs/controllers/form-result.controller.js +0 -281
- package/cjs/controllers/form-result.controller.spec.js +0 -257
- package/cjs/controllers/form.controller.js +0 -231
- package/cjs/controllers/form.controller.spec.js +0 -212
- package/cjs/controllers/index.js +0 -19
- package/cjs/docs/form-builder-swagger.config.js +0 -150
- package/cjs/docs/form-builder-swagger.config.spec.js +0 -75
- package/cjs/docs/index.js +0 -11
- package/cjs/dtos/form-result.dto.js +0 -248
- package/cjs/dtos/form.dto.js +0 -270
- package/cjs/dtos/index.js +0 -19
- package/cjs/entities/form-result.entity.js +0 -100
- package/cjs/entities/form-with-company.entity.js +0 -65
- package/cjs/entities/form.entity.js +0 -127
- package/cjs/entities/index.js +0 -52
- package/cjs/entities/index.spec.js +0 -18
- package/cjs/enums/form-access-type.enum.js +0 -19
- package/cjs/enums/index.js +0 -18
- package/cjs/index.js +0 -28
- package/cjs/interfaces/form-builder-module.interface.js +0 -4
- package/cjs/interfaces/form-result.interface.js +0 -4
- package/cjs/interfaces/form.interface.js +0 -4
- package/cjs/interfaces/index.js +0 -20
- package/cjs/modules/form-builder.module.js +0 -136
- package/cjs/modules/form-builder.module.spec.js +0 -133
- package/cjs/modules/index.js +0 -18
- package/cjs/services/form-builder-config.service.js +0 -69
- package/cjs/services/form-builder-config.service.spec.js +0 -121
- package/cjs/services/form-builder-datasource.provider.js +0 -125
- package/cjs/services/form-builder-datasource.provider.spec.js +0 -147
- package/cjs/services/form-result.service.js +0 -366
- package/cjs/services/form-result.service.spec.js +0 -823
- package/cjs/services/form.service.js +0 -341
- package/cjs/services/form.service.spec.js +0 -746
- package/cjs/services/index.js +0 -21
- package/cjs/utils/computed-field.utils.js +0 -199
- package/cjs/utils/computed-field.utils.spec.js +0 -1205
- package/cjs/utils/index.js +0 -19
- package/cjs/utils/permission.utils.js +0 -44
- package/cjs/utils/permission.utils.spec.js +0 -118
- package/fesm/config/event-actions.js +0 -12
- package/fesm/config/form-builder.constants.js +0 -3
- package/fesm/config/message-keys.js +0 -20
- package/fesm/controllers/form-result.controller.js +0 -271
- package/fesm/controllers/form-result.controller.spec.js +0 -253
- package/fesm/controllers/form.controller.js +0 -221
- package/fesm/controllers/form.controller.spec.js +0 -208
- package/fesm/docs/form-builder-swagger.config.js +0 -146
- package/fesm/docs/form-builder-swagger.config.spec.js +0 -71
- package/fesm/dtos/form-result.dto.js +0 -215
- package/fesm/dtos/form.dto.js +0 -243
- package/fesm/entities/form-result.entity.js +0 -90
- package/fesm/entities/form-with-company.entity.js +0 -55
- package/fesm/entities/form.entity.js +0 -117
- package/fesm/entities/index.spec.js +0 -14
- package/fesm/enums/form-access-type.enum.js +0 -9
- package/fesm/interfaces/form-builder-module.interface.js +0 -3
- package/fesm/interfaces/form-result.interface.js +0 -6
- package/fesm/interfaces/form.interface.js +0 -3
- package/fesm/modules/form-builder.module.js +0 -126
- package/fesm/modules/form-builder.module.spec.js +0 -129
- package/fesm/services/form-builder-config.service.js +0 -59
- package/fesm/services/form-builder-config.service.spec.js +0 -117
- package/fesm/services/form-builder-datasource.provider.js +0 -74
- package/fesm/services/form-builder-datasource.provider.spec.js +0 -143
- package/fesm/services/form-result.service.js +0 -356
- package/fesm/services/form-result.service.spec.js +0 -778
- package/fesm/services/form.service.js +0 -331
- package/fesm/services/form.service.spec.js +0 -701
- package/fesm/utils/computed-field.utils.js +0 -195
- package/fesm/utils/computed-field.utils.spec.js +0 -1201
- package/fesm/utils/index.js +0 -2
- package/fesm/utils/permission.utils.js +0 -42
- package/fesm/utils/permission.utils.spec.js +0 -114
package/cjs/config/index.js
DELETED
|
@@ -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
|
-
});
|