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

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

07 Apr 2024 07:25PM UTC coverage: 40.738% (-0.1%) from 40.886%
8591087004

push

github

web-flow
Clot.load template2 (#346)

* templatessss

* prelim add es translations

* switch back to default en

* open planting site spacing

* Bump @testing-library/react from 11.2.7 to 12.1.5

Bumps [@testing-library/react](https://github.com/testing-library/react-testing-library) from 11.2.7 to 12.1.5.
- [Release notes](https://github.com/testing-library/react-testing-library/releases)
- [Changelog](https://github.com/testing-library/react-testing-library/blob/main/CHANGELOG.md)
- [Commits](https://github.com/testing-library/react-testing-library/compare/v11.2.7...v12.1.5)

---
updated-dependencies:
- dependency-name: "@testing-library/react"
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump follow-redirects from 1.15.2 to 1.15.4

Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.15.2 to 1.15.4.
- [Release notes](https://github.com/follow-redirects/follow-redirects/releases)
- [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.15.2...v1.15.4)

---
updated-dependencies:
- dependency-name: follow-redirects
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump @types/react-csv from 1.1.3 to 1.1.10

Bumps [@types/react-csv](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react-csv) from 1.1.3 to 1.1.10.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react-csv)

---
updated-dependencies:
- dependency-name: "@types/react-csv"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* dropdown inital implementation

* add catch clause, debugging

* load template contents boilerplate

* templatessss

* dro... (continued)

232 of 867 branches covered (26.76%)

Branch coverage included in aggregate %.

4 of 24 new or added lines in 3 files covered. (16.67%)

5 existing lines in 2 files now uncovered.

1081 of 2356 relevant lines covered (45.88%)

11.47 hits per line

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

94.97
/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
} from '../components/forms/ducks/types';
24
import {
25
  ActivityRequest,
26
  AdoptedSites,
27
} from '../containers/treePage/ducks/types';
28
import {
29
  AdoptionReport,
30
  StewardshipReport,
31
} from '../containers/reports/ducks/types';
32
import {
33
  FilterSitesParams,
34
  FilterSitesResponse,
35
  TemplateNamesResponse,
36
  LoadTemplateResponse,
37
} from '../containers/email/types';
38

39
export interface ProtectedApiExtraArgs {
40
  readonly protectedApiClient: ProtectedApiClient;
41
}
42

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

142
export enum ProtectedApiClientRoutes {
143
  MAKE_RESERVATION = '/api/v1/protected/reservations/reserve',
144
  COMPLETE_RESERVATION = '/api/v1/protected/reservations/complete',
145
  RELEASE_RESERVATION = '/api/v1/protected/reservations/release',
146
  CHANGE_PASSWORD = '/api/v1/protected/user/change_password',
147
  CHANGE_USERNAME = '/api/v1/protected/user/change_username',
148
  CHANGE_EMAIL = '/api/v1/protected/user/change_email',
149
  DELETE_USER = '/api/v1/protected/user/delete',
150
  GET_USER_DATA = '/api/v1/protected/user/data',
151
  CREATE_TEAM = '/api/v1/protected/teams/create',
152
  GET_TEAMS = '/api/v1/protected/teams/',
153
  GET_ADOPTED_SITES = '/api/v1/protected/sites/adopted_sites',
154
  ADD_SITE = '/api/v1/protected/sites/add',
155
}
156

157
export enum AdminApiClientRoutes {
158
  UNCOMPLETE_RESERVATION = '/api/v1/protected/reservations/uncomplete',
159
  MARK_RESERVATION_FOR_QA = '/api/v1/protected/reservations/qa',
160
  PASS_RESERVATION_QA = '/api/v1/protected/reservations/pass_qa',
161
  FAIL_RESERVATION_QA = '/api/v1/protected/reservations/fail_qa',
162
  CHANGE_PRIVILEGE = '/api/v1/protected/user/change_privilege',
163
  CREATE_CHILD = '/api/v1/protected/user/create_child',
164
  GET_ADOPTION_REPORT = '/api/v1/protected/report/adoption',
165
  GET_ADOPTION_REPORT_CSV = '/api/v1/protected/report/csv/adoption',
166
  GET_STEWARDSHIP_REPORT = '/api/v1/protected/report/stewardship',
167
  GET_STEWARDSHIP_REPORT_CSV = '/api/v1/protected/report/csv/adoption',
168
  ADD_SITES = '/api/v1/protected/sites/add_sites',
169
  SEND_EMAIL = '/api/v1/protected/neighborhoods/send_email',
170
  GET_TEMPLATE_NAMES = 'api/v1/protected/emailer/template_names',
171
}
172

173
const baseTeamRoute = '/api/v1/protected/teams/';
48✔
174
const baseSiteRoute = '/api/v1/protected/sites/';
48✔
175

176
export const ParameterizedApiRoutes = {
48✔
177
  GET_TEAM: (teamId: number): string => `${baseTeamRoute}${teamId}`,
16✔
178
  ADD_GOAL: (teamId: number): string => `${baseTeamRoute}${teamId}/add_goal`,
24✔
179
  DELETE_GOAL: (teamId: number, goalId: number): string =>
180
    `${baseTeamRoute}${teamId}/delete_goal/${goalId}`,
24✔
181
  INVITE_USER: (teamId: number): string => `${baseTeamRoute}${teamId}/invite`,
16✔
182
  GET_APPLICANTS: (teamId: number): string =>
183
    `${baseTeamRoute}${teamId}/applicants`,
24✔
184
  APPLY_TO_TEAM: (teamId: number): string => `${baseTeamRoute}${teamId}/apply`,
16✔
185
  APPROVE_USER: (teamId: number, userId: number): string =>
186
    `${baseTeamRoute}${teamId}/applicants/${userId}/approve`,
24✔
187
  REJECT_USER: (teamId: number, userId: number): string =>
188
    `${baseTeamRoute}${teamId}/applicants/${userId}/reject`,
24✔
189
  KICK_USER: (teamId: number, memberId: number): string =>
190
    `${baseTeamRoute}${teamId}/members/${memberId}/kick`,
24✔
191
  LEAVE_TEAM: (teamId: number): string => `${baseTeamRoute}${teamId}/leave`,
16✔
192
  DISBAND_TEAM: (teamId: number): string => `${baseTeamRoute}${teamId}/disband`,
24✔
193
  TRANSFER_OWNERSHIP: (teamId: number): string =>
194
    `${baseTeamRoute}${teamId}/transfer_ownership`,
24✔
195
  ADOPT_SITE: (siteId: number): string => `${baseSiteRoute}${siteId}/adopt`,
16✔
196
  UNADOPT_SITE: (siteId: number): string => `${baseSiteRoute}${siteId}/unadopt`,
16✔
197
  FORCE_UNADOPT_SITE: (siteId: number): string =>
198
    `${baseSiteRoute}${siteId}/force_unadopt`,
16✔
199
  RECORD_STEWARDSHIP: (siteId: number): string =>
200
    `${baseSiteRoute}${siteId}/record_stewardship`,
16✔
201
  EDIT_STEWARDSHIP: (activityId: number): string =>
202
    `${baseSiteRoute}edit_stewardship/${activityId}`,
24✔
203
  DELETE_STEWARDSHIP: (actvityId: number): string =>
204
    `${baseSiteRoute}delete_stewardship/${actvityId}`,
24✔
205
  UPDATE_SITE: (siteId: number): string => `${baseSiteRoute}${siteId}/update`,
16✔
206
  NAME_SITE_ENTRY: (siteId: number): string =>
207
    `${baseSiteRoute}${siteId}/name_entry`,
24✔
208
  DELETE_IMAGE: (imageId: number): string =>
209
    `${baseSiteRoute}site_image/${imageId}`,
16✔
210
};
211

212
export const ParameterizedAdminApiRoutes = {
48✔
213
  EDIT_SITE: (siteId: number): string => `${baseSiteRoute}${siteId}/edit`,
16✔
214
  GET_ADOPTION_REPORT_CSV: (previousDays: number): string =>
215
    `/api/v1/protected/report/csv/adoption?previousDays=${previousDays}`,
16✔
216
  GET_STEWARDSHIP_REPORT_CSV: (previousDays: number): string =>
217
    `/api/v1/protected/report/csv/stewardship?previousDays=${previousDays}`,
16✔
218
  EDIT_SITE_ENTRY: (entryId: number): string =>
219
    `${baseSiteRoute}edit_entry/${entryId}`,
16✔
220
  FILTER_SITES: (params: FilterSitesParams): string =>
221
    `${baseSiteRoute}filter_sites?activityCountMin=${params.activityCountMin}${
24✔
222
      params.treeCommonNames ? `&treeCommonNames=${params.treeCommonNames}` : ''
24!
223
    }${params.adoptedStart ? `&adoptedStart=${params.adoptedStart}` : ''}${
24✔
224
      params.adoptedEnd ? `&adoptedEnd=${params.adoptedEnd}` : ''
24✔
225
    }${
226
      params.lastActivityStart
24!
227
        ? `&lastActivityStart=${params.lastActivityStart}`
228
        : ''
229
    }${
230
      params.lastActivityEnd ? `&lastActivityEnd=${params.lastActivityEnd}` : ''
24!
231
    }${
232
      params.neighborhoodIds ? `&neighborhoodIds=${params.neighborhoodIds}` : ''
24!
233
    }${
234
      params.activityCountMax !== null
24!
235
        ? `&activityCountMax=${params.activityCountMax}`
236
        : ''
237
    }`,
238
  LOAD_TEMPLATE: (templateName: string): string =>
NEW
239
    `api/v1/protected/emailer/load_template/${templateName}`,
×
240
};
241

242
const makeReservation = (blockId: number, teamId?: number): Promise<void> => {
48✔
243
  return AppAxiosInstance.post(ProtectedApiClientRoutes.MAKE_RESERVATION, {
12✔
244
    blockID: blockId,
245
    teamID: teamId,
246
  }).then((res) => res.data);
8✔
247
};
248

249
const completeReservation = (
48✔
250
  blockId: number,
251
  teamId?: number,
252
): Promise<void> => {
253
  return AppAxiosInstance.post(ProtectedApiClientRoutes.COMPLETE_RESERVATION, {
12✔
254
    blockID: blockId,
255
    teamID: teamId,
256
  }).then((res) => res.data);
8✔
257
};
258

259
const releaseReservation = (blockId: number): Promise<void> => {
48✔
260
  return AppAxiosInstance.post(ProtectedApiClientRoutes.RELEASE_RESERVATION, {
8✔
261
    blockID: blockId,
262
  }).then((res) => res.data);
4✔
263
};
264

265
// Admin routes
266

267
const uncompleteReservation = (blockId: number): Promise<void> => {
48✔
268
  return AppAxiosInstance.post(AdminApiClientRoutes.UNCOMPLETE_RESERVATION, {
12✔
269
    blockID: blockId,
270
  }).then((res) => res.data);
4✔
271
};
272

273
const markReservationForQa = (blockId: number): Promise<void> => {
48✔
274
  return AppAxiosInstance.post(AdminApiClientRoutes.MARK_RESERVATION_FOR_QA, {
12✔
275
    blockID: blockId,
276
  }).then((res) => res.data);
4✔
277
};
278

279
const passReservationQa = (blockId: number): Promise<void> => {
48✔
280
  return AppAxiosInstance.post(AdminApiClientRoutes.PASS_RESERVATION_QA, {
12✔
281
    blockID: blockId,
282
  }).then((res) => res.data);
4✔
283
};
284

285
const failReservationQa = (blockId: number): Promise<void> => {
48✔
286
  return AppAxiosInstance.post(AdminApiClientRoutes.FAIL_RESERVATION_QA, {
12✔
287
    blockID: blockId,
288
  }).then((res) => res.data);
4✔
289
};
290

291
const changePassword = (request: ChangePasswordRequest): Promise<void> => {
48✔
292
  return AppAxiosInstance.post(
8✔
293
    ProtectedApiClientRoutes.CHANGE_PASSWORD,
294
    request,
295
  ).then((res) => res.data);
4✔
296
};
297

298
const changeUsername = (request: ChangeUsernameRequest): Promise<void> => {
48✔
299
  return AppAxiosInstance.post(
12✔
300
    ProtectedApiClientRoutes.CHANGE_USERNAME,
301
    request,
302
  ).then((res) => res.data);
4✔
303
};
304

305
const changeEmail = (request: ChangeEmailRequest): Promise<void> => {
48✔
306
  return AppAxiosInstance.post(
12✔
307
    ProtectedApiClientRoutes.CHANGE_EMAIL,
308
    request,
309
  ).then((res) => res.data);
4✔
310
};
311

312
const deleteUser = (request: AuthRequest): Promise<void> => {
48✔
313
  return AppAxiosInstance.post(
8✔
314
    ProtectedApiClientRoutes.DELETE_USER,
315
    request,
316
  ).then((res) => res.data);
4✔
317
};
318

319
const changePrivilegeLevel = (
48✔
320
  request: ChangePrivilegeRequest,
321
): Promise<void> => {
322
  return AppAxiosInstance.post(
12✔
323
    AdminApiClientRoutes.CHANGE_PRIVILEGE,
324
    request,
325
  ).then((res) => res.data);
4✔
326
};
327

328
const createChild = (request: SignupRequest): Promise<void> => {
48✔
329
  return AppAxiosInstance.post(AdminApiClientRoutes.CREATE_CHILD, request).then(
12✔
330
    (res) => res.data,
4✔
331
  );
332
};
333

334
const getUserData = (): Promise<UserData> => {
48✔
335
  return AppAxiosInstance.get(ProtectedApiClientRoutes.GET_USER_DATA).then(
84✔
336
    (res) => res.data,
52✔
337
  );
338
};
339

340
const createTeam = (request: CreateTeamRequest): Promise<void> => {
48✔
341
  return AppAxiosInstance.post(
8✔
342
    ProtectedApiClientRoutes.CREATE_TEAM,
343
    request,
344
  ).then((res) => res.data);
4✔
345
};
346

347
const getTeams = (): Promise<TeamResponse[]> => {
48✔
348
  return AppAxiosInstance.get(baseTeamRoute).then((res) => res.data);
4✔
349
};
350

351
const getTeam = (teamId: number): Promise<TeamResponse> => {
48✔
352
  return AppAxiosInstance.get(ParameterizedApiRoutes.GET_TEAM(teamId)).then(
8✔
353
    (res) => res.data,
4✔
354
  );
355
};
356

357
const addGoal = (teamId: number, request: AddGoalRequest): Promise<void> => {
48✔
358
  return AppAxiosInstance.post(
12✔
359
    ParameterizedApiRoutes.ADD_GOAL(teamId),
360
    request,
361
  ).then((res) => res.data);
4✔
362
};
363

364
const deleteGoal = (teamId: number, goalId: number): Promise<void> => {
48✔
365
  return AppAxiosInstance.post(
12✔
366
    ParameterizedApiRoutes.DELETE_GOAL(teamId, goalId),
367
  ).then((res) => res.data);
4✔
368
};
369

370
const inviteUser = (
48✔
371
  teamId: number,
372
  request: InviteUserRequest,
373
): Promise<void> => {
374
  return AppAxiosInstance.post(
8✔
375
    ParameterizedApiRoutes.INVITE_USER(teamId),
376
    request,
377
  ).then((res) => res.data);
4✔
378
};
379

380
const getApplicants = (teamId: number): Promise<Applicant[]> => {
48✔
381
  return AppAxiosInstance.get(
12✔
382
    ParameterizedApiRoutes.GET_APPLICANTS(teamId),
383
  ).then((res) => res.data);
4✔
384
};
385

386
const applyToTeam = (teamId: number): Promise<void> => {
48✔
387
  return AppAxiosInstance.post(
8✔
388
    ParameterizedApiRoutes.APPLY_TO_TEAM(teamId),
389
  ).then((res) => res.data);
4✔
390
};
391

392
const approveUser = (teamId: number, userId: number): Promise<void> => {
48✔
393
  return AppAxiosInstance.post(
12✔
394
    ParameterizedApiRoutes.APPROVE_USER(teamId, userId),
395
  ).then((res) => res.data);
4✔
396
};
397

398
const rejectUser = (teamId: number, userId: number): Promise<void> => {
48✔
399
  return AppAxiosInstance.post(
12✔
400
    ParameterizedApiRoutes.REJECT_USER(teamId, userId),
401
  ).then((res) => res.data);
4✔
402
};
403

404
const kickUser = (teamId: number, memberId: number): Promise<void> => {
48✔
405
  return AppAxiosInstance.post(
12✔
406
    ParameterizedApiRoutes.KICK_USER(teamId, memberId),
407
  ).then((res) => res.data);
4✔
408
};
409

410
const leaveTeam = (teamId: number): Promise<void> => {
48✔
411
  return AppAxiosInstance.post(ParameterizedApiRoutes.LEAVE_TEAM(teamId)).then(
8✔
412
    (res) => res.data,
4✔
413
  );
414
};
415

416
const disbandTeam = (teamId: number): Promise<void> => {
48✔
417
  return AppAxiosInstance.post(
12✔
418
    ParameterizedApiRoutes.DISBAND_TEAM(teamId),
419
  ).then((res) => res.data);
4✔
420
};
421

422
const transferOwnership = (
48✔
423
  teamId: number,
424
  request: TransferOwnershipRequest,
425
): Promise<void> => {
426
  return AppAxiosInstance.post(
12✔
427
    ParameterizedApiRoutes.TRANSFER_OWNERSHIP(teamId),
428
    request,
429
  ).then((res) => res.data);
4✔
430
};
431

432
const adoptSite = (siteId: number): Promise<void> => {
48✔
433
  return AppAxiosInstance.post(ParameterizedApiRoutes.ADOPT_SITE(siteId)).then(
8✔
434
    (res) => res.data,
4✔
435
  );
436
};
437

438
const unadoptSite = (siteId: number): Promise<void> => {
48✔
439
  return AppAxiosInstance.post(
8✔
440
    ParameterizedApiRoutes.UNADOPT_SITE(siteId),
441
  ).then((res) => res.data);
4✔
442
};
443

444
const forceUnadoptSite = (siteId: number): Promise<void> => {
48✔
445
  return AppAxiosInstance.post(
8✔
446
    ParameterizedApiRoutes.FORCE_UNADOPT_SITE(siteId),
447
  ).then((res) => res.data);
4✔
448
};
449

450
const recordStewardship = (
48✔
451
  siteId: number,
452
  request: ActivityRequest,
453
): Promise<void> => {
454
  return AppAxiosInstance.post(
8✔
455
    ParameterizedApiRoutes.RECORD_STEWARDSHIP(siteId),
456
    request,
457
  ).then((res) => res.data);
4✔
458
};
459

460
const editStewardship = (
48✔
461
  activityId: number,
462
  request: ActivityRequest,
463
): Promise<void> => {
464
  return AppAxiosInstance.post(
12✔
465
    ParameterizedApiRoutes.EDIT_STEWARDSHIP(activityId),
466
    request,
467
  ).then((res) => res.data);
4✔
468
};
469

470
const deleteStewardship = (siteId: number): Promise<void> => {
48✔
471
  return AppAxiosInstance.post(
12✔
472
    ParameterizedApiRoutes.DELETE_STEWARDSHIP(siteId),
473
  ).then((res) => res.data);
4✔
474
};
475

476
const getAdoptedSites = (): Promise<AdoptedSites> => {
48✔
477
  return AppAxiosInstance.get(ProtectedApiClientRoutes.GET_ADOPTED_SITES).then(
12✔
478
    (res) => res.data,
8✔
479
  );
480
};
481

482
const editSite = (siteId: number, request: EditSiteRequest): Promise<void> => {
48✔
483
  return AppAxiosInstance.post(
8✔
484
    ParameterizedAdminApiRoutes.EDIT_SITE(siteId),
485
    request,
486
  ).then((res) => res.data);
4✔
487
};
488

489
const updateSite = (
48✔
490
  siteId: number,
491
  request: SiteEntriesRequest,
492
): Promise<void> => {
493
  return AppAxiosInstance.post(
8✔
494
    ParameterizedApiRoutes.UPDATE_SITE(siteId),
495
    request,
496
  ).then((res) => res.data);
4✔
497
};
498

499
const editSiteEntry = (
48✔
500
  entryId: number,
501
  request: SiteEntriesRequest,
502
): Promise<void> => {
503
  return AppAxiosInstance.post(
8✔
504
    ParameterizedAdminApiRoutes.EDIT_SITE_ENTRY(entryId),
505
    request,
506
  ).then((res) => res.data);
4✔
507
};
508

509
const getAdoptionReport = (): Promise<AdoptionReport> => {
48✔
510
  return AppAxiosInstance.get(AdminApiClientRoutes.GET_ADOPTION_REPORT).then(
8✔
511
    (res) => res.data,
4✔
512
  );
513
};
514

515
const getAdoptionReportCsv = (previousDays: number | null): Promise<string> => {
48✔
516
  return AppAxiosInstance.get(
12✔
517
    `${
518
      previousDays
12✔
519
        ? ParameterizedAdminApiRoutes.GET_ADOPTION_REPORT_CSV(previousDays)
520
        : AdminApiClientRoutes.GET_ADOPTION_REPORT_CSV
521
    }`,
522
  ).then((res) => res.data);
8✔
523
};
524

525
const getStewardshipReport = (): Promise<StewardshipReport> => {
48✔
526
  return AppAxiosInstance.get(AdminApiClientRoutes.GET_STEWARDSHIP_REPORT).then(
8✔
527
    (res) => res.data,
4✔
528
  );
529
};
530

531
const getStewardshipReportCsv = (
48✔
532
  previousDays: number | null,
533
): Promise<string> => {
534
  return AppAxiosInstance.get(
12✔
535
    `${
536
      previousDays
12✔
537
        ? ParameterizedAdminApiRoutes.GET_STEWARDSHIP_REPORT_CSV(previousDays)
538
        : AdminApiClientRoutes.GET_STEWARDSHIP_REPORT_CSV
539
    }`,
540
  ).then((res) => res.data);
8✔
541
};
542

543
const addSite = (request: AddSiteRequest): Promise<void> => {
48✔
544
  return AppAxiosInstance.post(ProtectedApiClientRoutes.ADD_SITE, request).then(
8✔
545
    (res) => res.data,
4✔
546
  );
547
};
548

549
const nameSiteEntry = (
48✔
550
  siteId: number,
551
  request: NameSiteEntryRequest,
552
): Promise<void> => {
553
  return AppAxiosInstance.post(
12✔
554
    ParameterizedApiRoutes.NAME_SITE_ENTRY(siteId),
555
    request,
556
  ).then((res) => res.data);
4✔
557
};
558

559
const addSites = (request: AddSitesRequest): Promise<void> => {
48✔
560
  return AppAxiosInstance.post(AdminApiClientRoutes.ADD_SITES, request).then(
8✔
561
    (res) => res.data,
4✔
562
  );
563
};
564

565
const sendEmail = (request: SendEmailRequest): Promise<void> => {
48✔
566
  return AppAxiosInstance.post(AdminApiClientRoutes.SEND_EMAIL, request).then(
12✔
567
    (res) => res.data,
4✔
568
  );
569
};
570

571
const deleteImage = (imageId: number): Promise<void> => {
48✔
572
  return AppAxiosInstance.delete(
8✔
573
    ParameterizedApiRoutes.DELETE_IMAGE(imageId),
574
  ).then((res) => res.data);
4✔
575
};
576

577
const filterSites = (
48✔
578
  params: FilterSitesParams,
579
): Promise<FilterSitesResponse> => {
580
  return AppAxiosInstance.get(
12✔
581
    ParameterizedAdminApiRoutes.FILTER_SITES(params),
582
  ).then((res) => res.data);
4✔
583
};
584

585
const getEmailTemplateNames = (): Promise<TemplateNamesResponse> => {
48✔
NEW
586
  return AppAxiosInstance.get(AdminApiClientRoutes.GET_TEMPLATE_NAMES).then(
×
NEW
587
    (res) => res.data,
×
588
  );
589
};
590

591
const loadEmailTemplateContent = (
48✔
592
  templateName: string,
593
): Promise<LoadTemplateResponse> => {
NEW
594
  return AppAxiosInstance.get(
×
595
    ParameterizedAdminApiRoutes.LOAD_TEMPLATE(templateName),
NEW
596
  ).then((res) => res.data);
×
597
};
598

599
const Client: ProtectedApiClient = Object.freeze({
48✔
600
  makeReservation,
601
  completeReservation,
602
  releaseReservation,
603
  uncompleteReservation,
604
  markReservationForQa,
605
  passReservationQa,
606
  failReservationQa,
607
  changePassword,
608
  changeUsername,
609
  changeEmail,
610
  deleteUser,
611
  changePrivilegeLevel,
612
  createChild,
613
  getUserData,
614
  createTeam,
615
  getTeams,
616
  getTeam,
617
  addGoal,
618
  deleteGoal,
619
  inviteUser,
620
  getApplicants,
621
  applyToTeam,
622
  approveUser,
623
  rejectUser,
624
  kickUser,
625
  leaveTeam,
626
  disbandTeam,
627
  transferOwnership,
628
  adoptSite,
629
  unadoptSite,
630
  forceUnadoptSite,
631
  recordStewardship,
632
  editStewardship,
633
  deleteStewardship,
634
  getAdoptedSites,
635
  editSite,
636
  updateSite,
637
  editSiteEntry,
638
  getAdoptionReport,
639
  getAdoptionReportCsv,
640
  getStewardshipReport,
641
  getStewardshipReportCsv,
642
  addSite,
643
  nameSiteEntry,
644
  addSites,
645
  sendEmail,
646
  deleteImage,
647
  filterSites,
648
  getEmailTemplateNames,
649
  loadEmailTemplateContent,
650
});
651

652
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