@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,146 +0,0 @@
1
- /** Schema properties to exclude when company feature is disabled */ const COMPANY_SCHEMA_EXCLUSIONS = [
2
- {
3
- schemaName: 'CreateFormDto',
4
- properties: [
5
- 'companyId'
6
- ]
7
- },
8
- {
9
- schemaName: 'UpdateFormDto',
10
- properties: [
11
- 'companyId'
12
- ]
13
- },
14
- {
15
- schemaName: 'FormQueryDto',
16
- properties: [
17
- 'companyId'
18
- ]
19
- },
20
- {
21
- schemaName: 'FormResponseDto',
22
- properties: [
23
- 'companyId'
24
- ]
25
- }
26
- ];
27
- /**
28
- * Form Builder Module Swagger Configuration
29
- * Use this with setupSwaggerDocs() from @flusys/nestjs-core
30
- *
31
- * @param bootstrapConfig - Bootstrap configuration to determine feature visibility
32
- * @returns Swagger configuration with appropriate excludeSchemaProperties based on enableCompanyFeature
33
- */ export function formBuilderSwaggerConfig(bootstrapConfig) {
34
- const enableCompanyFeature = bootstrapConfig?.enableCompanyFeature ?? true;
35
- const isMultiTenant = bootstrapConfig?.databaseMode === 'multi-tenant';
36
- const multiTenantNote = isMultiTenant ? `\n> **Multi-Tenant Mode**: Include \`x-tenant-id\` header to target a specific tenant database.\n` : '';
37
- return {
38
- title: 'Form Builder API',
39
- description: `
40
- # Form Builder API
41
- ${multiTenantNote}
42
-
43
- Dynamic form builder with schema versioning, conditional logic, and access control.
44
-
45
- ## Features
46
-
47
- ### 📋 Form Management
48
- - Create and manage dynamic forms
49
- - Schema versioning for form updates
50
- - Slug-based URLs for sharing${enableCompanyFeature ? '\n- **Company isolation**' : ''}
51
-
52
- ### 🔒 Access Control
53
- - **Public**: No authentication required
54
- - **Authenticated**: JWT authentication required
55
- - **Action Group**: Permission-based access via IAM
56
-
57
- ### 📊 Form Results
58
- - Submit and track form responses
59
- - Draft support for partial submissions
60
- - Schema snapshot preservation${enableCompanyFeature ? '\n- **Company-level permissions**' : ''}
61
-
62
- ### 🔀 Conditional Logic
63
- - Show/hide fields based on values
64
- - Show/hide sections dynamically
65
- - Jump to sections based on conditions
66
- - Conditional required validation
67
- ${enableCompanyFeature ? `
68
- ## Multi-Tenant Support
69
-
70
- Forms and results are automatically isolated by:
71
- - **Company ID**: Company-level data isolation
72
-
73
- All queries automatically filter by current user's company context.
74
- ` : ''}
75
- ## Form Access Types
76
-
77
- ### Public Forms
78
- - No authentication required
79
- - Anyone can view and submit
80
- - Use \`/form-builder/form/public/:id\` to get form
81
- - Use \`/form-builder/result/submit-public\` to submit
82
-
83
- ### Authenticated Forms
84
- - JWT authentication required
85
- - User must be logged in
86
- - Use \`/form-builder/form/authenticated/:id\` to get form
87
- - Use \`/form-builder/result/submit\` to submit
88
-
89
- ### Action Group Forms
90
- - Permission-based access via IAM
91
- - User must have specific permissions
92
- - Use \`/form-builder/form/authenticated/:id\` to get form
93
- - Use \`/form-builder/result/submit\` to submit
94
-
95
- ## Draft Support
96
-
97
- Save form progress and complete later:
98
- 1. Submit with \`isDraft: true\` to save draft
99
- 2. Get draft with \`/form-builder/result/my-draft\`
100
- 3. Update draft with \`/form-builder/result/update-draft\`
101
- 4. Finalize by setting \`isDraft: false\`
102
-
103
- ## Response Format
104
-
105
- All endpoints return standardized responses with success status, data, message, and timestamp.
106
-
107
- ## Error Handling
108
-
109
- Errors return structured responses with success false, error message, error code, and timestamp.
110
-
111
- ## Common Error Codes
112
-
113
- - **400 Bad Request**: Invalid input data
114
- - **401 Unauthorized**: Missing or invalid authentication
115
- - **403 Forbidden**: Insufficient permissions or wrong access type
116
- - **404 Not Found**: Form or result not found
117
- - **500 Internal Server Error**: Server error
118
-
119
- ## API Endpoints
120
-
121
- All form builder endpoints are prefixed with \`/form-builder\`:
122
- - \`/form-builder/form/*\` - Form management
123
- - \`/form-builder/result/*\` - Form result/submission management
124
-
125
- ## Examples
126
-
127
- ### Get Form Access Info
128
-
129
- POST /form-builder/form/access-info/:id
130
- Returns access type and requirements (no auth required)
131
-
132
- ### Submit Public Form
133
-
134
- POST /form-builder/result/submit-public with JSON body containing formId and formData
135
-
136
- ### Submit Authenticated Form
137
-
138
- POST /form-builder/result/submit with JWT token and JSON body containing formId and formData
139
- `,
140
- version: '1.0',
141
- path: 'api/docs/form-builder',
142
- bearerAuth: true,
143
- excludeTags: [],
144
- excludeSchemaProperties: enableCompanyFeature ? undefined : COMPANY_SCHEMA_EXCLUSIONS
145
- };
146
- }
@@ -1,71 +0,0 @@
1
- import { formBuilderSwaggerConfig } from './form-builder-swagger.config';
2
- describe('formBuilderSwaggerConfig', ()=>{
3
- it('should default to company feature enabled and single-database mode when no config is given', ()=>{
4
- const config = formBuilderSwaggerConfig();
5
- expect(config.title).toBe('Form Builder API');
6
- expect(config.path).toBe('api/docs/form-builder');
7
- expect(config.bearerAuth).toBe(true);
8
- expect(config.excludeTags).toEqual([]);
9
- expect(config.excludeSchemaProperties).toBeUndefined();
10
- expect(config.description).not.toContain('Multi-Tenant Mode');
11
- });
12
- it('should exclude companyId schema properties when the company feature is disabled', ()=>{
13
- const config = formBuilderSwaggerConfig({
14
- enableCompanyFeature: false
15
- });
16
- expect(config.excludeSchemaProperties).toEqual([
17
- {
18
- schemaName: 'CreateFormDto',
19
- properties: [
20
- 'companyId'
21
- ]
22
- },
23
- {
24
- schemaName: 'UpdateFormDto',
25
- properties: [
26
- 'companyId'
27
- ]
28
- },
29
- {
30
- schemaName: 'FormQueryDto',
31
- properties: [
32
- 'companyId'
33
- ]
34
- },
35
- {
36
- schemaName: 'FormResponseDto',
37
- properties: [
38
- 'companyId'
39
- ]
40
- }
41
- ]);
42
- });
43
- it('should not exclude any schema properties when the company feature is enabled', ()=>{
44
- const config = formBuilderSwaggerConfig({
45
- enableCompanyFeature: true
46
- });
47
- expect(config.excludeSchemaProperties).toBeUndefined();
48
- });
49
- it('should describe company isolation and multi-tenant support only when the company feature is enabled', ()=>{
50
- const withCompany = formBuilderSwaggerConfig({
51
- enableCompanyFeature: true
52
- });
53
- const withoutCompany = formBuilderSwaggerConfig({
54
- enableCompanyFeature: false
55
- });
56
- expect(withCompany.description).toContain('Company isolation');
57
- expect(withCompany.description).toContain('## Multi-Tenant Support');
58
- expect(withoutCompany.description).not.toContain('Company isolation');
59
- expect(withoutCompany.description).not.toContain('## Multi-Tenant Support');
60
- });
61
- it('should mention multi-tenant mode in the description only for multi-tenant database mode', ()=>{
62
- const multiTenant = formBuilderSwaggerConfig({
63
- databaseMode: 'multi-tenant'
64
- });
65
- const single = formBuilderSwaggerConfig({
66
- databaseMode: 'single'
67
- });
68
- expect(multiTenant.description).toContain('Multi-Tenant Mode');
69
- expect(single.description).not.toContain('Multi-Tenant Mode');
70
- });
71
- });
@@ -1,215 +0,0 @@
1
- function _define_property(obj, key, value) {
2
- if (key in obj) {
3
- Object.defineProperty(obj, key, {
4
- value: value,
5
- enumerable: true,
6
- configurable: true,
7
- writable: true
8
- });
9
- } else {
10
- obj[key] = value;
11
- }
12
- return obj;
13
- }
14
- function _ts_decorate(decorators, target, key, desc) {
15
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
16
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
17
- 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;
18
- return c > 3 && r && Object.defineProperty(target, key, r), r;
19
- }
20
- function _ts_metadata(k, v) {
21
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
22
- }
23
- import { IdentityResponseDto } from '@flusys/nestjs-shared/dtos';
24
- import { ApiProperty, PartialType } from '@nestjs/swagger';
25
- import { Expose } from 'class-transformer';
26
- import { IsBoolean, IsInt, IsNotEmpty, IsObject, IsOptional, IsUUID, Min } from 'class-validator';
27
- export class SubmitFormDto {
28
- constructor(){
29
- _define_property(this, "formId", void 0);
30
- _define_property(this, "data", void 0);
31
- _define_property(this, "isDraft", void 0);
32
- }
33
- }
34
- _ts_decorate([
35
- ApiProperty({
36
- description: 'Form ID to submit',
37
- example: '123e4567-e89b-12d3-a456-426614174000'
38
- }),
39
- IsUUID(),
40
- IsNotEmpty(),
41
- _ts_metadata("design:type", String)
42
- ], SubmitFormDto.prototype, "formId", void 0);
43
- _ts_decorate([
44
- ApiProperty({
45
- description: 'Submitted form data (field values)',
46
- example: {
47
- field1: 'value1',
48
- field2: 123
49
- }
50
- }),
51
- IsObject(),
52
- IsNotEmpty(),
53
- _ts_metadata("design:type", typeof Record === "undefined" ? Object : Record)
54
- ], SubmitFormDto.prototype, "data", void 0);
55
- _ts_decorate([
56
- ApiProperty({
57
- description: 'Save as draft instead of final submission',
58
- default: false,
59
- required: false
60
- }),
61
- IsBoolean(),
62
- IsOptional(),
63
- _ts_metadata("design:type", Boolean)
64
- ], SubmitFormDto.prototype, "isDraft", void 0);
65
- export class CreateFormResultDto extends SubmitFormDto {
66
- constructor(...args){
67
- super(...args), _define_property(this, "schemaVersionSnapshot", void 0), _define_property(this, "schemaVersion", void 0), _define_property(this, "submittedById", void 0);
68
- }
69
- }
70
- _ts_decorate([
71
- ApiProperty({
72
- description: 'Schema snapshot at submission time',
73
- required: false
74
- }),
75
- IsObject(),
76
- IsOptional(),
77
- _ts_metadata("design:type", typeof Record === "undefined" ? Object : Record)
78
- ], CreateFormResultDto.prototype, "schemaVersionSnapshot", void 0);
79
- _ts_decorate([
80
- ApiProperty({
81
- description: 'Schema version at submission time',
82
- required: false
83
- }),
84
- IsOptional(),
85
- _ts_metadata("design:type", Number)
86
- ], CreateFormResultDto.prototype, "schemaVersion", void 0);
87
- _ts_decorate([
88
- ApiProperty({
89
- description: 'User who submitted (null for public)',
90
- required: false
91
- }),
92
- IsUUID(),
93
- IsOptional(),
94
- _ts_metadata("design:type", Object)
95
- ], CreateFormResultDto.prototype, "submittedById", void 0);
96
- export class UpdateFormResultDto extends PartialType(CreateFormResultDto) {
97
- constructor(...args){
98
- super(...args), _define_property(this, "id", void 0);
99
- }
100
- }
101
- _ts_decorate([
102
- ApiProperty({
103
- description: 'Form Result ID',
104
- example: '123e4567-e89b-12d3-a456-426614174000'
105
- }),
106
- IsUUID(),
107
- IsNotEmpty(),
108
- _ts_metadata("design:type", String)
109
- ], UpdateFormResultDto.prototype, "id", void 0);
110
- export class GetMyDraftDto {
111
- constructor(){
112
- _define_property(this, "formId", void 0);
113
- }
114
- }
115
- _ts_decorate([
116
- ApiProperty({
117
- description: 'Form ID to get draft for',
118
- example: '123e4567-e89b-12d3-a456-426614174000'
119
- }),
120
- IsUUID(),
121
- IsNotEmpty(),
122
- _ts_metadata("design:type", String)
123
- ], GetMyDraftDto.prototype, "formId", void 0);
124
- export class UpdateDraftDto extends SubmitFormDto {
125
- constructor(...args){
126
- super(...args), _define_property(this, "draftId", void 0);
127
- }
128
- }
129
- _ts_decorate([
130
- ApiProperty({
131
- description: 'Draft ID to update',
132
- example: '123e4567-e89b-12d3-a456-426614174000'
133
- }),
134
- IsUUID(),
135
- IsNotEmpty(),
136
- _ts_metadata("design:type", String)
137
- ], UpdateDraftDto.prototype, "draftId", void 0);
138
- export class GetResultsByFormDto {
139
- constructor(){
140
- _define_property(this, "formId", void 0);
141
- _define_property(this, "page", void 0);
142
- _define_property(this, "pageSize", void 0);
143
- }
144
- }
145
- _ts_decorate([
146
- ApiProperty({
147
- description: 'Form ID to filter results',
148
- example: '123e4567-e89b-12d3-a456-426614174000'
149
- }),
150
- IsUUID(),
151
- IsNotEmpty(),
152
- _ts_metadata("design:type", String)
153
- ], GetResultsByFormDto.prototype, "formId", void 0);
154
- _ts_decorate([
155
- ApiProperty({
156
- description: 'Page number (0-based)',
157
- default: 0,
158
- required: false
159
- }),
160
- IsInt(),
161
- Min(0),
162
- IsOptional(),
163
- _ts_metadata("design:type", Number)
164
- ], GetResultsByFormDto.prototype, "page", void 0);
165
- _ts_decorate([
166
- ApiProperty({
167
- description: 'Page size',
168
- default: 10,
169
- required: false
170
- }),
171
- IsInt(),
172
- Min(1),
173
- IsOptional(),
174
- _ts_metadata("design:type", Number)
175
- ], GetResultsByFormDto.prototype, "pageSize", void 0);
176
- export class FormResultResponseDto extends IdentityResponseDto {
177
- constructor(...args){
178
- super(...args), _define_property(this, "formId", void 0), _define_property(this, "schemaVersionSnapshot", void 0), _define_property(this, "schemaVersion", void 0), _define_property(this, "data", void 0), _define_property(this, "submittedById", void 0), _define_property(this, "submittedAt", void 0), _define_property(this, "isDraft", void 0);
179
- }
180
- }
181
- _ts_decorate([
182
- Expose(),
183
- ApiProperty(),
184
- _ts_metadata("design:type", String)
185
- ], FormResultResponseDto.prototype, "formId", void 0);
186
- _ts_decorate([
187
- Expose(),
188
- ApiProperty(),
189
- _ts_metadata("design:type", typeof Record === "undefined" ? Object : Record)
190
- ], FormResultResponseDto.prototype, "schemaVersionSnapshot", void 0);
191
- _ts_decorate([
192
- Expose(),
193
- ApiProperty(),
194
- _ts_metadata("design:type", Number)
195
- ], FormResultResponseDto.prototype, "schemaVersion", void 0);
196
- _ts_decorate([
197
- Expose(),
198
- ApiProperty(),
199
- _ts_metadata("design:type", typeof Record === "undefined" ? Object : Record)
200
- ], FormResultResponseDto.prototype, "data", void 0);
201
- _ts_decorate([
202
- Expose(),
203
- ApiProperty(),
204
- _ts_metadata("design:type", Object)
205
- ], FormResultResponseDto.prototype, "submittedById", void 0);
206
- _ts_decorate([
207
- Expose(),
208
- ApiProperty(),
209
- _ts_metadata("design:type", typeof Date === "undefined" ? Object : Date)
210
- ], FormResultResponseDto.prototype, "submittedAt", void 0);
211
- _ts_decorate([
212
- Expose(),
213
- ApiProperty(),
214
- _ts_metadata("design:type", Boolean)
215
- ], FormResultResponseDto.prototype, "isDraft", void 0);
@@ -1,243 +0,0 @@
1
- function _define_property(obj, key, value) {
2
- if (key in obj) {
3
- Object.defineProperty(obj, key, {
4
- value: value,
5
- enumerable: true,
6
- configurable: true,
7
- writable: true
8
- });
9
- } else {
10
- obj[key] = value;
11
- }
12
- return obj;
13
- }
14
- function _ts_decorate(decorators, target, key, desc) {
15
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
16
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
17
- 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;
18
- return c > 3 && r && Object.defineProperty(target, key, r), r;
19
- }
20
- function _ts_metadata(k, v) {
21
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
22
- }
23
- import { IdentityResponseDto } from '@flusys/nestjs-shared/dtos';
24
- import { ApiProperty, PartialType, PickType } from '@nestjs/swagger';
25
- import { Expose } from 'class-transformer';
26
- import { IsArray, IsBoolean, IsEnum, IsNotEmpty, IsObject, IsOptional, IsString, IsUUID, MaxLength } from 'class-validator';
27
- import { FormAccessType } from '../enums/form-access-type.enum';
28
- export class CreateFormDto {
29
- constructor(){
30
- _define_property(this, "name", void 0);
31
- _define_property(this, "description", void 0);
32
- _define_property(this, "slug", void 0);
33
- _define_property(this, "schema", void 0);
34
- _define_property(this, "accessType", void 0);
35
- _define_property(this, "actionGroups", void 0);
36
- _define_property(this, "tags", void 0);
37
- _define_property(this, "companyId", void 0);
38
- _define_property(this, "isActive", void 0);
39
- }
40
- }
41
- _ts_decorate([
42
- ApiProperty({
43
- description: 'Form name',
44
- example: 'Customer Feedback Survey'
45
- }),
46
- IsString(),
47
- IsNotEmpty(),
48
- MaxLength(255),
49
- _ts_metadata("design:type", String)
50
- ], CreateFormDto.prototype, "name", void 0);
51
- _ts_decorate([
52
- ApiProperty({
53
- description: 'Form description',
54
- example: 'A survey to collect customer feedback',
55
- required: false
56
- }),
57
- IsString(),
58
- IsOptional(),
59
- MaxLength(500),
60
- _ts_metadata("design:type", String)
61
- ], CreateFormDto.prototype, "description", void 0);
62
- _ts_decorate([
63
- ApiProperty({
64
- description: 'URL-friendly slug for public links',
65
- example: 'customer-feedback',
66
- required: false
67
- }),
68
- IsString(),
69
- IsOptional(),
70
- MaxLength(255),
71
- _ts_metadata("design:type", String)
72
- ], CreateFormDto.prototype, "slug", void 0);
73
- _ts_decorate([
74
- ApiProperty({
75
- description: 'Form schema (JSON structure)',
76
- example: {
77
- sections: [],
78
- settings: {}
79
- }
80
- }),
81
- IsObject(),
82
- IsNotEmpty(),
83
- _ts_metadata("design:type", typeof Record === "undefined" ? Object : Record)
84
- ], CreateFormDto.prototype, "schema", void 0);
85
- _ts_decorate([
86
- ApiProperty({
87
- description: 'Access type for the form',
88
- enum: FormAccessType,
89
- default: FormAccessType.AUTHENTICATED,
90
- required: false
91
- }),
92
- IsEnum(FormAccessType),
93
- IsOptional(),
94
- _ts_metadata("design:type", typeof FormAccessType === "undefined" ? Object : FormAccessType)
95
- ], CreateFormDto.prototype, "accessType", void 0);
96
- _ts_decorate([
97
- ApiProperty({
98
- description: 'Action groups for permission-based access (only used when accessType is action_group)',
99
- example: [
100
- 'hr.survey.submit',
101
- 'employee.feedback.submit'
102
- ],
103
- required: false
104
- }),
105
- IsArray(),
106
- IsString({
107
- each: true
108
- }),
109
- IsOptional(),
110
- _ts_metadata("design:type", Array)
111
- ], CreateFormDto.prototype, "actionGroups", void 0);
112
- _ts_decorate([
113
- ApiProperty({
114
- description: 'Tags used by consuming modules to fetch this form (e.g. survey, review)',
115
- example: [
116
- 'survey',
117
- 'review'
118
- ],
119
- required: false
120
- }),
121
- IsArray(),
122
- IsString({
123
- each: true
124
- }),
125
- IsOptional(),
126
- _ts_metadata("design:type", Array)
127
- ], CreateFormDto.prototype, "tags", void 0);
128
- _ts_decorate([
129
- ApiProperty({
130
- description: 'Company ID - Only available when company feature is enabled',
131
- example: '123e4567-e89b-12d3-a456-426614174000',
132
- required: false
133
- }),
134
- IsUUID(),
135
- IsOptional(),
136
- _ts_metadata("design:type", String)
137
- ], CreateFormDto.prototype, "companyId", void 0);
138
- _ts_decorate([
139
- ApiProperty({
140
- description: 'Active status',
141
- default: true,
142
- required: false
143
- }),
144
- IsBoolean(),
145
- IsOptional(),
146
- _ts_metadata("design:type", Boolean)
147
- ], CreateFormDto.prototype, "isActive", void 0);
148
- export class UpdateFormDto extends PartialType(CreateFormDto) {
149
- constructor(...args){
150
- super(...args), _define_property(this, "id", void 0), _define_property(this, "schemaVersion", void 0);
151
- }
152
- }
153
- _ts_decorate([
154
- ApiProperty({
155
- description: 'Form ID',
156
- example: '123e4567-e89b-12d3-a456-426614174000'
157
- }),
158
- IsUUID(),
159
- IsNotEmpty(),
160
- _ts_metadata("design:type", String)
161
- ], UpdateFormDto.prototype, "id", void 0);
162
- _ts_decorate([
163
- ApiProperty({
164
- description: 'Schema version (auto-incremented when schema changes)',
165
- required: false
166
- }),
167
- IsOptional(),
168
- _ts_metadata("design:type", Number)
169
- ], UpdateFormDto.prototype, "schemaVersion", void 0);
170
- export class FormResponseDto extends IdentityResponseDto {
171
- constructor(...args){
172
- super(...args), _define_property(this, "name", void 0), _define_property(this, "description", void 0), _define_property(this, "slug", void 0), _define_property(this, "schema", void 0), _define_property(this, "schemaVersion", void 0), _define_property(this, "accessType", void 0), _define_property(this, "actionGroups", void 0), _define_property(this, "tags", void 0), _define_property(this, "companyId", void 0), _define_property(this, "isActive", void 0);
173
- }
174
- }
175
- _ts_decorate([
176
- Expose(),
177
- ApiProperty(),
178
- _ts_metadata("design:type", String)
179
- ], FormResponseDto.prototype, "name", void 0);
180
- _ts_decorate([
181
- Expose(),
182
- ApiProperty(),
183
- _ts_metadata("design:type", Object)
184
- ], FormResponseDto.prototype, "description", void 0);
185
- _ts_decorate([
186
- Expose(),
187
- ApiProperty(),
188
- _ts_metadata("design:type", Object)
189
- ], FormResponseDto.prototype, "slug", void 0);
190
- _ts_decorate([
191
- Expose(),
192
- ApiProperty(),
193
- _ts_metadata("design:type", typeof Record === "undefined" ? Object : Record)
194
- ], FormResponseDto.prototype, "schema", void 0);
195
- _ts_decorate([
196
- Expose(),
197
- ApiProperty(),
198
- _ts_metadata("design:type", Number)
199
- ], FormResponseDto.prototype, "schemaVersion", void 0);
200
- _ts_decorate([
201
- Expose(),
202
- ApiProperty({
203
- enum: FormAccessType
204
- }),
205
- _ts_metadata("design:type", typeof FormAccessType === "undefined" ? Object : FormAccessType)
206
- ], FormResponseDto.prototype, "accessType", void 0);
207
- _ts_decorate([
208
- Expose(),
209
- ApiProperty(),
210
- _ts_metadata("design:type", Object)
211
- ], FormResponseDto.prototype, "actionGroups", void 0);
212
- _ts_decorate([
213
- Expose(),
214
- ApiProperty(),
215
- _ts_metadata("design:type", Object)
216
- ], FormResponseDto.prototype, "tags", void 0);
217
- _ts_decorate([
218
- Expose(),
219
- ApiProperty(),
220
- _ts_metadata("design:type", Object)
221
- ], FormResponseDto.prototype, "companyId", void 0);
222
- _ts_decorate([
223
- Expose(),
224
- ApiProperty(),
225
- _ts_metadata("design:type", Boolean)
226
- ], FormResponseDto.prototype, "isActive", void 0);
227
- export class PublicFormResponseDto extends PickType(FormResponseDto, [
228
- 'id',
229
- 'name',
230
- 'description',
231
- 'schema',
232
- 'schemaVersion'
233
- ]) {
234
- }
235
- export class FormAccessInfoResponseDto extends PickType(FormResponseDto, [
236
- 'id',
237
- 'name',
238
- 'description',
239
- 'accessType',
240
- 'actionGroups',
241
- 'isActive'
242
- ]) {
243
- }