• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

Code-4-Community / speak-for-the-trees-frontend / 9340616811

02 Jun 2024 07:13PM UTC coverage: 38.964% (-0.8%) from 39.761%
9340616811

push

github

web-flow
fix json + duped button (#364)

239 of 925 branches covered (25.84%)

Branch coverage included in aggregate %.

1115 of 2550 relevant lines covered (43.73%)

10.97 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

90.25
/src/api/protectedApiClient.ts
1
import { AppAxiosInstance } from './apiClient';
2
import { SignupRequest, UserData } from '../auth/ducks/types';
3
import {
4
  TeamResponse,
5
  Applicant,
6
  CreateTeamRequest,
7
  AddGoalRequest,
8
  InviteUserRequest,
9
  TransferOwnershipRequest,
10
} from '../containers/teamPage/ducks/types';
11
import {
12
  AuthRequest,
13
  ChangeEmailRequest,
14
  ChangePasswordRequest,
15
  ChangePrivilegeRequest,
16
  ChangeUsernameRequest,
17
  EditSiteRequest,
18
  SiteEntriesRequest,
19
  AddSiteRequest,
20
  AddSitesRequest,
21
  NameSiteEntryRequest,
22
  SendEmailRequest,
23
  AddTemplateRequest,
24
} from '../components/forms/ducks/types';
25
import {
26
  ActivityRequest,
27
  ReportSiteRequest,
28
  AdoptedSites,
29
} from '../containers/treePage/ducks/types';
30
import {
31
  AdoptionReport,
32
  StewardshipReport,
33
} from '../containers/reports/ducks/types';
34
import {
35
  FilterSitesParams,
36
  FilterSitesResponse,
37
  TemplateNamesResponse,
38
  LoadTemplateResponse,
39
} from '../containers/email/types';
40
import {
41
  FilterSiteImagesParams,
42
  FilterSiteImagesResponse,
43
} from '../containers/reviewImages/types';
44

45
export interface ProtectedApiExtraArgs {
46
  readonly protectedApiClient: ProtectedApiClient;
47
}
48

49
export interface ProtectedApiClient {
50
  readonly makeReservation: (blockId: number, teamId?: number) => Promise<void>;
51
  readonly completeReservation: (
52
    blockId: number,
53
    teamId?: number,
54
  ) => Promise<void>;
55
  readonly releaseReservation: (blockId: number) => Promise<void>;
56
  readonly uncompleteReservation: (blockId: number) => Promise<void>;
57
  readonly markReservationForQa: (blockId: number) => Promise<void>;
58
  readonly passReservationQa: (blockId: number) => Promise<void>;
59
  readonly failReservationQa: (blockId: number) => Promise<void>;
60
  readonly changePassword: (request: {
61
    currentPassword: string;
62
    newPassword: string;
63
  }) => Promise<void>;
64
  readonly changeUsername: (request: {
65
    newUsername: string;
66
    password: string;
67
  }) => Promise<void>;
68
  readonly changeEmail: (request: {
69
    newEmail: string;
70
    password: string;
71
  }) => Promise<void>;
72
  readonly deleteUser: (request: { password: string }) => Promise<void>;
73
  readonly changePrivilegeLevel: (
74
    request: ChangePrivilegeRequest,
75
  ) => Promise<void>;
76
  readonly createChild: (request: SignupRequest) => Promise<void>;
77
  readonly getUserData: () => Promise<UserData>;
78
  readonly createTeam: (request: CreateTeamRequest) => Promise<void>;
79
  readonly getTeams: () => Promise<TeamResponse[]>;
80
  readonly getTeam: (teamId: number) => Promise<TeamResponse>;
81
  readonly addGoal: (teamId: number, request: AddGoalRequest) => Promise<void>;
82
  readonly deleteGoal: (teamId: number, goalId: number) => Promise<void>;
83
  readonly inviteUser: (
84
    teamId: number,
85
    request: InviteUserRequest,
86
  ) => Promise<void>;
87
  readonly getApplicants: (teamId: number) => Promise<Applicant[]>;
88
  readonly applyToTeam: (teamId: number) => Promise<void>;
89
  readonly approveUser: (teamId: number, userId: number) => Promise<void>;
90
  readonly rejectUser: (teamId: number, userId: number) => Promise<void>;
91
  readonly kickUser: (teamId: number, memberId: number) => Promise<void>;
92
  readonly leaveTeam: (teamId: number) => Promise<void>;
93
  readonly disbandTeam: (teamId: number) => Promise<void>;
94
  readonly transferOwnership: (
95
    teamId: number,
96
    request: TransferOwnershipRequest,
97
  ) => Promise<void>;
98
  readonly adoptSite: (siteId: number) => Promise<void>;
99
  readonly unadoptSite: (siteId: number) => Promise<void>;
100
  readonly forceUnadoptSite: (siteId: number) => Promise<void>;
101
  readonly recordStewardship: (
102
    siteId: number,
103
    request: ActivityRequest,
104
  ) => Promise<void>;
105
  readonly editStewardship: (
106
    activityId: number,
107
    request: ActivityRequest,
108
  ) => Promise<void>;
109
  readonly deleteStewardship: (activityId: number) => Promise<void>;
110
  readonly getAdoptedSites: () => Promise<AdoptedSites>;
111
  readonly editSite: (
112
    siteId: number,
113
    request: EditSiteRequest,
114
  ) => Promise<void>;
115
  readonly updateSite: (
116
    siteId: number,
117
    request: SiteEntriesRequest,
118
  ) => Promise<void>;
119
  readonly editSiteEntry: (
120
    entryId: number,
121
    request: SiteEntriesRequest,
122
  ) => Promise<void>;
123
  readonly getAdoptionReport: () => Promise<AdoptionReport>;
124
  readonly getAdoptionReportCsv: (
125
    previousDays: number | null,
126
  ) => Promise<string>;
127
  readonly getStewardshipReport: () => Promise<StewardshipReport>;
128
  readonly getStewardshipReportCsv: (
129
    previousDays: number | null,
130
  ) => Promise<string>;
131
  readonly addSite: (request: AddSiteRequest) => Promise<void>;
132
  readonly nameSiteEntry: (
133
    siteId: number,
134
    request: NameSiteEntryRequest,
135
  ) => Promise<void>;
136
  readonly addSites: (request: AddSitesRequest) => Promise<void>;
137
  readonly sendEmail: (request: SendEmailRequest) => Promise<void>;
138
  readonly deleteImage: (imageId: number) => Promise<void>;
139
  readonly filterSites: (
140
    params: FilterSitesParams,
141
  ) => Promise<FilterSitesResponse>;
142
  readonly filterSiteImages: (
143
    params: FilterSiteImagesParams,
144
  ) => Promise<FilterSiteImagesResponse>;
145
  readonly approveImage: (imageId: number) => Promise<void>;
146
  readonly rejectImage: (imageId: number, reason: string) => Promise<void>;
147
  readonly uploadImage: (
148
    siteEntryId: number,
149
    imageFile: string | ArrayBuffer,
150
    anon: boolean,
151
  ) => Promise<void>;
152
  readonly getEmailTemplateNames: () => Promise<TemplateNamesResponse>;
153
  readonly loadEmailTemplateContent: (
154
    templateName: string,
155
  ) => Promise<LoadTemplateResponse>;
156
  readonly addTemplate: (request: AddTemplateRequest) => Promise<void>;
157
  readonly reportSiteForIssues: (
158
    siteId: number,
159
    request: ReportSiteRequest,
160
  ) => Promise<void>;
161
}
162

163
export enum ProtectedApiClientRoutes {
164
  MAKE_RESERVATION = '/api/v1/protected/reservations/reserve',
165
  COMPLETE_RESERVATION = '/api/v1/protected/reservations/complete',
166
  RELEASE_RESERVATION = '/api/v1/protected/reservations/release',
167
  CHANGE_PASSWORD = '/api/v1/protected/user/change_password',
168
  CHANGE_USERNAME = '/api/v1/protected/user/change_username',
169
  CHANGE_EMAIL = '/api/v1/protected/user/change_email',
170
  DELETE_USER = '/api/v1/protected/user/delete',
171
  GET_USER_DATA = '/api/v1/protected/user/data',
172
  CREATE_TEAM = '/api/v1/protected/teams/create',
173
  GET_TEAMS = '/api/v1/protected/teams/',
174
  GET_ADOPTED_SITES = '/api/v1/protected/sites/adopted_sites',
175
  ADD_SITE = '/api/v1/protected/sites/add',
176
}
177

178
export enum AdminApiClientRoutes {
179
  UNCOMPLETE_RESERVATION = '/api/v1/protected/reservations/uncomplete',
180
  MARK_RESERVATION_FOR_QA = '/api/v1/protected/reservations/qa',
181
  PASS_RESERVATION_QA = '/api/v1/protected/reservations/pass_qa',
182
  FAIL_RESERVATION_QA = '/api/v1/protected/reservations/fail_qa',
183
  CHANGE_PRIVILEGE = '/api/v1/protected/user/change_privilege',
184
  CREATE_CHILD = '/api/v1/protected/user/create_child',
185
  GET_ADOPTION_REPORT = '/api/v1/protected/report/adoption',
186
  GET_ADOPTION_REPORT_CSV = '/api/v1/protected/report/csv/adoption',
187
  GET_STEWARDSHIP_REPORT = '/api/v1/protected/report/stewardship',
188
  GET_STEWARDSHIP_REPORT_CSV = '/api/v1/protected/report/csv/adoption',
189
  ADD_SITES = '/api/v1/protected/sites/add_sites',
190
  SEND_EMAIL = '/api/v1/protected/neighborhoods/send_email',
191
  GET_TEMPLATE_NAMES = '/api/v1/protected/emailer/template_names',
192
  ADD_TEMPLATE = '/api/v1/protected/emailer/add_template',
193
}
194

195
const baseTeamRoute = '/api/v1/protected/teams/';
48✔
196
const baseSiteRoute = '/api/v1/protected/sites/';
48✔
197

198
export const ParameterizedApiRoutes = {
48✔
199
  GET_TEAM: (teamId: number): string => `${baseTeamRoute}${teamId}`,
16✔
200
  ADD_GOAL: (teamId: number): string => `${baseTeamRoute}${teamId}/add_goal`,
24✔
201
  DELETE_GOAL: (teamId: number, goalId: number): string =>
202
    `${baseTeamRoute}${teamId}/delete_goal/${goalId}`,
24✔
203
  INVITE_USER: (teamId: number): string => `${baseTeamRoute}${teamId}/invite`,
16✔
204
  GET_APPLICANTS: (teamId: number): string =>
205
    `${baseTeamRoute}${teamId}/applicants`,
24✔
206
  APPLY_TO_TEAM: (teamId: number): string => `${baseTeamRoute}${teamId}/apply`,
16✔
207
  APPROVE_USER: (teamId: number, userId: number): string =>
208
    `${baseTeamRoute}${teamId}/applicants/${userId}/approve`,
24✔
209
  REJECT_USER: (teamId: number, userId: number): string =>
210
    `${baseTeamRoute}${teamId}/applicants/${userId}/reject`,
24✔
211
  KICK_USER: (teamId: number, memberId: number): string =>
212
    `${baseTeamRoute}${teamId}/members/${memberId}/kick`,
24✔
213
  LEAVE_TEAM: (teamId: number): string => `${baseTeamRoute}${teamId}/leave`,
16✔
214
  DISBAND_TEAM: (teamId: number): string => `${baseTeamRoute}${teamId}/disband`,
24✔
215
  TRANSFER_OWNERSHIP: (teamId: number): string =>
216
    `${baseTeamRoute}${teamId}/transfer_ownership`,
24✔
217
  ADOPT_SITE: (siteId: number): string => `${baseSiteRoute}${siteId}/adopt`,
16✔
218
  UNADOPT_SITE: (siteId: number): string => `${baseSiteRoute}${siteId}/unadopt`,
16✔
219
  FORCE_UNADOPT_SITE: (siteId: number): string =>
220
    `${baseSiteRoute}${siteId}/force_unadopt`,
16✔
221
  RECORD_STEWARDSHIP: (siteId: number): string =>
222
    `${baseSiteRoute}${siteId}/record_stewardship`,
16✔
223
  EDIT_STEWARDSHIP: (activityId: number): string =>
224
    `${baseSiteRoute}edit_stewardship/${activityId}`,
24✔
225
  DELETE_STEWARDSHIP: (actvityId: number): string =>
226
    `${baseSiteRoute}delete_stewardship/${actvityId}`,
24✔
227
  UPDATE_SITE: (siteId: number): string => `${baseSiteRoute}${siteId}/update`,
16✔
228
  NAME_SITE_ENTRY: (siteId: number): string =>
229
    `${baseSiteRoute}${siteId}/name_entry`,
24✔
230
  UPLOAD_IMAGE: (siteEntryId: number): string =>
231
    `${baseSiteRoute}site_image/${siteEntryId}`,
24✔
232
  DELETE_IMAGE: (imageId: number): string =>
233
    `${baseSiteRoute}site_image/${imageId}`,
16✔
234
  REPORT_SITE: (siteId: number): string => `${baseSiteRoute}${siteId}/report`,
16✔
235
};
236

237
export const ParameterizedAdminApiRoutes = {
48✔
238
  EDIT_SITE: (siteId: number): string => `${baseSiteRoute}${siteId}/edit`,
16✔
239
  GET_ADOPTION_REPORT_CSV: (previousDays: number): string =>
240
    `/api/v1/protected/report/csv/adoption?previousDays=${previousDays}`,
16✔
241
  GET_STEWARDSHIP_REPORT_CSV: (previousDays: number): string =>
242
    `/api/v1/protected/report/csv/stewardship?previousDays=${previousDays}`,
16✔
243
  EDIT_SITE_ENTRY: (entryId: number): string =>
244
    `${baseSiteRoute}edit_entry/${entryId}`,
16✔
245
  FILTER_SITES: (params: FilterSitesParams): string =>
246
    `${baseSiteRoute}filter_sites?activityCountMin=${params.activityCountMin}${
24✔
247
      params.treeCommonNames ? `&treeCommonNames=${params.treeCommonNames}` : ''
24!
248
    }${params.adoptedStart ? `&adoptedStart=${params.adoptedStart}` : ''}${
24✔
249
      params.adoptedEnd ? `&adoptedEnd=${params.adoptedEnd}` : ''
24✔
250
    }${
251
      params.lastActivityStart
24!
252
        ? `&lastActivityStart=${params.lastActivityStart}`
253
        : ''
254
    }${
255
      params.lastActivityEnd ? `&lastActivityEnd=${params.lastActivityEnd}` : ''
24!
256
    }${
257
      params.neighborhoodIds ? `&neighborhoodIds=${params.neighborhoodIds}` : ''
24!
258
    }${
259
      params.activityCountMax !== null
24!
260
        ? `&activityCountMax=${params.activityCountMax}`
261
        : ''
262
    }`,
263
  FILTER_SITE_IMAGES: (params: FilterSiteImagesParams): string =>
264
    `${baseSiteRoute}unapproved_images${
24✔
265
      params.siteIds ||
48!
266
      params.submittedStart ||
267
      params.submittedEnd ||
268
      params.neighborhoods
269
        ? '?'
270
        : ''
271
    }
272
    ${params.siteIds ? `&siteIds=${params.siteIds}` : ''}${
24!
273
      params.submittedStart ? `&submittedStart=${params.submittedStart}` : ''
24✔
274
    }${params.submittedEnd ? `&submittedEnd=${params.submittedEnd}` : ''}${
24!
275
      params.neighborhoods ? `&neighborhoodIds=${params.neighborhoods}` : ''
24!
276
    }`,
277
  APPROVE_IMAGE: (imageId: number): string =>
278
    `api/v1/protected/sites/approve_image/${imageId}`,
×
279
  REJECT_IMAGE: (imageId: number, reason: string): string =>
280
    `api/v1/protected/sites/reject_image/${imageId}?reason=${reason}`,
×
281
  LOAD_TEMPLATE: (templateName: string): string =>
282
    `api/v1/protected/emailer/load_template/${templateName}`,
×
283
};
284

285
const makeReservation = (blockId: number, teamId?: number): Promise<void> => {
48✔
286
  return AppAxiosInstance.post(ProtectedApiClientRoutes.MAKE_RESERVATION, {
12✔
287
    blockID: blockId,
288
    teamID: teamId,
289
  }).then((res) => res.data);
8✔
290
};
291

292
const completeReservation = (
48✔
293
  blockId: number,
294
  teamId?: number,
295
): Promise<void> => {
296
  return AppAxiosInstance.post(ProtectedApiClientRoutes.COMPLETE_RESERVATION, {
12✔
297
    blockID: blockId,
298
    teamID: teamId,
299
  }).then((res) => res.data);
8✔
300
};
301

302
const releaseReservation = (blockId: number): Promise<void> => {
48✔
303
  return AppAxiosInstance.post(ProtectedApiClientRoutes.RELEASE_RESERVATION, {
8✔
304
    blockID: blockId,
305
  }).then((res) => res.data);
4✔
306
};
307

308
// Admin routes
309

310
const uncompleteReservation = (blockId: number): Promise<void> => {
48✔
311
  return AppAxiosInstance.post(AdminApiClientRoutes.UNCOMPLETE_RESERVATION, {
12✔
312
    blockID: blockId,
313
  }).then((res) => res.data);
4✔
314
};
315

316
const markReservationForQa = (blockId: number): Promise<void> => {
48✔
317
  return AppAxiosInstance.post(AdminApiClientRoutes.MARK_RESERVATION_FOR_QA, {
12✔
318
    blockID: blockId,
319
  }).then((res) => res.data);
4✔
320
};
321

322
const passReservationQa = (blockId: number): Promise<void> => {
48✔
323
  return AppAxiosInstance.post(AdminApiClientRoutes.PASS_RESERVATION_QA, {
12✔
324
    blockID: blockId,
325
  }).then((res) => res.data);
4✔
326
};
327

328
const failReservationQa = (blockId: number): Promise<void> => {
48✔
329
  return AppAxiosInstance.post(AdminApiClientRoutes.FAIL_RESERVATION_QA, {
12✔
330
    blockID: blockId,
331
  }).then((res) => res.data);
4✔
332
};
333

334
const changePassword = (request: ChangePasswordRequest): Promise<void> => {
48✔
335
  return AppAxiosInstance.post(
8✔
336
    ProtectedApiClientRoutes.CHANGE_PASSWORD,
337
    request,
338
  ).then((res) => res.data);
4✔
339
};
340

341
const changeUsername = (request: ChangeUsernameRequest): Promise<void> => {
48✔
342
  return AppAxiosInstance.post(
12✔
343
    ProtectedApiClientRoutes.CHANGE_USERNAME,
344
    request,
345
  ).then((res) => res.data);
4✔
346
};
347

348
const changeEmail = (request: ChangeEmailRequest): Promise<void> => {
48✔
349
  return AppAxiosInstance.post(
12✔
350
    ProtectedApiClientRoutes.CHANGE_EMAIL,
351
    request,
352
  ).then((res) => res.data);
4✔
353
};
354

355
const deleteUser = (request: AuthRequest): Promise<void> => {
48✔
356
  return AppAxiosInstance.post(
8✔
357
    ProtectedApiClientRoutes.DELETE_USER,
358
    request,
359
  ).then((res) => res.data);
4✔
360
};
361

362
const changePrivilegeLevel = (
48✔
363
  request: ChangePrivilegeRequest,
364
): Promise<void> => {
365
  return AppAxiosInstance.post(
12✔
366
    AdminApiClientRoutes.CHANGE_PRIVILEGE,
367
    request,
368
  ).then((res) => res.data);
4✔
369
};
370

371
const createChild = (request: SignupRequest): Promise<void> => {
48✔
372
  return AppAxiosInstance.post(AdminApiClientRoutes.CREATE_CHILD, request).then(
12✔
373
    (res) => res.data,
4✔
374
  );
375
};
376

377
const getUserData = (): Promise<UserData> => {
48✔
378
  return AppAxiosInstance.get(ProtectedApiClientRoutes.GET_USER_DATA).then(
84✔
379
    (res) => res.data,
52✔
380
  );
381
};
382

383
const createTeam = (request: CreateTeamRequest): Promise<void> => {
48✔
384
  return AppAxiosInstance.post(
8✔
385
    ProtectedApiClientRoutes.CREATE_TEAM,
386
    request,
387
  ).then((res) => res.data);
4✔
388
};
389

390
const getTeams = (): Promise<TeamResponse[]> => {
48✔
391
  return AppAxiosInstance.get(baseTeamRoute).then((res) => res.data);
4✔
392
};
393

394
const getTeam = (teamId: number): Promise<TeamResponse> => {
48✔
395
  return AppAxiosInstance.get(ParameterizedApiRoutes.GET_TEAM(teamId)).then(
8✔
396
    (res) => res.data,
4✔
397
  );
398
};
399

400
const addGoal = (teamId: number, request: AddGoalRequest): Promise<void> => {
48✔
401
  return AppAxiosInstance.post(
12✔
402
    ParameterizedApiRoutes.ADD_GOAL(teamId),
403
    request,
404
  ).then((res) => res.data);
4✔
405
};
406

407
const deleteGoal = (teamId: number, goalId: number): Promise<void> => {
48✔
408
  return AppAxiosInstance.post(
12✔
409
    ParameterizedApiRoutes.DELETE_GOAL(teamId, goalId),
410
  ).then((res) => res.data);
4✔
411
};
412

413
const inviteUser = (
48✔
414
  teamId: number,
415
  request: InviteUserRequest,
416
): Promise<void> => {
417
  return AppAxiosInstance.post(
8✔
418
    ParameterizedApiRoutes.INVITE_USER(teamId),
419
    request,
420
  ).then((res) => res.data);
4✔
421
};
422

423
const getApplicants = (teamId: number): Promise<Applicant[]> => {
48✔
424
  return AppAxiosInstance.get(
12✔
425
    ParameterizedApiRoutes.GET_APPLICANTS(teamId),
426
  ).then((res) => res.data);
4✔
427
};
428

429
const applyToTeam = (teamId: number): Promise<void> => {
48✔
430
  return AppAxiosInstance.post(
8✔
431
    ParameterizedApiRoutes.APPLY_TO_TEAM(teamId),
432
  ).then((res) => res.data);
4✔
433
};
434

435
const approveUser = (teamId: number, userId: number): Promise<void> => {
48✔
436
  return AppAxiosInstance.post(
12✔
437
    ParameterizedApiRoutes.APPROVE_USER(teamId, userId),
438
  ).then((res) => res.data);
4✔
439
};
440

441
const rejectUser = (teamId: number, userId: number): Promise<void> => {
48✔
442
  return AppAxiosInstance.post(
12✔
443
    ParameterizedApiRoutes.REJECT_USER(teamId, userId),
444
  ).then((res) => res.data);
4✔
445
};
446

447
const kickUser = (teamId: number, memberId: number): Promise<void> => {
48✔
448
  return AppAxiosInstance.post(
12✔
449
    ParameterizedApiRoutes.KICK_USER(teamId, memberId),
450
  ).then((res) => res.data);
4✔
451
};
452

453
const leaveTeam = (teamId: number): Promise<void> => {
48✔
454
  return AppAxiosInstance.post(ParameterizedApiRoutes.LEAVE_TEAM(teamId)).then(
8✔
455
    (res) => res.data,
4✔
456
  );
457
};
458

459
const disbandTeam = (teamId: number): Promise<void> => {
48✔
460
  return AppAxiosInstance.post(
12✔
461
    ParameterizedApiRoutes.DISBAND_TEAM(teamId),
462
  ).then((res) => res.data);
4✔
463
};
464

465
const transferOwnership = (
48✔
466
  teamId: number,
467
  request: TransferOwnershipRequest,
468
): Promise<void> => {
469
  return AppAxiosInstance.post(
12✔
470
    ParameterizedApiRoutes.TRANSFER_OWNERSHIP(teamId),
471
    request,
472
  ).then((res) => res.data);
4✔
473
};
474

475
const adoptSite = (siteId: number): Promise<void> => {
48✔
476
  return AppAxiosInstance.post(ParameterizedApiRoutes.ADOPT_SITE(siteId)).then(
8✔
477
    (res) => res.data,
4✔
478
  );
479
};
480

481
const unadoptSite = (siteId: number): Promise<void> => {
48✔
482
  return AppAxiosInstance.post(
8✔
483
    ParameterizedApiRoutes.UNADOPT_SITE(siteId),
484
  ).then((res) => res.data);
4✔
485
};
486

487
const forceUnadoptSite = (siteId: number): Promise<void> => {
48✔
488
  return AppAxiosInstance.post(
8✔
489
    ParameterizedApiRoutes.FORCE_UNADOPT_SITE(siteId),
490
  ).then((res) => res.data);
4✔
491
};
492

493
const recordStewardship = (
48✔
494
  siteId: number,
495
  request: ActivityRequest,
496
): Promise<void> => {
497
  return AppAxiosInstance.post(
8✔
498
    ParameterizedApiRoutes.RECORD_STEWARDSHIP(siteId),
499
    request,
500
  ).then((res) => res.data);
4✔
501
};
502

503
const editStewardship = (
48✔
504
  activityId: number,
505
  request: ActivityRequest,
506
): Promise<void> => {
507
  return AppAxiosInstance.post(
12✔
508
    ParameterizedApiRoutes.EDIT_STEWARDSHIP(activityId),
509
    request,
510
  ).then((res) => res.data);
4✔
511
};
512

513
const deleteStewardship = (siteId: number): Promise<void> => {
48✔
514
  return AppAxiosInstance.post(
12✔
515
    ParameterizedApiRoutes.DELETE_STEWARDSHIP(siteId),
516
  ).then((res) => res.data);
4✔
517
};
518

519
const getAdoptedSites = (): Promise<AdoptedSites> => {
48✔
520
  return AppAxiosInstance.get(ProtectedApiClientRoutes.GET_ADOPTED_SITES).then(
12✔
521
    (res) => res.data,
8✔
522
  );
523
};
524

525
const editSite = (siteId: number, request: EditSiteRequest): Promise<void> => {
48✔
526
  return AppAxiosInstance.post(
8✔
527
    ParameterizedAdminApiRoutes.EDIT_SITE(siteId),
528
    request,
529
  ).then((res) => res.data);
4✔
530
};
531

532
const updateSite = (
48✔
533
  siteId: number,
534
  request: SiteEntriesRequest,
535
): Promise<void> => {
536
  return AppAxiosInstance.post(
8✔
537
    ParameterizedApiRoutes.UPDATE_SITE(siteId),
538
    request,
539
  ).then((res) => res.data);
4✔
540
};
541

542
const editSiteEntry = (
48✔
543
  entryId: number,
544
  request: SiteEntriesRequest,
545
): Promise<void> => {
546
  return AppAxiosInstance.post(
8✔
547
    ParameterizedAdminApiRoutes.EDIT_SITE_ENTRY(entryId),
548
    request,
549
  ).then((res) => res.data);
4✔
550
};
551

552
const getAdoptionReport = (): Promise<AdoptionReport> => {
48✔
553
  return AppAxiosInstance.get(AdminApiClientRoutes.GET_ADOPTION_REPORT).then(
8✔
554
    (res) => res.data,
4✔
555
  );
556
};
557

558
const getAdoptionReportCsv = (previousDays: number | null): Promise<string> => {
48✔
559
  return AppAxiosInstance.get(
12✔
560
    `${
561
      previousDays
12✔
562
        ? ParameterizedAdminApiRoutes.GET_ADOPTION_REPORT_CSV(previousDays)
563
        : AdminApiClientRoutes.GET_ADOPTION_REPORT_CSV
564
    }`,
565
  ).then((res) => res.data);
8✔
566
};
567

568
const getStewardshipReport = (): Promise<StewardshipReport> => {
48✔
569
  return AppAxiosInstance.get(AdminApiClientRoutes.GET_STEWARDSHIP_REPORT).then(
8✔
570
    (res) => res.data,
4✔
571
  );
572
};
573

574
const getStewardshipReportCsv = (
48✔
575
  previousDays: number | null,
576
): Promise<string> => {
577
  return AppAxiosInstance.get(
12✔
578
    `${
579
      previousDays
12✔
580
        ? ParameterizedAdminApiRoutes.GET_STEWARDSHIP_REPORT_CSV(previousDays)
581
        : AdminApiClientRoutes.GET_STEWARDSHIP_REPORT_CSV
582
    }`,
583
  ).then((res) => res.data);
8✔
584
};
585

586
const addSite = (request: AddSiteRequest): Promise<void> => {
48✔
587
  return AppAxiosInstance.post(ProtectedApiClientRoutes.ADD_SITE, request).then(
8✔
588
    (res) => res.data,
4✔
589
  );
590
};
591

592
const nameSiteEntry = (
48✔
593
  siteId: number,
594
  request: NameSiteEntryRequest,
595
): Promise<void> => {
596
  return AppAxiosInstance.post(
12✔
597
    ParameterizedApiRoutes.NAME_SITE_ENTRY(siteId),
598
    request,
599
  ).then((res) => res.data);
4✔
600
};
601

602
const addSites = (request: AddSitesRequest): Promise<void> => {
48✔
603
  return AppAxiosInstance.post(AdminApiClientRoutes.ADD_SITES, request).then(
8✔
604
    (res) => res.data,
4✔
605
  );
606
};
607

608
const sendEmail = (request: SendEmailRequest): Promise<void> => {
48✔
609
  return AppAxiosInstance.post(AdminApiClientRoutes.SEND_EMAIL, request).then(
12✔
610
    (res) => res.data,
4✔
611
  );
612
};
613

614
const deleteImage = (imageId: number): Promise<void> => {
48✔
615
  return AppAxiosInstance.delete(
8✔
616
    ParameterizedApiRoutes.DELETE_IMAGE(imageId),
617
  ).then((res) => res.data);
4✔
618
};
619

620
const filterSites = (
48✔
621
  params: FilterSitesParams,
622
): Promise<FilterSitesResponse> => {
623
  return AppAxiosInstance.get(
12✔
624
    ParameterizedAdminApiRoutes.FILTER_SITES(params),
625
  ).then((res) => res.data);
4✔
626
};
627

628
const filterSiteImages = (
48✔
629
  params: FilterSiteImagesParams,
630
): Promise<FilterSiteImagesResponse> => {
631
  return AppAxiosInstance.get(
12✔
632
    ParameterizedAdminApiRoutes.FILTER_SITE_IMAGES(params),
633
  ).then((res) => res.data);
4✔
634
};
635

636
const approveImage = (imageId: number): Promise<void> => {
48✔
637
  return AppAxiosInstance.put(
×
638
    ParameterizedAdminApiRoutes.APPROVE_IMAGE(imageId),
639
  ).then((res) => res.data);
×
640
};
641

642
const rejectImage = (imageId: number, reason: string): Promise<void> => {
48✔
643
  return AppAxiosInstance.delete(
×
644
    ParameterizedAdminApiRoutes.REJECT_IMAGE(imageId, reason),
645
  ).then((res) => res.data);
×
646
};
647

648
const uploadImage = (
48✔
649
  siteEntryId: number,
650
  imageFile: string | ArrayBuffer,
651
  anon: boolean,
652
): Promise<void> => {
653
  return AppAxiosInstance.post(
12✔
654
    ParameterizedApiRoutes.UPLOAD_IMAGE(siteEntryId),
655
    { anonymous: anon, image: imageFile },
656
  ).then((res) => res.data);
4✔
657
};
658

659
const getEmailTemplateNames = (): Promise<TemplateNamesResponse> => {
48✔
660
  return AppAxiosInstance.get(AdminApiClientRoutes.GET_TEMPLATE_NAMES).then(
×
661
    (res) => res.data,
×
662
  );
663
};
664

665
const loadEmailTemplateContent = (
48✔
666
  templateName: string,
667
): Promise<LoadTemplateResponse> => {
668
  return AppAxiosInstance.get(
×
669
    ParameterizedAdminApiRoutes.LOAD_TEMPLATE(templateName),
670
  ).then((res) => res.data);
×
671
};
672

673
const addTemplate = (request: AddTemplateRequest): Promise<void> => {
48✔
674
  return AppAxiosInstance.post(AdminApiClientRoutes.ADD_TEMPLATE, request).then(
8✔
675
    (res) => res.data,
4✔
676
  );
677
};
678

679
const reportSiteForIssues = (
48✔
680
  siteId: number,
681
  request: ReportSiteRequest,
682
): Promise<void> => {
683
  return AppAxiosInstance.post(
8✔
684
    ParameterizedApiRoutes.REPORT_SITE(siteId),
685
    request,
686
  ).then((res) => res.data);
4✔
687
};
688

689
const Client: ProtectedApiClient = Object.freeze({
48✔
690
  makeReservation,
691
  completeReservation,
692
  releaseReservation,
693
  uncompleteReservation,
694
  markReservationForQa,
695
  passReservationQa,
696
  failReservationQa,
697
  changePassword,
698
  changeUsername,
699
  changeEmail,
700
  deleteUser,
701
  changePrivilegeLevel,
702
  createChild,
703
  getUserData,
704
  createTeam,
705
  getTeams,
706
  getTeam,
707
  addGoal,
708
  deleteGoal,
709
  inviteUser,
710
  getApplicants,
711
  applyToTeam,
712
  approveUser,
713
  rejectUser,
714
  kickUser,
715
  leaveTeam,
716
  disbandTeam,
717
  transferOwnership,
718
  adoptSite,
719
  unadoptSite,
720
  forceUnadoptSite,
721
  recordStewardship,
722
  editStewardship,
723
  deleteStewardship,
724
  getAdoptedSites,
725
  editSite,
726
  updateSite,
727
  editSiteEntry,
728
  getAdoptionReport,
729
  getAdoptionReportCsv,
730
  getStewardshipReport,
731
  getStewardshipReportCsv,
732
  addSite,
733
  nameSiteEntry,
734
  addSites,
735
  sendEmail,
736
  deleteImage,
737
  filterSites,
738
  filterSiteImages,
739
  approveImage,
740
  rejectImage,
741
  uploadImage,
742
  getEmailTemplateNames,
743
  loadEmailTemplateContent,
744
  addTemplate,
745
  reportSiteForIssues,
746
});
747

748
export default Client;
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc