@insignia-education/api-sdk-js 0.15.49 → 0.15.53

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 (71) hide show
  1. package/coverage/clover.xml +1515 -0
  2. package/coverage/coverage-final.json +48 -0
  3. package/coverage/lcov-report/base.css +224 -0
  4. package/coverage/lcov-report/block-navigation.js +87 -0
  5. package/coverage/lcov-report/favicon.png +0 -0
  6. package/coverage/lcov-report/index.html +161 -0
  7. package/coverage/lcov-report/prettify.css +1 -0
  8. package/coverage/lcov-report/prettify.js +2 -0
  9. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  10. package/coverage/lcov-report/sorter.js +210 -0
  11. package/coverage/lcov-report/src/Client.js.html +454 -0
  12. package/coverage/lcov-report/src/api/index.html +116 -0
  13. package/coverage/lcov-report/src/api/index.js.html +127 -0
  14. package/coverage/lcov-report/src/api/v1/Accounts.js.html +151 -0
  15. package/coverage/lcov-report/src/api/v1/Admin.js.html +121 -0
  16. package/coverage/lcov-report/src/api/v1/Auth.js.html +157 -0
  17. package/coverage/lcov-report/src/api/v1/Categories.js.html +121 -0
  18. package/coverage/lcov-report/src/api/v1/Changelogs.js.html +118 -0
  19. package/coverage/lcov-report/src/api/v1/Configs.js.html +121 -0
  20. package/coverage/lcov-report/src/api/v1/ContactForms.js.html +121 -0
  21. package/coverage/lcov-report/src/api/v1/ConversationalTopics.js.html +121 -0
  22. package/coverage/lcov-report/src/api/v1/Countries.js.html +112 -0
  23. package/coverage/lcov-report/src/api/v1/Coupons.js.html +142 -0
  24. package/coverage/lcov-report/src/api/v1/Courses.js.html +436 -0
  25. package/coverage/lcov-report/src/api/v1/Currencies.js.html +118 -0
  26. package/coverage/lcov-report/src/api/v1/Dashboard.js.html +115 -0
  27. package/coverage/lcov-report/src/api/v1/EducationCenter.js.html +115 -0
  28. package/coverage/lcov-report/src/api/v1/Employee.js.html +169 -0
  29. package/coverage/lcov-report/src/api/v1/Files.js.html +160 -0
  30. package/coverage/lcov-report/src/api/v1/Forums.js.html +175 -0
  31. package/coverage/lcov-report/src/api/v1/Hashes.js.html +118 -0
  32. package/coverage/lcov-report/src/api/v1/Insignias.js.html +121 -0
  33. package/coverage/lcov-report/src/api/v1/Languages.js.html +121 -0
  34. package/coverage/lcov-report/src/api/v1/MailBlacklist.js.html +118 -0
  35. package/coverage/lcov-report/src/api/v1/MailingLists.js.html +127 -0
  36. package/coverage/lcov-report/src/api/v1/Offers.js.html +142 -0
  37. package/coverage/lcov-report/src/api/v1/Organizations.js.html +199 -0
  38. package/coverage/lcov-report/src/api/v1/PaymentMethods.js.html +121 -0
  39. package/coverage/lcov-report/src/api/v1/Payments.js.html +310 -0
  40. package/coverage/lcov-report/src/api/v1/Premiums.js.html +121 -0
  41. package/coverage/lcov-report/src/api/v1/Quizzes.js.html +214 -0
  42. package/coverage/lcov-report/src/api/v1/Sales.js.html +148 -0
  43. package/coverage/lcov-report/src/api/v1/Search.js.html +115 -0
  44. package/coverage/lcov-report/src/api/v1/ShortLinks.js.html +127 -0
  45. package/coverage/lcov-report/src/api/v1/Surveys.js.html +181 -0
  46. package/coverage/lcov-report/src/api/v1/Taxes.js.html +121 -0
  47. package/coverage/lcov-report/src/api/v1/Teacher.js.html +292 -0
  48. package/coverage/lcov-report/src/api/v1/Telegram.js.html +124 -0
  49. package/coverage/lcov-report/src/api/v1/TwoFactor.js.html +145 -0
  50. package/coverage/lcov-report/src/api/v1/UserSessionTypes.js.html +112 -0
  51. package/coverage/lcov-report/src/api/v1/UserTypes.js.html +121 -0
  52. package/coverage/lcov-report/src/api/v1/Users.js.html +604 -0
  53. package/coverage/lcov-report/src/api/v1/Utm.js.html +151 -0
  54. package/coverage/lcov-report/src/api/v1/Webauthn.js.html +190 -0
  55. package/coverage/lcov-report/src/api/v1/Zoom.js.html +124 -0
  56. package/coverage/lcov-report/src/api/v1/index.html +746 -0
  57. package/coverage/lcov-report/src/api/v1/index.js.html +385 -0
  58. package/coverage/lcov-report/src/index.html +131 -0
  59. package/coverage/lcov-report/src/index.js.html +109 -0
  60. package/coverage/lcov-report/tests/helpers.js.html +145 -0
  61. package/coverage/lcov-report/tests/index.html +116 -0
  62. package/coverage/lcov.info +2512 -0
  63. package/coverage/test-report.html +286 -0
  64. package/package.json +1 -1
  65. package/src/api/v1/Currencies.js +1 -0
  66. package/src/api/v1/Employee.js +2 -0
  67. package/src/api/v1/MailingLists.js +14 -0
  68. package/src/api/v1/Organizations.js +10 -1
  69. package/src/api/v1/Teacher.js +2 -0
  70. package/src/api/v1/index.js +2 -0
  71. package/tests/integration/api/v1/currencies/history.test.js +23 -0
@@ -0,0 +1,286 @@
1
+ <html><head><meta charset="utf-8"/><title>API SDK Test Report</title><style type="text/css">:root {
2
+ --text-primary: #111;
3
+ --text-secondary: #4f4f4f;
4
+ --success: #006633;
5
+ --success-bright: #80ffbf;
6
+ --danger: #cc071e;
7
+ --danger-bright: #fbdfe0;
8
+ --warning: #995c00;
9
+ --warning-bright: #ffeea8;
10
+ --panel: #eee;
11
+ --border: #949494;
12
+ --disabled: #6b6b6b;
13
+ }
14
+
15
+ html,
16
+ body {
17
+ font-family: Arial, Helvetica, sans-serif;
18
+ font-size: 16px;
19
+ margin: 0;
20
+ padding: 0;
21
+ color: var(--text-primary);
22
+ }
23
+ body {
24
+ padding: 2rem 1rem;
25
+ }
26
+ .jesthtml-content {
27
+ margin: 0 auto;
28
+ max-width: 70rem;
29
+ }
30
+ header {
31
+ display: flex;
32
+ align-items: center;
33
+ }
34
+ #title {
35
+ margin: 0;
36
+ flex-grow: 1;
37
+ }
38
+ #logo {
39
+ height: 4rem;
40
+ }
41
+ #timestamp {
42
+ color: var(--text-secondary);
43
+ margin-top: 0.5rem;
44
+ }
45
+
46
+ #metadata-container {
47
+ display: flex;
48
+ flex-direction: column;
49
+ gap: 2rem;
50
+ margin-bottom: 2rem;
51
+ }
52
+
53
+ .additional-information-container {
54
+ display: flex;
55
+ flex-direction: column;
56
+ gap: 0.5rem;
57
+ color: var(--text-secondary);
58
+ }
59
+
60
+ /** SUMMARY */
61
+ #summary {
62
+ color: var(--text-primary);
63
+ display: flex;
64
+ font-family: monospace;
65
+ font-size: 1rem;
66
+ }
67
+ #summary > div {
68
+ margin-right: 0.5rem;
69
+ background: var(--panel);
70
+ padding: 1rem;
71
+ min-width: 15rem;
72
+ }
73
+ #summary > div:last-child {
74
+ margin-right: 0;
75
+ }
76
+ @media only screen and (max-width: 720px) {
77
+ #summary {
78
+ flex-direction: column;
79
+ }
80
+ #summary > div {
81
+ margin-right: 0;
82
+ margin-top: 1rem;
83
+ }
84
+ #summary > div:first-child {
85
+ margin-top: 0;
86
+ }
87
+ }
88
+
89
+ .summary-total {
90
+ font-weight: bold;
91
+ margin-bottom: 0.5rem;
92
+ }
93
+ .summary-passed {
94
+ color: var(--success);
95
+ border-left: 0.4rem solid var(--success);
96
+ padding-left: 0.5rem;
97
+ margin-bottom: 0.15rem;
98
+ }
99
+ .summary-failed,
100
+ .summary-obsolete-snapshots {
101
+ color: var(--danger);
102
+ border-left: 0.4rem solid var(--danger);
103
+ padding-left: 0.5rem;
104
+ margin-bottom: 0.15rem;
105
+ }
106
+ .summary-pending {
107
+ color: var(--warning);
108
+ border-left: 0.4rem solid var(--warning);
109
+ padding-left: 0.5rem;
110
+ margin-bottom: 0.15rem;
111
+ }
112
+ .summary-empty {
113
+ color: var(--disabled);
114
+ border-left: 0.4rem solid var(--disabled);
115
+ margin-bottom: 0.15rem;
116
+ }
117
+
118
+ .test-result {
119
+ padding: 1rem;
120
+ margin-bottom: 0.25rem;
121
+ }
122
+ .test-result:last-child {
123
+ border: 0;
124
+ }
125
+ .test-result.passed {
126
+ background-color: var(--success-bright);
127
+ color: var(--success);
128
+ }
129
+ .test-result.failed {
130
+ background-color: var(--danger-bright);
131
+ color: var(--danger);
132
+ }
133
+ .test-result.pending {
134
+ background-color: var(--warning-bright);
135
+ color: var(--warning);
136
+ }
137
+
138
+ .test-info {
139
+ display: flex;
140
+ justify-content: space-between;
141
+ }
142
+ .test-suitename {
143
+ width: 20%;
144
+ text-align: left;
145
+ font-weight: bold;
146
+ word-break: break-word;
147
+ }
148
+ .test-title {
149
+ width: 40%;
150
+ text-align: left;
151
+ font-style: italic;
152
+ }
153
+ .test-status {
154
+ width: 20%;
155
+ text-align: right;
156
+ }
157
+ .test-duration {
158
+ width: 10%;
159
+ text-align: right;
160
+ font-size: 0.85rem;
161
+ }
162
+
163
+ .failureMessages {
164
+ padding: 0 1rem;
165
+ margin-top: 1rem;
166
+ border-top: 1px dashed var(--danger);
167
+ }
168
+ .failureMessages.suiteFailure {
169
+ border-top: none;
170
+ }
171
+ .failureMsg {
172
+ white-space: pre-wrap;
173
+ white-space: -moz-pre-wrap;
174
+ white-space: -pre-wrap;
175
+ white-space: -o-pre-wrap;
176
+ word-wrap: break-word;
177
+ }
178
+
179
+ .suite-container {
180
+ margin-bottom: 1rem;
181
+ }
182
+ .suite-info {
183
+ padding: 1rem;
184
+ background-color: var(--panel);
185
+ color: var(--text-secondary);
186
+ border: 0.15rem solid;
187
+ border-color: var(--panel);
188
+ display: flex;
189
+ align-items: center;
190
+ margin-bottom: 0.25rem;
191
+ }
192
+ .suite-info:hover {
193
+ border-color: var(--border);
194
+ cursor: pointer;
195
+ }
196
+ .suite-info .suite-path {
197
+ word-break: break-all;
198
+ flex-grow: 1;
199
+ font-family: monospace;
200
+ font-size: 1rem;
201
+ }
202
+ .suite-info .suite-time {
203
+ margin-left: 1rem;
204
+ padding: 0.2rem 0.3rem;
205
+ font-size: 0.85rem;
206
+ }
207
+ .suite-info .suite-time.warn {
208
+ background-color: var(--danger);
209
+ color: #fff;
210
+ }
211
+ .suite-info:before {
212
+ content: "\2303";
213
+ display: inline-block;
214
+ margin-right: 1rem;
215
+ transform: rotate(180deg) translateY(0.15rem);
216
+ }
217
+ .suite-container[open] .suite-info:before {
218
+ transform: rotate(0deg) translateY(0.15rem);
219
+ }
220
+
221
+ /* CONSOLE LOGS */
222
+ .suite-consolelog {
223
+ margin-bottom: 0.25rem;
224
+ padding: 1rem;
225
+ background-color: var(--panel);
226
+ }
227
+ .suite-consolelog-header {
228
+ font-weight: bold;
229
+ }
230
+ .suite-consolelog-item {
231
+ padding: 0.5rem;
232
+ }
233
+ .suite-consolelog-item pre {
234
+ margin: 0.5rem 0;
235
+ white-space: pre-wrap;
236
+ white-space: -moz-pre-wrap;
237
+ white-space: -pre-wrap;
238
+ white-space: -o-pre-wrap;
239
+ word-wrap: break-word;
240
+ }
241
+ .suite-consolelog-item-origin {
242
+ color: var(--text-secondary);
243
+ font-weight: bold;
244
+ }
245
+ .suite-consolelog-item-message {
246
+ color: var(--text-primary);
247
+ font-size: 1rem;
248
+ padding: 0 0.5rem;
249
+ }
250
+
251
+ /* OBSOLETE SNAPSHOTS */
252
+ .suite-obsolete-snapshots {
253
+ margin-bottom: 0.25rem;
254
+ padding: 1rem;
255
+ background-color: var(--danger-bright);
256
+ color: var(--danger);
257
+ }
258
+ .suite-obsolete-snapshots-header {
259
+ font-weight: bold;
260
+ }
261
+ .suite-obsolete-snapshots-item {
262
+ padding: 0.5rem;
263
+ }
264
+ .suite-obsolete-snapshots-item pre {
265
+ margin: 0.5rem 0;
266
+ white-space: pre-wrap;
267
+ white-space: -moz-pre-wrap;
268
+ white-space: -pre-wrap;
269
+ white-space: -o-pre-wrap;
270
+ word-wrap: break-word;
271
+ }
272
+ .suite-obsolete-snapshots-item-message {
273
+ color: var(--text-primary);
274
+ font-size: 1rem;
275
+ padding: 0 0.5rem;
276
+ }
277
+ </style></head><body><main class="jesthtml-content"><header><h1 id="title">API SDK Test Report</h1></header><section id="metadata-container"><div id="timestamp">Started: 2026-08-03 10:22:42</div><div id="summary"><div id="suite-summary"><div class="summary-total">Suites (1)</div><div class="summary-passed summary-empty">0 passed</div><div class="summary-failed ">1 failed</div><div class="summary-pending summary-empty">0 pending</div></div><div id="test-summary"><div class="summary-total">Tests (3)</div><div class="summary-passed summary-empty">0 passed</div><div class="summary-failed ">3 failed</div><div class="summary-pending summary-empty">0 pending</div></div></div></section><details id="suite-1" class="suite-container" open=""><summary class="suite-info"><div class="suite-path">/Users/roquendo/code/insignia-education/api-sdk-js/tests/integration/api/v1/accounts.test.js</div><div class="suite-time">2.086s</div></summary><div class="suite-tests"><div class="test-result failed"><div class="test-info"><div class="test-suitename">api/v1/accounts</div><div class="test-title">get | unauthenticated</div><div class="test-status">failed</div><div class="test-duration">0.11s</div></div><div class="failureMessages"> <pre class="failureMsg">Error: HTTP 401
278
+ at InsigniaApiV1.#request (/Users/roquendo/code/insignia-education/api-sdk-js/src/Client.js:82:25)
279
+ at processTicksAndRejections (node:internal/process/task_queues:105:5)
280
+ at Object.&lt;anonymous&gt; (/Users/roquendo/code/insignia-education/api-sdk-js/tests/integration/api/v1/accounts.test.js:9:9)</pre></div></div><div class="test-result failed"><div class="test-info"><div class="test-suitename">api/v1/accounts</div><div class="test-title">get | authenticated but other type</div><div class="test-status">failed</div><div class="test-duration">0.648s</div></div><div class="failureMessages"> <pre class="failureMsg">Error: HTTP 422
281
+ at InsigniaApiV1.#request (/Users/roquendo/code/insignia-education/api-sdk-js/src/Client.js:82:25)
282
+ at processTicksAndRejections (node:internal/process/task_queues:105:5)
283
+ at Object.&lt;anonymous&gt; (/Users/roquendo/code/insignia-education/api-sdk-js/tests/integration/api/v1/accounts.test.js:16:9)</pre></div></div><div class="test-result failed"><div class="test-info"><div class="test-suitename">api/v1/accounts</div><div class="test-title">get | authenticated</div><div class="test-status">failed</div><div class="test-duration">0.802s</div></div><div class="failureMessages"> <pre class="failureMsg">Error: HTTP 422
284
+ at InsigniaApiV1.#request (/Users/roquendo/code/insignia-education/api-sdk-js/src/Client.js:82:25)
285
+ at processTicksAndRejections (node:internal/process/task_queues:105:5)
286
+ at Object.&lt;anonymous&gt; (/Users/roquendo/code/insignia-education/api-sdk-js/tests/integration/api/v1/accounts.test.js:25:9)</pre></div></div></div></details></main></body></html>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@insignia-education/api-sdk-js",
3
- "version": "0.15.49",
3
+ "version": "0.15.53",
4
4
  "description": "JavaScript SDK for the Insignia Education API",
5
5
  "main": "index.js",
6
6
  "type": "module",
@@ -7,4 +7,5 @@ export default class Currencies {
7
7
 
8
8
  get(id = null) { return id ? this.#client.get(`/currencies/${id}`) : this.#client.get('/currencies'); }
9
9
  getValues() { return this.#client.get('/currencies/values'); }
10
+ getHistory(id) { return this.#client.get(`/currencies/${id}/history`); }
10
11
  }
@@ -10,6 +10,8 @@ export default class Employee {
10
10
  return {
11
11
  /** All teachers' sessions for a given date (YYYY-MM-DD). */
12
12
  sessions: (date) => this.#client.get(`${base}/sessions`, { date }),
13
+ /** All teachers' individual sessions for the 7-day window starting at `start` (YYYY-MM-DD, Monday). */
14
+ weekSessions: (start) => this.#client.get(`${base}/sessions/week`, { start }),
13
15
  /** All sessions for one course_date, any teacher. */
14
16
  courseDateSessions: (courseDateId) => this.#client.get(`${base}/course-dates/${courseDateId}/sessions`),
15
17
  /** Mark a student's attendance on any teacher's session. */
@@ -0,0 +1,14 @@
1
+ export default class MailingLists {
2
+ #client;
3
+
4
+ constructor(client) {
5
+ this.#client = client;
6
+ }
7
+
8
+ get(id = null) { return id ? this.#client.get(`/mailing-lists/${id}`) : this.#client.get('/mailing-lists'); }
9
+ create(data) { return this.#client.put('/mailing-lists', data); }
10
+ delete(id) { return this.#client.del(`/mailing-lists/${id}`); }
11
+ preview(filters) { return this.#client.post('/mailing-lists/preview', { filters }); }
12
+ send(data) { return this.#client.post('/mailing-lists/send', data); }
13
+ sent() { return this.#client.get('/mailing-lists/sent'); }
14
+ }
@@ -11,17 +11,26 @@ export default class Organizations {
11
11
  ? this.#client.get(`/organizations/${id}`)
12
12
  : this.#client.get('/organizations', { page, per_page: perPage });
13
13
  }
14
- /** Employee-only. */
14
+ /** Organization-and-above (owner creates their own org; employee-and-above may pass user_id to set another owner). */
15
15
  create(data) { return this.#client.put('/organizations', data); }
16
16
  /** user_id (owner reassignment) is applied only when the caller is employee-and-above. */
17
17
  edit(id, data) { return this.#client.patch(`/organizations/${id}`, data); }
18
18
 
19
+ /** Confirms a pending member invite from the emailed link — logs the user in on success. */
20
+ confirmInvite(id, { username, hash }) { return this.#client.post(`/organizations/${id}/members/invite/confirm`, { username, hash }); }
21
+
19
22
  members(id) {
20
23
  const base = `/organizations/${id}/members`;
21
24
  const client = this.#client;
22
25
  return {
23
26
  get: () => client.get(base),
24
27
  courses: (userId) => client.get(`${base}/${userId}/courses`),
28
+ /** Users matching `q` not already invited/members — for the invite search box. */
29
+ search: (q) => client.get(`${base}/search`, { q }),
30
+ /** Creates a pending invite and emails the user a confirm link. */
31
+ invite: (userId) => client.post(`${base}/invite`, { user_id: userId }),
32
+ /** Re-sends the invite email to a still-pending member with a fresh link. */
33
+ resendInvite: (userId) => client.post(`${base}/${userId}/resend-invite`),
25
34
  /** Creates a real UserPayment for this member — same payload shape as users(id).payments().create(). */
26
35
  createPayment: (userId, data) => client.put(`${base}/${userId}/payments`, data),
27
36
  };
@@ -52,6 +52,8 @@ export default class Teacher {
52
52
  courseDates: () => this.#client.get(`${base}/course-dates`),
53
53
  /** All sessions for one CourseDate, each with a `students` roster ({id, name, present}). */
54
54
  courseDateSessions: (courseDateId) => this.#client.get(`${base}/course-dates/${courseDateId}/sessions`),
55
+ /** { url, pending } — the zip archive of this group's course materials, or pending:true while it's (re)building. */
56
+ courseDateContentDownload: (courseDateId) => this.#client.get(`${base}/course-dates/${courseDateId}/content-download`),
55
57
  /** Ungraded quiz submissions from one CourseDate's own students. */
56
58
  courseDateUngradedQuizzes: (courseDateId) => this.#client.get(`${base}/course-dates/${courseDateId}/quizzes/ungraded`),
57
59
  /** Ungraded quiz submissions grouped by course, for every course this teacher teaches. */
@@ -20,6 +20,7 @@ import Hashes from './Hashes.js';
20
20
  import Insignias from './Insignias.js';
21
21
  import Languages from './Languages.js';
22
22
  import MailBlacklist from './MailBlacklist.js';
23
+ import MailingLists from './MailingLists.js';
23
24
  import Offers from './Offers.js';
24
25
  import Organizations from './Organizations.js';
25
26
  import PaymentMethods from './PaymentMethods.js';
@@ -74,6 +75,7 @@ export default class InsigniaApiV1 extends InsigniaApi {
74
75
  this.insignias = new Insignias(this);
75
76
  this.languages = new Languages(this);
76
77
  this.mailBlacklist = new MailBlacklist(this);
78
+ this.mailingLists = new MailingLists(this);
77
79
  this.offers = new Offers(this);
78
80
  this.organizations = new Organizations(this);
79
81
  this.paymentMethods = new PaymentMethods(this);
@@ -0,0 +1,23 @@
1
+ import {
2
+ api,
3
+ loginCustomer,
4
+ loginAdmin
5
+ } from '../../../../helpers.js';
6
+
7
+ describe('api/v1/currencies/{id}/history', () => {
8
+
9
+ test('get', async () => {
10
+ await loginAdmin();
11
+ await api.currencies.getHistory(1)
12
+ .then(response => {
13
+ response = Object.values(response);
14
+ response.forEach(value => {
15
+ expect(value["id"]).toBeDefined();
16
+ expect(value["currency_id"]).toBeDefined();
17
+ expect(value["value"]).toBeDefined();
18
+ expect(value["created_at"]).toBeDefined();
19
+ expect(value["updated_at"]).toBeDefined();
20
+ })
21
+ });
22
+ });
23
+ });