rotacloud 1.0.40 → 1.0.43

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. package/dist/cjs/interfaces/index.d.ts +2 -0
  2. package/dist/cjs/interfaces/index.js +2 -0
  3. package/dist/cjs/interfaces/query-params/index.d.ts +2 -0
  4. package/dist/cjs/interfaces/query-params/index.js +2 -0
  5. package/dist/cjs/interfaces/query-params/toil-accruals-query-params.interface.d.ts +4 -0
  6. package/dist/cjs/interfaces/query-params/toil-accruals-query-params.interface.js +2 -0
  7. package/dist/cjs/interfaces/query-params/toil-allowance-query-params.interface.d.ts +3 -0
  8. package/dist/cjs/interfaces/query-params/toil-allowance-query-params.interface.js +2 -0
  9. package/dist/cjs/interfaces/toil-accrual.interface.d.ts +14 -0
  10. package/dist/cjs/interfaces/toil-accrual.interface.js +2 -0
  11. package/dist/cjs/interfaces/toil-allowance.interface.d.ts +7 -0
  12. package/dist/cjs/interfaces/toil-allowance.interface.js +2 -0
  13. package/dist/cjs/models/SDKError.model.d.ts +11 -0
  14. package/dist/cjs/models/SDKError.model.js +15 -0
  15. package/dist/cjs/models/index.d.ts +3 -1
  16. package/dist/cjs/models/index.js +3 -1
  17. package/dist/cjs/models/toil-accrual.model.d.ts +16 -0
  18. package/dist/cjs/models/toil-accrual.model.js +20 -0
  19. package/dist/cjs/models/toil-allowance.model.d.ts +9 -0
  20. package/dist/cjs/models/toil-allowance.model.js +13 -0
  21. package/dist/cjs/rotacloud.d.ts +3 -1
  22. package/dist/cjs/rotacloud.js +2 -0
  23. package/dist/cjs/services/accounts.service.js +3 -2
  24. package/dist/cjs/services/attendance.service.js +10 -5
  25. package/dist/cjs/services/auth.service.js +3 -2
  26. package/dist/cjs/services/availability.service.js +1 -2
  27. package/dist/cjs/services/daily-budgets.service.js +1 -2
  28. package/dist/cjs/services/daily-revenue.service.js +1 -2
  29. package/dist/cjs/services/day-notes.service.js +10 -5
  30. package/dist/cjs/services/days-off.service.js +2 -3
  31. package/dist/cjs/services/groups.service.js +10 -5
  32. package/dist/cjs/services/index.d.ts +2 -0
  33. package/dist/cjs/services/index.js +2 -0
  34. package/dist/cjs/services/leave-embargoes.service.js +10 -5
  35. package/dist/cjs/services/leave-request.service.js +14 -5
  36. package/dist/cjs/services/leave.service.js +10 -5
  37. package/dist/cjs/services/locations.service.js +10 -5
  38. package/dist/cjs/services/roles.service.js +10 -5
  39. package/dist/cjs/services/service.d.ts +3 -0
  40. package/dist/cjs/services/service.js +24 -2
  41. package/dist/cjs/services/settings.service.js +3 -2
  42. package/dist/cjs/services/shifts.service.d.ts +3 -3
  43. package/dist/cjs/services/shifts.service.js +21 -9
  44. package/dist/cjs/services/toil-accruals.service.d.ts +28 -0
  45. package/dist/cjs/services/toil-accruals.service.js +99 -0
  46. package/dist/cjs/services/toil-allowance.service.d.ts +10 -0
  47. package/dist/cjs/services/toil-allowance.service.js +84 -0
  48. package/dist/cjs/services/users.service.js +10 -5
  49. package/dist/cjs/version.js +1 -1
  50. package/dist/mjs/interfaces/index.d.ts +2 -0
  51. package/dist/mjs/interfaces/index.js +2 -0
  52. package/dist/mjs/interfaces/query-params/index.d.ts +2 -0
  53. package/dist/mjs/interfaces/query-params/index.js +2 -0
  54. package/dist/mjs/interfaces/query-params/toil-accruals-query-params.interface.d.ts +4 -0
  55. package/dist/mjs/interfaces/query-params/toil-accruals-query-params.interface.js +1 -0
  56. package/dist/mjs/interfaces/query-params/toil-allowance-query-params.interface.d.ts +3 -0
  57. package/dist/mjs/interfaces/query-params/toil-allowance-query-params.interface.js +1 -0
  58. package/dist/mjs/interfaces/toil-accrual.interface.d.ts +14 -0
  59. package/dist/mjs/interfaces/toil-accrual.interface.js +1 -0
  60. package/dist/mjs/interfaces/toil-allowance.interface.d.ts +7 -0
  61. package/dist/mjs/interfaces/toil-allowance.interface.js +1 -0
  62. package/dist/mjs/models/SDKError.model.d.ts +11 -0
  63. package/dist/mjs/models/SDKError.model.js +10 -0
  64. package/dist/mjs/models/index.d.ts +3 -1
  65. package/dist/mjs/models/index.js +3 -1
  66. package/dist/mjs/models/toil-accrual.model.d.ts +16 -0
  67. package/dist/mjs/models/toil-accrual.model.js +16 -0
  68. package/dist/mjs/models/toil-allowance.model.d.ts +9 -0
  69. package/dist/mjs/models/toil-allowance.model.js +9 -0
  70. package/dist/mjs/rotacloud.d.ts +3 -1
  71. package/dist/mjs/rotacloud.js +3 -1
  72. package/dist/mjs/services/accounts.service.js +3 -2
  73. package/dist/mjs/services/attendance.service.js +10 -5
  74. package/dist/mjs/services/auth.service.js +3 -2
  75. package/dist/mjs/services/availability.service.js +1 -2
  76. package/dist/mjs/services/daily-budgets.service.js +1 -2
  77. package/dist/mjs/services/daily-revenue.service.js +1 -2
  78. package/dist/mjs/services/day-notes.service.js +10 -5
  79. package/dist/mjs/services/days-off.service.js +2 -3
  80. package/dist/mjs/services/groups.service.js +10 -5
  81. package/dist/mjs/services/index.d.ts +2 -0
  82. package/dist/mjs/services/index.js +2 -0
  83. package/dist/mjs/services/leave-embargoes.service.js +10 -5
  84. package/dist/mjs/services/leave-request.service.js +14 -5
  85. package/dist/mjs/services/leave.service.js +10 -5
  86. package/dist/mjs/services/locations.service.js +10 -5
  87. package/dist/mjs/services/roles.service.js +10 -5
  88. package/dist/mjs/services/service.d.ts +3 -0
  89. package/dist/mjs/services/service.js +23 -1
  90. package/dist/mjs/services/settings.service.js +3 -2
  91. package/dist/mjs/services/shifts.service.d.ts +3 -3
  92. package/dist/mjs/services/shifts.service.js +21 -9
  93. package/dist/mjs/services/toil-accruals.service.d.ts +28 -0
  94. package/dist/mjs/services/toil-accruals.service.js +38 -0
  95. package/dist/mjs/services/toil-allowance.service.d.ts +10 -0
  96. package/dist/mjs/services/toil-allowance.service.js +23 -0
  97. package/dist/mjs/services/users.service.js +10 -5
  98. package/dist/mjs/version.js +1 -1
  99. package/package.json +1 -1
  100. package/src/interfaces/index.ts +2 -0
  101. package/src/interfaces/query-params/index.ts +2 -0
  102. package/src/interfaces/query-params/toil-accruals-query-params.interface.ts +4 -0
  103. package/src/interfaces/query-params/toil-allowance-query-params.interface.ts +3 -0
  104. package/src/interfaces/toil-accrual.interface.ts +14 -0
  105. package/src/interfaces/toil-allowance.interface.ts +7 -0
  106. package/src/models/SDKError.model.ts +20 -0
  107. package/src/models/index.ts +3 -1
  108. package/src/models/toil-accrual.model.ts +30 -0
  109. package/src/models/toil-allowance.model.ts +16 -0
  110. package/src/rotacloud.ts +4 -0
  111. package/src/services/accounts.service.ts +3 -5
  112. package/src/services/attendance.service.ts +10 -17
  113. package/src/services/auth.service.ts +3 -5
  114. package/src/services/availability.service.ts +1 -5
  115. package/src/services/daily-budgets.service.ts +1 -5
  116. package/src/services/daily-revenue.service.ts +1 -5
  117. package/src/services/day-notes.service.ts +10 -18
  118. package/src/services/days-off.service.ts +2 -10
  119. package/src/services/groups.service.ts +10 -18
  120. package/src/services/index.ts +2 -0
  121. package/src/services/leave-embargoes.service.ts +10 -17
  122. package/src/services/leave-request.service.ts +17 -17
  123. package/src/services/leave.service.ts +11 -17
  124. package/src/services/locations.service.ts +11 -17
  125. package/src/services/roles.service.ts +11 -17
  126. package/src/services/service.ts +31 -2
  127. package/src/services/settings.service.ts +4 -5
  128. package/src/services/shifts.service.ts +28 -34
  129. package/src/services/toil-accruals.service.ts +59 -0
  130. package/src/services/toil-allowance.service.ts +29 -0
  131. package/src/services/users.service.ts +11 -17
  132. package/src/version.ts +1 -1
  133. package/dist/cjs/models/error-response.model.d.ts +0 -8
  134. package/dist/cjs/models/error-response.model.js +0 -13
  135. package/dist/mjs/models/error-response.model.d.ts +0 -8
  136. package/dist/mjs/models/error-response.model.js +0 -8
  137. package/src/models/error-response.model.ts +0 -14
@@ -2,8 +2,6 @@ import { AxiosResponse } from 'axios';
2
2
  import { ApiDayNote } from '../interfaces/index.js';
3
3
  import { Service, Options } from './index.js';
4
4
 
5
- import { ErrorResponse } from '../models/error-response.model.js';
6
-
7
5
  import { DayNote } from '../models/day-note.model.js';
8
6
  import { DayNotesQueryParams } from '../interfaces/query-params/day-notes-query-params.interface';
9
7
 
@@ -14,20 +12,18 @@ export class DayNotesService extends Service {
14
12
  create(data: ApiDayNote, options: { rawResponse: true } & Options): Promise<AxiosResponse<ApiDayNote, any>>;
15
13
  create(data: ApiDayNote, options: Options): Promise<DayNote>;
16
14
  create(data: ApiDayNote, options?: Options) {
17
- return super.fetch<ApiDayNote>({ url: this.apiPath, data, method: 'POST' }).then(
18
- (res) => Promise.resolve(options?.rawResponse ? res : new DayNote(res.data)),
19
- (err) => Promise.reject(options?.rawResponse ? err : new ErrorResponse(err))
20
- );
15
+ return super
16
+ .fetch<ApiDayNote>({ url: this.apiPath, data, method: 'POST' })
17
+ .then((res) => Promise.resolve(options?.rawResponse ? res : new DayNote(res.data)));
21
18
  }
22
19
 
23
20
  get(id: number): Promise<DayNote>;
24
21
  get(id: number, options: { rawResponse: true } & Options): Promise<AxiosResponse<ApiDayNote, any>>;
25
22
  get(id: number, options: Options): Promise<DayNote>;
26
23
  get(id: number, options?: Options) {
27
- return super.fetch<ApiDayNote>({ url: `${this.apiPath}/${id}` }, options).then(
28
- (res) => Promise.resolve(options?.rawResponse ? res : new DayNote(res.data)),
29
- (err) => Promise.reject(options?.rawResponse ? err : new ErrorResponse(err))
30
- );
24
+ return super
25
+ .fetch<ApiDayNote>({ url: `${this.apiPath}/${id}` }, options)
26
+ .then((res) => Promise.resolve(options?.rawResponse ? res : new DayNote(res.data)));
31
27
  }
32
28
 
33
29
  async *list(query: DayNotesQueryParams, options?: Options) {
@@ -63,19 +59,15 @@ export class DayNotesService extends Service {
63
59
  data,
64
60
  method: 'POST',
65
61
  })
66
- .then(
67
- (res) => Promise.resolve(options?.rawResponse ? res : new DayNote(res.data)),
68
- (err) => Promise.reject(options?.rawResponse ? err : new ErrorResponse(err))
69
- );
62
+ .then((res) => Promise.resolve(options?.rawResponse ? res : new DayNote(res.data)));
70
63
  }
71
64
 
72
65
  delete(id: number): Promise<number>;
73
66
  delete(id: number, options: { rawResponse: true } & Options): Promise<AxiosResponse<any, any>>;
74
67
  delete(id: number, options: Options): Promise<number>;
75
68
  delete(id: number, options?: Options) {
76
- return super.fetch<ApiDayNote>({ url: `${this.apiPath}/${id}`, method: 'DELETE' }).then(
77
- (res) => Promise.resolve(options?.rawResponse ? res : res.status),
78
- (err) => Promise.reject(options?.rawResponse ? err : new ErrorResponse(err))
79
- );
69
+ return super
70
+ .fetch<ApiDayNote>({ url: `${this.apiPath}/${id}`, method: 'DELETE' })
71
+ .then((res) => Promise.resolve(options?.rawResponse ? res : res.status));
80
72
  }
81
73
  }
@@ -2,8 +2,6 @@ import { AxiosResponse } from 'axios';
2
2
  import { ApiDaysOff } from '../interfaces/index.js';
3
3
  import { Service, Options } from './index.js';
4
4
 
5
- import { ErrorResponse } from '../models/error-response.model.js';
6
-
7
5
  import { DaysOff } from '../models/days-off.model.js';
8
6
  import { DaysOffQueryParams } from '../interfaces/query-params/days-off-query-params.interface.js';
9
7
 
@@ -27,10 +25,7 @@ export class DaysOffService extends Service<ApiDaysOff> {
27
25
  },
28
26
  method: 'POST',
29
27
  })
30
- .then(
31
- (res) => Promise.resolve(options?.rawResponse ? res : res.status),
32
- (err) => Promise.reject(options?.rawResponse ? err : new ErrorResponse(err))
33
- );
28
+ .then((res) => Promise.resolve(options?.rawResponse ? res : res.status));
34
29
  }
35
30
 
36
31
  async *list(query: DaysOffQueryParams, options?: Options) {
@@ -65,9 +60,6 @@ export class DaysOffService extends Service<ApiDaysOff> {
65
60
  users,
66
61
  },
67
62
  })
68
- .then(
69
- (res) => Promise.resolve(options?.rawResponse ? res : res.status),
70
- (err) => Promise.reject(options?.rawResponse ? err : new ErrorResponse(err))
71
- );
63
+ .then((res) => Promise.resolve(options?.rawResponse ? res : res.status));
72
64
  }
73
65
  }
@@ -2,8 +2,6 @@ import { AxiosResponse } from 'axios';
2
2
  import { ApiGroup } from '../interfaces/index.js';
3
3
  import { Service, Options, RequirementsOf } from './index.js';
4
4
 
5
- import { ErrorResponse } from '../models/error-response.model.js';
6
-
7
5
  import { Group } from '../models/group.model.js';
8
6
  import { GroupsQueryParams } from '../interfaces/query-params/groups-query-params.interface.js';
9
7
 
@@ -19,20 +17,18 @@ export class GroupsService extends Service {
19
17
  ): Promise<AxiosResponse<ApiGroup, any>>;
20
18
  create(data: RequirementsOf<ApiGroup, RequiredProps>, options: Options): Promise<Group>;
21
19
  create(data: RequirementsOf<ApiGroup, RequiredProps>, options?: Options) {
22
- return super.fetch<ApiGroup>({ url: this.apiPath, data, method: 'POST' }).then(
23
- (res) => Promise.resolve(options?.rawResponse ? res : new Group(res.data)),
24
- (err) => Promise.reject(options?.rawResponse ? err : new ErrorResponse(err))
25
- );
20
+ return super
21
+ .fetch<ApiGroup>({ url: this.apiPath, data, method: 'POST' })
22
+ .then((res) => Promise.resolve(options?.rawResponse ? res : new Group(res.data)));
26
23
  }
27
24
 
28
25
  get(id: number): Promise<Group>;
29
26
  get(id: number, options: { rawResponse: true } & Options): Promise<AxiosResponse<ApiGroup, any>>;
30
27
  get(id: number, options: Options): Promise<Group>;
31
28
  get(id: number, options?: Options) {
32
- return super.fetch<ApiGroup>({ url: `${this.apiPath}/${id}` }, options).then(
33
- (res) => Promise.resolve(options?.rawResponse ? res : new Group(res.data)),
34
- (err) => Promise.reject(options?.rawResponse ? err : new ErrorResponse(err))
35
- );
29
+ return super
30
+ .fetch<ApiGroup>({ url: `${this.apiPath}/${id}` }, options)
31
+ .then((res) => Promise.resolve(options?.rawResponse ? res : new Group(res.data)));
36
32
  }
37
33
 
38
34
  async *list(query?: GroupsQueryParams, options?: Options) {
@@ -68,19 +64,15 @@ export class GroupsService extends Service {
68
64
  data,
69
65
  method: 'POST',
70
66
  })
71
- .then(
72
- (res) => Promise.resolve(options?.rawResponse ? res : new Group(res.data)),
73
- (err) => Promise.reject(options?.rawResponse ? err : new ErrorResponse(err))
74
- );
67
+ .then((res) => Promise.resolve(options?.rawResponse ? res : new Group(res.data)));
75
68
  }
76
69
 
77
70
  delete(id: number): Promise<number>;
78
71
  delete(id: number, options: { rawResponse: true } & Options): Promise<AxiosResponse<any, any>>;
79
72
  delete(id: number, options: Options): Promise<number>;
80
73
  delete(id: number, options?: Options) {
81
- return super.fetch<ApiGroup>({ url: `${this.apiPath}/${id}`, method: 'DELETE' }).then(
82
- (res) => Promise.resolve(options?.rawResponse ? res : res.status),
83
- (err) => Promise.reject(options?.rawResponse ? err : new ErrorResponse(err))
84
- );
74
+ return super
75
+ .fetch<ApiGroup>({ url: `${this.apiPath}/${id}`, method: 'DELETE' })
76
+ .then((res) => Promise.resolve(options?.rawResponse ? res : res.status));
85
77
  }
86
78
  }
@@ -14,4 +14,6 @@ export * from './locations.service.js';
14
14
  export * from './roles.service.js';
15
15
  export * from './settings.service.js';
16
16
  export * from './shifts.service.js';
17
+ export * from './toil-accruals.service.js';
18
+ export * from './toil-allowance.service.js';
17
19
  export * from './users.service.js';
@@ -3,7 +3,6 @@ import { ApiLeaveEmbargo } from '../interfaces/index.js';
3
3
  import { Service, Options, RequirementsOf } from './index.js';
4
4
 
5
5
  import { LeaveEmbargo } from '../models/leave-embargo.model.js';
6
- import { ErrorResponse } from '../models/error-response.model.js';
7
6
  import { LeaveEmbargoesQueryParams } from '../rotacloud.js';
8
7
 
9
8
  type RequiredProps = 'start_date' | 'end_date' | 'users';
@@ -18,20 +17,18 @@ export class LeaveEmbargoesService extends Service {
18
17
  ): Promise<AxiosResponse<ApiLeaveEmbargo, any>>;
19
18
  create(data: RequirementsOf<ApiLeaveEmbargo, RequiredProps>, options: Options): Promise<LeaveEmbargo>;
20
19
  create(data: RequirementsOf<ApiLeaveEmbargo, RequiredProps>, options?: Options) {
21
- return super.fetch<ApiLeaveEmbargo>({ url: this.apiPath, data, method: 'POST' }).then(
22
- (res) => Promise.resolve(options?.rawResponse ? res : new LeaveEmbargo(res.data)),
23
- (err) => Promise.reject(options?.rawResponse ? err : new ErrorResponse(err))
24
- );
20
+ return super
21
+ .fetch<ApiLeaveEmbargo>({ url: this.apiPath, data, method: 'POST' })
22
+ .then((res) => Promise.resolve(options?.rawResponse ? res : new LeaveEmbargo(res.data)));
25
23
  }
26
24
 
27
25
  get(id: number): Promise<LeaveEmbargo>;
28
26
  get(id: number, options: { rawResponse: true }): Promise<AxiosResponse<ApiLeaveEmbargo, any>>;
29
27
  get(id: number, options: Options): Promise<LeaveEmbargo>;
30
28
  get(id: number, options?: Options) {
31
- return super.fetch<ApiLeaveEmbargo>({ url: `${this.apiPath}/${id}` }, options).then(
32
- (res) => Promise.resolve(options?.rawResponse ? res : new LeaveEmbargo(res.data)),
33
- (err) => Promise.reject(options?.rawResponse ? err : new ErrorResponse(err))
34
- );
29
+ return super
30
+ .fetch<ApiLeaveEmbargo>({ url: `${this.apiPath}/${id}` }, options)
31
+ .then((res) => Promise.resolve(options?.rawResponse ? res : new LeaveEmbargo(res.data)));
35
32
  }
36
33
 
37
34
  async *list(query: LeaveEmbargoesQueryParams, options?: Options) {
@@ -67,19 +64,15 @@ export class LeaveEmbargoesService extends Service {
67
64
  data,
68
65
  method: 'POST',
69
66
  })
70
- .then(
71
- (res) => Promise.resolve(options?.rawResponse ? res : new LeaveEmbargo(res.data)),
72
- (err) => Promise.reject(options?.rawResponse ? err : new ErrorResponse(err))
73
- );
67
+ .then((res) => Promise.resolve(options?.rawResponse ? res : new LeaveEmbargo(res.data)));
74
68
  }
75
69
 
76
70
  delete(id: number): Promise<number>;
77
71
  delete(id: number, options: { rawResponse: true } & Options): Promise<AxiosResponse<any, any>>;
78
72
  delete(id: number, options: Options): Promise<number>;
79
73
  delete(id: number, options?: Options) {
80
- return super.fetch<ApiLeaveEmbargo>({ url: `${this.apiPath}/${id}`, method: 'DELETE' }).then(
81
- (res) => Promise.resolve(options?.rawResponse ? res : res.status),
82
- (err) => Promise.reject(options?.rawResponse ? err : new ErrorResponse(err))
83
- );
74
+ return super
75
+ .fetch<ApiLeaveEmbargo>({ url: `${this.apiPath}/${id}`, method: 'DELETE' })
76
+ .then((res) => Promise.resolve(options?.rawResponse ? res : res.status));
84
77
  }
85
78
  }
@@ -2,7 +2,6 @@ import { AxiosResponse } from 'axios';
2
2
  import { ApiLeaveRequest } from '../interfaces/index.js';
3
3
  import { Service, Options, RequirementsOf } from './index.js';
4
4
 
5
- import { ErrorResponse } from '../models/error-response.model.js';
6
5
  import { LeaveRequestsQueryParams } from '../interfaces/query-params/leave-requests-query-params.interface.js';
7
6
 
8
7
  import { LeaveRequest } from '../models/leave-request.model.js';
@@ -19,20 +18,25 @@ export class LeaveRequestService extends Service {
19
18
  ): Promise<AxiosResponse<ApiLeaveRequest, any>>;
20
19
  create(data: RequirementsOf<ApiLeaveRequest, RequiredProps>, options: Options): Promise<LeaveRequest>;
21
20
  create(data: RequirementsOf<ApiLeaveRequest, RequiredProps>, options?: Options) {
22
- return super.fetch<ApiLeaveRequest>({ url: this.apiPath, data, method: 'POST' }).then(
23
- (res) => Promise.resolve(options?.rawResponse ? res : new LeaveRequest(res.data)),
24
- (err) => Promise.reject(options?.rawResponse ? err : new ErrorResponse(err))
25
- );
21
+ return super
22
+ .fetch<ApiLeaveRequest>(
23
+ {
24
+ url: this.apiPath,
25
+ data,
26
+ method: 'POST',
27
+ },
28
+ options
29
+ )
30
+ .then((res) => Promise.resolve(options?.rawResponse ? res : new LeaveRequest(res.data)));
26
31
  }
27
32
 
28
33
  get(id: number): Promise<LeaveRequest>;
29
34
  get(id: number, options: { rawResponse: true }): Promise<AxiosResponse<ApiLeaveRequest, any>>;
30
35
  get(id: number, options: Options): Promise<LeaveRequest>;
31
36
  get(id: number, options?: Options) {
32
- return super.fetch<ApiLeaveRequest>({ url: `${this.apiPath}/${id}` }, options).then(
33
- (res) => Promise.resolve(options?.rawResponse ? res : new LeaveRequest(res.data)),
34
- (err) => Promise.reject(options?.rawResponse ? err : new ErrorResponse(err))
35
- );
37
+ return super
38
+ .fetch<ApiLeaveRequest>({ url: `${this.apiPath}/${id}` }, options)
39
+ .then((res) => Promise.resolve(options?.rawResponse ? res : new LeaveRequest(res.data)));
36
40
  }
37
41
 
38
42
  async *list(query?: LeaveRequestsQueryParams, options?: Options) {
@@ -68,19 +72,15 @@ export class LeaveRequestService extends Service {
68
72
  data,
69
73
  method: 'POST',
70
74
  })
71
- .then(
72
- (res) => Promise.resolve(options?.rawResponse ? res : new LeaveRequest(res.data)),
73
- (err) => Promise.reject(options?.rawResponse ? err : new ErrorResponse(err))
74
- );
75
+ .then((res) => Promise.resolve(options?.rawResponse ? res : new LeaveRequest(res.data)));
75
76
  }
76
77
 
77
78
  delete(id: number): Promise<number>;
78
79
  delete(id: number, options: { rawResponse: true } & Options): Promise<AxiosResponse<ApiLeaveRequest, any>>;
79
80
  delete(id: number, options: Options): Promise<number>;
80
81
  delete(id: number, options?: Options) {
81
- return super.fetch<ApiLeaveRequest>({ url: `${this.apiPath}/${id}`, method: 'DELETE' }).then(
82
- (res) => Promise.resolve(options?.rawResponse ? res : res.status),
83
- (err) => Promise.reject(options?.rawResponse ? err : new ErrorResponse(err))
84
- );
82
+ return super
83
+ .fetch<ApiLeaveRequest>({ url: `${this.apiPath}/${id}`, method: 'DELETE' })
84
+ .then((res) => Promise.resolve(options?.rawResponse ? res : res.status));
85
85
  }
86
86
  }
@@ -3,7 +3,7 @@ import { ApiLeave, ApiLeaveType } from '../interfaces/index.js';
3
3
  import { Service, Options, RequirementsOf } from './index.js';
4
4
 
5
5
  import { Leave } from '../models/leave.model.js';
6
- import { ErrorResponse } from '../models/error-response.model.js';
6
+
7
7
  import { LeaveQueryParams } from '../interfaces/query-params/leave-query-params.interface.js';
8
8
 
9
9
  import { LeaveType } from '../models/leave-type.model.js';
@@ -20,20 +20,18 @@ export class LeaveService extends Service {
20
20
  ): Promise<AxiosResponse<ApiLeave[], any>>;
21
21
  create(data: RequirementsOf<ApiLeave, RequiredProps>, options: Options): Promise<Leave[]>;
22
22
  create(data: RequirementsOf<ApiLeave, RequiredProps>, options?: Options) {
23
- return super.fetch<ApiLeave[]>({ url: this.apiPath, data, method: 'POST' }).then(
24
- (res) => Promise.resolve(options?.rawResponse ? res : [...res.data.map((leave) => new Leave(leave))]),
25
- (err) => Promise.reject(options?.rawResponse ? err : new ErrorResponse(err))
26
- );
23
+ return super
24
+ .fetch<ApiLeave[]>({ url: this.apiPath, data, method: 'POST' }, options)
25
+ .then((res) => Promise.resolve(options?.rawResponse ? res : [...res.data.map((leave) => new Leave(leave))]));
27
26
  }
28
27
 
29
28
  get(id: number): Promise<Leave>;
30
29
  get(id: number, options: { rawResponse: true }): Promise<AxiosResponse<ApiLeave, any>>;
31
30
  get(id: number, options: Options): Promise<Leave>;
32
31
  get(id: number, options?: Options) {
33
- return super.fetch<ApiLeave>({ url: `${this.apiPath}/${id}` }, options).then(
34
- (res) => Promise.resolve(options?.rawResponse ? res : new Leave(res.data)),
35
- (err) => Promise.reject(options?.rawResponse ? err : new ErrorResponse(err))
36
- );
32
+ return super
33
+ .fetch<ApiLeave>({ url: `${this.apiPath}/${id}` }, options)
34
+ .then((res) => Promise.resolve(options?.rawResponse ? res : new Leave(res.data)));
37
35
  }
38
36
 
39
37
  async *list(query: LeaveQueryParams, options?: Options) {
@@ -75,19 +73,15 @@ export class LeaveService extends Service {
75
73
  data,
76
74
  method: 'POST',
77
75
  })
78
- .then(
79
- (res) => Promise.resolve(options?.rawResponse ? res : new Leave(res.data)),
80
- (err) => Promise.reject(options?.rawResponse ? err : new ErrorResponse(err))
81
- );
76
+ .then((res) => Promise.resolve(options?.rawResponse ? res : new Leave(res.data)));
82
77
  }
83
78
 
84
79
  delete(id: number): Promise<number>;
85
80
  delete(id: number, options: { rawResponse: true } & Options): Promise<AxiosResponse<ApiLeave, any>>;
86
81
  delete(id: number, options: Options): Promise<number>;
87
82
  delete(id: number, options?: Options) {
88
- return super.fetch<ApiLeave>({ url: `${this.apiPath}/${id}`, method: 'DELETE' }).then(
89
- (res) => Promise.resolve(options?.rawResponse ? res : res.status),
90
- (err) => Promise.reject(options?.rawResponse ? err : new ErrorResponse(err))
91
- );
83
+ return super
84
+ .fetch<ApiLeave>({ url: `${this.apiPath}/${id}`, method: 'DELETE' })
85
+ .then((res) => Promise.resolve(options?.rawResponse ? res : res.status));
92
86
  }
93
87
  }
@@ -3,7 +3,7 @@ import { ApiLocation } from '../interfaces/index.js';
3
3
  import { Service, Options, RequirementsOf } from './index.js';
4
4
 
5
5
  import { Location } from '../models/location.model.js';
6
- import { ErrorResponse } from '../models/error-response.model.js';
6
+
7
7
  import { LocationsQueryParams } from '../interfaces/query-params/locations-query-params.interface.js';
8
8
 
9
9
  type RequiredProps = 'name';
@@ -18,20 +18,18 @@ export class LocationsService extends Service {
18
18
  ): Promise<AxiosResponse<ApiLocation, any>>;
19
19
  create(data: RequirementsOf<ApiLocation, RequiredProps>, options: Options): Promise<Location>;
20
20
  create(data: RequirementsOf<ApiLocation, RequiredProps>, options?: Options) {
21
- return super.fetch<ApiLocation>({ url: `${this.apiPath}`, data, method: 'POST' }).then(
22
- (res) => Promise.resolve(options?.rawResponse ? res : new Location(res.data)),
23
- (err) => Promise.reject(options?.rawResponse ? err : new ErrorResponse(err))
24
- );
21
+ return super
22
+ .fetch<ApiLocation>({ url: `${this.apiPath}`, data, method: 'POST' })
23
+ .then((res) => Promise.resolve(options?.rawResponse ? res : new Location(res.data)));
25
24
  }
26
25
 
27
26
  get(id: number): Promise<Location>;
28
27
  get(id: number, options: { rawResponse: true } & Options): Promise<AxiosResponse<ApiLocation, any>>;
29
28
  get(id: number, options: Options): Promise<Location>;
30
29
  get(id: number, options?: Options) {
31
- return super.fetch<ApiLocation>({ url: `${this.apiPath}/${id}` }, options).then(
32
- (res) => Promise.resolve(options?.rawResponse ? res : new Location(res.data)),
33
- (err) => Promise.reject(options?.rawResponse ? err : new ErrorResponse(err))
34
- );
30
+ return super
31
+ .fetch<ApiLocation>({ url: `${this.apiPath}/${id}` }, options)
32
+ .then((res) => Promise.resolve(options?.rawResponse ? res : new Location(res.data)));
35
33
  }
36
34
 
37
35
  async *list(query?: LocationsQueryParams, options?: Options) {
@@ -67,19 +65,15 @@ export class LocationsService extends Service {
67
65
  data,
68
66
  method: 'POST',
69
67
  })
70
- .then(
71
- (res) => Promise.resolve(options?.rawResponse ? res : new Location(res.data)),
72
- (err) => Promise.reject(options?.rawResponse ? err : new ErrorResponse(err))
73
- );
68
+ .then((res) => Promise.resolve(options?.rawResponse ? res : new Location(res.data)));
74
69
  }
75
70
 
76
71
  delete(id: number): Promise<number>;
77
72
  delete(id: number, options: { rawResponse: true } & Options): Promise<AxiosResponse<any, any>>;
78
73
  delete(id: number, options: Options): Promise<number>;
79
74
  delete(id: number, options?: Options) {
80
- return super.fetch<ApiLocation>({ url: `${this.apiPath}/${id}`, method: 'DELETE' }).then(
81
- (res) => Promise.resolve(options?.rawResponse ? res : res.status),
82
- (err) => Promise.reject(options?.rawResponse ? err : new ErrorResponse(err))
83
- );
75
+ return super
76
+ .fetch<ApiLocation>({ url: `${this.apiPath}/${id}`, method: 'DELETE' })
77
+ .then((res) => Promise.resolve(options?.rawResponse ? res : res.status));
84
78
  }
85
79
  }
@@ -3,7 +3,7 @@ import { ApiRole } from '../interfaces/index.js';
3
3
  import { Service, Options, RequirementsOf } from './index.js';
4
4
 
5
5
  import { Role } from '../models/role.model.js';
6
- import { ErrorResponse } from '../models/error-response.model.js';
6
+
7
7
  import { RolesQueryParams } from '../interfaces/query-params/roles-query-params.interface.js';
8
8
 
9
9
  type RequiredProps = 'name';
@@ -18,20 +18,18 @@ export class RolesService extends Service {
18
18
  ): Promise<AxiosResponse<ApiRole, any>>;
19
19
  create(data: RequirementsOf<ApiRole, RequiredProps>, options: Options): Promise<Role>;
20
20
  create(data: RequirementsOf<ApiRole, RequiredProps>, options?: Options) {
21
- return super.fetch<ApiRole>({ url: this.apiPath, data, method: 'POST' }).then(
22
- (res) => Promise.resolve(options?.rawResponse ? res : new Role(res.data)),
23
- (err) => Promise.reject(options?.rawResponse ? err : new ErrorResponse(err))
24
- );
21
+ return super
22
+ .fetch<ApiRole>({ url: this.apiPath, data, method: 'POST' })
23
+ .then((res) => Promise.resolve(options?.rawResponse ? res : new Role(res.data)));
25
24
  }
26
25
 
27
26
  get(id: number): Promise<Role>;
28
27
  get(id: number, options: { rawResponse: true } & Options): Promise<AxiosResponse<ApiRole, any>>;
29
28
  get(id: number, options: Options): Promise<Role>;
30
29
  get(id: number, options?: Options) {
31
- return super.fetch<ApiRole>({ url: `${this.apiPath}/${id}` }, options).then(
32
- (res) => Promise.resolve(options?.rawResponse ? res : new Role(res.data)),
33
- (err) => Promise.reject(options?.rawResponse ? err : new ErrorResponse(err))
34
- );
30
+ return super
31
+ .fetch<ApiRole>({ url: `${this.apiPath}/${id}` }, options)
32
+ .then((res) => Promise.resolve(options?.rawResponse ? res : new Role(res.data)));
35
33
  }
36
34
 
37
35
  async *list(query?: RolesQueryParams, options?: Options) {
@@ -66,19 +64,15 @@ export class RolesService extends Service {
66
64
  data,
67
65
  method: 'POST',
68
66
  })
69
- .then(
70
- (res) => Promise.resolve(options?.rawResponse ? res : new Role(res.data)),
71
- (err) => Promise.reject(options?.rawResponse ? err : new ErrorResponse(err))
72
- );
67
+ .then((res) => Promise.resolve(options?.rawResponse ? res : new Role(res.data)));
73
68
  }
74
69
 
75
70
  delete(id: number): Promise<number>;
76
71
  delete(id: number, options: { rawResponse: true } & Options): Promise<AxiosResponse<any, any>>;
77
72
  delete(id: number, options: Options): Promise<number>;
78
73
  delete(id: number, options?: Options) {
79
- return super.fetch<ApiRole>({ url: `${this.apiPath}/${id}`, method: 'DELETE' }).then(
80
- (res) => Promise.resolve(options?.rawResponse ? res : res.status),
81
- (err) => Promise.reject(options?.rawResponse ? err : new ErrorResponse(err))
82
- );
74
+ return super
75
+ .fetch<ApiRole>({ url: `${this.apiPath}/${id}`, method: 'DELETE' })
76
+ .then((res) => Promise.resolve(options?.rawResponse ? res : res.status));
83
77
  }
84
78
  }
@@ -1,7 +1,8 @@
1
- import axios, { AxiosInstance, AxiosRequestConfig, AxiosRequestHeaders, AxiosResponse } from 'axios';
1
+ import axios, { AxiosError, AxiosInstance, AxiosRequestConfig, AxiosRequestHeaders, AxiosResponse } from 'axios';
2
2
  import axiosRetry from 'axios-retry';
3
3
  import { RotaCloud } from '../rotacloud.js';
4
4
  import { Version } from '../version.js';
5
+ import { SDKErrorConfig, SDKError } from '../models/SDKError.model.js';
5
6
 
6
7
  export type RequirementsOf<T, K extends keyof T> = Required<Pick<T, K>> & Partial<T>;
7
8
 
@@ -46,6 +47,7 @@ export interface Options {
46
47
  expand?: string[];
47
48
  fields?: string[];
48
49
  limit?: number;
50
+ dryRun?: boolean;
49
51
  }
50
52
 
51
53
  interface PagingObject {
@@ -59,7 +61,33 @@ type ParameterPrimitive = string | boolean | number | null;
59
61
  type ParameterValue = ParameterPrimitive | ParameterPrimitive[] | undefined;
60
62
 
61
63
  export abstract class Service<ApiResponse = any> {
62
- protected client: AxiosInstance = axios.create();
64
+ protected client: AxiosInstance = this.initialiseAxios();
65
+
66
+ private initialiseAxios(): AxiosInstance {
67
+ const client = axios.create();
68
+ client.interceptors.response.use(
69
+ (response) => response,
70
+ (error) => {
71
+ const parsedError = this.parseClientError(error);
72
+
73
+ return Promise.reject(parsedError);
74
+ }
75
+ );
76
+ return client;
77
+ }
78
+
79
+ private parseClientError(error: unknown | AxiosError): SDKError | unknown {
80
+ if (!axios.isAxiosError(error)) return error;
81
+ const axiosErrorLocation = error.response || error.request;
82
+ const apiErrorMessage = axiosErrorLocation.data?.error;
83
+ const sdkErrorParams: SDKErrorConfig = {
84
+ code: axiosErrorLocation.status,
85
+ message: apiErrorMessage || error.message,
86
+ data: axiosErrorLocation.data,
87
+ };
88
+
89
+ return new SDKError(sdkErrorParams);
90
+ }
63
91
 
64
92
  public isLeaveRequest(endpoint?: string): boolean {
65
93
  return endpoint === '/leave_requests';
@@ -118,6 +146,7 @@ export abstract class Service<ApiResponse = any> {
118
146
  expand: options?.expand,
119
147
  fields: options?.fields,
120
148
  limit: options?.limit,
149
+ dry_run: options?.dryRun,
121
150
  ...httpOptions?.params,
122
151
  },
123
152
  paramsSerializer: this.buildQueryStr,
@@ -3,7 +3,7 @@ import { Settings } from '../models/settings.model.js';
3
3
  import { Service, Options } from './index.js';
4
4
 
5
5
  import { ApiSettings } from '../interfaces/index.js';
6
- import { ErrorResponse } from '../models/error-response.model.js';
6
+
7
7
  import { SettingsQueryParams } from '../rotacloud.js';
8
8
 
9
9
  class SettingsService extends Service {
@@ -13,10 +13,9 @@ class SettingsService extends Service {
13
13
  get(query: SettingsQueryParams, options: { rawResponse: true } & Options): Promise<AxiosResponse<ApiSettings, any>>;
14
14
  get(query: SettingsQueryParams, options: Options): Promise<Settings>;
15
15
  get(query: SettingsQueryParams, options?: Options) {
16
- return super.fetch<ApiSettings>({ url: `${this.apiPath}`, params: query }, options).then(
17
- (res) => Promise.resolve(options?.rawResponse ? res : new Settings(res.data)),
18
- (err) => Promise.reject(options?.rawResponse ? err : new ErrorResponse(err))
19
- );
16
+ return super
17
+ .fetch<ApiSettings>({ url: `${this.apiPath}`, params: query }, options)
18
+ .then((res) => Promise.resolve(options?.rawResponse ? res : new Settings(res.data)));
20
19
  }
21
20
  }
22
21