1+ import { CourseCode , UserData } from "@packages/models" ;
2+ import { Value } from "@sinclair/typebox/value" ;
13import { eq } from "drizzle-orm" ;
2- import Elysia from "elysia" ;
3- import { db } from "@/db/client" ;
4- import { betterAuth } from "@/lib/auth.ts" ;
4+ import Elysia , { status , t } from "elysia" ;
5+ import { db } from "../db/client.ts" ;
6+ import { userData } from "../db/schema.ts" ;
7+ import { betterAuth } from "../lib/auth.ts" ;
8+ import type { SelectUser } from "../types.ts" ;
59
610const router = new Elysia ( {
711 prefix : "/users" ,
@@ -14,14 +18,49 @@ const router = new Elysia({
1418 where : ( user ) => eq ( user . id , currentUserId ) ,
1519 with : {
1620 data : true ,
17- courses : true ,
1821 } ,
1922 } ) ;
20- return fullUser ;
23+ if ( ! fullUser ) return status ( 404 , "User not found" ) ;
24+
25+ try {
26+ if ( fullUser . data ) {
27+ Value . Assert ( t . Array ( CourseCode ) , fullUser . data . courses ) ;
28+ }
29+ return < SelectUser > fullUser ;
30+ } catch {
31+ // it's not recoverable - reset courses
32+ console . error ( "Failed to parse courses:" , fullUser . data ?. courses ) ;
33+ await db
34+ . update ( userData )
35+ . set ( {
36+ courses : [ ] ,
37+ } )
38+ . where ( eq ( userData . userId , currentUserId ) ) ;
39+ return status ( 500 , "Internal server error: Failed to parse courses" ) ;
40+ }
41+ } ,
42+ {
43+ auth : true ,
44+ } ,
45+ )
46+ . put (
47+ "/me/data" ,
48+ async ( { user : { id : currentUserId } , body } ) => {
49+ await db
50+ . update ( userData )
51+ . set ( {
52+ stream : body . stream ,
53+ grade : body . grade ,
54+ classNumber : body . classNumber ,
55+ courses : body . courses ,
56+ } )
57+ . where ( eq ( userData . userId , currentUserId ) ) ;
2158 } ,
2259 {
2360 auth : true ,
61+ body : UserData ,
2462 } ,
2563 ) ;
64+ // TODO: 画像を更新する
2665
2766export default router ;
0 commit comments