@insignia-education/api-sdk-js 0.24.3 → 0.25.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -0
- package/package.json +1 -1
- package/src/api/v1/Admin.js +15 -1
- package/src/api/v1/Games.js +69 -0
- package/src/api/v1/index.js +2 -0
package/README.md
CHANGED
|
@@ -276,6 +276,30 @@ await v1.organizations.create(data);
|
|
|
276
276
|
await v1.organizations.edit(1, data);
|
|
277
277
|
```
|
|
278
278
|
|
|
279
|
+
### Games
|
|
280
|
+
|
|
281
|
+
```js
|
|
282
|
+
await v1.games.get(); // paginated: get(null, { search, page, perPage })
|
|
283
|
+
await v1.games.get(1);
|
|
284
|
+
await v1.games.create({ title: 'Quiz night', type: 'kahoot' }); // type: kahoot | jeopardy
|
|
285
|
+
await v1.games.edit(1, { status: 'lobby' }); // draft | lobby | in_progress | finished
|
|
286
|
+
await v1.games.delete(1);
|
|
287
|
+
await v1.games.restore(1);
|
|
288
|
+
await v1.games.players(1);
|
|
289
|
+
await v1.games.join(1);
|
|
290
|
+
await v1.games.removePlayer(1, 5);
|
|
291
|
+
await v1.games.regenerateShare(1); // new share_token; old link stops working
|
|
292
|
+
await v1.games.shared(token).get(); // public — no login needed
|
|
293
|
+
await v1.games.shared(token).join(); // logged-in user
|
|
294
|
+
await v1.games.shared(token).guestJoin('Ana'); // non-logged user, needs allow_guests; returns guest_token
|
|
295
|
+
await v1.games.shared(token).guestQuestions(guestToken);
|
|
296
|
+
await v1.games.questions(1).get();
|
|
297
|
+
await v1.games.questions(1).create(data);
|
|
298
|
+
await v1.games.questions(1).edit(2, { enabled: false });
|
|
299
|
+
await v1.games.questions(1).delete(2);
|
|
300
|
+
await v1.games.questions(1).restore(2);
|
|
301
|
+
```
|
|
302
|
+
|
|
279
303
|
### Quizzes
|
|
280
304
|
|
|
281
305
|
```js
|
package/package.json
CHANGED
package/src/api/v1/Admin.js
CHANGED
|
@@ -23,7 +23,7 @@ export default class Admin {
|
|
|
23
23
|
});
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
-
/** Date-range sales report: totals by status (pending/approved/rejected), and the same split by course, payment method and
|
|
26
|
+
/** Date-range sales report: totals by status (pending/approved/rejected), and the same split by course, payment method, currency, owner and seller (`by_seller`: `[{ seller: { id|null, name, username }, pending, approved, rejected, total }]`). */
|
|
27
27
|
statisticsSales({ fromDate, toDate } = {}) {
|
|
28
28
|
return this.#client.get('/admin/statistics/sales', { from_date: fromDate, to_date: toDate });
|
|
29
29
|
}
|
|
@@ -188,6 +188,20 @@ export default class Admin {
|
|
|
188
188
|
});
|
|
189
189
|
}
|
|
190
190
|
|
|
191
|
+
/** Paginated per-seller sales report for a date range: line count and base-currency amount per status (pending/approved/rejected) and in total, biggest first. Payments with no seller are one row with `seller_id: null`. */
|
|
192
|
+
reportsSalesBySeller({ fromDate, toDate, page, perPage } = {}) {
|
|
193
|
+
return this.#client.get('/admin/reports/sales-by-seller', {
|
|
194
|
+
from_date: fromDate, to_date: toDate, page, per_page: perPage,
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/** Direct download link for the sales-by-seller report (format: 'csv' | 'xlsx'). */
|
|
199
|
+
reportsSalesBySellerExportUrl({ fromDate, toDate, format = 'csv' } = {}) {
|
|
200
|
+
return Admin.#buildUrl(this.#client.baseUrl, '/admin/reports/sales-by-seller/export', {
|
|
201
|
+
from_date: fromDate, to_date: toDate, format,
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
|
|
191
205
|
/** Organization-wide OpenAI completion usage, model breakdown and spend for a date range. Resolves `{ available: false }` when the API server has no valid OpenAI Admin API key. */
|
|
192
206
|
reportsOpenAiUsage({ fromDate, toDate } = {}) {
|
|
193
207
|
return this.#client.get('/admin/reports/openai-usage', {
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
export default class Games {
|
|
2
|
+
#client;
|
|
3
|
+
|
|
4
|
+
constructor(client) {
|
|
5
|
+
this.#client = client;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* With no id: paginated list of the games the authenticated user hosts or plays in
|
|
10
|
+
* (admins get every game). Pass search/page/perPage to filter and page it.
|
|
11
|
+
* Write methods (create/edit/delete/restore) are teacher+ and, except for admins, host-only.
|
|
12
|
+
*/
|
|
13
|
+
get(id = null, { search = null, page = null, perPage = null } = {}) {
|
|
14
|
+
if (id) return this.#client.get(`/games/${id}`);
|
|
15
|
+
return this.#client.get('/games', { search, page, per_page: perPage ?? 15 });
|
|
16
|
+
}
|
|
17
|
+
/** `data`: `{ title, type }` — type is `kahoot` or `jeopardy`. The creator becomes the host. */
|
|
18
|
+
create(data) { return this.#client.put('/games', data); }
|
|
19
|
+
/** `data`: `{ title?, status?, allow_guests? }` — `allow_guests` lets non-logged users join through the share link; status is `draft`, `lobby`, `in_progress` or `finished`. */
|
|
20
|
+
edit(id, data) { return this.#client.patch(`/games/${id}`, data); }
|
|
21
|
+
delete(id) { return this.#client.del(`/games/${id}`); }
|
|
22
|
+
/** Undoes delete() — brings a soft-deleted game back. */
|
|
23
|
+
restore(id) { return this.#client.post(`/games/${id}/restore`); }
|
|
24
|
+
|
|
25
|
+
/** Host and players of a game. */
|
|
26
|
+
players(id) { return this.#client.get(`/games/${id}/players`); }
|
|
27
|
+
/** Takes a seat as a player — only while the game's status is `lobby`. */
|
|
28
|
+
join(id) { return this.#client.post(`/games/${id}/join`); }
|
|
29
|
+
/** Host/admin only; hosts themselves can't be removed. */
|
|
30
|
+
removePlayer(id, userId) { return this.#client.del(`/games/${id}/players/${userId}`); }
|
|
31
|
+
|
|
32
|
+
/** Host/admin only. Issues a new share token — the old link stops working; anyone already seated keeps their seat. */
|
|
33
|
+
regenerateShare(id) { return this.#client.post(`/games/${id}/share/regenerate`); }
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Share-link endpoints, keyed by the `share_token` only the host/admin sees on get(id).
|
|
37
|
+
* `get` is public (no login): `{ id, title, type, status, allow_guests }`. `join` is for a logged-in
|
|
38
|
+
* user. `guestJoin(name)` seats a non-logged user (host must have enabled `allow_guests`) and returns
|
|
39
|
+
* a `guest_token`, which `guestQuestions(guestToken)` then needs to read the enabled questions.
|
|
40
|
+
*/
|
|
41
|
+
shared(token) {
|
|
42
|
+
const client = this.#client;
|
|
43
|
+
const base = `/games/shared/${token}`;
|
|
44
|
+
return {
|
|
45
|
+
get: () => client.get(base),
|
|
46
|
+
join: () => client.post(`${base}/join`),
|
|
47
|
+
guestJoin: (name) => client.post(`${base}/guest`, { name }),
|
|
48
|
+
guestQuestions: (guestToken) => client.get(`${base}/questions`, { guest_token: guestToken }),
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Hosts/admins get every question (answers included); players only the enabled ones,
|
|
54
|
+
* without answers. Kahoot data: `{ question, options: [{ text, is_correct }], points?, time_limit? }`;
|
|
55
|
+
* Jeopardy data: `{ question, category, answer, points? }`. `enabled` toggles a question on/off.
|
|
56
|
+
*/
|
|
57
|
+
questions(gameId) {
|
|
58
|
+
const client = this.#client;
|
|
59
|
+
const base = `/games/${gameId}/questions`;
|
|
60
|
+
return {
|
|
61
|
+
get: () => client.get(base),
|
|
62
|
+
create: (data) => client.put(base, data),
|
|
63
|
+
edit: (id, data) => client.patch(`${base}/${id}`, data),
|
|
64
|
+
delete: (id) => client.del(`${base}/${id}`),
|
|
65
|
+
/** Undoes delete() — brings a soft-deleted question back. */
|
|
66
|
+
restore: (id) => client.post(`${base}/${id}/restore`),
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
}
|
package/src/api/v1/index.js
CHANGED
|
@@ -17,6 +17,7 @@ import Dashboard from './Dashboard.js';
|
|
|
17
17
|
import EducationCenter from './EducationCenter.js';
|
|
18
18
|
import Employee from './Employee.js';
|
|
19
19
|
import Files from './Files.js';
|
|
20
|
+
import Games from './Games.js';
|
|
20
21
|
import Forums from './Forums.js';
|
|
21
22
|
import Hashes from './Hashes.js';
|
|
22
23
|
import Insignias from './Insignias.js';
|
|
@@ -88,6 +89,7 @@ export default class InsigniaApiV1 extends InsigniaApi {
|
|
|
88
89
|
this.organizations = new Organizations(this);
|
|
89
90
|
this.paymentMethods = new PaymentMethods(this);
|
|
90
91
|
this.payments = new Payments(this);
|
|
92
|
+
this.games = new Games(this);
|
|
91
93
|
this.quizzes = new Quizzes(this);
|
|
92
94
|
this.sales = new Sales(this);
|
|
93
95
|
this.search = new Search(this);
|