chukyo-sdk 0.1.0
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/LICENSE +21 -0
- package/README.md +227 -0
- package/dist/cjs/albo/client.js +133 -0
- package/dist/cjs/albo/index.js +55 -0
- package/dist/cjs/albo/parser/albo.js +110 -0
- package/dist/cjs/albo/types/albo.js +351 -0
- package/dist/cjs/albo/types/alboCalendar.js +51 -0
- package/dist/cjs/albo/types/alboCommon.js +55 -0
- package/dist/cjs/albo/types/alboInformation.js +136 -0
- package/dist/cjs/albo/types/alboMenu.js +92 -0
- package/dist/cjs/albo/types/alboQuestionnaire.js +229 -0
- package/dist/cjs/albo/types/alboSharedItem.js +137 -0
- package/dist/cjs/albo/types/alboSystem.js +103 -0
- package/dist/cjs/albo/types/alboUniversalForm.js +51 -0
- package/dist/cjs/common/dom.js +137 -0
- package/dist/cjs/common/utils.js +29 -0
- package/dist/cjs/constants.js +127 -0
- package/dist/cjs/core/request.js +39 -0
- package/dist/cjs/cubics/client.js +49 -0
- package/dist/cjs/cubics/index.js +22 -0
- package/dist/cjs/cubics/parser/cubics.js +103 -0
- package/dist/cjs/cubics/types/cubics.js +90 -0
- package/dist/cjs/errors.js +55 -0
- package/dist/cjs/index.js +50 -0
- package/dist/cjs/manabo/client.js +135 -0
- package/dist/cjs/manabo/index.js +44 -0
- package/dist/cjs/manabo/parser/manaboClass.js +386 -0
- package/dist/cjs/manabo/parser/manaboEntry.js +38 -0
- package/dist/cjs/manabo/parser/manaboMail.js +153 -0
- package/dist/cjs/manabo/parser/manaboNews.js +26 -0
- package/dist/cjs/manabo/parser/manaboTimetable.js +93 -0
- package/dist/cjs/manabo/types/manaboClass.js +223 -0
- package/dist/cjs/manabo/types/manaboEntry.js +43 -0
- package/dist/cjs/manabo/types/manaboMail.js +117 -0
- package/dist/cjs/manabo/types/manaboNews.js +20 -0
- package/dist/cjs/manabo/types/manaboTimetable.js +79 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/shib/builder.js +239 -0
- package/dist/cjs/shib/index.js +32 -0
- package/dist/cjs/shib/parser/shibLogin.js +138 -0
- package/dist/cjs/shib/parser/shibUser.js +51 -0
- package/dist/cjs/shib/types/common.js +2 -0
- package/dist/cjs/shib/types/shibLogin.js +92 -0
- package/dist/cjs/shib/types/shibUser.js +44 -0
- package/dist/cjs/transports/fetch.js +84 -0
- package/dist/cjs/types.js +9 -0
- package/dist/esm/albo/client.d.ts +80 -0
- package/dist/esm/albo/client.d.ts.map +1 -0
- package/dist/esm/albo/client.js +129 -0
- package/dist/esm/albo/index.d.ts +12 -0
- package/dist/esm/albo/index.d.ts.map +1 -0
- package/dist/esm/albo/index.js +11 -0
- package/dist/esm/albo/parser/albo.d.ts +69 -0
- package/dist/esm/albo/parser/albo.d.ts.map +1 -0
- package/dist/esm/albo/parser/albo.js +84 -0
- package/dist/esm/albo/types/albo.d.ts +460 -0
- package/dist/esm/albo/types/albo.d.ts.map +1 -0
- package/dist/esm/albo/types/albo.js +348 -0
- package/dist/esm/albo/types/alboCalendar.d.ts +58 -0
- package/dist/esm/albo/types/alboCalendar.d.ts.map +1 -0
- package/dist/esm/albo/types/alboCalendar.js +48 -0
- package/dist/esm/albo/types/alboCommon.d.ts +52 -0
- package/dist/esm/albo/types/alboCommon.d.ts.map +1 -0
- package/dist/esm/albo/types/alboCommon.js +51 -0
- package/dist/esm/albo/types/alboInformation.d.ts +214 -0
- package/dist/esm/albo/types/alboInformation.d.ts.map +1 -0
- package/dist/esm/albo/types/alboInformation.js +133 -0
- package/dist/esm/albo/types/alboMenu.d.ts +114 -0
- package/dist/esm/albo/types/alboMenu.d.ts.map +1 -0
- package/dist/esm/albo/types/alboMenu.js +89 -0
- package/dist/esm/albo/types/alboQuestionnaire.d.ts +442 -0
- package/dist/esm/albo/types/alboQuestionnaire.d.ts.map +1 -0
- package/dist/esm/albo/types/alboQuestionnaire.js +226 -0
- package/dist/esm/albo/types/alboSharedItem.d.ts +205 -0
- package/dist/esm/albo/types/alboSharedItem.d.ts.map +1 -0
- package/dist/esm/albo/types/alboSharedItem.js +134 -0
- package/dist/esm/albo/types/alboSystem.d.ts +129 -0
- package/dist/esm/albo/types/alboSystem.d.ts.map +1 -0
- package/dist/esm/albo/types/alboSystem.js +100 -0
- package/dist/esm/albo/types/alboUniversalForm.d.ts +63 -0
- package/dist/esm/albo/types/alboUniversalForm.d.ts.map +1 -0
- package/dist/esm/albo/types/alboUniversalForm.js +48 -0
- package/dist/esm/common/dom.d.ts +35 -0
- package/dist/esm/common/dom.d.ts.map +1 -0
- package/dist/esm/common/dom.js +120 -0
- package/dist/esm/common/utils.d.ts +15 -0
- package/dist/esm/common/utils.d.ts.map +1 -0
- package/dist/esm/common/utils.js +22 -0
- package/dist/esm/constants.d.ts +113 -0
- package/dist/esm/constants.d.ts.map +1 -0
- package/dist/esm/constants.js +124 -0
- package/dist/esm/core/request.d.ts +29 -0
- package/dist/esm/core/request.d.ts.map +1 -0
- package/dist/esm/core/request.js +33 -0
- package/dist/esm/cubics/client.d.ts +13 -0
- package/dist/esm/cubics/client.d.ts.map +1 -0
- package/dist/esm/cubics/client.js +45 -0
- package/dist/esm/cubics/index.d.ts +4 -0
- package/dist/esm/cubics/index.d.ts.map +1 -0
- package/dist/esm/cubics/index.js +3 -0
- package/dist/esm/cubics/parser/cubics.d.ts +8 -0
- package/dist/esm/cubics/parser/cubics.d.ts.map +1 -0
- package/dist/esm/cubics/parser/cubics.js +99 -0
- package/dist/esm/cubics/types/cubics.d.ts +94 -0
- package/dist/esm/cubics/types/cubics.d.ts.map +1 -0
- package/dist/esm/cubics/types/cubics.js +87 -0
- package/dist/esm/errors.d.ts +46 -0
- package/dist/esm/errors.d.ts.map +1 -0
- package/dist/esm/errors.js +46 -0
- package/dist/esm/index.d.ts +19 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +25 -0
- package/dist/esm/manabo/client.d.ts +75 -0
- package/dist/esm/manabo/client.d.ts.map +1 -0
- package/dist/esm/manabo/client.js +131 -0
- package/dist/esm/manabo/index.d.ts +12 -0
- package/dist/esm/manabo/index.d.ts.map +1 -0
- package/dist/esm/manabo/index.js +11 -0
- package/dist/esm/manabo/parser/manaboClass.d.ts +9 -0
- package/dist/esm/manabo/parser/manaboClass.d.ts.map +1 -0
- package/dist/esm/manabo/parser/manaboClass.js +377 -0
- package/dist/esm/manabo/parser/manaboEntry.d.ts +8 -0
- package/dist/esm/manabo/parser/manaboEntry.d.ts.map +1 -0
- package/dist/esm/manabo/parser/manaboEntry.js +33 -0
- package/dist/esm/manabo/parser/manaboMail.d.ts +8 -0
- package/dist/esm/manabo/parser/manaboMail.d.ts.map +1 -0
- package/dist/esm/manabo/parser/manaboMail.js +145 -0
- package/dist/esm/manabo/parser/manaboNews.d.ts +7 -0
- package/dist/esm/manabo/parser/manaboNews.d.ts.map +1 -0
- package/dist/esm/manabo/parser/manaboNews.js +22 -0
- package/dist/esm/manabo/parser/manaboTimetable.d.ts +4 -0
- package/dist/esm/manabo/parser/manaboTimetable.d.ts.map +1 -0
- package/dist/esm/manabo/parser/manaboTimetable.js +89 -0
- package/dist/esm/manabo/types/manaboClass.d.ts +294 -0
- package/dist/esm/manabo/types/manaboClass.d.ts.map +1 -0
- package/dist/esm/manabo/types/manaboClass.js +220 -0
- package/dist/esm/manabo/types/manaboEntry.d.ts +24 -0
- package/dist/esm/manabo/types/manaboEntry.d.ts.map +1 -0
- package/dist/esm/manabo/types/manaboEntry.js +40 -0
- package/dist/esm/manabo/types/manaboMail.d.ts +103 -0
- package/dist/esm/manabo/types/manaboMail.d.ts.map +1 -0
- package/dist/esm/manabo/types/manaboMail.js +114 -0
- package/dist/esm/manabo/types/manaboNews.d.ts +15 -0
- package/dist/esm/manabo/types/manaboNews.d.ts.map +1 -0
- package/dist/esm/manabo/types/manaboNews.js +17 -0
- package/dist/esm/manabo/types/manaboTimetable.d.ts +88 -0
- package/dist/esm/manabo/types/manaboTimetable.d.ts.map +1 -0
- package/dist/esm/manabo/types/manaboTimetable.js +76 -0
- package/dist/esm/package.json +1 -0
- package/dist/esm/shib/builder.d.ts +154 -0
- package/dist/esm/shib/builder.d.ts.map +1 -0
- package/dist/esm/shib/builder.js +212 -0
- package/dist/esm/shib/index.d.ts +15 -0
- package/dist/esm/shib/index.d.ts.map +1 -0
- package/dist/esm/shib/index.js +14 -0
- package/dist/esm/shib/parser/shibLogin.d.ts +47 -0
- package/dist/esm/shib/parser/shibLogin.d.ts.map +1 -0
- package/dist/esm/shib/parser/shibLogin.js +127 -0
- package/dist/esm/shib/parser/shibUser.d.ts +11 -0
- package/dist/esm/shib/parser/shibUser.d.ts.map +1 -0
- package/dist/esm/shib/parser/shibUser.js +46 -0
- package/dist/esm/shib/types/common.d.ts +20 -0
- package/dist/esm/shib/types/common.d.ts.map +1 -0
- package/dist/esm/shib/types/common.js +1 -0
- package/dist/esm/shib/types/shibLogin.d.ts +62 -0
- package/dist/esm/shib/types/shibLogin.d.ts.map +1 -0
- package/dist/esm/shib/types/shibLogin.js +89 -0
- package/dist/esm/shib/types/shibUser.d.ts +36 -0
- package/dist/esm/shib/types/shibUser.d.ts.map +1 -0
- package/dist/esm/shib/types/shibUser.js +41 -0
- package/dist/esm/transports/fetch.d.ts +36 -0
- package/dist/esm/transports/fetch.d.ts.map +1 -0
- package/dist/esm/transports/fetch.js +80 -0
- package/dist/esm/types.d.ts +71 -0
- package/dist/esm/types.d.ts.map +1 -0
- package/dist/esm/types.js +8 -0
- package/package.json +72 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 chukyo-umebo
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
# chukyo-sdk
|
|
2
|
+
|
|
3
|
+
中京大学ポータル(**Albo** / **CUBICS** / **MaNaBo**)のデータを、**fetch → parse → 検証済み DTO** まで一気に取得する TypeScript SDK。
|
|
4
|
+
|
|
5
|
+
Node / ブラウザ / ブラウザ拡張 / Expo など環境を問わず、同じコードで動きます。
|
|
6
|
+
|
|
7
|
+
> このドキュメントは**使い方**です。設計思想・内部方針は [DESIGN.md](DESIGN.md) を参照してください。
|
|
8
|
+
|
|
9
|
+
## インストール
|
|
10
|
+
|
|
11
|
+
```sh
|
|
12
|
+
npm install chukyo-sdk
|
|
13
|
+
# または
|
|
14
|
+
bun add chukyo-sdk
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
`typescript ^5` を peerDependency に持ちます。
|
|
18
|
+
|
|
19
|
+
## クイックスタート
|
|
20
|
+
|
|
21
|
+
```ts
|
|
22
|
+
import { createChukyoClient, fetchTransport } from "chukyo-sdk";
|
|
23
|
+
|
|
24
|
+
const client = createChukyoClient({
|
|
25
|
+
transport: fetchTransport(), // HTTP をどう実行するか(必須)
|
|
26
|
+
session: mySessionProvider, // Cookie をどう供給するか(任意)
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
// 各メソッドは fetch → parse まで行い、Zod 検証済みの DTO を返す
|
|
30
|
+
const timetable = await client.albo.getTimetable();
|
|
31
|
+
const news = await client.albo.getInformation();
|
|
32
|
+
const cubicsTimetable = await client.cubics.getTimetable();
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
`client` には `albo` / `cubics` / `manabo` の3つのポータルクライアントがぶら下がっています。
|
|
36
|
+
|
|
37
|
+
## 2つの Adapter を理解する
|
|
38
|
+
|
|
39
|
+
SDK は「HTTP の実行方法」と「Cookie の供給方法」を**知りません**。この2つを注入することで、あらゆる環境で同じコードが動きます。
|
|
40
|
+
|
|
41
|
+
### 1. Transport(必須)— HTTP をどう実行するか
|
|
42
|
+
|
|
43
|
+
`fetchTransport()` が標準実装です。環境ごとに引数を変えるだけで対応できます。
|
|
44
|
+
|
|
45
|
+
```ts
|
|
46
|
+
import { fetchTransport } from "chukyo-sdk";
|
|
47
|
+
|
|
48
|
+
// Node 18+(globalThis.fetch を使う)
|
|
49
|
+
fetchTransport();
|
|
50
|
+
|
|
51
|
+
// Expo
|
|
52
|
+
import { fetch as expoFetch } from "expo/fetch";
|
|
53
|
+
fetchTransport(expoFetch);
|
|
54
|
+
|
|
55
|
+
// ブラウザ拡張(ブラウザの Cookie ジャーを自動送信 → SessionProvider 不要)
|
|
56
|
+
fetchTransport(fetch, { credentials: "include" });
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
オプション(`FetchTransportOptions`):
|
|
60
|
+
|
|
61
|
+
| オプション | 既定 | 説明 |
|
|
62
|
+
| --- | --- | --- |
|
|
63
|
+
| `timeoutMs` | `10000` | タイムアウト(ms) |
|
|
64
|
+
| `userAgent` | なし | 付与する User-Agent(ブラウザでは無視される) |
|
|
65
|
+
| `credentials` | `"omit"` | Cookie 送信ポリシー。拡張でブラウザ Cookie を使うなら `"include"` |
|
|
66
|
+
| `mapErrorStatus` | 503→メンテナンス | 異常ステータスをエラーへ変換するフック |
|
|
67
|
+
|
|
68
|
+
### 2. SessionProvider(任意)— Cookie をどう供給するか
|
|
69
|
+
|
|
70
|
+
**この SDK はログイン(認証)を行いません。** 有効な Cookie を供給する `SessionProvider` を実装して渡します。
|
|
71
|
+
|
|
72
|
+
```ts
|
|
73
|
+
import type { SessionProvider, PortalService } from "chukyo-sdk";
|
|
74
|
+
|
|
75
|
+
const mySessionProvider: SessionProvider = {
|
|
76
|
+
// サービスごとに HTTP ヘッダ用の Cookie 文字列を返す。失効していれば内部で再認証する
|
|
77
|
+
async getCookieHeader(service: PortalService): Promise<string> {
|
|
78
|
+
return "SESSION=...; ...";
|
|
79
|
+
},
|
|
80
|
+
// セッション無効を検知した際に SDK から呼ばれる(次回アクセスで再認証させる)
|
|
81
|
+
invalidate(serviceKey: string): void {
|
|
82
|
+
// キャッシュを破棄するなど
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
**省略した場合**、SDK は Cookie ヘッダを付与せず、Transport の `credentials` 設定に委ねます。ブラウザ拡張でブラウザの Cookie ジャーを使う場合は `session` を省略し、`fetchTransport(fetch, { credentials: "include" })` を渡してください。
|
|
88
|
+
|
|
89
|
+
## API リファレンス
|
|
90
|
+
|
|
91
|
+
すべてのメソッドは非同期で、Zod で検証済みの DTO を返します(パース失敗時は `ParseError` を throw)。
|
|
92
|
+
|
|
93
|
+
### `client.albo` — ポータルサイト(JSON REST API)
|
|
94
|
+
|
|
95
|
+
3システムで唯一の本格的な JSON API を持ち、機能が最も豊富です。
|
|
96
|
+
|
|
97
|
+
| メソッド | 説明 |
|
|
98
|
+
| --- | --- |
|
|
99
|
+
| `getTimetable()` | 時間割 |
|
|
100
|
+
| `getCalendar(options?)` | 学年暦カレンダー(後述) |
|
|
101
|
+
| `getCalendarSource()` | 購読中カレンダーソース一覧(学部/大学院などの UUID) |
|
|
102
|
+
| `getCalendarOutlookEvent(n, options?)` | Outlook 連携イベント |
|
|
103
|
+
| `getInformation(page?, pageSize?)` | お知らせ一覧 |
|
|
104
|
+
| `getInformationDetail(uuid)` | お知らせ詳細 |
|
|
105
|
+
| `getInformationCategoryTree()` | お知らせカテゴリのツリー |
|
|
106
|
+
| `getQuestionnaire(page?, pageSize?)` | アンケート一覧 |
|
|
107
|
+
| `getQuestionnaireDetail(uuid)` | アンケート詳細(設問・回答含む) |
|
|
108
|
+
| `getQuestionnaireCategory()` | アンケートカテゴリ一覧 |
|
|
109
|
+
| `getUniversalForm(page?, pageSize?)` | 汎用申請フォーム一覧 |
|
|
110
|
+
| `getUniversalFormCategory(page?, pageSize?)` | 汎用申請カテゴリ一覧 |
|
|
111
|
+
| `getMenu()` | メニュー(タブ)一覧 |
|
|
112
|
+
| `getMenuDetail(uuid)` | メニュー詳細 |
|
|
113
|
+
| `getMenuLayout(uuid)` | メニューのレイアウト設定 |
|
|
114
|
+
| `getSystemSetting()` | システム設定一覧 |
|
|
115
|
+
| `getLanguageSetting()` | 翻訳(言語)設定 |
|
|
116
|
+
| `getDevice(page?, pageSize?)` | ログイン済みデバイス一覧 |
|
|
117
|
+
| `getActionLog(page?, pageSize?)` | 自分の操作ログ |
|
|
118
|
+
| `getSharedItem(page, folderUuid)` | 指定フォルダ配下のファイル一覧 |
|
|
119
|
+
| `getPersonal()` | 個人情報(**PII を含む**) |
|
|
120
|
+
| `getAuthCheck()` | ログイン確認(個人情報と同型、**PII を含む**) |
|
|
121
|
+
|
|
122
|
+
`getCalendar` の主なオプション:
|
|
123
|
+
|
|
124
|
+
```ts
|
|
125
|
+
await client.albo.getCalendar({
|
|
126
|
+
calendarSourceUuid, // 省略時は学年暦(学部)。getCalendarSource() で別ソースの UUID を取得
|
|
127
|
+
startAt, // UNIX 秒。省略時は範囲指定なし(全件)
|
|
128
|
+
endAt, // UNIX 秒
|
|
129
|
+
addOutlookCalendar, // Outlook 連携イベントを含めるか
|
|
130
|
+
pageSize, // 既定 1000
|
|
131
|
+
});
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### `client.cubics` — 教務システム(画面遷移型 HTML)
|
|
135
|
+
|
|
136
|
+
セッションが不安定なため、無効を検知すると自動でリトライします。
|
|
137
|
+
|
|
138
|
+
| メソッド | 説明 |
|
|
139
|
+
| --- | --- |
|
|
140
|
+
| `getTimetable()` | 週間時間割 |
|
|
141
|
+
|
|
142
|
+
### `client.manabo` — 学習管理システム(Glexa ベース)
|
|
143
|
+
|
|
144
|
+
授業・出席・メールなどを扱います。`classId` は時間割などから取得します。
|
|
145
|
+
|
|
146
|
+
| メソッド | 説明 |
|
|
147
|
+
| --- | --- |
|
|
148
|
+
| `getTimetable()` | 時間割 |
|
|
149
|
+
| `getClassNews(classId)` | 授業のお知らせ一覧 |
|
|
150
|
+
| `getClassSyllabus(classId)` | 授業のシラバス |
|
|
151
|
+
| `getClassEntry(classId)` | 授業の出席表(各回の出欠一覧) |
|
|
152
|
+
| `getClassDirectory(classId)` | 授業のディレクトリ(週・回)一覧 |
|
|
153
|
+
| `getClassContent(classId, directoryId, viewType?)` | ディレクトリ配下の教材一覧 |
|
|
154
|
+
| `getEntryForm(classId)` | 出席受付モーダルのフォーム(後述) |
|
|
155
|
+
| `submitEntry(params)` | 出席登録を送信(後述) |
|
|
156
|
+
| `getReceivedMail(options?)` | 受信メール一覧 |
|
|
157
|
+
| `getSentMail(options?)` | 送信メール一覧 |
|
|
158
|
+
| `getMailView(mailId)` | メール本文 |
|
|
159
|
+
| `searchMailMembers(q)` | メール宛先候補メンバーを検索 |
|
|
160
|
+
|
|
161
|
+
出席登録の流れ:
|
|
162
|
+
|
|
163
|
+
```ts
|
|
164
|
+
// 1. フォームを取得
|
|
165
|
+
const form = await client.manabo.getEntryForm(classId);
|
|
166
|
+
|
|
167
|
+
// 2. 出席コード(パスワード)が必要かは requiresCode で判定
|
|
168
|
+
await client.manabo.submitEntry({
|
|
169
|
+
classId,
|
|
170
|
+
directoryId: form.directoryId,
|
|
171
|
+
entryId: form.entryId,
|
|
172
|
+
uniqid: form.uniqid,
|
|
173
|
+
code: form.requiresCode ? "教員指示のコード" : undefined,
|
|
174
|
+
});
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
## エラーハンドリング
|
|
178
|
+
|
|
179
|
+
SDK が投げるエラーはすべて `ChukyoSdkError` を継承しています。`instanceof` で判別してください。
|
|
180
|
+
|
|
181
|
+
```ts
|
|
182
|
+
import {
|
|
183
|
+
ChukyoSdkError,
|
|
184
|
+
ParseError, // fetch は成功したが期待スキーマに一致しない(サイト構造変化の疑い、cause に Zod エラー)
|
|
185
|
+
ExpiredSessionError, // セッション失効。再認証を試みても回復しなかった
|
|
186
|
+
ChukyoMaintenanceError, // 大学側メンテナンス(HTTP 503)
|
|
187
|
+
NetworkError, // ネットワーク到達失敗(DNS・接続拒否・TLS 等)
|
|
188
|
+
TimeoutError, // リクエストがタイムアウト
|
|
189
|
+
} from "chukyo-sdk";
|
|
190
|
+
|
|
191
|
+
try {
|
|
192
|
+
const tt = await client.albo.getTimetable();
|
|
193
|
+
} catch (e) {
|
|
194
|
+
if (e instanceof ChukyoMaintenanceError) {
|
|
195
|
+
// メンテナンス中の案内を出す
|
|
196
|
+
} else if (e instanceof ExpiredSessionError) {
|
|
197
|
+
// 再ログインを促す
|
|
198
|
+
} else if (e instanceof ChukyoSdkError) {
|
|
199
|
+
// その他 SDK エラー
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
## 認証(Shibboleth)について
|
|
205
|
+
|
|
206
|
+
前述のとおり SDK はログインを**実行しません**。ただし Shibboleth(SAML + パスキー等)フローを組み立てるための**構造化ヘルパ**を `shib` モジュールとして提供しています。
|
|
207
|
+
|
|
208
|
+
- **ビルダ**(`buildPasswordLoginRequest` など): 各ステップのリクエスト記述子を組み立てる
|
|
209
|
+
- **パーサ**(`parseShibLoginResult` など): レスポンスから AuthState・SAML フォーム・CSRF トークン・WebAuthn challenge・リダイレクト先などを取り出す
|
|
210
|
+
|
|
211
|
+
HTTP 実行・Cookie 管理・リダイレクト追従・パスキーの鍵生成/署名は**呼び出し側の責務**です。これらを使って自前の `SessionProvider` を実装します。
|
|
212
|
+
|
|
213
|
+
```ts
|
|
214
|
+
import { buildPasswordLoginRequest, parseShibLoginResult, SHIB_URLS } from "chukyo-sdk";
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
## PII(個人情報)の取り扱い
|
|
218
|
+
|
|
219
|
+
SDK は PII のフィルタを**行いません**。`getPersonal()` など個人情報を含むエンドポイントもそのまま取得できます。PII の保管・表示・送信の責務は利用側にあります。
|
|
220
|
+
|
|
221
|
+
## 型と DTO
|
|
222
|
+
|
|
223
|
+
全 DTO のフィールドには日本語の説明とサニタイズ済みの例が、JSDoc と Zod の `.meta()` の両方で付いています。エディタの補完・ホバーでそのまま確認できます。DTO 型(`AlboTimetableDTO` など)や個別の parser 関数も import 可能です。
|
|
224
|
+
|
|
225
|
+
## ライセンス / 注意
|
|
226
|
+
|
|
227
|
+
中京大学の各ポータルを利用規約の範囲内で利用してください。取得したデータ、特に個人情報の取り扱いには十分注意してください。
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AlboClient = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Albo クライアント。3システムで唯一まともな JSON REST API を持つ。
|
|
6
|
+
*
|
|
7
|
+
* ※ 個人情報を含むエンドポイント(auth/check-logged-in・personal)も提供する。
|
|
8
|
+
* PII の取り扱いは利用側の責務(SDK ではフィルタしない)。
|
|
9
|
+
*/
|
|
10
|
+
const constants_1 = require("../constants");
|
|
11
|
+
const request_1 = require("../core/request");
|
|
12
|
+
const albo_1 = require("./parser/albo");
|
|
13
|
+
class AlboClient {
|
|
14
|
+
ctx;
|
|
15
|
+
constructor(ctx) {
|
|
16
|
+
this.ctx = ctx;
|
|
17
|
+
}
|
|
18
|
+
fetchText(path) {
|
|
19
|
+
return (0, request_1.portalRequestText)(this.ctx, constants_1.SERVICES.albo, {
|
|
20
|
+
method: "GET",
|
|
21
|
+
url: `${constants_1.ALBO_URLS.base}${path}`,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* 学年暦カレンダーを取得する。
|
|
26
|
+
*
|
|
27
|
+
* `calendarSourceUuid` 省略時は {@link ALBO_DEFAULT_CALENDAR_SOURCE_UUID}(学年暦・学部)を使う。
|
|
28
|
+
* 大学院など別ソースを取りたい場合は `getCalendarSource()` で UUID を取得し、ここに渡す。
|
|
29
|
+
* `startAt` / `endAt`(UNIX 秒)省略時は範囲指定なし(ブラウザの UI は「本日〜今年度末」を渡すが、
|
|
30
|
+
* SDK としては全件取得をデフォルトにしている)。
|
|
31
|
+
*/
|
|
32
|
+
async getCalendar(options = {}) {
|
|
33
|
+
const { calendarSourceUuid = constants_1.ALBO_DEFAULT_CALENDAR_SOURCE_UUID, startAt, endAt, addOutlookCalendar, pageSize = 1000, } = options;
|
|
34
|
+
const query = [
|
|
35
|
+
`page_size=${pageSize}`,
|
|
36
|
+
`calendar_source_uuid=${calendarSourceUuid}`,
|
|
37
|
+
...(startAt != null ? [`start_at=${startAt}`] : []),
|
|
38
|
+
...(endAt != null ? [`end_at=${endAt}`] : []),
|
|
39
|
+
...(addOutlookCalendar != null ? [`add_outlook_calendar=${addOutlookCalendar ? "1" : "0"}`] : []),
|
|
40
|
+
].join("&");
|
|
41
|
+
return (0, request_1.unwrap)((0, albo_1.parseAlboCalendar)(await this.fetchText(`/api/calendar/?${query}`)));
|
|
42
|
+
}
|
|
43
|
+
/** お知らせ一覧を取得する */
|
|
44
|
+
async getInformation(page = 1, pageSize = 20) {
|
|
45
|
+
return (0, request_1.unwrap)((0, albo_1.parseAlboInformation)(await this.fetchText(`/api/information/${page}?page_size=${pageSize}&category_uuid=`)));
|
|
46
|
+
}
|
|
47
|
+
/** 時間割を取得する */
|
|
48
|
+
async getTimetable() {
|
|
49
|
+
return (0, request_1.unwrap)((0, albo_1.parseAlboTimetable)(await this.fetchText("/api/class/time-table/")));
|
|
50
|
+
}
|
|
51
|
+
/** ログイン確認(個人情報と同型。PII を含む) */
|
|
52
|
+
async getAuthCheck() {
|
|
53
|
+
return (0, request_1.unwrap)((0, albo_1.parseAlboAuthCheck)(await this.fetchText("/api/auth/check-logged-in")));
|
|
54
|
+
}
|
|
55
|
+
/** 個人情報を取得する(PII を含む) */
|
|
56
|
+
async getPersonal() {
|
|
57
|
+
return (0, request_1.unwrap)((0, albo_1.parseAlboPersonal)(await this.fetchText("/api/auth/check-logged-in")));
|
|
58
|
+
}
|
|
59
|
+
/** 購読中カレンダーソースの一覧を取得する */
|
|
60
|
+
async getCalendarSource() {
|
|
61
|
+
return (0, request_1.unwrap)((0, albo_1.parseAlboCalendarSource)(await this.fetchText("/api/calendar-source/")));
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Outlook 連携イベントを取得する(未連携時は `result.message === "No token."` の応答)。
|
|
65
|
+
* `start_at` / `end_at` / `page_size` は実ブラウザも常に付与しているクエリで、省略はできない
|
|
66
|
+
* 前提で `startAt=0, endAt=0, pageSize=1`(=連携有無の確認用)をデフォルトにしている。
|
|
67
|
+
*/
|
|
68
|
+
async getCalendarOutlookEvent(n, options = {}) {
|
|
69
|
+
const { startAt = 0, endAt = 0, pageSize = 1 } = options;
|
|
70
|
+
return (0, request_1.unwrap)((0, albo_1.parseAlboCalendarOutlookEvent)(await this.fetchText(`/api/calendar/outlook-event/${n}?start_at=${startAt}&end_at=${endAt}&page_size=${pageSize}`)));
|
|
71
|
+
}
|
|
72
|
+
/** お知らせ詳細を取得する */
|
|
73
|
+
async getInformationDetail(uuid) {
|
|
74
|
+
return (0, request_1.unwrap)((0, albo_1.parseAlboInformationDetail)(await this.fetchText(`/api/information/view/${uuid}`)));
|
|
75
|
+
}
|
|
76
|
+
/** お知らせカテゴリのツリーを取得する */
|
|
77
|
+
async getInformationCategoryTree() {
|
|
78
|
+
return (0, request_1.unwrap)((0, albo_1.parseAlboInformationCategoryTree)(await this.fetchText("/api/information-category/tree")));
|
|
79
|
+
}
|
|
80
|
+
/** アンケート一覧を取得する */
|
|
81
|
+
async getQuestionnaire(page = 1, pageSize = 20) {
|
|
82
|
+
return (0, request_1.unwrap)((0, albo_1.parseAlboQuestionnaire)(await this.fetchText(`/api/questionnaire/${page}?page_size=${pageSize}`)));
|
|
83
|
+
}
|
|
84
|
+
/** アンケート詳細(設問・回答含む)を取得する */
|
|
85
|
+
async getQuestionnaireDetail(uuid) {
|
|
86
|
+
return (0, request_1.unwrap)((0, albo_1.parseAlboQuestionnaireDetail)(await this.fetchText(`/api/questionnaire/view/${uuid}`)));
|
|
87
|
+
}
|
|
88
|
+
/** アンケートカテゴリ一覧を取得する */
|
|
89
|
+
async getQuestionnaireCategory() {
|
|
90
|
+
return (0, request_1.unwrap)((0, albo_1.parseAlboQuestionnaireCategory)(await this.fetchText("/api/questionnaire-category")));
|
|
91
|
+
}
|
|
92
|
+
/** 汎用申請フォーム一覧を取得する */
|
|
93
|
+
async getUniversalForm(page = 1, pageSize = 20) {
|
|
94
|
+
return (0, request_1.unwrap)((0, albo_1.parseAlboUniversalForm)(await this.fetchText(`/api/universal-form/${page}?page_size=${pageSize}`)));
|
|
95
|
+
}
|
|
96
|
+
/** 汎用申請カテゴリ一覧を取得する */
|
|
97
|
+
async getUniversalFormCategory(page = 1, pageSize = 20) {
|
|
98
|
+
return (0, request_1.unwrap)((0, albo_1.parseAlboUniversalFormCategory)(await this.fetchText(`/api/universal-form-category/${page}?page_size=${pageSize}`)));
|
|
99
|
+
}
|
|
100
|
+
/** メニュー(タブ)一覧を取得する */
|
|
101
|
+
async getMenu() {
|
|
102
|
+
return (0, request_1.unwrap)((0, albo_1.parseAlboMenu)(await this.fetchText("/api/menu")));
|
|
103
|
+
}
|
|
104
|
+
/** メニュー詳細(配置モジュール含む)を取得する */
|
|
105
|
+
async getMenuDetail(uuid) {
|
|
106
|
+
return (0, request_1.unwrap)((0, albo_1.parseAlboMenuDetail)(await this.fetchText(`/api/menu/view/${uuid}`)));
|
|
107
|
+
}
|
|
108
|
+
/** メニューのレイアウト設定を取得する */
|
|
109
|
+
async getMenuLayout(uuid) {
|
|
110
|
+
return (0, request_1.unwrap)((0, albo_1.parseAlboMenuLayout)(await this.fetchText(`/api/menu-layout/view/${uuid}`)));
|
|
111
|
+
}
|
|
112
|
+
/** システム設定一覧を取得する */
|
|
113
|
+
async getSystemSetting() {
|
|
114
|
+
return (0, request_1.unwrap)((0, albo_1.parseAlboSystemSetting)(await this.fetchText("/api/system-setting")));
|
|
115
|
+
}
|
|
116
|
+
/** 翻訳(言語)設定を取得する */
|
|
117
|
+
async getLanguageSetting() {
|
|
118
|
+
return (0, request_1.unwrap)((0, albo_1.parseAlboLanguageSetting)(await this.fetchText("/api/language-setting/view")));
|
|
119
|
+
}
|
|
120
|
+
/** ログイン済みデバイス一覧を取得する */
|
|
121
|
+
async getDevice(page = 1, pageSize = 20) {
|
|
122
|
+
return (0, request_1.unwrap)((0, albo_1.parseAlboDevice)(await this.fetchText(`/api/device/${page}?page_size=${pageSize}`)));
|
|
123
|
+
}
|
|
124
|
+
/** 自分の操作ログを取得する */
|
|
125
|
+
async getActionLog(page = 1, pageSize = 20) {
|
|
126
|
+
return (0, request_1.unwrap)((0, albo_1.parseAlboActionLog)(await this.fetchText(`/api/action-log/user-view/${page}?page_size=${pageSize}`)));
|
|
127
|
+
}
|
|
128
|
+
/** 指定フォルダ配下のファイル一覧を取得する */
|
|
129
|
+
async getSharedItem(page, folderUuid) {
|
|
130
|
+
return (0, request_1.unwrap)((0, albo_1.parseAlboSharedItem)(await this.fetchText(`/api/shared-item/${page}/${folderUuid}`)));
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
exports.AlboClient = AlboClient;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.AlboClient = exports.AlboActionResultSchema = exports.paginationShape = exports.alboEnvelope = exports.parseAlboActionResult = exports.parseAlboSharedItem = exports.parseAlboActionLog = exports.parseAlboDevice = exports.parseAlboLanguageSetting = exports.parseAlboSystemSetting = exports.parseAlboPersonal = exports.parseAlboAuthCheck = exports.parseAlboTimetable = exports.parseAlboMenuLayout = exports.parseAlboMenuDetail = exports.parseAlboMenu = exports.parseAlboUniversalFormCategory = exports.parseAlboUniversalForm = exports.parseAlboQuestionnaireCategory = exports.parseAlboQuestionnaireDetail = exports.parseAlboQuestionnaire = exports.parseAlboInformationCategoryTree = exports.parseAlboInformationDetail = exports.parseAlboInformation = exports.parseAlboCalendarOutlookEvent = exports.parseAlboCalendarSource = exports.parseAlboCalendar = void 0;
|
|
18
|
+
var albo_1 = require("./parser/albo");
|
|
19
|
+
Object.defineProperty(exports, "parseAlboCalendar", { enumerable: true, get: function () { return albo_1.parseAlboCalendar; } });
|
|
20
|
+
Object.defineProperty(exports, "parseAlboCalendarSource", { enumerable: true, get: function () { return albo_1.parseAlboCalendarSource; } });
|
|
21
|
+
Object.defineProperty(exports, "parseAlboCalendarOutlookEvent", { enumerable: true, get: function () { return albo_1.parseAlboCalendarOutlookEvent; } });
|
|
22
|
+
Object.defineProperty(exports, "parseAlboInformation", { enumerable: true, get: function () { return albo_1.parseAlboInformation; } });
|
|
23
|
+
Object.defineProperty(exports, "parseAlboInformationDetail", { enumerable: true, get: function () { return albo_1.parseAlboInformationDetail; } });
|
|
24
|
+
Object.defineProperty(exports, "parseAlboInformationCategoryTree", { enumerable: true, get: function () { return albo_1.parseAlboInformationCategoryTree; } });
|
|
25
|
+
Object.defineProperty(exports, "parseAlboQuestionnaire", { enumerable: true, get: function () { return albo_1.parseAlboQuestionnaire; } });
|
|
26
|
+
Object.defineProperty(exports, "parseAlboQuestionnaireDetail", { enumerable: true, get: function () { return albo_1.parseAlboQuestionnaireDetail; } });
|
|
27
|
+
Object.defineProperty(exports, "parseAlboQuestionnaireCategory", { enumerable: true, get: function () { return albo_1.parseAlboQuestionnaireCategory; } });
|
|
28
|
+
Object.defineProperty(exports, "parseAlboUniversalForm", { enumerable: true, get: function () { return albo_1.parseAlboUniversalForm; } });
|
|
29
|
+
Object.defineProperty(exports, "parseAlboUniversalFormCategory", { enumerable: true, get: function () { return albo_1.parseAlboUniversalFormCategory; } });
|
|
30
|
+
Object.defineProperty(exports, "parseAlboMenu", { enumerable: true, get: function () { return albo_1.parseAlboMenu; } });
|
|
31
|
+
Object.defineProperty(exports, "parseAlboMenuDetail", { enumerable: true, get: function () { return albo_1.parseAlboMenuDetail; } });
|
|
32
|
+
Object.defineProperty(exports, "parseAlboMenuLayout", { enumerable: true, get: function () { return albo_1.parseAlboMenuLayout; } });
|
|
33
|
+
Object.defineProperty(exports, "parseAlboTimetable", { enumerable: true, get: function () { return albo_1.parseAlboTimetable; } });
|
|
34
|
+
Object.defineProperty(exports, "parseAlboAuthCheck", { enumerable: true, get: function () { return albo_1.parseAlboAuthCheck; } });
|
|
35
|
+
Object.defineProperty(exports, "parseAlboPersonal", { enumerable: true, get: function () { return albo_1.parseAlboPersonal; } });
|
|
36
|
+
Object.defineProperty(exports, "parseAlboSystemSetting", { enumerable: true, get: function () { return albo_1.parseAlboSystemSetting; } });
|
|
37
|
+
Object.defineProperty(exports, "parseAlboLanguageSetting", { enumerable: true, get: function () { return albo_1.parseAlboLanguageSetting; } });
|
|
38
|
+
Object.defineProperty(exports, "parseAlboDevice", { enumerable: true, get: function () { return albo_1.parseAlboDevice; } });
|
|
39
|
+
Object.defineProperty(exports, "parseAlboActionLog", { enumerable: true, get: function () { return albo_1.parseAlboActionLog; } });
|
|
40
|
+
Object.defineProperty(exports, "parseAlboSharedItem", { enumerable: true, get: function () { return albo_1.parseAlboSharedItem; } });
|
|
41
|
+
Object.defineProperty(exports, "parseAlboActionResult", { enumerable: true, get: function () { return albo_1.parseAlboActionResult; } });
|
|
42
|
+
__exportStar(require("./types/albo"), exports);
|
|
43
|
+
__exportStar(require("./types/alboCalendar"), exports);
|
|
44
|
+
__exportStar(require("./types/alboInformation"), exports);
|
|
45
|
+
__exportStar(require("./types/alboQuestionnaire"), exports);
|
|
46
|
+
__exportStar(require("./types/alboUniversalForm"), exports);
|
|
47
|
+
__exportStar(require("./types/alboMenu"), exports);
|
|
48
|
+
__exportStar(require("./types/alboSystem"), exports);
|
|
49
|
+
__exportStar(require("./types/alboSharedItem"), exports);
|
|
50
|
+
var alboCommon_1 = require("./types/alboCommon");
|
|
51
|
+
Object.defineProperty(exports, "alboEnvelope", { enumerable: true, get: function () { return alboCommon_1.alboEnvelope; } });
|
|
52
|
+
Object.defineProperty(exports, "paginationShape", { enumerable: true, get: function () { return alboCommon_1.paginationShape; } });
|
|
53
|
+
Object.defineProperty(exports, "AlboActionResultSchema", { enumerable: true, get: function () { return alboCommon_1.AlboActionResultSchema; } });
|
|
54
|
+
var client_1 = require("./client");
|
|
55
|
+
Object.defineProperty(exports, "AlboClient", { enumerable: true, get: function () { return client_1.AlboClient; } });
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseAlboActionResult = exports.parseAlboTimetable = exports.parseAlboSharedItem = exports.parseAlboActionLog = exports.parseAlboDevice = exports.parseAlboLanguageSetting = exports.parseAlboSystemSetting = exports.parseAlboPersonal = exports.parseAlboAuthCheck = exports.parseAlboMenuLayout = exports.parseAlboMenuDetail = exports.parseAlboMenu = exports.parseAlboUniversalFormCategory = exports.parseAlboUniversalForm = exports.parseAlboQuestionnaireCategory = exports.parseAlboQuestionnaireDetail = exports.parseAlboQuestionnaire = exports.parseAlboInformationCategoryTree = exports.parseAlboInformationDetail = exports.parseAlboInformation = exports.parseAlboCalendarOutlookEvent = exports.parseAlboCalendarSource = exports.parseAlboCalendar = void 0;
|
|
4
|
+
const albo_1 = require("../types/albo");
|
|
5
|
+
const alboCommon_1 = require("../types/alboCommon");
|
|
6
|
+
const alboCalendar_1 = require("../types/alboCalendar");
|
|
7
|
+
const alboInformation_1 = require("../types/alboInformation");
|
|
8
|
+
const alboQuestionnaire_1 = require("../types/alboQuestionnaire");
|
|
9
|
+
const alboUniversalForm_1 = require("../types/alboUniversalForm");
|
|
10
|
+
const alboMenu_1 = require("../types/alboMenu");
|
|
11
|
+
const alboSystem_1 = require("../types/alboSystem");
|
|
12
|
+
const alboSharedItem_1 = require("../types/alboSharedItem");
|
|
13
|
+
/**
|
|
14
|
+
* albo API の JSON 文字列を安全にパースする共通ヘルパー。
|
|
15
|
+
* JSON として不正な入力でも例外を投げず、`ZodSafeParseResult`(success/error)を返す。
|
|
16
|
+
*/
|
|
17
|
+
const parseAlboJson = (input, schema) => {
|
|
18
|
+
try {
|
|
19
|
+
return schema.safeParse(JSON.parse(input));
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return schema.safeParse(undefined);
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
// --- カレンダー(calendar) ---------------------------------------------------
|
|
26
|
+
/** GET /api/calendar/ … 学年暦カレンダーのイベント一覧 */
|
|
27
|
+
const parseAlboCalendar = (json) => parseAlboJson(json, albo_1.AlboCalendarSchema);
|
|
28
|
+
exports.parseAlboCalendar = parseAlboCalendar;
|
|
29
|
+
/** GET /api/calendar-source/ … 購読中カレンダーソースの一覧 */
|
|
30
|
+
const parseAlboCalendarSource = (json) => parseAlboJson(json, alboCalendar_1.AlboCalendarSourceSchema);
|
|
31
|
+
exports.parseAlboCalendarSource = parseAlboCalendarSource;
|
|
32
|
+
/** GET /api/calendar/outlook-event/{n} … Outlook 連携イベント(未連携時はエラー応答) */
|
|
33
|
+
const parseAlboCalendarOutlookEvent = (json) => parseAlboJson(json, alboCalendar_1.AlboCalendarOutlookEventSchema);
|
|
34
|
+
exports.parseAlboCalendarOutlookEvent = parseAlboCalendarOutlookEvent;
|
|
35
|
+
// --- お知らせ(information) -------------------------------------------------
|
|
36
|
+
/** GET /api/information/{page} … お知らせ一覧 */
|
|
37
|
+
const parseAlboInformation = (json) => parseAlboJson(json, albo_1.AlboInformationSchema);
|
|
38
|
+
exports.parseAlboInformation = parseAlboInformation;
|
|
39
|
+
/** GET /api/information/view/{uuid} … お知らせ詳細 */
|
|
40
|
+
const parseAlboInformationDetail = (json) => parseAlboJson(json, alboInformation_1.AlboInformationDetailSchema);
|
|
41
|
+
exports.parseAlboInformationDetail = parseAlboInformationDetail;
|
|
42
|
+
/** GET /api/information-category/tree … お知らせカテゴリのツリー */
|
|
43
|
+
const parseAlboInformationCategoryTree = (json) => parseAlboJson(json, alboInformation_1.AlboInformationCategoryTreeSchema);
|
|
44
|
+
exports.parseAlboInformationCategoryTree = parseAlboInformationCategoryTree;
|
|
45
|
+
// --- アンケート(questionnaire) --------------------------------------------
|
|
46
|
+
/** GET /api/questionnaire/{page} … アンケート一覧 */
|
|
47
|
+
const parseAlboQuestionnaire = (json) => parseAlboJson(json, alboQuestionnaire_1.AlboQuestionnaireSchema);
|
|
48
|
+
exports.parseAlboQuestionnaire = parseAlboQuestionnaire;
|
|
49
|
+
/** GET /api/questionnaire/view/{uuid}, PUT /api/questionnaire/answer/{uuid} … アンケート詳細/回答結果 */
|
|
50
|
+
const parseAlboQuestionnaireDetail = (json) => parseAlboJson(json, alboQuestionnaire_1.AlboQuestionnaireDetailSchema);
|
|
51
|
+
exports.parseAlboQuestionnaireDetail = parseAlboQuestionnaireDetail;
|
|
52
|
+
/** GET /api/questionnaire-category … アンケートカテゴリ一覧 */
|
|
53
|
+
const parseAlboQuestionnaireCategory = (json) => parseAlboJson(json, alboQuestionnaire_1.AlboQuestionnaireCategoryListSchema);
|
|
54
|
+
exports.parseAlboQuestionnaireCategory = parseAlboQuestionnaireCategory;
|
|
55
|
+
// --- 汎用申請(universal-form) ---------------------------------------------
|
|
56
|
+
/** GET /api/universal-form/{page} … 申請フォーム一覧 */
|
|
57
|
+
const parseAlboUniversalForm = (json) => parseAlboJson(json, alboUniversalForm_1.AlboUniversalFormSchema);
|
|
58
|
+
exports.parseAlboUniversalForm = parseAlboUniversalForm;
|
|
59
|
+
/** GET /api/universal-form-category/{page} … 申請カテゴリ一覧 */
|
|
60
|
+
const parseAlboUniversalFormCategory = (json) => parseAlboJson(json, alboUniversalForm_1.AlboUniversalFormCategoryListSchema);
|
|
61
|
+
exports.parseAlboUniversalFormCategory = parseAlboUniversalFormCategory;
|
|
62
|
+
// --- メニュー(menu) -------------------------------------------------------
|
|
63
|
+
/** GET /api/menu … メニュー(タブ)一覧 */
|
|
64
|
+
const parseAlboMenu = (json) => parseAlboJson(json, alboMenu_1.AlboMenuSchema);
|
|
65
|
+
exports.parseAlboMenu = parseAlboMenu;
|
|
66
|
+
/** GET /api/menu/view/{uuid} … メニュー詳細(配置モジュール含む) */
|
|
67
|
+
const parseAlboMenuDetail = (json) => parseAlboJson(json, alboMenu_1.AlboMenuDetailSchema);
|
|
68
|
+
exports.parseAlboMenuDetail = parseAlboMenuDetail;
|
|
69
|
+
/** GET /api/menu-layout/view/{uuid}, POST /api/menu-layout/save/{uuid} … レイアウト設定 */
|
|
70
|
+
const parseAlboMenuLayout = (json) => parseAlboJson(json, alboMenu_1.AlboMenuLayoutSchema);
|
|
71
|
+
exports.parseAlboMenuLayout = parseAlboMenuLayout;
|
|
72
|
+
// --- システム設定・アカウント(system) ------------------------------------
|
|
73
|
+
/** GET /api/auth/check-logged-in … ログイン確認(レスポンスは個人情報と同型。PII を含む) */
|
|
74
|
+
const parseAlboAuthCheck = (json) => parseAlboJson(json, albo_1.AlboPersonalSchema);
|
|
75
|
+
exports.parseAlboAuthCheck = parseAlboAuthCheck;
|
|
76
|
+
/** ログイン後の個人情報(PII を含む) */
|
|
77
|
+
const parseAlboPersonal = (json) => parseAlboJson(json, albo_1.AlboPersonalSchema);
|
|
78
|
+
exports.parseAlboPersonal = parseAlboPersonal;
|
|
79
|
+
/** GET /api/system-setting … システム設定一覧 */
|
|
80
|
+
const parseAlboSystemSetting = (json) => parseAlboJson(json, alboSystem_1.AlboSystemSettingSchema);
|
|
81
|
+
exports.parseAlboSystemSetting = parseAlboSystemSetting;
|
|
82
|
+
/** GET /api/language-setting/view … 翻訳(言語)設定 */
|
|
83
|
+
const parseAlboLanguageSetting = (json) => parseAlboJson(json, alboSystem_1.AlboLanguageSettingSchema);
|
|
84
|
+
exports.parseAlboLanguageSetting = parseAlboLanguageSetting;
|
|
85
|
+
/** GET /api/device/{page} … ログイン済みデバイス一覧 */
|
|
86
|
+
const parseAlboDevice = (json) => parseAlboJson(json, alboSystem_1.AlboDeviceSchema);
|
|
87
|
+
exports.parseAlboDevice = parseAlboDevice;
|
|
88
|
+
/** GET /api/action-log/user-view/{page} … 自分の操作ログ */
|
|
89
|
+
const parseAlboActionLog = (json) => parseAlboJson(json, alboSystem_1.AlboActionLogSchema);
|
|
90
|
+
exports.parseAlboActionLog = parseAlboActionLog;
|
|
91
|
+
// --- ファイル共有(shared-item) --------------------------------------------
|
|
92
|
+
/** GET /api/shared-item/{page}/{folderUuid} … フォルダ配下のファイル一覧 */
|
|
93
|
+
const parseAlboSharedItem = (json) => parseAlboJson(json, alboSharedItem_1.AlboSharedItemListSchema);
|
|
94
|
+
exports.parseAlboSharedItem = parseAlboSharedItem;
|
|
95
|
+
// --- 時間割(timetable) ----------------------------------------------------
|
|
96
|
+
/** GET /api/class/time-table/ … 時間割 */
|
|
97
|
+
const parseAlboTimetable = (json) => parseAlboJson(json, albo_1.AlboTimetableSchema);
|
|
98
|
+
exports.parseAlboTimetable = parseAlboTimetable;
|
|
99
|
+
// --- 汎用操作結果(action result) ------------------------------------------
|
|
100
|
+
/**
|
|
101
|
+
* 既読化・ピン留め・いいね・ダウンロード準備・デバイス削除などの操作系 API が返す
|
|
102
|
+
* 汎用の結果(`{ message, count? }`)をパースする。対象エンドポイント例:
|
|
103
|
+
* - GET /api/information/set-read-all/
|
|
104
|
+
* - GET /api/information/add-good/{uuid}
|
|
105
|
+
* - PUT /api/information/set-pin-selected/ など set/unset-*-selected 一式
|
|
106
|
+
* - POST /api/shared-item/prepare-multiple-download/
|
|
107
|
+
* - DELETE /api/device/delete/{id}
|
|
108
|
+
*/
|
|
109
|
+
const parseAlboActionResult = (json) => parseAlboJson(json, alboCommon_1.AlboActionResultSchema);
|
|
110
|
+
exports.parseAlboActionResult = parseAlboActionResult;
|