@athos-sdk/api-types 1.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.
- package/README.md +49 -0
- package/dist/index.d.mts +419 -0
- package/dist/index.d.ts +419 -0
- package/dist/index.js +62 -0
- package/dist/index.mjs +32 -0
- package/package.json +33 -0
package/README.md
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# @athos/api-types
|
|
2
|
+
|
|
3
|
+
Shared TypeScript types for the Athos API: request DTOs and response shapes used by the backend, admin dashboard, and mobile app.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
From another repo (e.g. admin dashboard or mobile app):
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install @athos/api-types
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Or with a workspace (same monorepo):
|
|
14
|
+
|
|
15
|
+
```json
|
|
16
|
+
{
|
|
17
|
+
"dependencies": {
|
|
18
|
+
"@athos/api-types": "workspace:*"
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Build
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
npm install
|
|
27
|
+
npm run build
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Usage
|
|
31
|
+
|
|
32
|
+
```ts
|
|
33
|
+
import {
|
|
34
|
+
LoginDto,
|
|
35
|
+
AuthResponse,
|
|
36
|
+
GetMeResponse,
|
|
37
|
+
LeaderboardEntryStatus,
|
|
38
|
+
type Member,
|
|
39
|
+
type Gym,
|
|
40
|
+
} from '@athos/api-types';
|
|
41
|
+
|
|
42
|
+
const body: LoginDto = { email: 'u@example.com', password: 'secret123' };
|
|
43
|
+
const res: AuthResponse = await fetch('/auth/login', {
|
|
44
|
+
method: 'POST',
|
|
45
|
+
body: JSON.stringify(body),
|
|
46
|
+
}).then((r) => r.json());
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
All request bodies (DTOs) and response types match the NestJS backend routes. Enums are exported as TypeScript enums; entities and DTOs are interfaces.
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,419 @@
|
|
|
1
|
+
/** Leaderboard PR submission status */
|
|
2
|
+
declare enum LeaderboardEntryStatus {
|
|
3
|
+
PENDING = "PENDING",
|
|
4
|
+
APPROVED = "APPROVED",
|
|
5
|
+
REJECTED = "REJECTED"
|
|
6
|
+
}
|
|
7
|
+
/** How a challenge is verified (system auto vs member self-report) */
|
|
8
|
+
declare enum ChallengeVerificationType {
|
|
9
|
+
SYSTEM = "SYSTEM",
|
|
10
|
+
SELF_REPORTED = "SELF_REPORTED"
|
|
11
|
+
}
|
|
12
|
+
/** Booking lifecycle status */
|
|
13
|
+
declare enum BookingStatus {
|
|
14
|
+
PENDING = "PENDING",
|
|
15
|
+
CONFIRMED = "CONFIRMED",
|
|
16
|
+
REJECTED = "REJECTED",
|
|
17
|
+
CANCELLED = "CANCELLED",
|
|
18
|
+
COMPLETED = "COMPLETED"
|
|
19
|
+
}
|
|
20
|
+
/** Expert/trainer role type */
|
|
21
|
+
declare enum ExpertRole {
|
|
22
|
+
TRAINER = "TRAINER",
|
|
23
|
+
PHYSIO = "PHYSIO",
|
|
24
|
+
DIETITIAN = "DIETITIAN"
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** Generic success response */
|
|
28
|
+
interface SuccessResponse {
|
|
29
|
+
success: true;
|
|
30
|
+
}
|
|
31
|
+
/** Media record (e.g. profile image, gym image) */
|
|
32
|
+
interface Media {
|
|
33
|
+
id: string;
|
|
34
|
+
url: string;
|
|
35
|
+
createdAt: string;
|
|
36
|
+
}
|
|
37
|
+
/** Level for XP progression */
|
|
38
|
+
interface Level {
|
|
39
|
+
id: string;
|
|
40
|
+
levelNumber: number;
|
|
41
|
+
xpRequired: number;
|
|
42
|
+
}
|
|
43
|
+
/** User (safe, no password). Used in auth and nested in entities. */
|
|
44
|
+
interface User {
|
|
45
|
+
id: string;
|
|
46
|
+
email: string;
|
|
47
|
+
name: string | null;
|
|
48
|
+
profileImageId: string | null;
|
|
49
|
+
createdAt: string;
|
|
50
|
+
updatedAt: string;
|
|
51
|
+
}
|
|
52
|
+
/** User with roles attached (e.g. after login) */
|
|
53
|
+
interface UserWithRoles extends User {
|
|
54
|
+
roles: string[];
|
|
55
|
+
}
|
|
56
|
+
/** Gym entity */
|
|
57
|
+
interface Gym {
|
|
58
|
+
id: string;
|
|
59
|
+
name: string;
|
|
60
|
+
inviteCode: string | null;
|
|
61
|
+
weekRequirement: number;
|
|
62
|
+
primaryColor: string | null;
|
|
63
|
+
imageId: string | null;
|
|
64
|
+
createdAt: string;
|
|
65
|
+
updatedAt: string;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/** POST /auth/register */
|
|
69
|
+
interface RegisterDto {
|
|
70
|
+
email: string;
|
|
71
|
+
password: string;
|
|
72
|
+
name?: string;
|
|
73
|
+
}
|
|
74
|
+
/** POST /auth/login */
|
|
75
|
+
interface LoginDto {
|
|
76
|
+
email: string;
|
|
77
|
+
password: string;
|
|
78
|
+
}
|
|
79
|
+
/** Response from POST /auth/login */
|
|
80
|
+
interface AuthResponse {
|
|
81
|
+
accessToken: string;
|
|
82
|
+
user: UserWithRoles;
|
|
83
|
+
}
|
|
84
|
+
/** Response from POST /auth/register (user without password) */
|
|
85
|
+
interface RegisterResponse {
|
|
86
|
+
id: string;
|
|
87
|
+
email: string;
|
|
88
|
+
name: string | null;
|
|
89
|
+
profileImageId: string | null;
|
|
90
|
+
createdAt: string;
|
|
91
|
+
updatedAt: string;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/** POST /leaderboards (owner) */
|
|
95
|
+
interface CreateLeaderboardDto {
|
|
96
|
+
name: string;
|
|
97
|
+
metric: string;
|
|
98
|
+
}
|
|
99
|
+
/** POST /leaderboards/entries (member) */
|
|
100
|
+
interface SubmitEntryDto {
|
|
101
|
+
leaderboardId: string;
|
|
102
|
+
memberId: string;
|
|
103
|
+
score: string;
|
|
104
|
+
}
|
|
105
|
+
/** POST /leaderboards/entries/review (trainer/staff/owner) */
|
|
106
|
+
interface ReviewEntryDto {
|
|
107
|
+
entryId: string;
|
|
108
|
+
status: LeaderboardEntryStatus.APPROVED | LeaderboardEntryStatus.REJECTED;
|
|
109
|
+
}
|
|
110
|
+
/** Leaderboard entity */
|
|
111
|
+
interface Leaderboard {
|
|
112
|
+
id: string;
|
|
113
|
+
gymId: string;
|
|
114
|
+
name: string;
|
|
115
|
+
metric: string;
|
|
116
|
+
}
|
|
117
|
+
/** Leaderboard with entries (e.g. GET /leaderboards) */
|
|
118
|
+
interface LeaderboardWithEntries extends Leaderboard {
|
|
119
|
+
entries: LeaderboardEntry[];
|
|
120
|
+
}
|
|
121
|
+
/** LeaderboardEntry entity */
|
|
122
|
+
interface LeaderboardEntry {
|
|
123
|
+
id: string;
|
|
124
|
+
leaderboardId: string;
|
|
125
|
+
memberId: string;
|
|
126
|
+
score: string;
|
|
127
|
+
status: LeaderboardEntryStatus;
|
|
128
|
+
approvedById: string | null;
|
|
129
|
+
submittedAt: string;
|
|
130
|
+
decidedAt: string | null;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/** POST /challenges (owner) */
|
|
134
|
+
interface CreateChallengeDto {
|
|
135
|
+
title: string;
|
|
136
|
+
description?: string;
|
|
137
|
+
xpReward: number;
|
|
138
|
+
verificationType: ChallengeVerificationType;
|
|
139
|
+
/** For SYSTEM challenges: e.g. 5 = "check in 5 times this week" */
|
|
140
|
+
targetProgress?: number;
|
|
141
|
+
}
|
|
142
|
+
/** POST /challenges/occurrences (owner) */
|
|
143
|
+
interface CreateOccurrenceDto {
|
|
144
|
+
challengeId: string;
|
|
145
|
+
startDate: string;
|
|
146
|
+
endDate: string;
|
|
147
|
+
}
|
|
148
|
+
/** POST /challenges/join (member) */
|
|
149
|
+
interface JoinChallengeDto {
|
|
150
|
+
occurrenceId: string;
|
|
151
|
+
}
|
|
152
|
+
/** POST /challenges/complete (member, self-reported only) */
|
|
153
|
+
interface CompleteChallengeDto {
|
|
154
|
+
participationId: string;
|
|
155
|
+
}
|
|
156
|
+
/** Challenge entity */
|
|
157
|
+
interface Challenge {
|
|
158
|
+
id: string;
|
|
159
|
+
gymId: string;
|
|
160
|
+
title: string;
|
|
161
|
+
description: string | null;
|
|
162
|
+
xpReward: number;
|
|
163
|
+
verificationType: ChallengeVerificationType;
|
|
164
|
+
targetProgress: number | null;
|
|
165
|
+
imageId: string | null;
|
|
166
|
+
}
|
|
167
|
+
/** ChallengeOccurrence entity */
|
|
168
|
+
interface ChallengeOccurrence {
|
|
169
|
+
id: string;
|
|
170
|
+
challengeId: string;
|
|
171
|
+
startDate: string;
|
|
172
|
+
endDate: string;
|
|
173
|
+
imageId: string | null;
|
|
174
|
+
}
|
|
175
|
+
/** Occurrence with challenge and participations (e.g. GET /challenges/me/active) */
|
|
176
|
+
interface ChallengeOccurrenceWithDetails extends ChallengeOccurrence {
|
|
177
|
+
challenge: Challenge;
|
|
178
|
+
participations: ChallengeParticipation[];
|
|
179
|
+
}
|
|
180
|
+
/** ChallengeParticipation entity */
|
|
181
|
+
interface ChallengeParticipation {
|
|
182
|
+
id: string;
|
|
183
|
+
occurrenceId: string;
|
|
184
|
+
memberId: string;
|
|
185
|
+
progress: number;
|
|
186
|
+
completedAt: string | null;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/** Reward entity */
|
|
190
|
+
interface Reward {
|
|
191
|
+
id: string;
|
|
192
|
+
gymId: string;
|
|
193
|
+
name: string;
|
|
194
|
+
requiredQualifyingWeeks: number;
|
|
195
|
+
}
|
|
196
|
+
/** MemberReward (unlocked reward) */
|
|
197
|
+
interface MemberReward {
|
|
198
|
+
id: string;
|
|
199
|
+
memberId: string;
|
|
200
|
+
rewardId: string;
|
|
201
|
+
unlockedAt: string;
|
|
202
|
+
reward?: Reward;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/** PATCH /members/me */
|
|
206
|
+
interface UpdateMemberProfileDto {
|
|
207
|
+
name?: string;
|
|
208
|
+
}
|
|
209
|
+
/** POST /members/join */
|
|
210
|
+
interface JoinGymDto {
|
|
211
|
+
inviteCode: string;
|
|
212
|
+
}
|
|
213
|
+
/** POST /admin/members */
|
|
214
|
+
interface AddMemberDto {
|
|
215
|
+
userId: string;
|
|
216
|
+
}
|
|
217
|
+
/** Member entity (from API responses) */
|
|
218
|
+
interface Member {
|
|
219
|
+
id: string;
|
|
220
|
+
userId: string;
|
|
221
|
+
gymId: string;
|
|
222
|
+
levelId: string | null;
|
|
223
|
+
xp: number;
|
|
224
|
+
currentWeekStreak: number;
|
|
225
|
+
longestWeekStreak: number;
|
|
226
|
+
totalQualifyingWeeks: number;
|
|
227
|
+
lastQualifyingWeekStart: string | null;
|
|
228
|
+
createdAt: string;
|
|
229
|
+
updatedAt: string;
|
|
230
|
+
}
|
|
231
|
+
/** Member with gym (e.g. join response, getMe) */
|
|
232
|
+
interface MemberWithGym extends Member {
|
|
233
|
+
gym: Gym;
|
|
234
|
+
}
|
|
235
|
+
/** GET /members/me response */
|
|
236
|
+
interface GetMeResponse {
|
|
237
|
+
user: User;
|
|
238
|
+
member: Member & {
|
|
239
|
+
gym: Gym;
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
/** GET /members/me/stats response */
|
|
243
|
+
interface MemberStatsResponse {
|
|
244
|
+
xp: number;
|
|
245
|
+
currentWeekStreak: number;
|
|
246
|
+
longestWeekStreak: number;
|
|
247
|
+
totalQualifyingWeeks: number;
|
|
248
|
+
totalVisits: number;
|
|
249
|
+
leaderboardEntries: LeaderboardEntry[];
|
|
250
|
+
challenges: ChallengeParticipation[];
|
|
251
|
+
rewards: MemberReward[];
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/** POST /check-ins (staff/owner) */
|
|
255
|
+
interface CreateCheckInDto {
|
|
256
|
+
memberId: string;
|
|
257
|
+
gymId?: string;
|
|
258
|
+
}
|
|
259
|
+
/** CheckIn entity */
|
|
260
|
+
interface CheckIn {
|
|
261
|
+
id: string;
|
|
262
|
+
memberId: string;
|
|
263
|
+
gymId: string;
|
|
264
|
+
staffId: string | null;
|
|
265
|
+
checkedInAt: string;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
/** POST /bookings (member) */
|
|
269
|
+
interface CreateBookingDto {
|
|
270
|
+
expertId: string;
|
|
271
|
+
startAt: string;
|
|
272
|
+
endAt: string;
|
|
273
|
+
}
|
|
274
|
+
/** POST /bookings/status (expert) */
|
|
275
|
+
interface UpdateBookingStatusDto {
|
|
276
|
+
bookingId: string;
|
|
277
|
+
status: BookingStatus;
|
|
278
|
+
}
|
|
279
|
+
/** Booking entity */
|
|
280
|
+
interface Booking {
|
|
281
|
+
id: string;
|
|
282
|
+
memberId: string;
|
|
283
|
+
expertId: string;
|
|
284
|
+
startAt: string;
|
|
285
|
+
endAt: string;
|
|
286
|
+
status: BookingStatus;
|
|
287
|
+
createdAt: string;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
/** Single availability slot (day + time range) */
|
|
291
|
+
interface AvailabilitySlotDto {
|
|
292
|
+
dayOfWeek: number;
|
|
293
|
+
startTime: string;
|
|
294
|
+
endTime: string;
|
|
295
|
+
}
|
|
296
|
+
/** POST /experts/me/availability (expert) */
|
|
297
|
+
interface SetAvailabilityDto {
|
|
298
|
+
slots: AvailabilitySlotDto[];
|
|
299
|
+
}
|
|
300
|
+
/** POST /experts/me/availability-exceptions (expert) */
|
|
301
|
+
interface SetAvailabilityExceptionDto {
|
|
302
|
+
date: string;
|
|
303
|
+
isAvailable: boolean;
|
|
304
|
+
startTime?: string;
|
|
305
|
+
endTime?: string;
|
|
306
|
+
}
|
|
307
|
+
/** Expert entity */
|
|
308
|
+
interface Expert {
|
|
309
|
+
id: string;
|
|
310
|
+
userId: string;
|
|
311
|
+
gymId: string;
|
|
312
|
+
role: ExpertRole;
|
|
313
|
+
disabledAt: string | null;
|
|
314
|
+
createdAt: string;
|
|
315
|
+
updatedAt: string;
|
|
316
|
+
}
|
|
317
|
+
/** ExpertAvailability (weekly slot) */
|
|
318
|
+
interface ExpertAvailability {
|
|
319
|
+
id: string;
|
|
320
|
+
expertId: string;
|
|
321
|
+
dayOfWeek: number;
|
|
322
|
+
startTime: string;
|
|
323
|
+
endTime: string;
|
|
324
|
+
}
|
|
325
|
+
/** ExpertAvailabilityException */
|
|
326
|
+
interface ExpertAvailabilityException {
|
|
327
|
+
id: string;
|
|
328
|
+
expertId: string;
|
|
329
|
+
date: string;
|
|
330
|
+
startTime: string | null;
|
|
331
|
+
endTime: string | null;
|
|
332
|
+
isAvailable: boolean;
|
|
333
|
+
}
|
|
334
|
+
/** GET /experts/:id/availability response */
|
|
335
|
+
interface ExpertAvailabilityResponse {
|
|
336
|
+
expert: Expert;
|
|
337
|
+
slots: ExpertAvailability[];
|
|
338
|
+
exceptions: ExpertAvailabilityException[];
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
/** PATCH /admin/gym */
|
|
342
|
+
interface UpdateGymDto {
|
|
343
|
+
name?: string;
|
|
344
|
+
weekRequirement?: number;
|
|
345
|
+
primaryColor?: string;
|
|
346
|
+
inviteCode?: string | null;
|
|
347
|
+
}
|
|
348
|
+
/** POST /admin/rewards */
|
|
349
|
+
interface CreateRewardDto {
|
|
350
|
+
name: string;
|
|
351
|
+
requiredQualifyingWeeks: number;
|
|
352
|
+
}
|
|
353
|
+
/** PATCH /admin/rewards/:id */
|
|
354
|
+
interface UpdateRewardDto {
|
|
355
|
+
name?: string;
|
|
356
|
+
requiredQualifyingWeeks?: number;
|
|
357
|
+
}
|
|
358
|
+
/** POST /admin/staff */
|
|
359
|
+
interface AddStaffDto {
|
|
360
|
+
userId: string;
|
|
361
|
+
isOwner?: boolean;
|
|
362
|
+
}
|
|
363
|
+
/** POST /admin/experts */
|
|
364
|
+
interface AddExpertDto {
|
|
365
|
+
userId: string;
|
|
366
|
+
role: ExpertRole;
|
|
367
|
+
}
|
|
368
|
+
/** Staff entity */
|
|
369
|
+
interface Staff {
|
|
370
|
+
id: string;
|
|
371
|
+
userId: string;
|
|
372
|
+
gymId: string;
|
|
373
|
+
isOwner: boolean;
|
|
374
|
+
disabledAt: string | null;
|
|
375
|
+
createdAt: string;
|
|
376
|
+
updatedAt: string;
|
|
377
|
+
}
|
|
378
|
+
/** GET /admin/summary response */
|
|
379
|
+
interface AdminSummaryResponse {
|
|
380
|
+
membersCount: number;
|
|
381
|
+
staffCount: number;
|
|
382
|
+
expertsCount: number;
|
|
383
|
+
checkInsLast30: number;
|
|
384
|
+
}
|
|
385
|
+
/** Member with user (e.g. GET /admin/members) */
|
|
386
|
+
interface MemberWithUser extends Member {
|
|
387
|
+
user: User;
|
|
388
|
+
}
|
|
389
|
+
/** Staff with user (e.g. GET /admin/staff) */
|
|
390
|
+
interface StaffWithUser extends Staff {
|
|
391
|
+
user: User;
|
|
392
|
+
}
|
|
393
|
+
/** Expert with user (e.g. GET /admin/experts) */
|
|
394
|
+
interface ExpertWithUser extends Expert {
|
|
395
|
+
user: User;
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
/** Notification entity */
|
|
399
|
+
interface Notification {
|
|
400
|
+
id: string;
|
|
401
|
+
userId: string;
|
|
402
|
+
type: string;
|
|
403
|
+
title: string;
|
|
404
|
+
body: string | null;
|
|
405
|
+
readAt: string | null;
|
|
406
|
+
createdAt: string;
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
/** Activity log entity */
|
|
410
|
+
interface Activity {
|
|
411
|
+
id: string;
|
|
412
|
+
memberId: string | null;
|
|
413
|
+
gymId: string;
|
|
414
|
+
type: string;
|
|
415
|
+
metadata: Record<string, unknown> | null;
|
|
416
|
+
createdAt: string;
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
export { type Activity, type AddExpertDto, type AddMemberDto, type AddStaffDto, type AdminSummaryResponse, type AuthResponse, type AvailabilitySlotDto, type Booking, BookingStatus, type Challenge, type ChallengeOccurrence, type ChallengeOccurrenceWithDetails, type ChallengeParticipation, ChallengeVerificationType, type CheckIn, type CompleteChallengeDto, type CreateBookingDto, type CreateChallengeDto, type CreateCheckInDto, type CreateLeaderboardDto, type CreateOccurrenceDto, type CreateRewardDto, type Expert, type ExpertAvailability, type ExpertAvailabilityException, type ExpertAvailabilityResponse, ExpertRole, type ExpertWithUser, type GetMeResponse, type Gym, type JoinChallengeDto, type JoinGymDto, type Leaderboard, type LeaderboardEntry, LeaderboardEntryStatus, type LeaderboardWithEntries, type Level, type LoginDto, type Media, type Member, type MemberReward, type MemberStatsResponse, type MemberWithGym, type MemberWithUser, type Notification, type RegisterDto, type RegisterResponse, type ReviewEntryDto, type Reward, type SetAvailabilityDto, type SetAvailabilityExceptionDto, type Staff, type StaffWithUser, type SubmitEntryDto, type SuccessResponse, type UpdateBookingStatusDto, type UpdateGymDto, type UpdateMemberProfileDto, type UpdateRewardDto, type User, type UserWithRoles };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,419 @@
|
|
|
1
|
+
/** Leaderboard PR submission status */
|
|
2
|
+
declare enum LeaderboardEntryStatus {
|
|
3
|
+
PENDING = "PENDING",
|
|
4
|
+
APPROVED = "APPROVED",
|
|
5
|
+
REJECTED = "REJECTED"
|
|
6
|
+
}
|
|
7
|
+
/** How a challenge is verified (system auto vs member self-report) */
|
|
8
|
+
declare enum ChallengeVerificationType {
|
|
9
|
+
SYSTEM = "SYSTEM",
|
|
10
|
+
SELF_REPORTED = "SELF_REPORTED"
|
|
11
|
+
}
|
|
12
|
+
/** Booking lifecycle status */
|
|
13
|
+
declare enum BookingStatus {
|
|
14
|
+
PENDING = "PENDING",
|
|
15
|
+
CONFIRMED = "CONFIRMED",
|
|
16
|
+
REJECTED = "REJECTED",
|
|
17
|
+
CANCELLED = "CANCELLED",
|
|
18
|
+
COMPLETED = "COMPLETED"
|
|
19
|
+
}
|
|
20
|
+
/** Expert/trainer role type */
|
|
21
|
+
declare enum ExpertRole {
|
|
22
|
+
TRAINER = "TRAINER",
|
|
23
|
+
PHYSIO = "PHYSIO",
|
|
24
|
+
DIETITIAN = "DIETITIAN"
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** Generic success response */
|
|
28
|
+
interface SuccessResponse {
|
|
29
|
+
success: true;
|
|
30
|
+
}
|
|
31
|
+
/** Media record (e.g. profile image, gym image) */
|
|
32
|
+
interface Media {
|
|
33
|
+
id: string;
|
|
34
|
+
url: string;
|
|
35
|
+
createdAt: string;
|
|
36
|
+
}
|
|
37
|
+
/** Level for XP progression */
|
|
38
|
+
interface Level {
|
|
39
|
+
id: string;
|
|
40
|
+
levelNumber: number;
|
|
41
|
+
xpRequired: number;
|
|
42
|
+
}
|
|
43
|
+
/** User (safe, no password). Used in auth and nested in entities. */
|
|
44
|
+
interface User {
|
|
45
|
+
id: string;
|
|
46
|
+
email: string;
|
|
47
|
+
name: string | null;
|
|
48
|
+
profileImageId: string | null;
|
|
49
|
+
createdAt: string;
|
|
50
|
+
updatedAt: string;
|
|
51
|
+
}
|
|
52
|
+
/** User with roles attached (e.g. after login) */
|
|
53
|
+
interface UserWithRoles extends User {
|
|
54
|
+
roles: string[];
|
|
55
|
+
}
|
|
56
|
+
/** Gym entity */
|
|
57
|
+
interface Gym {
|
|
58
|
+
id: string;
|
|
59
|
+
name: string;
|
|
60
|
+
inviteCode: string | null;
|
|
61
|
+
weekRequirement: number;
|
|
62
|
+
primaryColor: string | null;
|
|
63
|
+
imageId: string | null;
|
|
64
|
+
createdAt: string;
|
|
65
|
+
updatedAt: string;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/** POST /auth/register */
|
|
69
|
+
interface RegisterDto {
|
|
70
|
+
email: string;
|
|
71
|
+
password: string;
|
|
72
|
+
name?: string;
|
|
73
|
+
}
|
|
74
|
+
/** POST /auth/login */
|
|
75
|
+
interface LoginDto {
|
|
76
|
+
email: string;
|
|
77
|
+
password: string;
|
|
78
|
+
}
|
|
79
|
+
/** Response from POST /auth/login */
|
|
80
|
+
interface AuthResponse {
|
|
81
|
+
accessToken: string;
|
|
82
|
+
user: UserWithRoles;
|
|
83
|
+
}
|
|
84
|
+
/** Response from POST /auth/register (user without password) */
|
|
85
|
+
interface RegisterResponse {
|
|
86
|
+
id: string;
|
|
87
|
+
email: string;
|
|
88
|
+
name: string | null;
|
|
89
|
+
profileImageId: string | null;
|
|
90
|
+
createdAt: string;
|
|
91
|
+
updatedAt: string;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/** POST /leaderboards (owner) */
|
|
95
|
+
interface CreateLeaderboardDto {
|
|
96
|
+
name: string;
|
|
97
|
+
metric: string;
|
|
98
|
+
}
|
|
99
|
+
/** POST /leaderboards/entries (member) */
|
|
100
|
+
interface SubmitEntryDto {
|
|
101
|
+
leaderboardId: string;
|
|
102
|
+
memberId: string;
|
|
103
|
+
score: string;
|
|
104
|
+
}
|
|
105
|
+
/** POST /leaderboards/entries/review (trainer/staff/owner) */
|
|
106
|
+
interface ReviewEntryDto {
|
|
107
|
+
entryId: string;
|
|
108
|
+
status: LeaderboardEntryStatus.APPROVED | LeaderboardEntryStatus.REJECTED;
|
|
109
|
+
}
|
|
110
|
+
/** Leaderboard entity */
|
|
111
|
+
interface Leaderboard {
|
|
112
|
+
id: string;
|
|
113
|
+
gymId: string;
|
|
114
|
+
name: string;
|
|
115
|
+
metric: string;
|
|
116
|
+
}
|
|
117
|
+
/** Leaderboard with entries (e.g. GET /leaderboards) */
|
|
118
|
+
interface LeaderboardWithEntries extends Leaderboard {
|
|
119
|
+
entries: LeaderboardEntry[];
|
|
120
|
+
}
|
|
121
|
+
/** LeaderboardEntry entity */
|
|
122
|
+
interface LeaderboardEntry {
|
|
123
|
+
id: string;
|
|
124
|
+
leaderboardId: string;
|
|
125
|
+
memberId: string;
|
|
126
|
+
score: string;
|
|
127
|
+
status: LeaderboardEntryStatus;
|
|
128
|
+
approvedById: string | null;
|
|
129
|
+
submittedAt: string;
|
|
130
|
+
decidedAt: string | null;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/** POST /challenges (owner) */
|
|
134
|
+
interface CreateChallengeDto {
|
|
135
|
+
title: string;
|
|
136
|
+
description?: string;
|
|
137
|
+
xpReward: number;
|
|
138
|
+
verificationType: ChallengeVerificationType;
|
|
139
|
+
/** For SYSTEM challenges: e.g. 5 = "check in 5 times this week" */
|
|
140
|
+
targetProgress?: number;
|
|
141
|
+
}
|
|
142
|
+
/** POST /challenges/occurrences (owner) */
|
|
143
|
+
interface CreateOccurrenceDto {
|
|
144
|
+
challengeId: string;
|
|
145
|
+
startDate: string;
|
|
146
|
+
endDate: string;
|
|
147
|
+
}
|
|
148
|
+
/** POST /challenges/join (member) */
|
|
149
|
+
interface JoinChallengeDto {
|
|
150
|
+
occurrenceId: string;
|
|
151
|
+
}
|
|
152
|
+
/** POST /challenges/complete (member, self-reported only) */
|
|
153
|
+
interface CompleteChallengeDto {
|
|
154
|
+
participationId: string;
|
|
155
|
+
}
|
|
156
|
+
/** Challenge entity */
|
|
157
|
+
interface Challenge {
|
|
158
|
+
id: string;
|
|
159
|
+
gymId: string;
|
|
160
|
+
title: string;
|
|
161
|
+
description: string | null;
|
|
162
|
+
xpReward: number;
|
|
163
|
+
verificationType: ChallengeVerificationType;
|
|
164
|
+
targetProgress: number | null;
|
|
165
|
+
imageId: string | null;
|
|
166
|
+
}
|
|
167
|
+
/** ChallengeOccurrence entity */
|
|
168
|
+
interface ChallengeOccurrence {
|
|
169
|
+
id: string;
|
|
170
|
+
challengeId: string;
|
|
171
|
+
startDate: string;
|
|
172
|
+
endDate: string;
|
|
173
|
+
imageId: string | null;
|
|
174
|
+
}
|
|
175
|
+
/** Occurrence with challenge and participations (e.g. GET /challenges/me/active) */
|
|
176
|
+
interface ChallengeOccurrenceWithDetails extends ChallengeOccurrence {
|
|
177
|
+
challenge: Challenge;
|
|
178
|
+
participations: ChallengeParticipation[];
|
|
179
|
+
}
|
|
180
|
+
/** ChallengeParticipation entity */
|
|
181
|
+
interface ChallengeParticipation {
|
|
182
|
+
id: string;
|
|
183
|
+
occurrenceId: string;
|
|
184
|
+
memberId: string;
|
|
185
|
+
progress: number;
|
|
186
|
+
completedAt: string | null;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/** Reward entity */
|
|
190
|
+
interface Reward {
|
|
191
|
+
id: string;
|
|
192
|
+
gymId: string;
|
|
193
|
+
name: string;
|
|
194
|
+
requiredQualifyingWeeks: number;
|
|
195
|
+
}
|
|
196
|
+
/** MemberReward (unlocked reward) */
|
|
197
|
+
interface MemberReward {
|
|
198
|
+
id: string;
|
|
199
|
+
memberId: string;
|
|
200
|
+
rewardId: string;
|
|
201
|
+
unlockedAt: string;
|
|
202
|
+
reward?: Reward;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/** PATCH /members/me */
|
|
206
|
+
interface UpdateMemberProfileDto {
|
|
207
|
+
name?: string;
|
|
208
|
+
}
|
|
209
|
+
/** POST /members/join */
|
|
210
|
+
interface JoinGymDto {
|
|
211
|
+
inviteCode: string;
|
|
212
|
+
}
|
|
213
|
+
/** POST /admin/members */
|
|
214
|
+
interface AddMemberDto {
|
|
215
|
+
userId: string;
|
|
216
|
+
}
|
|
217
|
+
/** Member entity (from API responses) */
|
|
218
|
+
interface Member {
|
|
219
|
+
id: string;
|
|
220
|
+
userId: string;
|
|
221
|
+
gymId: string;
|
|
222
|
+
levelId: string | null;
|
|
223
|
+
xp: number;
|
|
224
|
+
currentWeekStreak: number;
|
|
225
|
+
longestWeekStreak: number;
|
|
226
|
+
totalQualifyingWeeks: number;
|
|
227
|
+
lastQualifyingWeekStart: string | null;
|
|
228
|
+
createdAt: string;
|
|
229
|
+
updatedAt: string;
|
|
230
|
+
}
|
|
231
|
+
/** Member with gym (e.g. join response, getMe) */
|
|
232
|
+
interface MemberWithGym extends Member {
|
|
233
|
+
gym: Gym;
|
|
234
|
+
}
|
|
235
|
+
/** GET /members/me response */
|
|
236
|
+
interface GetMeResponse {
|
|
237
|
+
user: User;
|
|
238
|
+
member: Member & {
|
|
239
|
+
gym: Gym;
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
/** GET /members/me/stats response */
|
|
243
|
+
interface MemberStatsResponse {
|
|
244
|
+
xp: number;
|
|
245
|
+
currentWeekStreak: number;
|
|
246
|
+
longestWeekStreak: number;
|
|
247
|
+
totalQualifyingWeeks: number;
|
|
248
|
+
totalVisits: number;
|
|
249
|
+
leaderboardEntries: LeaderboardEntry[];
|
|
250
|
+
challenges: ChallengeParticipation[];
|
|
251
|
+
rewards: MemberReward[];
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/** POST /check-ins (staff/owner) */
|
|
255
|
+
interface CreateCheckInDto {
|
|
256
|
+
memberId: string;
|
|
257
|
+
gymId?: string;
|
|
258
|
+
}
|
|
259
|
+
/** CheckIn entity */
|
|
260
|
+
interface CheckIn {
|
|
261
|
+
id: string;
|
|
262
|
+
memberId: string;
|
|
263
|
+
gymId: string;
|
|
264
|
+
staffId: string | null;
|
|
265
|
+
checkedInAt: string;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
/** POST /bookings (member) */
|
|
269
|
+
interface CreateBookingDto {
|
|
270
|
+
expertId: string;
|
|
271
|
+
startAt: string;
|
|
272
|
+
endAt: string;
|
|
273
|
+
}
|
|
274
|
+
/** POST /bookings/status (expert) */
|
|
275
|
+
interface UpdateBookingStatusDto {
|
|
276
|
+
bookingId: string;
|
|
277
|
+
status: BookingStatus;
|
|
278
|
+
}
|
|
279
|
+
/** Booking entity */
|
|
280
|
+
interface Booking {
|
|
281
|
+
id: string;
|
|
282
|
+
memberId: string;
|
|
283
|
+
expertId: string;
|
|
284
|
+
startAt: string;
|
|
285
|
+
endAt: string;
|
|
286
|
+
status: BookingStatus;
|
|
287
|
+
createdAt: string;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
/** Single availability slot (day + time range) */
|
|
291
|
+
interface AvailabilitySlotDto {
|
|
292
|
+
dayOfWeek: number;
|
|
293
|
+
startTime: string;
|
|
294
|
+
endTime: string;
|
|
295
|
+
}
|
|
296
|
+
/** POST /experts/me/availability (expert) */
|
|
297
|
+
interface SetAvailabilityDto {
|
|
298
|
+
slots: AvailabilitySlotDto[];
|
|
299
|
+
}
|
|
300
|
+
/** POST /experts/me/availability-exceptions (expert) */
|
|
301
|
+
interface SetAvailabilityExceptionDto {
|
|
302
|
+
date: string;
|
|
303
|
+
isAvailable: boolean;
|
|
304
|
+
startTime?: string;
|
|
305
|
+
endTime?: string;
|
|
306
|
+
}
|
|
307
|
+
/** Expert entity */
|
|
308
|
+
interface Expert {
|
|
309
|
+
id: string;
|
|
310
|
+
userId: string;
|
|
311
|
+
gymId: string;
|
|
312
|
+
role: ExpertRole;
|
|
313
|
+
disabledAt: string | null;
|
|
314
|
+
createdAt: string;
|
|
315
|
+
updatedAt: string;
|
|
316
|
+
}
|
|
317
|
+
/** ExpertAvailability (weekly slot) */
|
|
318
|
+
interface ExpertAvailability {
|
|
319
|
+
id: string;
|
|
320
|
+
expertId: string;
|
|
321
|
+
dayOfWeek: number;
|
|
322
|
+
startTime: string;
|
|
323
|
+
endTime: string;
|
|
324
|
+
}
|
|
325
|
+
/** ExpertAvailabilityException */
|
|
326
|
+
interface ExpertAvailabilityException {
|
|
327
|
+
id: string;
|
|
328
|
+
expertId: string;
|
|
329
|
+
date: string;
|
|
330
|
+
startTime: string | null;
|
|
331
|
+
endTime: string | null;
|
|
332
|
+
isAvailable: boolean;
|
|
333
|
+
}
|
|
334
|
+
/** GET /experts/:id/availability response */
|
|
335
|
+
interface ExpertAvailabilityResponse {
|
|
336
|
+
expert: Expert;
|
|
337
|
+
slots: ExpertAvailability[];
|
|
338
|
+
exceptions: ExpertAvailabilityException[];
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
/** PATCH /admin/gym */
|
|
342
|
+
interface UpdateGymDto {
|
|
343
|
+
name?: string;
|
|
344
|
+
weekRequirement?: number;
|
|
345
|
+
primaryColor?: string;
|
|
346
|
+
inviteCode?: string | null;
|
|
347
|
+
}
|
|
348
|
+
/** POST /admin/rewards */
|
|
349
|
+
interface CreateRewardDto {
|
|
350
|
+
name: string;
|
|
351
|
+
requiredQualifyingWeeks: number;
|
|
352
|
+
}
|
|
353
|
+
/** PATCH /admin/rewards/:id */
|
|
354
|
+
interface UpdateRewardDto {
|
|
355
|
+
name?: string;
|
|
356
|
+
requiredQualifyingWeeks?: number;
|
|
357
|
+
}
|
|
358
|
+
/** POST /admin/staff */
|
|
359
|
+
interface AddStaffDto {
|
|
360
|
+
userId: string;
|
|
361
|
+
isOwner?: boolean;
|
|
362
|
+
}
|
|
363
|
+
/** POST /admin/experts */
|
|
364
|
+
interface AddExpertDto {
|
|
365
|
+
userId: string;
|
|
366
|
+
role: ExpertRole;
|
|
367
|
+
}
|
|
368
|
+
/** Staff entity */
|
|
369
|
+
interface Staff {
|
|
370
|
+
id: string;
|
|
371
|
+
userId: string;
|
|
372
|
+
gymId: string;
|
|
373
|
+
isOwner: boolean;
|
|
374
|
+
disabledAt: string | null;
|
|
375
|
+
createdAt: string;
|
|
376
|
+
updatedAt: string;
|
|
377
|
+
}
|
|
378
|
+
/** GET /admin/summary response */
|
|
379
|
+
interface AdminSummaryResponse {
|
|
380
|
+
membersCount: number;
|
|
381
|
+
staffCount: number;
|
|
382
|
+
expertsCount: number;
|
|
383
|
+
checkInsLast30: number;
|
|
384
|
+
}
|
|
385
|
+
/** Member with user (e.g. GET /admin/members) */
|
|
386
|
+
interface MemberWithUser extends Member {
|
|
387
|
+
user: User;
|
|
388
|
+
}
|
|
389
|
+
/** Staff with user (e.g. GET /admin/staff) */
|
|
390
|
+
interface StaffWithUser extends Staff {
|
|
391
|
+
user: User;
|
|
392
|
+
}
|
|
393
|
+
/** Expert with user (e.g. GET /admin/experts) */
|
|
394
|
+
interface ExpertWithUser extends Expert {
|
|
395
|
+
user: User;
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
/** Notification entity */
|
|
399
|
+
interface Notification {
|
|
400
|
+
id: string;
|
|
401
|
+
userId: string;
|
|
402
|
+
type: string;
|
|
403
|
+
title: string;
|
|
404
|
+
body: string | null;
|
|
405
|
+
readAt: string | null;
|
|
406
|
+
createdAt: string;
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
/** Activity log entity */
|
|
410
|
+
interface Activity {
|
|
411
|
+
id: string;
|
|
412
|
+
memberId: string | null;
|
|
413
|
+
gymId: string;
|
|
414
|
+
type: string;
|
|
415
|
+
metadata: Record<string, unknown> | null;
|
|
416
|
+
createdAt: string;
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
export { type Activity, type AddExpertDto, type AddMemberDto, type AddStaffDto, type AdminSummaryResponse, type AuthResponse, type AvailabilitySlotDto, type Booking, BookingStatus, type Challenge, type ChallengeOccurrence, type ChallengeOccurrenceWithDetails, type ChallengeParticipation, ChallengeVerificationType, type CheckIn, type CompleteChallengeDto, type CreateBookingDto, type CreateChallengeDto, type CreateCheckInDto, type CreateLeaderboardDto, type CreateOccurrenceDto, type CreateRewardDto, type Expert, type ExpertAvailability, type ExpertAvailabilityException, type ExpertAvailabilityResponse, ExpertRole, type ExpertWithUser, type GetMeResponse, type Gym, type JoinChallengeDto, type JoinGymDto, type Leaderboard, type LeaderboardEntry, LeaderboardEntryStatus, type LeaderboardWithEntries, type Level, type LoginDto, type Media, type Member, type MemberReward, type MemberStatsResponse, type MemberWithGym, type MemberWithUser, type Notification, type RegisterDto, type RegisterResponse, type ReviewEntryDto, type Reward, type SetAvailabilityDto, type SetAvailabilityExceptionDto, type Staff, type StaffWithUser, type SubmitEntryDto, type SuccessResponse, type UpdateBookingStatusDto, type UpdateGymDto, type UpdateMemberProfileDto, type UpdateRewardDto, type User, type UserWithRoles };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/index.ts
|
|
21
|
+
var index_exports = {};
|
|
22
|
+
__export(index_exports, {
|
|
23
|
+
BookingStatus: () => BookingStatus,
|
|
24
|
+
ChallengeVerificationType: () => ChallengeVerificationType,
|
|
25
|
+
ExpertRole: () => ExpertRole,
|
|
26
|
+
LeaderboardEntryStatus: () => LeaderboardEntryStatus
|
|
27
|
+
});
|
|
28
|
+
module.exports = __toCommonJS(index_exports);
|
|
29
|
+
|
|
30
|
+
// src/enums.ts
|
|
31
|
+
var LeaderboardEntryStatus = /* @__PURE__ */ ((LeaderboardEntryStatus2) => {
|
|
32
|
+
LeaderboardEntryStatus2["PENDING"] = "PENDING";
|
|
33
|
+
LeaderboardEntryStatus2["APPROVED"] = "APPROVED";
|
|
34
|
+
LeaderboardEntryStatus2["REJECTED"] = "REJECTED";
|
|
35
|
+
return LeaderboardEntryStatus2;
|
|
36
|
+
})(LeaderboardEntryStatus || {});
|
|
37
|
+
var ChallengeVerificationType = /* @__PURE__ */ ((ChallengeVerificationType2) => {
|
|
38
|
+
ChallengeVerificationType2["SYSTEM"] = "SYSTEM";
|
|
39
|
+
ChallengeVerificationType2["SELF_REPORTED"] = "SELF_REPORTED";
|
|
40
|
+
return ChallengeVerificationType2;
|
|
41
|
+
})(ChallengeVerificationType || {});
|
|
42
|
+
var BookingStatus = /* @__PURE__ */ ((BookingStatus2) => {
|
|
43
|
+
BookingStatus2["PENDING"] = "PENDING";
|
|
44
|
+
BookingStatus2["CONFIRMED"] = "CONFIRMED";
|
|
45
|
+
BookingStatus2["REJECTED"] = "REJECTED";
|
|
46
|
+
BookingStatus2["CANCELLED"] = "CANCELLED";
|
|
47
|
+
BookingStatus2["COMPLETED"] = "COMPLETED";
|
|
48
|
+
return BookingStatus2;
|
|
49
|
+
})(BookingStatus || {});
|
|
50
|
+
var ExpertRole = /* @__PURE__ */ ((ExpertRole2) => {
|
|
51
|
+
ExpertRole2["TRAINER"] = "TRAINER";
|
|
52
|
+
ExpertRole2["PHYSIO"] = "PHYSIO";
|
|
53
|
+
ExpertRole2["DIETITIAN"] = "DIETITIAN";
|
|
54
|
+
return ExpertRole2;
|
|
55
|
+
})(ExpertRole || {});
|
|
56
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
57
|
+
0 && (module.exports = {
|
|
58
|
+
BookingStatus,
|
|
59
|
+
ChallengeVerificationType,
|
|
60
|
+
ExpertRole,
|
|
61
|
+
LeaderboardEntryStatus
|
|
62
|
+
});
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
// src/enums.ts
|
|
2
|
+
var LeaderboardEntryStatus = /* @__PURE__ */ ((LeaderboardEntryStatus2) => {
|
|
3
|
+
LeaderboardEntryStatus2["PENDING"] = "PENDING";
|
|
4
|
+
LeaderboardEntryStatus2["APPROVED"] = "APPROVED";
|
|
5
|
+
LeaderboardEntryStatus2["REJECTED"] = "REJECTED";
|
|
6
|
+
return LeaderboardEntryStatus2;
|
|
7
|
+
})(LeaderboardEntryStatus || {});
|
|
8
|
+
var ChallengeVerificationType = /* @__PURE__ */ ((ChallengeVerificationType2) => {
|
|
9
|
+
ChallengeVerificationType2["SYSTEM"] = "SYSTEM";
|
|
10
|
+
ChallengeVerificationType2["SELF_REPORTED"] = "SELF_REPORTED";
|
|
11
|
+
return ChallengeVerificationType2;
|
|
12
|
+
})(ChallengeVerificationType || {});
|
|
13
|
+
var BookingStatus = /* @__PURE__ */ ((BookingStatus2) => {
|
|
14
|
+
BookingStatus2["PENDING"] = "PENDING";
|
|
15
|
+
BookingStatus2["CONFIRMED"] = "CONFIRMED";
|
|
16
|
+
BookingStatus2["REJECTED"] = "REJECTED";
|
|
17
|
+
BookingStatus2["CANCELLED"] = "CANCELLED";
|
|
18
|
+
BookingStatus2["COMPLETED"] = "COMPLETED";
|
|
19
|
+
return BookingStatus2;
|
|
20
|
+
})(BookingStatus || {});
|
|
21
|
+
var ExpertRole = /* @__PURE__ */ ((ExpertRole2) => {
|
|
22
|
+
ExpertRole2["TRAINER"] = "TRAINER";
|
|
23
|
+
ExpertRole2["PHYSIO"] = "PHYSIO";
|
|
24
|
+
ExpertRole2["DIETITIAN"] = "DIETITIAN";
|
|
25
|
+
return ExpertRole2;
|
|
26
|
+
})(ExpertRole || {});
|
|
27
|
+
export {
|
|
28
|
+
BookingStatus,
|
|
29
|
+
ChallengeVerificationType,
|
|
30
|
+
ExpertRole,
|
|
31
|
+
LeaderboardEntryStatus
|
|
32
|
+
};
|
package/package.json
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@athos-sdk/api-types",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Shared API request and response types for Athos backend, admin dashboard, and mobile app",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"module": "dist/index.mjs",
|
|
8
|
+
"types": "dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.mjs",
|
|
13
|
+
"require": "./dist/index.js"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist",
|
|
18
|
+
"README.md"
|
|
19
|
+
],
|
|
20
|
+
"scripts": {
|
|
21
|
+
"build": "tsup src/index.ts --format cjs,esm --dts",
|
|
22
|
+
"dev": "tsup src/index.ts --format cjs,esm --dts --watch",
|
|
23
|
+
"prepublishOnly": "npm run build",
|
|
24
|
+
"pub": "npm run build && npm publish --access public"
|
|
25
|
+
},
|
|
26
|
+
"publishConfig": {
|
|
27
|
+
"access": "public"
|
|
28
|
+
},
|
|
29
|
+
"devDependencies": {
|
|
30
|
+
"tsup": "^8.3.5",
|
|
31
|
+
"typescript": "^5.7.3"
|
|
32
|
+
}
|
|
33
|
+
}
|