Skip to content

Commit b2db763

Browse files
aster-voidclaude
andauthored
バックエンドと接続 (#70)
- Course をバックエンドから読み込み - ユーザー情報読み込み - 開発時に、 Vite からバックエンドサーバーに /api 以下のルートをプロキシ - これをしないと Cookie の同オリジン制限で認証が動かない --------- Co-authored-by: Claude <[email protected]>
1 parent 6599095 commit b2db763

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

75 files changed

+1033
-457
lines changed

.env.sample

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
# Config
2-
PUBLIC_SERVER_URL=http://localhost:4000
32
PUBLIC_MOCK_DATA=true
4-
SERVER_PORT=4000 # optional, server port (alias: PORT, PUBLIC_SERVER_URL.port) (defaults to 4000 if none are specified)
53

6-
# Secrets
7-
PUBLIC_X_ANON_KEY=...
8-
X_API_KEY=...
4+
# 開発中 -> Vite: BASE_URL.port, Elysia: EXTERNAL_SERVER_PORT
5+
# プロダクション -> Vite: - , Elysia: PORT ?? BASE_URL.port
6+
BASE_URL=http://localhost:3000
7+
EXTERNAL_SERVER_PORT=4000
98

9+
NODE_ENV=development
10+
11+
# Database
1012
DATABASE_URL=file:../../local.db
1113

14+
# Better Auth
1215
BETTER_AUTH_SECRET=...
13-
BETTER_AUTH_URL=http://localhost:4000
1416

1517
GOOGLE_CLIENT_ID=...
1618
GOOGLE_CLIENT_SECRET=
17-
18-
PUBLIC_WEB_URL=http://localhost:3000

.github/workflows/static-checks.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ on:
66
- main
77
pull_request:
88

9+
env:
10+
BASE_URL: http://localhost:3000
11+
EXTERNAL_SERVER_PORT: 4000
12+
913
jobs:
1014
build:
1115
name: Build
@@ -15,6 +19,7 @@ jobs:
1519
- uses: oven-sh/setup-bun@v2
1620
- run: bun install --frozen-lockfile
1721
- run: bun run build
22+
1823
biome:
1924
name: Biome Checks
2025
runs-on: ubuntu-latest

.github/workflows/test.yaml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
name: Tests
2+
3+
on:
4+
push:
5+
branches:
6+
- main
7+
pull_request:
8+
9+
jobs:
10+
bun:
11+
name: Bun Unit Tests
12+
runs-on: ubuntu-latest
13+
timeout-minutes: 10
14+
steps:
15+
- uses: actions/checkout@v4
16+
- uses: oven-sh/setup-bun@v2
17+
- run: bun install --frozen-lockfile
18+
- run: bun test

TODO.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
11
# TODOs
22

3-
- setup elysia server and RPC
43
- implement build script

bun.lock

Lines changed: 41 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33
"workspaces": {
44
"": {
55
"name": "syllabus",
6+
"dependencies": {
7+
"@elysiajs/eden": "^1.3.2",
8+
"elysia": "^1.3.6",
9+
},
610
"devDependencies": {
711
"@biomejs/biome": "^2.1.1",
812
"concurrently": "^9.2.0",
@@ -29,7 +33,8 @@
2933
"dependencies": {
3034
"@elysiajs/cors": "^1.3.3",
3135
"@libsql/client": "^0.15.10",
32-
"@sinclair/typebox": "^0.34.37",
36+
"@packages/class_data": "workspace:*",
37+
"@sinclair/typebox": "^0.34.38",
3338
"better-auth": "^1.3.1",
3439
"drizzle-orm": "^0.44.3",
3540
"elysia": "^1.3.5",
@@ -43,20 +48,30 @@
4348
"typescript": "^5.8.3",
4449
},
4550
},
51+
"packages/tests": {
52+
"name": "tests",
53+
"dependencies": {
54+
"@packages/class_data": "workspace:*",
55+
"@packages/models": "workspace:*",
56+
"@sinclair/typebox": "^0.34.38",
57+
},
58+
},
4659
"packages/web": {
4760
"name": "@packages/web",
4861
"version": "0.1.0",
4962
"dependencies": {
5063
"@elysiajs/eden": "^1.3.2",
5164
"@headlessui/react": "^2.2.4",
52-
"@packages/class_data": "workspace:*",
65+
"@packages/models": "workspace:models",
5366
"@packages/server": "workspace:*",
67+
"@sinclair/typebox": "^0.34.38",
5468
"@tanstack/react-query": "^5.83.0",
5569
"react": "^19.1.0",
5670
"react-dom": "^19.1.0",
5771
"react-hook-form": "^7.60.0",
5872
"react-icons": "^5.5.0",
5973
"react-router-dom": "^7.1.1",
74+
"svelte": "^5.37.0",
6075
},
6176
"devDependencies": {
6277
"@storybook/addon-essentials": "^8.6.14",
@@ -417,6 +432,8 @@
417432

418433
"@storybook/theming": ["@storybook/[email protected]", "", { "peerDependencies": { "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0" } }, "sha512-r4y+LsiB37V5hzpQo+BM10PaCsp7YlZ0YcZzQP1OCkPlYXmUAFy2VvDKaFRpD8IeNPKug2u4iFm/laDEbs03dg=="],
419434

435+
"@sveltejs/acorn-typescript": ["@sveltejs/[email protected]", "", { "peerDependencies": { "acorn": "^8.9.0" } }, "sha512-IwQk4yfwLdibDlrXVE04jTZYlLnwsTT2PIOQQGNLWfjavGifnk1JD1LcZjZaBTRcxZu2FfPfNLOE04DSu9lqtQ=="],
436+
420437
"@swc/helpers": ["@swc/[email protected]", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A=="],
421438

422439
"@tailwindcss/node": ["@tailwindcss/[email protected]", "", { "dependencies": { "@ampproject/remapping": "^2.3.0", "enhanced-resolve": "^5.18.1", "jiti": "^2.4.2", "lightningcss": "1.30.1", "magic-string": "^0.30.17", "source-map-js": "^1.2.1", "tailwindcss": "4.1.11" } }, "sha512-yzhzuGRmv5QyU9qLNg4GTlYI6STedBWRE7NjxP45CsFYYq9taI0zJXZBMqIC/c8fViNLhmrbpSFS57EoxUmD6Q=="],
@@ -513,7 +530,7 @@
513530

514531
"ansi-styles": ["[email protected]", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
515532

516-
"aria-query": ["[email protected].0", "", { "dependencies": { "dequal": "^2.0.3" } }, "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A=="],
533+
"aria-query": ["[email protected].2", "", {}, "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="],
517534

518535
"asn1js": ["[email protected]", "", { "dependencies": { "pvtsutils": "^1.3.6", "pvutils": "^1.1.3", "tslib": "^2.8.1" } }, "sha512-UOCGPYbl0tv8+006qks/dTgV9ajs97X2p0FAbyS2iyCRrmLSRolDaHdp+v/CLgnzHc3fVB+CwYiUmei7ndFcgA=="],
519536

@@ -523,6 +540,8 @@
523540

524541
"available-typed-arrays": ["[email protected]", "", { "dependencies": { "possible-typed-array-names": "^1.0.0" } }, "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ=="],
525542

543+
"axobject-query": ["[email protected]", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="],
544+
526545
"balanced-match": ["[email protected]", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
527546

528547
"better-auth": ["[email protected]", "", { "dependencies": { "@better-auth/utils": "0.2.5", "@better-fetch/fetch": "^1.1.18", "@noble/ciphers": "^0.6.0", "@noble/hashes": "^1.8.0", "@simplewebauthn/browser": "^13.0.0", "@simplewebauthn/server": "^13.0.0", "better-call": "^1.0.12", "defu": "^6.1.4", "jose": "^5.9.6", "kysely": "^0.28.1", "nanostores": "^0.11.3", "zod": "^4.0.5" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["react", "react-dom"] }, "sha512-q1aD2nNpGfEI2ckYu+pBjN+23CIRctOpmREkWyJDJdoYW1q9EPs1Xdb+KhFztg2rMmsoUN8I9Xm5mUWMxiWuLw=="],
@@ -609,7 +628,7 @@
609628

610629
"electron-to-chromium": ["[email protected]", "", {}, "sha512-k4McmnB2091YIsdCgkS0fMVMPOJgxl93ltFzaryXqwip1AaxeDqKCGLxkXODDA5Ab/D+tV5EL5+aTx76RvLRxw=="],
611630

612-
"elysia": ["[email protected].5", "", { "dependencies": { "cookie": "^1.0.2", "exact-mirror": "0.1.2", "fast-decode-uri-component": "^1.0.1" }, "optionalDependencies": { "@sinclair/typebox": "^0.34.33", "openapi-types": "^12.1.3" }, "peerDependencies": { "file-type": ">= 20.0.0", "typescript": ">= 5.0.0" } }, "sha512-XVIKXlKFwUT7Sta8GY+wO5reD9I0rqAEtaz1Z71UgJb61csYt8Q3W9al8rtL5RgumuRR8e3DNdzlUN9GkC4KDw=="],
631+
"elysia": ["[email protected].6", "", { "dependencies": { "cookie": "^1.0.2", "exact-mirror": "0.1.2", "fast-decode-uri-component": "^1.0.1" }, "optionalDependencies": { "@sinclair/typebox": "^0.34.33", "openapi-types": "^12.1.3" }, "peerDependencies": { "file-type": ">= 20.0.0", "typescript": ">= 5.0.0" } }, "sha512-NPjbt42KlLzf98JN/3Uvzg3oVFCzEle9gJnRtwUxYGQd61Bm7sE1h8FMqQVdXRCoxmz1T+jhhoB+p1YjDdwEzQ=="],
613632

614633
"emoji-regex": ["[email protected]", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
615634

@@ -627,8 +646,12 @@
627646

628647
"escalade": ["[email protected]", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="],
629648

649+
"esm-env": ["[email protected]", "", {}, "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA=="],
650+
630651
"esprima": ["[email protected]", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="],
631652

653+
"esrap": ["[email protected]", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" } }, "sha512-yzmPNpl7TBbMRC5Lj2JlJZNPml0tzqoqP5B1JXycNUwtqma9AKCO0M2wHrdgsHcy1WRW7S9rJknAMtByg3usgA=="],
654+
632655
"estree-walker": ["[email protected]", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="],
633656

634657
"esutils": ["[email protected]", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="],
@@ -701,6 +724,8 @@
701724

702725
"is-generator-function": ["[email protected]", "", { "dependencies": { "call-bound": "^1.0.3", "get-proto": "^1.0.0", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ=="],
703726

727+
"is-reference": ["[email protected]", "", { "dependencies": { "@types/estree": "^1.0.6" } }, "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw=="],
728+
704729
"is-regex": ["[email protected]", "", { "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g=="],
705730

706731
"is-typed-array": ["[email protected]", "", { "dependencies": { "which-typed-array": "^1.1.16" } }, "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ=="],
@@ -751,6 +776,8 @@
751776

752777
"lightningcss-win32-x64-msvc": ["[email protected]", "", { "os": "win32", "cpu": "x64" }, "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg=="],
753778

779+
"locate-character": ["[email protected]", "", {}, "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA=="],
780+
754781
"locate-path": ["[email protected]", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="],
755782

756783
"lodash": ["[email protected]", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="],
@@ -913,6 +940,8 @@
913940

914941
"supports-preserve-symlinks-flag": ["[email protected]", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="],
915942

943+
"svelte": ["[email protected]", "", { "dependencies": { "@ampproject/remapping": "^2.3.0", "@jridgewell/sourcemap-codec": "^1.5.0", "@sveltejs/acorn-typescript": "^1.0.5", "@types/estree": "^1.0.5", "acorn": "^8.12.1", "aria-query": "^5.3.1", "axobject-query": "^4.1.0", "clsx": "^2.1.1", "esm-env": "^1.2.1", "esrap": "^2.1.0", "is-reference": "^3.0.3", "locate-character": "^3.0.0", "magic-string": "^0.30.11", "zimmerframe": "^1.1.2" } }, "sha512-BAHgWdKncZ4F1DVBrkKAvelx2Nv3mR032ca8/yj9Gxf5s9zzK1uGXiZTjCFDvmO2e9KQfcR2lEkVjw+ZxExJow=="],
944+
916945
"tabbable": ["[email protected]", "", {}, "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew=="],
917946

918947
"tailwindcss": ["[email protected]", "", {}, "sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA=="],
@@ -921,6 +950,8 @@
921950

922951
"tar": ["[email protected]", "", { "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.0.1", "mkdirp": "^3.0.1", "yallist": "^5.0.0" } }, "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw=="],
923952

953+
"tests": ["tests@workspace:packages/tests"],
954+
924955
"tiny-invariant": ["[email protected]", "", {}, "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg=="],
925956

926957
"tinyglobby": ["[email protected]", "", { "dependencies": { "fdir": "^6.4.4", "picomatch": "^4.0.2" } }, "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ=="],
@@ -985,6 +1016,8 @@
9851016

9861017
"yocto-queue": ["[email protected]", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="],
9871018

1019+
"zimmerframe": ["[email protected]", "", {}, "sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w=="],
1020+
9881021
"zod": ["[email protected]", "", {}, "sha512-+MSh9cZU9r3QKlHqrgHMTSr3QwMGv4PLfR0M4N/sYWV5/x67HgXEhIGObdBkpnX8G78pTgWnIrBL2lZcNJOtfg=="],
9891022

9901023
"@esbuild-kit/core-utils/esbuild": ["[email protected]", "", { "optionalDependencies": { "@esbuild/android-arm": "0.18.20", "@esbuild/android-arm64": "0.18.20", "@esbuild/android-x64": "0.18.20", "@esbuild/darwin-arm64": "0.18.20", "@esbuild/darwin-x64": "0.18.20", "@esbuild/freebsd-arm64": "0.18.20", "@esbuild/freebsd-x64": "0.18.20", "@esbuild/linux-arm": "0.18.20", "@esbuild/linux-arm64": "0.18.20", "@esbuild/linux-ia32": "0.18.20", "@esbuild/linux-loong64": "0.18.20", "@esbuild/linux-mips64el": "0.18.20", "@esbuild/linux-ppc64": "0.18.20", "@esbuild/linux-riscv64": "0.18.20", "@esbuild/linux-s390x": "0.18.20", "@esbuild/linux-x64": "0.18.20", "@esbuild/netbsd-x64": "0.18.20", "@esbuild/openbsd-x64": "0.18.20", "@esbuild/sunos-x64": "0.18.20", "@esbuild/win32-arm64": "0.18.20", "@esbuild/win32-ia32": "0.18.20", "@esbuild/win32-x64": "0.18.20" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA=="],
@@ -1013,6 +1046,10 @@
10131046

10141047
"@tailwindcss/oxide-wasm32-wasi/tslib": ["[email protected]", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
10151048

1049+
"@testing-library/dom/aria-query": ["[email protected]", "", { "dependencies": { "dequal": "^2.0.3" } }, "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A=="],
1050+
1051+
"@testing-library/jest-dom/aria-query": ["[email protected]", "", { "dependencies": { "dequal": "^2.0.3" } }, "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A=="],
1052+
10161053
"@testing-library/jest-dom/chalk": ["[email protected]", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg=="],
10171054

10181055
"@testing-library/jest-dom/dom-accessibility-api": ["[email protected]", "", {}, "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w=="],

docs/developer_readme.md

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@ bun db push
1616

1717
```bash
1818
# 開発モードを実行するには、以下のコマンドを実行してください。
19-
# localhost:5173 に Vite サーバーが立ち上がるので、そこで確認してください。
19+
# $BASE_URL に Vite サーバーが立ち上がるので、そこで確認してください。
2020
bun dev
2121

2222
# Storybookの使用
23-
# localhost:6006にStorybookが立ち上がるので、そこでUIを確認してください。
23+
# localhost:6006 にStorybookが立ち上がるので、そこでUIを確認してください。
2424
bun run storybook
2525
```
2626

@@ -36,28 +36,26 @@ bun check
3636
bun fix
3737
```
3838

39-
## モックモード
39+
## サーバー構成
4040

41-
モックモードを実行するには、以下のコマンドを実行してください。
41+
### 1. 開発中
4242

43-
```bash
44-
bun dev:mock
45-
```
43+
- Vite 開発サーバー (localhost:3000) -> すべてのリクエストはこのサーバーがプロキシ (ログインのリダイレクトを除く)
44+
- Elysia サーバー (localhost:4000) -> /api 以下のリクエストをプロキシされて受け取る
4645

47-
このコマンドを実行すると、モックデータを使用してアプリケーションが実行されます。
46+
### 2. プロダクション
4847

49-
## 関数やクラスの説明
48+
- Elysia サーバー (localhost:${PORT}) -> /api 以外は public/index.html を返す
5049

51-
### 1. Userのデータを扱う場合 (src/app/utils/user.ts)
50+
## モックモード
5251

53-
Userのデータは`User`クラスを使用して扱います。Userのデータは以下の場合があります
52+
モックモードを実行するには、以下のコマンドを実行してください
5453

55-
- `bun dev:mock`を実行した場合
56-
- Userはモックのデータが使用されます。
57-
- `bun dev`を実行した場合
58-
- UserはlocalStorageに保存されたデータが使用されます。
54+
```bash
55+
PUBLIC_MOCK_DATA=true bun dev
56+
```
5957

60-
ただ、まだユーザを登録する機能がないので、mockでユーザを作成する必要があります
58+
このコマンドを実行すると、モックデータを使用してアプリケーションが実行されます
6159

6260
## 推奨 VS Code 設定
6361

package.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,9 @@
1717
"devDependencies": {
1818
"@biomejs/biome": "^2.1.1",
1919
"concurrently": "^9.2.0"
20+
},
21+
"dependencies": {
22+
"@elysiajs/eden": "^1.3.2",
23+
"elysia": "^1.3.6"
2024
}
2125
}

packages/models/atoms.ts

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
import { t } from "elysia";
2+
3+
// Stream って何? 教えて有識者
4+
// Course.importance に使われているよう?
5+
export type Stream = typeof Stream.static;
6+
export const Stream = t.UnionEnum(["s1", "s2", "s3", "l1", "l2", "l3"]);
7+
8+
/**
9+
* 授業コード
10+
* 例: 30003
11+
*/
12+
export type CourseCode = typeof CourseCode.static;
13+
export const CourseCode = t.RegExp("^\\d{5}$");
14+
15+
/**
16+
* 共通科目コード
17+
* 例:
18+
* - XAB-CD1001L2
19+
* - CAS-FC1871L1
20+
* - CAS-GC1L37S4
21+
* - CASPG1F40L3 // 絶対入力ミスだが、データにあるので対応しなければならない
22+
* 仕様: https://www.u-tokyo.ac.jp/ja/students/classes/course-numbering.html
23+
* 本当は CommonSubjectCode になるはずだが、公式が勝手に CommonCourseCode と読んでいる
24+
*/
25+
export type CommonCourseCode = typeof CommonCourseCode.static;
26+
export const CommonCourseCode = t.RegExp(
27+
`
28+
^[CFG] ${/* [1] 課程コード */ ""}
29+
(?:LA|ME|EN|LE|SC|AG|EC|AS|ED|PH|GL) ${/* [2] 開講学部・研究科(教育部)コード */ ""}
30+
-?
31+
[A-Z]{2} ${/* [3] 開講学科・専攻等コード */ ""}
32+
[1-7] ${/* [4] レベルコード */ ""}
33+
[0-9a-zA-Z]{3} ${/* [5] 整理番号 */ ""}
34+
[LSEPTZ] ${/* [6] 授業形態コード */ ""}
35+
[123459] ${/* [7] 使用言語コード */ ""}
36+
$`.replaceAll(/\s/g, ""),
37+
);
38+
39+
/**
40+
* 曜日。
41+
*/
42+
export type Day = typeof Day.static;
43+
export const Day = t.UnionEnum(["mon", "tue", "wed", "thu", "fri", "sat"]);
44+
45+
export type Period = typeof Period.static;
46+
export const Period = t.UnionEnum([1, 2, 3, 4, 5, 6]);
47+
48+
/**
49+
* 曜限。
50+
*/
51+
export type DayPeriod = typeof DayPeriod.static;
52+
export const DayPeriod = t.Object({
53+
day: Day,
54+
period: Period,
55+
});
56+
57+
/**
58+
* セメスターまたはターム。
59+
*/
60+
export type Semester = typeof Semester.static;
61+
export const Semester = t.UnionEnum(["S", "S1", "S2", "A", "A1", "A2"]);
62+
63+
// 使われていない。
64+
/**
65+
* 評価方法。
66+
*/
67+
export type Evaluation = typeof Evaluation.static;
68+
export const Evaluation = t.UnionEnum(["試験", "レポート", "出席", "平常"]);
69+
70+
/**
71+
* 単位の種類。
72+
*/
73+
export type ClassType = typeof ClassType.static;
74+
export const ClassType = t.UnionEnum(["基礎", "要求", "主題", "総合", "展開"]);
75+
76+
export type ClassSeries = typeof ClassSeries.static;
77+
export const ClassSeries = t.UnionEnum([
78+
"基礎",
79+
"要求",
80+
"主題",
81+
"展開",
82+
"総合L",
83+
"総合A",
84+
"総合B",
85+
"総合C",
86+
"総合D",
87+
"総合E",
88+
"総合F",
89+
]);

packages/models/mappings.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import type { Day } from "./atoms.ts";
2+
3+
export const dayMapping: { [key in Day]: string } = {
4+
mon: "月",
5+
tue: "火",
6+
wed: "水",
7+
thu: "木",
8+
fri: "金",
9+
sat: "土",
10+
};

0 commit comments

Comments
 (0)