grm-shared-library 1.1.241 → 1.1.242

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 (70) hide show
  1. package/dist/cjs/index.js +1 -0
  2. package/dist/cjs/index.js.map +1 -1
  3. package/dist/cjs/modules/permission/data/permissions.data.js +8 -0
  4. package/dist/cjs/modules/permission/data/permissions.data.js.map +1 -1
  5. package/dist/cjs/modules/permission/enums/permission-actions.enum.js +17 -0
  6. package/dist/cjs/modules/permission/enums/permission-actions.enum.js.map +1 -1
  7. package/dist/cjs/modules/permission/enums/permissions-module.enum.js +1 -0
  8. package/dist/cjs/modules/permission/enums/permissions-module.enum.js.map +1 -1
  9. package/dist/cjs/modules/responder/constants/responder.const.js +124 -0
  10. package/dist/cjs/modules/responder/constants/responder.const.js.map +1 -0
  11. package/dist/cjs/modules/responder/dtos/responder.dto.js +582 -0
  12. package/dist/cjs/modules/responder/dtos/responder.dto.js.map +1 -0
  13. package/dist/cjs/modules/responder/enums/responder.enums.js +142 -0
  14. package/dist/cjs/modules/responder/enums/responder.enums.js.map +1 -0
  15. package/dist/cjs/modules/responder/index.js +29 -0
  16. package/dist/cjs/modules/responder/index.js.map +1 -0
  17. package/dist/cjs/modules/responder/interfaces/responder-dispatch.js +3 -0
  18. package/dist/cjs/modules/responder/interfaces/responder-dispatch.js.map +1 -0
  19. package/dist/cjs/modules/responder/interfaces/responder-policy.js +3 -0
  20. package/dist/cjs/modules/responder/interfaces/responder-policy.js.map +1 -0
  21. package/dist/cjs/modules/responder/interfaces/responder.js +3 -0
  22. package/dist/cjs/modules/responder/interfaces/responder.js.map +1 -0
  23. package/dist/cjs/modules/responder/utils/responder.util.js +65 -0
  24. package/dist/cjs/modules/responder/utils/responder.util.js.map +1 -0
  25. package/dist/cjs/modules/role/data/roles.data.js +25 -4
  26. package/dist/cjs/modules/role/data/roles.data.js.map +1 -1
  27. package/dist/cjs/modules/tracking/enums/tracking-provider-code.enum.js +8 -0
  28. package/dist/cjs/modules/tracking/enums/tracking-provider-code.enum.js.map +1 -1
  29. package/dist/esm/index.js +1 -0
  30. package/dist/esm/index.js.map +1 -1
  31. package/dist/esm/modules/permission/data/permissions.data.js +8 -0
  32. package/dist/esm/modules/permission/data/permissions.data.js.map +1 -1
  33. package/dist/esm/modules/permission/enums/permission-actions.enum.js +17 -0
  34. package/dist/esm/modules/permission/enums/permission-actions.enum.js.map +1 -1
  35. package/dist/esm/modules/permission/enums/permissions-module.enum.js +1 -0
  36. package/dist/esm/modules/permission/enums/permissions-module.enum.js.map +1 -1
  37. package/dist/esm/modules/responder/constants/responder.const.js +121 -0
  38. package/dist/esm/modules/responder/constants/responder.const.js.map +1 -0
  39. package/dist/esm/modules/responder/dtos/responder.dto.js +560 -0
  40. package/dist/esm/modules/responder/dtos/responder.dto.js.map +1 -0
  41. package/dist/esm/modules/responder/enums/responder.enums.js +139 -0
  42. package/dist/esm/modules/responder/enums/responder.enums.js.map +1 -0
  43. package/dist/esm/modules/responder/index.js +13 -0
  44. package/dist/esm/modules/responder/index.js.map +1 -0
  45. package/dist/esm/modules/responder/interfaces/responder-dispatch.js +2 -0
  46. package/dist/esm/modules/responder/interfaces/responder-dispatch.js.map +1 -0
  47. package/dist/esm/modules/responder/interfaces/responder-policy.js +2 -0
  48. package/dist/esm/modules/responder/interfaces/responder-policy.js.map +1 -0
  49. package/dist/esm/modules/responder/interfaces/responder.js +2 -0
  50. package/dist/esm/modules/responder/interfaces/responder.js.map +1 -0
  51. package/dist/esm/modules/responder/utils/responder.util.js +59 -0
  52. package/dist/esm/modules/responder/utils/responder.util.js.map +1 -0
  53. package/dist/esm/modules/role/data/roles.data.js +24 -3
  54. package/dist/esm/modules/role/data/roles.data.js.map +1 -1
  55. package/dist/esm/modules/tracking/enums/tracking-provider-code.enum.js +8 -0
  56. package/dist/esm/modules/tracking/enums/tracking-provider-code.enum.js.map +1 -1
  57. package/dist/types/index.d.ts +1 -0
  58. package/dist/types/modules/permission/enums/permission-actions.enum.d.ts +3 -0
  59. package/dist/types/modules/permission/enums/permissions-module.enum.d.ts +2 -1
  60. package/dist/types/modules/responder/constants/responder.const.d.ts +67 -0
  61. package/dist/types/modules/responder/dtos/responder.dto.d.ts +144 -0
  62. package/dist/types/modules/responder/enums/responder.enums.d.ts +128 -0
  63. package/dist/types/modules/responder/index.d.ts +7 -0
  64. package/dist/types/modules/responder/interfaces/responder-dispatch.d.ts +144 -0
  65. package/dist/types/modules/responder/interfaces/responder-policy.d.ts +55 -0
  66. package/dist/types/modules/responder/interfaces/responder.d.ts +113 -0
  67. package/dist/types/modules/responder/utils/responder.util.d.ts +24 -0
  68. package/dist/types/modules/role/data/roles.data.d.ts +7 -0
  69. package/dist/types/modules/tracking/enums/tracking-provider-code.enum.d.ts +9 -1
  70. package/package.json +1 -1
@@ -0,0 +1,121 @@
1
+ import { ResponseUnitDispatchStatus } from '../../dispatch/enums/response-unit-dispatch-status.enum';
2
+ import { ResponderReportField } from '../enums/responder.enums';
3
+ const S = ResponseUnitDispatchStatus;
4
+ /**
5
+ * The moves a responder may make on their own unit's dispatch - a strict
6
+ * subset of RESPONSE_UNIT_DISPATCH_TRANSITIONS.
7
+ *
8
+ * - Standing a unit down (CANCELLED) stays the control room's decision.
9
+ * - Declining (REJECTED) is only possible before the unit is moving, as for
10
+ * the control room.
11
+ * - COMPLETED only from ON_SCENE: a responder who never arrived did not
12
+ * complete anything; the control room stands the unit down instead.
13
+ * - EN_ROUTE straight from DISPATCHED is allowed: "I'm on my way" is an
14
+ * acknowledgement too, and making the responder tap twice while driving off
15
+ * helps nobody.
16
+ */
17
+ export const RESPONDER_DISPATCH_TRANSITIONS = {
18
+ [S.DISPATCHED]: [S.ACKNOWLEDGED, S.EN_ROUTE, S.REJECTED],
19
+ [S.ACKNOWLEDGED]: [S.EN_ROUTE, S.ON_SCENE, S.REJECTED],
20
+ [S.EN_ROUTE]: [S.ON_SCENE],
21
+ [S.ON_SCENE]: [S.COMPLETED],
22
+ [S.COMPLETED]: [],
23
+ [S.CANCELLED]: [],
24
+ [S.REJECTED]: [],
25
+ };
26
+ /** Every status a responder may ever set. */
27
+ export const RESPONDER_SETTABLE_DISPATCH_STATUSES = [
28
+ S.ACKNOWLEDGED,
29
+ S.EN_ROUTE,
30
+ S.ON_SCENE,
31
+ S.COMPLETED,
32
+ S.REJECTED,
33
+ ];
34
+ export const RESPONDER_FIELD_LIMITS = {
35
+ statusReason: 500,
36
+ dutyEndReason: 300,
37
+ reportSummary: 4000,
38
+ reportActionsTaken: 4000,
39
+ reportPersonsContacted: 2000,
40
+ reportHandoverTo: 500,
41
+ reportFollowUpNotes: 2000,
42
+ reportRemarks: 2000,
43
+ reportChecklistItems: 50,
44
+ reportChecklistItemId: 64,
45
+ reportChecklistItemLabel: 200,
46
+ reportAttachments: 50,
47
+ /** Positions per POST /responder/positions. The app sends smaller batches; this bounds a backlog. */
48
+ positionBatchSize: 100,
49
+ dispatchPageSize: 50,
50
+ };
51
+ /**
52
+ * A position older than this is still stored in the history but never moves
53
+ * the unit's current position (the projector's out-of-order rule) - and the
54
+ * ingestion refuses anything older than the backlog window outright.
55
+ */
56
+ export const RESPONDER_POSITION_LIMITS = {
57
+ /** Samples older than this are refused (an offline backlog is kept this long). */
58
+ maxSampleAgeSeconds: 6 * 60 * 60,
59
+ /** Samples further in the future than this (clock skew) are refused. */
60
+ maxFutureSkewSeconds: 120,
61
+ /** Worse than this is refused: it would put the unit in the wrong street. */
62
+ maxAccuracyMetres: 1000,
63
+ };
64
+ /**
65
+ * The defaults every organization starts from. An organization may override any
66
+ * part through `organizations.responderPolicy` (validated by ResponderPolicyDto);
67
+ * clarion-organization merges the override over these and serves the result in
68
+ * the responder profile, and clarion-incident enforces the dispatch and report
69
+ * parts server-side. The app only ever READS the policy - a client cannot relax
70
+ * it.
71
+ */
72
+ export const DEFAULT_RESPONDER_POLICY = {
73
+ location: {
74
+ // While on duty but not on a dispatch: enough to keep the map honest.
75
+ onDutyIntervalSeconds: 60,
76
+ // While on a dispatch: the control room is watching the unit approach.
77
+ activeIntervalSeconds: 10,
78
+ distanceFilterMetres: 25,
79
+ // A fix worse than this is kept on the phone, never reported.
80
+ maxAccuracyMetres: 100,
81
+ // Older than this, the app says the position is stale.
82
+ staleAfterSeconds: 120,
83
+ },
84
+ arrival: {
85
+ radiusMetres: 150,
86
+ allowManualConfirmation: true,
87
+ manualReasonRequired: true,
88
+ },
89
+ dispatch: {
90
+ allowDecline: true,
91
+ declineReasonRequired: true,
92
+ },
93
+ report: {
94
+ requiredToComplete: true,
95
+ requiredFields: [ResponderReportField.SUMMARY, ResponderReportField.ACTIONS_TAKEN],
96
+ checklist: [],
97
+ minPhotos: 0,
98
+ },
99
+ evidence: {
100
+ allowPhotos: true,
101
+ allowDocuments: true,
102
+ allowVideo: false,
103
+ maxImageMegabytes: 10,
104
+ maxDocumentMegabytes: 25,
105
+ maxVideoMegabytes: 100,
106
+ },
107
+ reporterContact: {
108
+ visible: true,
109
+ },
110
+ };
111
+ /**
112
+ * Cluster-internal routes. Not proxied by the gateway; callers carry the
113
+ * internal service token and no user context.
114
+ */
115
+ export const RESPONDER_INTERNAL_PATHS = {
116
+ /** clarion-organization: a user's units, active duty and effective policy. */
117
+ userUnits: (userId) => `/responders/internal/users/${userId}/units`,
118
+ /** clarion-organization: who is on duty with a unit right now. */
119
+ unitOnDuty: (responseUnitId) => `/responders/internal/response-units/${responseUnitId}/on-duty`,
120
+ };
121
+ //# sourceMappingURL=responder.const.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"responder.const.js","sourceRoot":"","sources":["../../../../../src/modules/responder/constants/responder.const.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,560 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ 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;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
11
+ import { Transform, Type } from 'class-transformer';
12
+ import { ArrayMaxSize, ArrayMinSize, IsArray, IsBoolean, IsEnum, IsIn, IsInt, IsISO8601, IsNotEmpty, IsNumber, IsOptional, IsString, IsUUID, Max, MaxLength, Min, ValidateNested, } from 'class-validator';
13
+ import { ResponseUnitDispatchStatus } from '../../dispatch/enums/response-unit-dispatch-status.enum';
14
+ import { RESPONDER_FIELD_LIMITS, RESPONDER_SETTABLE_DISPATCH_STATUSES } from '../constants/responder.const';
15
+ import { ResponderArrivalMethod, ResponderDispatchListState, ResponderReportField, ResponderReportOutcome, } from '../enums/responder.enums';
16
+ const L = RESPONDER_FIELD_LIMITS;
17
+ const trimmed = ({ value }) => (typeof value === 'string' ? value.trim() : value);
18
+ // ── Duty ────────────────────────────────────────────────────────────────────
19
+ /** `POST /responder/duty` - go on duty with one of the caller's units. */
20
+ export class StartResponderDutyDto {
21
+ }
22
+ __decorate([
23
+ ApiProperty({ example: 812 }),
24
+ Type(() => Number),
25
+ IsInt(),
26
+ Min(1),
27
+ __metadata("design:type", Number)
28
+ ], StartResponderDutyDto.prototype, "responseUnitId", void 0);
29
+ /** `POST /responder/duty/end` - go off duty. Idempotent: ending no duty is not an error. */
30
+ export class EndResponderDutyDto {
31
+ }
32
+ __decorate([
33
+ ApiPropertyOptional({ maxLength: L.dutyEndReason }),
34
+ IsOptional(),
35
+ Transform(trimmed),
36
+ IsString(),
37
+ MaxLength(L.dutyEndReason),
38
+ __metadata("design:type", String)
39
+ ], EndResponderDutyDto.prototype, "reason", void 0);
40
+ /** `POST /response-units/:id/responders/:userId/end-duty` - the control room ends someone's duty. */
41
+ export class EndResponderDutyByControlCentreDto extends EndResponderDutyDto {
42
+ }
43
+ // ── Memberships (admin) ─────────────────────────────────────────────────────
44
+ /** `POST /response-units/:id/responders` - link a Responder account to a unit. */
45
+ export class AddResponseUnitResponderDto {
46
+ }
47
+ __decorate([
48
+ ApiProperty({ example: 1802 }),
49
+ Type(() => Number),
50
+ IsInt(),
51
+ Min(1),
52
+ __metadata("design:type", Number)
53
+ ], AddResponseUnitResponderDto.prototype, "userId", void 0);
54
+ // ── Dispatches ──────────────────────────────────────────────────────────────
55
+ /** `GET /responder/dispatches`. Newest first. */
56
+ export class ResponderDispatchListQueryDto {
57
+ }
58
+ __decorate([
59
+ ApiPropertyOptional({ enum: ResponderDispatchListState, default: ResponderDispatchListState.ACTIVE }),
60
+ IsOptional(),
61
+ IsEnum(ResponderDispatchListState),
62
+ __metadata("design:type", String)
63
+ ], ResponderDispatchListQueryDto.prototype, "state", void 0);
64
+ __decorate([
65
+ ApiPropertyOptional({ default: 1 }),
66
+ IsOptional(),
67
+ Type(() => Number),
68
+ IsInt(),
69
+ Min(1),
70
+ __metadata("design:type", Number)
71
+ ], ResponderDispatchListQueryDto.prototype, "page", void 0);
72
+ __decorate([
73
+ ApiPropertyOptional({ default: 20, maximum: L.dispatchPageSize }),
74
+ IsOptional(),
75
+ Type(() => Number),
76
+ IsInt(),
77
+ Min(1),
78
+ Max(L.dispatchPageSize),
79
+ __metadata("design:type", Number)
80
+ ], ResponderDispatchListQueryDto.prototype, "limit", void 0);
81
+ __decorate([
82
+ ApiPropertyOptional({ example: '#4821' }),
83
+ IsOptional(),
84
+ IsString(),
85
+ MaxLength(20),
86
+ __metadata("design:type", String)
87
+ ], ResponderDispatchListQueryDto.prototype, "search", void 0);
88
+ /** A position fix the phone took, sent as evidence with an action. */
89
+ export class ResponderLocationFixDto {
90
+ }
91
+ __decorate([
92
+ ApiProperty(),
93
+ Type(() => Number),
94
+ IsNumber({ allowNaN: false, allowInfinity: false }),
95
+ Min(-90),
96
+ Max(90),
97
+ __metadata("design:type", Number)
98
+ ], ResponderLocationFixDto.prototype, "latitude", void 0);
99
+ __decorate([
100
+ ApiProperty(),
101
+ Type(() => Number),
102
+ IsNumber({ allowNaN: false, allowInfinity: false }),
103
+ Min(-180),
104
+ Max(180),
105
+ __metadata("design:type", Number)
106
+ ], ResponderLocationFixDto.prototype, "longitude", void 0);
107
+ __decorate([
108
+ ApiPropertyOptional(),
109
+ IsOptional(),
110
+ Type(() => Number),
111
+ IsNumber({ allowNaN: false, allowInfinity: false }),
112
+ Min(0),
113
+ __metadata("design:type", Number)
114
+ ], ResponderLocationFixDto.prototype, "accuracyMetres", void 0);
115
+ __decorate([
116
+ ApiProperty(),
117
+ IsISO8601({ strict: true }),
118
+ __metadata("design:type", String)
119
+ ], ResponderLocationFixDto.prototype, "recordedAt", void 0);
120
+ /**
121
+ * `POST /responder/dispatches/:dispatchId/status` - acknowledge, set off,
122
+ * arrive, complete or decline.
123
+ *
124
+ * Idempotent by target: asking for the status the dispatch already has returns
125
+ * it unchanged (HTTP 200) instead of a conflict, so a retry after a lost
126
+ * response is safe. `clientActionId` is recorded with the change for the audit.
127
+ */
128
+ export class RespondToDispatchDto {
129
+ }
130
+ __decorate([
131
+ ApiProperty({ enum: RESPONDER_SETTABLE_DISPATCH_STATUSES }),
132
+ IsIn(RESPONDER_SETTABLE_DISPATCH_STATUSES),
133
+ __metadata("design:type", String)
134
+ ], RespondToDispatchDto.prototype, "status", void 0);
135
+ __decorate([
136
+ ApiProperty({ description: 'A uuid the app generates once per user action.' }),
137
+ IsUUID(),
138
+ __metadata("design:type", String)
139
+ ], RespondToDispatchDto.prototype, "clientActionId", void 0);
140
+ __decorate([
141
+ ApiPropertyOptional({ maxLength: L.statusReason }),
142
+ IsOptional(),
143
+ Transform(trimmed),
144
+ IsString(),
145
+ MaxLength(L.statusReason),
146
+ __metadata("design:type", String)
147
+ ], RespondToDispatchDto.prototype, "reason", void 0);
148
+ __decorate([
149
+ ApiPropertyOptional({ type: ResponderLocationFixDto }),
150
+ IsOptional(),
151
+ ValidateNested(),
152
+ Type(() => ResponderLocationFixDto),
153
+ __metadata("design:type", ResponderLocationFixDto)
154
+ ], RespondToDispatchDto.prototype, "location", void 0);
155
+ __decorate([
156
+ ApiPropertyOptional({ enum: ResponderArrivalMethod }),
157
+ IsOptional(),
158
+ IsEnum(ResponderArrivalMethod),
159
+ __metadata("design:type", String)
160
+ ], RespondToDispatchDto.prototype, "arrivalMethod", void 0);
161
+ // ── Reports ─────────────────────────────────────────────────────────────────
162
+ export class ResponderChecklistAnswerDto {
163
+ }
164
+ __decorate([
165
+ ApiProperty({ maxLength: L.reportChecklistItemId }),
166
+ IsString(),
167
+ IsNotEmpty(),
168
+ MaxLength(L.reportChecklistItemId),
169
+ __metadata("design:type", String)
170
+ ], ResponderChecklistAnswerDto.prototype, "itemId", void 0);
171
+ __decorate([
172
+ ApiProperty(),
173
+ IsBoolean(),
174
+ __metadata("design:type", Boolean)
175
+ ], ResponderChecklistAnswerDto.prototype, "checked", void 0);
176
+ /**
177
+ * `POST /responder/dispatches/:dispatchId/report` - submit, or amend, the
178
+ * response report. The first submission is idempotent on `clientReportId`; an
179
+ * amendment must name the `expectedVersion` it was edited from.
180
+ */
181
+ export class SubmitResponderReportDto {
182
+ }
183
+ __decorate([
184
+ ApiProperty({ description: 'A uuid the app generates once per report draft.' }),
185
+ IsUUID(),
186
+ __metadata("design:type", String)
187
+ ], SubmitResponderReportDto.prototype, "clientReportId", void 0);
188
+ __decorate([
189
+ ApiPropertyOptional(),
190
+ IsOptional(),
191
+ Type(() => Number),
192
+ IsInt(),
193
+ Min(1),
194
+ __metadata("design:type", Number)
195
+ ], SubmitResponderReportDto.prototype, "expectedVersion", void 0);
196
+ __decorate([
197
+ ApiProperty({ maxLength: L.reportSummary }),
198
+ Transform(trimmed),
199
+ IsString(),
200
+ IsNotEmpty(),
201
+ MaxLength(L.reportSummary),
202
+ __metadata("design:type", String)
203
+ ], SubmitResponderReportDto.prototype, "summary", void 0);
204
+ __decorate([
205
+ ApiPropertyOptional({ maxLength: L.reportActionsTaken }),
206
+ IsOptional(),
207
+ Transform(trimmed),
208
+ IsString(),
209
+ MaxLength(L.reportActionsTaken),
210
+ __metadata("design:type", String)
211
+ ], SubmitResponderReportDto.prototype, "actionsTaken", void 0);
212
+ __decorate([
213
+ ApiProperty({ enum: ResponderReportOutcome }),
214
+ IsEnum(ResponderReportOutcome),
215
+ __metadata("design:type", String)
216
+ ], SubmitResponderReportDto.prototype, "outcome", void 0);
217
+ __decorate([
218
+ ApiPropertyOptional({ maxLength: L.reportPersonsContacted }),
219
+ IsOptional(),
220
+ Transform(trimmed),
221
+ IsString(),
222
+ MaxLength(L.reportPersonsContacted),
223
+ __metadata("design:type", String)
224
+ ], SubmitResponderReportDto.prototype, "personsContacted", void 0);
225
+ __decorate([
226
+ ApiPropertyOptional({ maxLength: L.reportHandoverTo }),
227
+ IsOptional(),
228
+ Transform(trimmed),
229
+ IsString(),
230
+ MaxLength(L.reportHandoverTo),
231
+ __metadata("design:type", String)
232
+ ], SubmitResponderReportDto.prototype, "handoverTo", void 0);
233
+ __decorate([
234
+ ApiProperty(),
235
+ IsBoolean(),
236
+ __metadata("design:type", Boolean)
237
+ ], SubmitResponderReportDto.prototype, "followUpRequired", void 0);
238
+ __decorate([
239
+ ApiPropertyOptional({ maxLength: L.reportFollowUpNotes }),
240
+ IsOptional(),
241
+ Transform(trimmed),
242
+ IsString(),
243
+ MaxLength(L.reportFollowUpNotes),
244
+ __metadata("design:type", String)
245
+ ], SubmitResponderReportDto.prototype, "followUpNotes", void 0);
246
+ __decorate([
247
+ ApiPropertyOptional({ maxLength: L.reportRemarks }),
248
+ IsOptional(),
249
+ Transform(trimmed),
250
+ IsString(),
251
+ MaxLength(L.reportRemarks),
252
+ __metadata("design:type", String)
253
+ ], SubmitResponderReportDto.prototype, "remarks", void 0);
254
+ __decorate([
255
+ ApiPropertyOptional({ type: [ResponderChecklistAnswerDto] }),
256
+ IsOptional(),
257
+ IsArray(),
258
+ ArrayMaxSize(L.reportChecklistItems),
259
+ ValidateNested({ each: true }),
260
+ Type(() => ResponderChecklistAnswerDto),
261
+ __metadata("design:type", Array)
262
+ ], SubmitResponderReportDto.prototype, "checklist", void 0);
263
+ __decorate([
264
+ ApiPropertyOptional({ type: [Number] }),
265
+ IsOptional(),
266
+ IsArray(),
267
+ ArrayMaxSize(L.reportAttachments),
268
+ Type(() => Number),
269
+ IsInt({ each: true }),
270
+ Min(1, { each: true }),
271
+ __metadata("design:type", Array)
272
+ ], SubmitResponderReportDto.prototype, "attachmentIds", void 0);
273
+ // ── Positions ───────────────────────────────────────────────────────────────
274
+ export class ResponderPositionSampleDto {
275
+ }
276
+ __decorate([
277
+ ApiProperty(),
278
+ Type(() => Number),
279
+ IsNumber({ allowNaN: false, allowInfinity: false }),
280
+ Min(-90),
281
+ Max(90),
282
+ __metadata("design:type", Number)
283
+ ], ResponderPositionSampleDto.prototype, "latitude", void 0);
284
+ __decorate([
285
+ ApiProperty(),
286
+ Type(() => Number),
287
+ IsNumber({ allowNaN: false, allowInfinity: false }),
288
+ Min(-180),
289
+ Max(180),
290
+ __metadata("design:type", Number)
291
+ ], ResponderPositionSampleDto.prototype, "longitude", void 0);
292
+ __decorate([
293
+ ApiPropertyOptional(),
294
+ IsOptional(),
295
+ Type(() => Number),
296
+ IsNumber({ allowNaN: false, allowInfinity: false }),
297
+ Min(0),
298
+ __metadata("design:type", Number)
299
+ ], ResponderPositionSampleDto.prototype, "accuracyMetres", void 0);
300
+ __decorate([
301
+ ApiPropertyOptional(),
302
+ IsOptional(),
303
+ Type(() => Number),
304
+ IsNumber({ allowNaN: false, allowInfinity: false }),
305
+ __metadata("design:type", Number)
306
+ ], ResponderPositionSampleDto.prototype, "altitudeMetres", void 0);
307
+ __decorate([
308
+ ApiPropertyOptional(),
309
+ IsOptional(),
310
+ Type(() => Number),
311
+ IsNumber({ allowNaN: false, allowInfinity: false }),
312
+ Min(0),
313
+ __metadata("design:type", Number)
314
+ ], ResponderPositionSampleDto.prototype, "speedMetresPerSecond", void 0);
315
+ __decorate([
316
+ ApiPropertyOptional(),
317
+ IsOptional(),
318
+ Type(() => Number),
319
+ IsNumber({ allowNaN: false, allowInfinity: false }),
320
+ Min(0),
321
+ Max(360),
322
+ __metadata("design:type", Number)
323
+ ], ResponderPositionSampleDto.prototype, "headingDegrees", void 0);
324
+ __decorate([
325
+ ApiProperty(),
326
+ IsISO8601({ strict: true }),
327
+ __metadata("design:type", String)
328
+ ], ResponderPositionSampleDto.prototype, "recordedAt", void 0);
329
+ __decorate([
330
+ ApiPropertyOptional(),
331
+ IsOptional(),
332
+ IsBoolean(),
333
+ __metadata("design:type", Boolean)
334
+ ], ResponderPositionSampleDto.prototype, "isMocked", void 0);
335
+ /**
336
+ * `POST /responder/positions` - positions of the unit the caller is on duty
337
+ * with. The server decides the unit from the caller's active duty session;
338
+ * the client never names one.
339
+ */
340
+ export class ReportResponderPositionsDto {
341
+ }
342
+ __decorate([
343
+ ApiProperty({ type: [ResponderPositionSampleDto] }),
344
+ IsArray(),
345
+ ArrayMinSize(1),
346
+ ArrayMaxSize(L.positionBatchSize),
347
+ ValidateNested({ each: true }),
348
+ Type(() => ResponderPositionSampleDto),
349
+ __metadata("design:type", Array)
350
+ ], ReportResponderPositionsDto.prototype, "samples", void 0);
351
+ // ── Policy (organization override) ──────────────────────────────────────────
352
+ export class ResponderLocationPolicyDto {
353
+ }
354
+ __decorate([
355
+ IsOptional(),
356
+ Type(() => Number),
357
+ IsInt(),
358
+ Min(10),
359
+ Max(900),
360
+ __metadata("design:type", Number)
361
+ ], ResponderLocationPolicyDto.prototype, "onDutyIntervalSeconds", void 0);
362
+ __decorate([
363
+ IsOptional(),
364
+ Type(() => Number),
365
+ IsInt(),
366
+ Min(3),
367
+ Max(300),
368
+ __metadata("design:type", Number)
369
+ ], ResponderLocationPolicyDto.prototype, "activeIntervalSeconds", void 0);
370
+ __decorate([
371
+ IsOptional(),
372
+ Type(() => Number),
373
+ IsInt(),
374
+ Min(0),
375
+ Max(500),
376
+ __metadata("design:type", Number)
377
+ ], ResponderLocationPolicyDto.prototype, "distanceFilterMetres", void 0);
378
+ __decorate([
379
+ IsOptional(),
380
+ Type(() => Number),
381
+ IsInt(),
382
+ Min(5),
383
+ Max(1000),
384
+ __metadata("design:type", Number)
385
+ ], ResponderLocationPolicyDto.prototype, "maxAccuracyMetres", void 0);
386
+ __decorate([
387
+ IsOptional(),
388
+ Type(() => Number),
389
+ IsInt(),
390
+ Min(30),
391
+ Max(3600),
392
+ __metadata("design:type", Number)
393
+ ], ResponderLocationPolicyDto.prototype, "staleAfterSeconds", void 0);
394
+ export class ResponderArrivalPolicyDto {
395
+ }
396
+ __decorate([
397
+ IsOptional(),
398
+ Type(() => Number),
399
+ IsInt(),
400
+ Min(25),
401
+ Max(5000),
402
+ __metadata("design:type", Number)
403
+ ], ResponderArrivalPolicyDto.prototype, "radiusMetres", void 0);
404
+ __decorate([
405
+ IsOptional(),
406
+ IsBoolean(),
407
+ __metadata("design:type", Boolean)
408
+ ], ResponderArrivalPolicyDto.prototype, "allowManualConfirmation", void 0);
409
+ __decorate([
410
+ IsOptional(),
411
+ IsBoolean(),
412
+ __metadata("design:type", Boolean)
413
+ ], ResponderArrivalPolicyDto.prototype, "manualReasonRequired", void 0);
414
+ export class ResponderDispatchPolicyDto {
415
+ }
416
+ __decorate([
417
+ IsOptional(),
418
+ IsBoolean(),
419
+ __metadata("design:type", Boolean)
420
+ ], ResponderDispatchPolicyDto.prototype, "allowDecline", void 0);
421
+ __decorate([
422
+ IsOptional(),
423
+ IsBoolean(),
424
+ __metadata("design:type", Boolean)
425
+ ], ResponderDispatchPolicyDto.prototype, "declineReasonRequired", void 0);
426
+ export class ResponderChecklistItemDto {
427
+ }
428
+ __decorate([
429
+ IsString(),
430
+ IsNotEmpty(),
431
+ MaxLength(L.reportChecklistItemId),
432
+ __metadata("design:type", String)
433
+ ], ResponderChecklistItemDto.prototype, "id", void 0);
434
+ __decorate([
435
+ IsString(),
436
+ IsNotEmpty(),
437
+ MaxLength(L.reportChecklistItemLabel),
438
+ __metadata("design:type", String)
439
+ ], ResponderChecklistItemDto.prototype, "label", void 0);
440
+ __decorate([
441
+ IsBoolean(),
442
+ __metadata("design:type", Boolean)
443
+ ], ResponderChecklistItemDto.prototype, "required", void 0);
444
+ export class ResponderReportPolicyDto {
445
+ }
446
+ __decorate([
447
+ IsOptional(),
448
+ IsBoolean(),
449
+ __metadata("design:type", Boolean)
450
+ ], ResponderReportPolicyDto.prototype, "requiredToComplete", void 0);
451
+ __decorate([
452
+ IsOptional(),
453
+ IsArray(),
454
+ IsEnum(ResponderReportField, { each: true }),
455
+ __metadata("design:type", Array)
456
+ ], ResponderReportPolicyDto.prototype, "requiredFields", void 0);
457
+ __decorate([
458
+ IsOptional(),
459
+ IsArray(),
460
+ ArrayMaxSize(L.reportChecklistItems),
461
+ ValidateNested({ each: true }),
462
+ Type(() => ResponderChecklistItemDto),
463
+ __metadata("design:type", Array)
464
+ ], ResponderReportPolicyDto.prototype, "checklist", void 0);
465
+ __decorate([
466
+ IsOptional(),
467
+ Type(() => Number),
468
+ IsInt(),
469
+ Min(0),
470
+ Max(20),
471
+ __metadata("design:type", Number)
472
+ ], ResponderReportPolicyDto.prototype, "minPhotos", void 0);
473
+ export class ResponderEvidencePolicyDto {
474
+ }
475
+ __decorate([
476
+ IsOptional(),
477
+ IsBoolean(),
478
+ __metadata("design:type", Boolean)
479
+ ], ResponderEvidencePolicyDto.prototype, "allowPhotos", void 0);
480
+ __decorate([
481
+ IsOptional(),
482
+ IsBoolean(),
483
+ __metadata("design:type", Boolean)
484
+ ], ResponderEvidencePolicyDto.prototype, "allowDocuments", void 0);
485
+ __decorate([
486
+ IsOptional(),
487
+ IsBoolean(),
488
+ __metadata("design:type", Boolean)
489
+ ], ResponderEvidencePolicyDto.prototype, "allowVideo", void 0);
490
+ __decorate([
491
+ IsOptional(),
492
+ Type(() => Number),
493
+ IsInt(),
494
+ Min(1),
495
+ Max(10),
496
+ __metadata("design:type", Number)
497
+ ], ResponderEvidencePolicyDto.prototype, "maxImageMegabytes", void 0);
498
+ __decorate([
499
+ IsOptional(),
500
+ Type(() => Number),
501
+ IsInt(),
502
+ Min(1),
503
+ Max(100),
504
+ __metadata("design:type", Number)
505
+ ], ResponderEvidencePolicyDto.prototype, "maxDocumentMegabytes", void 0);
506
+ __decorate([
507
+ IsOptional(),
508
+ Type(() => Number),
509
+ IsInt(),
510
+ Min(1),
511
+ Max(500),
512
+ __metadata("design:type", Number)
513
+ ], ResponderEvidencePolicyDto.prototype, "maxVideoMegabytes", void 0);
514
+ export class ResponderReporterContactPolicyDto {
515
+ }
516
+ __decorate([
517
+ IsOptional(),
518
+ IsBoolean(),
519
+ __metadata("design:type", Boolean)
520
+ ], ResponderReporterContactPolicyDto.prototype, "visible", void 0);
521
+ /** An organization's override of DEFAULT_RESPONDER_POLICY; every part optional. */
522
+ export class ResponderPolicyDto {
523
+ }
524
+ __decorate([
525
+ IsOptional(),
526
+ ValidateNested(),
527
+ Type(() => ResponderLocationPolicyDto),
528
+ __metadata("design:type", ResponderLocationPolicyDto)
529
+ ], ResponderPolicyDto.prototype, "location", void 0);
530
+ __decorate([
531
+ IsOptional(),
532
+ ValidateNested(),
533
+ Type(() => ResponderArrivalPolicyDto),
534
+ __metadata("design:type", ResponderArrivalPolicyDto)
535
+ ], ResponderPolicyDto.prototype, "arrival", void 0);
536
+ __decorate([
537
+ IsOptional(),
538
+ ValidateNested(),
539
+ Type(() => ResponderDispatchPolicyDto),
540
+ __metadata("design:type", ResponderDispatchPolicyDto)
541
+ ], ResponderPolicyDto.prototype, "dispatch", void 0);
542
+ __decorate([
543
+ IsOptional(),
544
+ ValidateNested(),
545
+ Type(() => ResponderReportPolicyDto),
546
+ __metadata("design:type", ResponderReportPolicyDto)
547
+ ], ResponderPolicyDto.prototype, "report", void 0);
548
+ __decorate([
549
+ IsOptional(),
550
+ ValidateNested(),
551
+ Type(() => ResponderEvidencePolicyDto),
552
+ __metadata("design:type", ResponderEvidencePolicyDto)
553
+ ], ResponderPolicyDto.prototype, "evidence", void 0);
554
+ __decorate([
555
+ IsOptional(),
556
+ ValidateNested(),
557
+ Type(() => ResponderReporterContactPolicyDto),
558
+ __metadata("design:type", ResponderReporterContactPolicyDto)
559
+ ], ResponderPolicyDto.prototype, "reporterContact", void 0);
560
+ //# sourceMappingURL=responder.dto.js.map