clarion-shared-types 1.0.106 → 1.0.107
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/dist/cjs/modules/gis/enums/routing.enum.js +30 -0
- package/dist/cjs/modules/gis/enums/routing.enum.js.map +1 -0
- package/dist/cjs/modules/gis/index.js +3 -0
- package/dist/cjs/modules/gis/index.js.map +1 -1
- package/dist/cjs/modules/gis/interfaces/routing.js +3 -0
- package/dist/cjs/modules/gis/interfaces/routing.js.map +1 -0
- package/dist/cjs/modules/gis/interfaces/trip-point.js +3 -0
- package/dist/cjs/modules/gis/interfaces/trip-point.js.map +1 -0
- package/dist/cjs/modules/incident/enums/incident-origin-type.enum.js +13 -0
- package/dist/cjs/modules/incident/enums/incident-origin-type.enum.js.map +1 -0
- package/dist/cjs/modules/incident/index.js +1 -0
- package/dist/cjs/modules/incident/index.js.map +1 -1
- package/dist/cjs/modules/permission/enums/permission-actions.enum.js +8 -0
- package/dist/cjs/modules/permission/enums/permission-actions.enum.js.map +1 -1
- package/dist/cjs/modules/permission/enums/permissions-moudule.enum.js +1 -0
- package/dist/cjs/modules/permission/enums/permissions-moudule.enum.js.map +1 -1
- package/dist/cjs/modules/role/constants/safety-roles.js +18 -1
- package/dist/cjs/modules/role/constants/safety-roles.js.map +1 -1
- package/dist/cjs/modules/safety/constants/follow-me.const.js +51 -0
- package/dist/cjs/modules/safety/constants/follow-me.const.js.map +1 -0
- package/dist/cjs/modules/safety/enums/follow-me.enums.js +238 -0
- package/dist/cjs/modules/safety/enums/follow-me.enums.js.map +1 -0
- package/dist/cjs/modules/safety/enums/safety-enums.js +3 -1
- package/dist/cjs/modules/safety/enums/safety-enums.js.map +1 -1
- package/dist/cjs/modules/safety/index.js +5 -0
- package/dist/cjs/modules/safety/index.js.map +1 -1
- package/dist/cjs/modules/safety/interfaces/follow-me.dto.js +3 -0
- package/dist/cjs/modules/safety/interfaces/follow-me.dto.js.map +1 -0
- package/dist/cjs/modules/safety/interfaces/safety-alert-context.js +3 -0
- package/dist/cjs/modules/safety/interfaces/safety-alert-context.js.map +1 -0
- package/dist/cjs/modules/safety/utils/follow-me-display.util.js +163 -0
- package/dist/cjs/modules/safety/utils/follow-me-display.util.js.map +1 -0
- package/dist/cjs/modules/safety/utils/safety-display.util.js +1 -0
- package/dist/cjs/modules/safety/utils/safety-display.util.js.map +1 -1
- package/dist/esm/modules/gis/enums/routing.enum.js +27 -0
- package/dist/esm/modules/gis/enums/routing.enum.js.map +1 -0
- package/dist/esm/modules/gis/index.js +3 -0
- package/dist/esm/modules/gis/index.js.map +1 -1
- package/dist/esm/modules/gis/interfaces/routing.js +2 -0
- package/dist/esm/modules/gis/interfaces/routing.js.map +1 -0
- package/dist/esm/modules/gis/interfaces/trip-point.js +2 -0
- package/dist/esm/modules/gis/interfaces/trip-point.js.map +1 -0
- package/dist/esm/modules/incident/enums/incident-origin-type.enum.js +10 -0
- package/dist/esm/modules/incident/enums/incident-origin-type.enum.js.map +1 -0
- package/dist/esm/modules/incident/index.js +1 -0
- package/dist/esm/modules/incident/index.js.map +1 -1
- package/dist/esm/modules/permission/enums/permission-actions.enum.js +8 -0
- package/dist/esm/modules/permission/enums/permission-actions.enum.js.map +1 -1
- package/dist/esm/modules/permission/enums/permissions-moudule.enum.js +1 -0
- package/dist/esm/modules/permission/enums/permissions-moudule.enum.js.map +1 -1
- package/dist/esm/modules/role/constants/safety-roles.js +17 -0
- package/dist/esm/modules/role/constants/safety-roles.js.map +1 -1
- package/dist/esm/modules/safety/constants/follow-me.const.js +48 -0
- package/dist/esm/modules/safety/constants/follow-me.const.js.map +1 -0
- package/dist/esm/modules/safety/enums/follow-me.enums.js +235 -0
- package/dist/esm/modules/safety/enums/follow-me.enums.js.map +1 -0
- package/dist/esm/modules/safety/enums/safety-enums.js +3 -1
- package/dist/esm/modules/safety/enums/safety-enums.js.map +1 -1
- package/dist/esm/modules/safety/index.js +5 -0
- package/dist/esm/modules/safety/index.js.map +1 -1
- package/dist/esm/modules/safety/interfaces/follow-me.dto.js +2 -0
- package/dist/esm/modules/safety/interfaces/follow-me.dto.js.map +1 -0
- package/dist/esm/modules/safety/interfaces/safety-alert-context.js +2 -0
- package/dist/esm/modules/safety/interfaces/safety-alert-context.js.map +1 -0
- package/dist/esm/modules/safety/utils/follow-me-display.util.js +155 -0
- package/dist/esm/modules/safety/utils/follow-me-display.util.js.map +1 -0
- package/dist/esm/modules/safety/utils/safety-display.util.js +1 -0
- package/dist/esm/modules/safety/utils/safety-display.util.js.map +1 -1
- package/dist/types/modules/gis/enums/routing.enum.d.ts +22 -0
- package/dist/types/modules/gis/index.d.ts +3 -0
- package/dist/types/modules/gis/interfaces/routing.d.ts +43 -0
- package/dist/types/modules/gis/interfaces/trip-point.d.ts +16 -0
- package/dist/types/modules/incident/enums/incident-origin-type.enum.d.ts +7 -0
- package/dist/types/modules/incident/index.d.ts +1 -0
- package/dist/types/modules/incident/intefaces/incident.d.ts +8 -0
- package/dist/types/modules/permission/enums/permission-actions.enum.d.ts +4 -0
- package/dist/types/modules/permission/enums/permissions-moudule.enum.d.ts +2 -1
- package/dist/types/modules/role/constants/safety-roles.d.ts +6 -0
- package/dist/types/modules/safety/constants/follow-me.const.d.ts +46 -0
- package/dist/types/modules/safety/enums/follow-me.enums.d.ts +218 -0
- package/dist/types/modules/safety/enums/safety-enums.d.ts +4 -2
- package/dist/types/modules/safety/index.d.ts +5 -0
- package/dist/types/modules/safety/interfaces/follow-me.dto.d.ts +392 -0
- package/dist/types/modules/safety/interfaces/safety-alert-context.d.ts +8 -0
- package/dist/types/modules/safety/interfaces/safety-check.dto.d.ts +5 -1
- package/dist/types/modules/safety/utils/follow-me-display.util.d.ts +27 -0
- package/package.json +1 -1
|
@@ -0,0 +1,392 @@
|
|
|
1
|
+
import { GuardianAudience } from '../../alert-dispatch/interfaces/guardian-audience';
|
|
2
|
+
import { GisRoutingProvider } from '../../gis/enums/routing.enum';
|
|
3
|
+
import { TripPoint } from '../../gis/interfaces/trip-point';
|
|
4
|
+
import { FollowMeAuditEventType, FollowMeEventType, FollowMeParticipantKind, FollowMeParticipantStatus, FollowMePromptStatus, FollowMeRealtimeEventType, FollowMeRouteKind, FollowMeSafetyEventType, FollowMeSafetyTrigger, FollowMeStatus, FollowMeTrackingHealth, FollowMeTransportMode, FollowMeWaypointKind } from '../enums/follow-me.enums';
|
|
5
|
+
import { SafetyCheckActorType, SafetyCheckSosTrigger } from '../enums/safety-enums';
|
|
6
|
+
import { SafetyCheckTripSummary } from './safety-check.dto';
|
|
7
|
+
/**
|
|
8
|
+
* Coordinates and address are null wherever the viewer may not see location (the
|
|
9
|
+
* admin detail without track access) - the label alone says "Home" or "Work".
|
|
10
|
+
*/
|
|
11
|
+
export interface FollowMeWaypointView {
|
|
12
|
+
sequence: number;
|
|
13
|
+
kind: FollowMeWaypointKind;
|
|
14
|
+
label: string;
|
|
15
|
+
address: string | null;
|
|
16
|
+
lat: number | null;
|
|
17
|
+
lng: number | null;
|
|
18
|
+
savedPlaceId: string | null;
|
|
19
|
+
}
|
|
20
|
+
/** A computed route as the session stores it. */
|
|
21
|
+
export interface FollowMeRouteView {
|
|
22
|
+
id: string;
|
|
23
|
+
kind: FollowMeRouteKind;
|
|
24
|
+
provider: GisRoutingProvider;
|
|
25
|
+
transportMode: FollowMeTransportMode;
|
|
26
|
+
/** Null wherever the viewer may not see location. */
|
|
27
|
+
polyline: string | null;
|
|
28
|
+
distanceMeters: number;
|
|
29
|
+
durationSeconds: number;
|
|
30
|
+
staticDurationSeconds: number;
|
|
31
|
+
computedAt: string;
|
|
32
|
+
/** Why it was recalculated (deviation, ETA check...). Null for the original plan. */
|
|
33
|
+
reason: string | null;
|
|
34
|
+
warnings: string[];
|
|
35
|
+
}
|
|
36
|
+
/** The answer to a route preview; start references it by `routeToken`. */
|
|
37
|
+
export interface FollowMeRoutePreview {
|
|
38
|
+
routeToken: string;
|
|
39
|
+
expiresAt: string;
|
|
40
|
+
transportMode: FollowMeTransportMode;
|
|
41
|
+
waypoints: FollowMeWaypointView[];
|
|
42
|
+
provider: GisRoutingProvider;
|
|
43
|
+
polyline: string;
|
|
44
|
+
distanceMeters: number;
|
|
45
|
+
durationSeconds: number;
|
|
46
|
+
staticDurationSeconds: number;
|
|
47
|
+
etaAt: string;
|
|
48
|
+
/** The journey would outlast Follow Me's 24 h maximum. */
|
|
49
|
+
exceedsMaxDuration: boolean;
|
|
50
|
+
/** What the setup screen should pre-select (travel time plus a buffer, capped at 24 h). */
|
|
51
|
+
suggestedDurationMinutes: number;
|
|
52
|
+
warnings: string[];
|
|
53
|
+
}
|
|
54
|
+
export interface FollowMePromptView {
|
|
55
|
+
id: string;
|
|
56
|
+
trigger: FollowMeSafetyTrigger;
|
|
57
|
+
status: FollowMePromptStatus;
|
|
58
|
+
startedAt: string;
|
|
59
|
+
/** When the visible countdown ends. */
|
|
60
|
+
deadlineAt: string;
|
|
61
|
+
countdownSeconds: number;
|
|
62
|
+
respondedAt: string | null;
|
|
63
|
+
/** What the prompt screen says caused it, in plain words. */
|
|
64
|
+
message: string;
|
|
65
|
+
}
|
|
66
|
+
/** A participant as the SESSION OWNER sees them. */
|
|
67
|
+
export interface FollowMeParticipantView {
|
|
68
|
+
id: string;
|
|
69
|
+
kind: FollowMeParticipantKind;
|
|
70
|
+
status: FollowMeParticipantStatus;
|
|
71
|
+
guardianUserId: number | null;
|
|
72
|
+
displayName: string;
|
|
73
|
+
/** External guardians only, masked (+2547******78). */
|
|
74
|
+
maskedPhoneNumber: string | null;
|
|
75
|
+
invitedAt: string;
|
|
76
|
+
respondedAt: string | null;
|
|
77
|
+
/** Looked at the journey in the last minute. */
|
|
78
|
+
watchingNow: boolean;
|
|
79
|
+
}
|
|
80
|
+
/** The session as its OWNER sees it. Timestamps are server time; use serverTime for skew. */
|
|
81
|
+
export interface FollowMeSessionView {
|
|
82
|
+
id: string;
|
|
83
|
+
status: FollowMeStatus;
|
|
84
|
+
reasonId: string | null;
|
|
85
|
+
reasonCode: string | null;
|
|
86
|
+
reasonLabel: string;
|
|
87
|
+
customReason: string | null;
|
|
88
|
+
durationMinutes: number;
|
|
89
|
+
startedAt: string;
|
|
90
|
+
plannedEndAt: string;
|
|
91
|
+
endedAt: string | null;
|
|
92
|
+
arrivedAt: string | null;
|
|
93
|
+
promptCountdownSeconds: number;
|
|
94
|
+
notifyGuardiansOnStartEnd: boolean;
|
|
95
|
+
notifyServiceProviderRequested: boolean;
|
|
96
|
+
notifyServiceProviderAllowed: boolean;
|
|
97
|
+
transportMode: FollowMeTransportMode | null;
|
|
98
|
+
waypoints: FollowMeWaypointView[];
|
|
99
|
+
/** The route being monitored (the latest recalculation, else the plan). */
|
|
100
|
+
currentRoute: FollowMeRouteView | null;
|
|
101
|
+
/** Live estimate; null without a destination. */
|
|
102
|
+
etaAt: string | null;
|
|
103
|
+
distanceRemainingMeters: number | null;
|
|
104
|
+
trackingHealth: FollowMeTrackingHealth;
|
|
105
|
+
lastLocationAt: string | null;
|
|
106
|
+
crashDetectionEnabled: boolean;
|
|
107
|
+
activePrompt: FollowMePromptView | null;
|
|
108
|
+
participants: FollowMeParticipantView[];
|
|
109
|
+
sosTrigger: SafetyCheckSosTrigger | null;
|
|
110
|
+
sosCause: FollowMeSafetyTrigger | null;
|
|
111
|
+
sosTriggeredAt: string | null;
|
|
112
|
+
incidentId: number | null;
|
|
113
|
+
tripId: string | null;
|
|
114
|
+
conversationId: string | null;
|
|
115
|
+
serverTime: string;
|
|
116
|
+
}
|
|
117
|
+
export interface FollowMeCurrentResponse {
|
|
118
|
+
session: FollowMeSessionView | null;
|
|
119
|
+
serverTime: string;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* The journey as a FOLLOWER sees it - an app guardian, an external guardian on the
|
|
123
|
+
* web page, or provider staff. Never includes guardians' contact details.
|
|
124
|
+
*/
|
|
125
|
+
export interface FollowMeFollowerView {
|
|
126
|
+
sessionId: string;
|
|
127
|
+
status: FollowMeStatus;
|
|
128
|
+
owner: {
|
|
129
|
+
firstName: string;
|
|
130
|
+
userId: number | null;
|
|
131
|
+
};
|
|
132
|
+
reasonLabel: string;
|
|
133
|
+
startedAt: string;
|
|
134
|
+
plannedEndAt: string;
|
|
135
|
+
endedAt: string | null;
|
|
136
|
+
arrivedAt: string | null;
|
|
137
|
+
transportMode: FollowMeTransportMode | null;
|
|
138
|
+
waypoints: FollowMeWaypointView[];
|
|
139
|
+
currentRoute: Pick<FollowMeRouteView, 'polyline' | 'distanceMeters' | 'durationSeconds' | 'provider'> | null;
|
|
140
|
+
etaAt: string | null;
|
|
141
|
+
distanceRemainingMeters: number | null;
|
|
142
|
+
trackingHealth: FollowMeTrackingHealth;
|
|
143
|
+
/** Null once live access has ended, and for a caller who has not accepted. */
|
|
144
|
+
latestLocation: TripPoint | null;
|
|
145
|
+
/** Recent path (oldest first) since the `since` the caller sent; empty without live access. */
|
|
146
|
+
path: TripPoint[];
|
|
147
|
+
/** Pass as `since` next time. */
|
|
148
|
+
pathCursor: string | null;
|
|
149
|
+
/** Other followers: names and states for app guardians, a count on the web page. */
|
|
150
|
+
otherFollowers: {
|
|
151
|
+
displayName: string;
|
|
152
|
+
status: FollowMeParticipantStatus;
|
|
153
|
+
}[] | {
|
|
154
|
+
count: number;
|
|
155
|
+
};
|
|
156
|
+
providerParticipating: boolean;
|
|
157
|
+
activePromptTrigger: FollowMeSafetyTrigger | null;
|
|
158
|
+
incidentId: number | null;
|
|
159
|
+
myParticipation: {
|
|
160
|
+
participantId: string;
|
|
161
|
+
status: FollowMeParticipantStatus;
|
|
162
|
+
} | null;
|
|
163
|
+
/** App guardians who accepted: the session chat. */
|
|
164
|
+
conversationId: string | null;
|
|
165
|
+
serverTime: string;
|
|
166
|
+
}
|
|
167
|
+
/** Pending requests for an app guardian (checked after sign-in, not only on a push). */
|
|
168
|
+
export interface FollowMeRequestSummary {
|
|
169
|
+
sessionId: string;
|
|
170
|
+
participantId: string;
|
|
171
|
+
ownerFirstName: string;
|
|
172
|
+
reasonLabel: string;
|
|
173
|
+
status: FollowMeParticipantStatus;
|
|
174
|
+
invitedAt: string;
|
|
175
|
+
plannedEndAt: string;
|
|
176
|
+
}
|
|
177
|
+
/** What the setup screens need, so client and server agree. */
|
|
178
|
+
export interface FollowMeStartOptions {
|
|
179
|
+
limits: {
|
|
180
|
+
minDurationMinutes: number;
|
|
181
|
+
maxDurationMinutes: number;
|
|
182
|
+
minPromptCountdownSeconds: number;
|
|
183
|
+
maxPromptCountdownSeconds: number;
|
|
184
|
+
maxIntermediateStops: number;
|
|
185
|
+
customReasonMaxLength: number;
|
|
186
|
+
};
|
|
187
|
+
defaults: {
|
|
188
|
+
durationMinutes: number;
|
|
189
|
+
promptCountdownSeconds: number;
|
|
190
|
+
notifyServiceProvider: boolean;
|
|
191
|
+
notifyGuardiansOnStartEnd: boolean;
|
|
192
|
+
transportMode: FollowMeTransportMode;
|
|
193
|
+
};
|
|
194
|
+
tracking: {
|
|
195
|
+
locationIntervalSeconds: number;
|
|
196
|
+
distanceFilterMeters: number;
|
|
197
|
+
uploadIntervalSeconds: number;
|
|
198
|
+
};
|
|
199
|
+
crashDetection: Record<string, number | string | boolean> & {
|
|
200
|
+
enabledTransportModes: FollowMeTransportMode[];
|
|
201
|
+
};
|
|
202
|
+
serviceProvider: {
|
|
203
|
+
available: boolean;
|
|
204
|
+
tier: string | null;
|
|
205
|
+
degraded: boolean;
|
|
206
|
+
};
|
|
207
|
+
serverTime: string;
|
|
208
|
+
}
|
|
209
|
+
export interface FollowMeSafetyEventView {
|
|
210
|
+
id: string;
|
|
211
|
+
type: FollowMeSafetyEventType;
|
|
212
|
+
occurredAt: string;
|
|
213
|
+
promptId: string | null;
|
|
214
|
+
/** Metrics (distances, durations, confidence). Coordinates only for viewers allowed location. */
|
|
215
|
+
evidence: Record<string, unknown> | null;
|
|
216
|
+
}
|
|
217
|
+
export interface FollowMeAuditEntry {
|
|
218
|
+
id: string;
|
|
219
|
+
eventType: FollowMeAuditEventType;
|
|
220
|
+
fromStatus: FollowMeStatus | null;
|
|
221
|
+
toStatus: FollowMeStatus | null;
|
|
222
|
+
actorType: SafetyCheckActorType;
|
|
223
|
+
actorUserId: number | null;
|
|
224
|
+
metadata: Record<string, unknown> | null;
|
|
225
|
+
createdAt: string;
|
|
226
|
+
}
|
|
227
|
+
export interface FollowMeAdminListItem {
|
|
228
|
+
id: string;
|
|
229
|
+
status: FollowMeStatus;
|
|
230
|
+
userId: number;
|
|
231
|
+
userName: string | null;
|
|
232
|
+
organizationId: number;
|
|
233
|
+
controlCentreId: number | null;
|
|
234
|
+
reasonLabel: string;
|
|
235
|
+
durationMinutes: number;
|
|
236
|
+
startedAt: string;
|
|
237
|
+
plannedEndAt: string;
|
|
238
|
+
endedAt: string | null;
|
|
239
|
+
destinationLabel: string | null;
|
|
240
|
+
transportMode: FollowMeTransportMode | null;
|
|
241
|
+
providerParticipation: boolean;
|
|
242
|
+
sosTriggeredAt: string | null;
|
|
243
|
+
incidentId: number | null;
|
|
244
|
+
createdAt: string;
|
|
245
|
+
}
|
|
246
|
+
export interface FollowMeAdminDetail {
|
|
247
|
+
session: FollowMeSessionView & {
|
|
248
|
+
userId: number;
|
|
249
|
+
userName: string | null;
|
|
250
|
+
userPhoneNumber: string | null;
|
|
251
|
+
organizationId: number;
|
|
252
|
+
controlCentreId: number | null;
|
|
253
|
+
appId: string | null;
|
|
254
|
+
countryCode: string | null;
|
|
255
|
+
entitlementTierAtStart: string | null;
|
|
256
|
+
workflowId: string | null;
|
|
257
|
+
workflowStartedAt: string | null;
|
|
258
|
+
trackPointCount: number;
|
|
259
|
+
sosAttempts: number;
|
|
260
|
+
sosFailureReason: string | null;
|
|
261
|
+
createdAt: string;
|
|
262
|
+
updatedAt: string;
|
|
263
|
+
};
|
|
264
|
+
routes: FollowMeRouteView[];
|
|
265
|
+
prompts: FollowMePromptView[];
|
|
266
|
+
safetyEvents: FollowMeSafetyEventView[];
|
|
267
|
+
audit: FollowMeAuditEntry[];
|
|
268
|
+
trip: SafetyCheckTripSummary | null;
|
|
269
|
+
/**
|
|
270
|
+
* Whether this viewer may see where the user was: the session was shared with
|
|
271
|
+
* the provider or became an SOS, AND the gateway vouched for track:follow-me
|
|
272
|
+
* (SAFETY_LOCATION_ACCESS_HEADER). When false every coordinate, address and
|
|
273
|
+
* polyline in this response is null and GET .../tracking answers 403.
|
|
274
|
+
*/
|
|
275
|
+
locationAccess: boolean;
|
|
276
|
+
}
|
|
277
|
+
/** GET /safety/admin/follow-me/:id/tracking - track:follow-me, provider-shared or SOS sessions only. */
|
|
278
|
+
export interface FollowMeAdminTracking {
|
|
279
|
+
sessionId: string;
|
|
280
|
+
status: FollowMeStatus;
|
|
281
|
+
waypoints: FollowMeWaypointView[];
|
|
282
|
+
routes: FollowMeRouteView[];
|
|
283
|
+
latestLocation: TripPoint | null;
|
|
284
|
+
/** Oldest first, after `since`; page with pathCursor. */
|
|
285
|
+
path: TripPoint[];
|
|
286
|
+
pathCursor: string | null;
|
|
287
|
+
/** Safety events with the coordinates they were observed at. */
|
|
288
|
+
safetyEvents: FollowMeSafetyEventView[];
|
|
289
|
+
trackingHealth: FollowMeTrackingHealth;
|
|
290
|
+
serverTime: string;
|
|
291
|
+
}
|
|
292
|
+
/** One active session on the staff live map (provider-shared, in the viewer's scope). */
|
|
293
|
+
export interface FollowMeLiveSession {
|
|
294
|
+
sessionId: string;
|
|
295
|
+
status: FollowMeStatus;
|
|
296
|
+
userId: number;
|
|
297
|
+
userName: string | null;
|
|
298
|
+
organizationId: number;
|
|
299
|
+
controlCentreId: number | null;
|
|
300
|
+
reasonLabel: string;
|
|
301
|
+
transportMode: FollowMeTransportMode | null;
|
|
302
|
+
destinationLabel: string | null;
|
|
303
|
+
etaAt: string | null;
|
|
304
|
+
trackingHealth: FollowMeTrackingHealth;
|
|
305
|
+
latestLocation: TripPoint | null;
|
|
306
|
+
activePromptTrigger: FollowMeSafetyTrigger | null;
|
|
307
|
+
startedAt: string;
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Kafka payload of every KAFKA_TOPICS.FOLLOW_ME_* topic (outbox, at-least-once,
|
|
311
|
+
* keyed by session id). NO location and NO access token - an external guardian's
|
|
312
|
+
* link is minted by clarion-notification at send time through the internal
|
|
313
|
+
* access-link route.
|
|
314
|
+
*/
|
|
315
|
+
export interface FollowMeEvent {
|
|
316
|
+
eventId: string;
|
|
317
|
+
eventType: FollowMeEventType;
|
|
318
|
+
version: 1;
|
|
319
|
+
occurredAt: string;
|
|
320
|
+
correlationId: string | null;
|
|
321
|
+
sessionId: string;
|
|
322
|
+
userId: number;
|
|
323
|
+
organizationId: number;
|
|
324
|
+
controlCentreId: number | null;
|
|
325
|
+
appId: string | null;
|
|
326
|
+
countryCode: string | null;
|
|
327
|
+
status: FollowMeStatus;
|
|
328
|
+
reasonLabel: string;
|
|
329
|
+
startedAt: string;
|
|
330
|
+
plannedEndAt: string;
|
|
331
|
+
endedAt: string | null;
|
|
332
|
+
destinationLabel: string | null;
|
|
333
|
+
etaAt: string | null;
|
|
334
|
+
notifyGuardiansOnStartEnd: boolean;
|
|
335
|
+
providerParticipation: boolean;
|
|
336
|
+
guardianAudience: GuardianAudience;
|
|
337
|
+
/** Everyone asked to follow, for invitations and endings. */
|
|
338
|
+
participants: {
|
|
339
|
+
participantId: string;
|
|
340
|
+
kind: FollowMeParticipantKind;
|
|
341
|
+
status: FollowMeParticipantStatus;
|
|
342
|
+
guardianUserId: number | null;
|
|
343
|
+
/** External guardians only (E.164), for the SMS. */
|
|
344
|
+
phoneNumber: string | null;
|
|
345
|
+
displayName: string;
|
|
346
|
+
}[];
|
|
347
|
+
/** GUARDIAN_RESPONDED: who answered, and how. */
|
|
348
|
+
respondingParticipantId: string | null;
|
|
349
|
+
promptId: string | null;
|
|
350
|
+
promptTrigger: FollowMeSafetyTrigger | null;
|
|
351
|
+
promptDeadlineAt: string | null;
|
|
352
|
+
sosTrigger: SafetyCheckSosTrigger | null;
|
|
353
|
+
sosCause: FollowMeSafetyTrigger | null;
|
|
354
|
+
incidentId: number | null;
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* What clarion-safety publishes on SAFETY_REALTIME_CHANNEL. `rooms` is decided by
|
|
358
|
+
* clarion-safety from the session's CURRENT audience each time, so a guardian who
|
|
359
|
+
* stops following or a session that ends stops receiving at once. clarion-socket
|
|
360
|
+
* validates the rooms and emits SAFETY_SOCKET_EVENT with the envelope minus rooms.
|
|
361
|
+
*/
|
|
362
|
+
export interface FollowMeRealtimeEnvelope {
|
|
363
|
+
eventId: string;
|
|
364
|
+
feature: 'FOLLOW_ME';
|
|
365
|
+
type: FollowMeRealtimeEventType;
|
|
366
|
+
sessionId: string;
|
|
367
|
+
organizationId: number;
|
|
368
|
+
occurredAt: string;
|
|
369
|
+
rooms: string[];
|
|
370
|
+
payload: Record<string, unknown>;
|
|
371
|
+
}
|
|
372
|
+
/** The internal access-link answer (clarion-safety -> clarion-notification only). */
|
|
373
|
+
export interface FollowMeExternalLink {
|
|
374
|
+
url: string;
|
|
375
|
+
expiresAt: string;
|
|
376
|
+
}
|
|
377
|
+
/** Filters for GET /safety/admin/follow-me (mirrors FollowMeAdminQueryDto). */
|
|
378
|
+
export interface FollowMeAdminQuery {
|
|
379
|
+
page?: number;
|
|
380
|
+
limit?: number;
|
|
381
|
+
status?: FollowMeStatus;
|
|
382
|
+
activeOnly?: boolean;
|
|
383
|
+
/** Super-admin only. */
|
|
384
|
+
organizationId?: number;
|
|
385
|
+
userId?: number;
|
|
386
|
+
sosOnly?: boolean;
|
|
387
|
+
providerParticipation?: boolean;
|
|
388
|
+
from?: string;
|
|
389
|
+
to?: string;
|
|
390
|
+
id?: string;
|
|
391
|
+
sortBy?: 'startedAt' | 'createdAt';
|
|
392
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { GuardianAudience } from '../../alert-dispatch/interfaces/guardian-audience';
|
|
2
|
-
import { SafetyCheckActorType, SafetyCheckAuditEventType, SafetyCheckSosTrigger, SafetyCheckStatus } from '../enums/safety-enums';
|
|
2
|
+
import { SafetyCheckActorType, SafetyCheckAuditEventType, SafetyCheckSosTrigger, SafetyCheckStatus, SafetyFeature } from '../enums/safety-enums';
|
|
3
3
|
/**
|
|
4
4
|
* Response shapes of clarion-safety, mirrored from grm-shared-library
|
|
5
5
|
* (modules/safety/interfaces/safety-check.ts). Timestamps are ISO 8601 strings
|
|
@@ -14,6 +14,8 @@ export interface SafetyCheckReasonView {
|
|
|
14
14
|
/** The "Write my own" entry: the user types the reason. */
|
|
15
15
|
isCustom: boolean;
|
|
16
16
|
displayOrder: number;
|
|
17
|
+
/** Which feature offers it; absent from a service older than Follow Me means SAFETY_CHECK. */
|
|
18
|
+
feature?: SafetyFeature;
|
|
17
19
|
}
|
|
18
20
|
/** A reason as the admin manages it. */
|
|
19
21
|
export interface SafetyCheckReasonAdminView extends SafetyCheckReasonView {
|
|
@@ -29,6 +31,8 @@ export interface SafetyCheckReasonAdminView extends SafetyCheckReasonView {
|
|
|
29
31
|
export interface CreateSafetyCheckReasonRequest {
|
|
30
32
|
code: string;
|
|
31
33
|
label: string;
|
|
34
|
+
/** Which feature offers it; SAFETY_CHECK when omitted. */
|
|
35
|
+
feature?: SafetyFeature;
|
|
32
36
|
description?: string;
|
|
33
37
|
organizationId?: number;
|
|
34
38
|
countryCode?: string;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { FollowMeAuditEventType, FollowMeParticipantKind, FollowMeParticipantStatus, FollowMePromptStatus, FollowMeRouteKind, FollowMeSafetyEventType, FollowMeSafetyTrigger, FollowMeStatus, FollowMeTrackingHealth, FollowMeTransportMode, FollowMeWaypointKind } from '../enums/follow-me.enums';
|
|
2
|
+
import { SafetyTone } from './safety-display.util';
|
|
3
|
+
/**
|
|
4
|
+
* Human labels for the Follow Me enums, so every screen names the same state the
|
|
5
|
+
* same way. Paired with an icon or text wherever colour is used - never colour alone.
|
|
6
|
+
*/
|
|
7
|
+
export declare const FOLLOW_ME_STATUS_LABELS: Readonly<Record<FollowMeStatus, string>>;
|
|
8
|
+
export declare const FOLLOW_ME_PARTICIPANT_STATUS_LABELS: Readonly<Record<FollowMeParticipantStatus, string>>;
|
|
9
|
+
export declare const FOLLOW_ME_PARTICIPANT_KIND_LABELS: Readonly<Record<FollowMeParticipantKind, string>>;
|
|
10
|
+
export declare const FOLLOW_ME_TRANSPORT_MODE_LABELS: Readonly<Record<FollowMeTransportMode, string>>;
|
|
11
|
+
export declare const FOLLOW_ME_WAYPOINT_KIND_LABELS: Readonly<Record<FollowMeWaypointKind, string>>;
|
|
12
|
+
export declare const FOLLOW_ME_ROUTE_KIND_LABELS: Readonly<Record<FollowMeRouteKind, string>>;
|
|
13
|
+
export declare const FOLLOW_ME_TRIGGER_LABELS: Readonly<Record<FollowMeSafetyTrigger, string>>;
|
|
14
|
+
export declare const FOLLOW_ME_PROMPT_STATUS_LABELS: Readonly<Record<FollowMePromptStatus, string>>;
|
|
15
|
+
export declare const FOLLOW_ME_SAFETY_EVENT_LABELS: Readonly<Record<FollowMeSafetyEventType, string>>;
|
|
16
|
+
export declare const FOLLOW_ME_AUDIT_EVENT_LABELS: Readonly<Record<FollowMeAuditEventType, string>>;
|
|
17
|
+
export declare const FOLLOW_ME_TRACKING_HEALTH_LABELS: Readonly<Record<FollowMeTrackingHealth, string>>;
|
|
18
|
+
export declare function followMeStatusTone(status: FollowMeStatus): SafetyTone;
|
|
19
|
+
export declare function followMeParticipantTone(status: FollowMeParticipantStatus): SafetyTone;
|
|
20
|
+
export declare function followMeTrackingHealthTone(health: FollowMeTrackingHealth): SafetyTone;
|
|
21
|
+
/** Whether the session is still running. */
|
|
22
|
+
export declare function isOpenFollowMe(status: FollowMeStatus): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* "Live", "Updated 3 min ago" or "No location yet" - so a stale position is never
|
|
25
|
+
* presented as live. `now` is injectable for tests.
|
|
26
|
+
*/
|
|
27
|
+
export declare function describeFollowMeFreshness(health: FollowMeTrackingHealth, lastLocationAt: string | null | undefined, now?: Date): string;
|