-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathUserStationController.ts
72 lines (62 loc) · 2.3 KB
/
UserStationController.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import { Controller, Example, Get, Path, Post, Request, Res, Route, Security, Tags, type TsoaResponse } from "tsoa";
import express from "express";
import { auth } from "../../../lib/auth/auth.ts";
import { db } from "../../../lib/db/data-db.ts";
import { favoriteStations } from "../../../db/data.schema.ts";
import { and, eq } from "drizzle-orm";
class FavorizedResponse {
@Example(8000096)
evaNumber!: number;
@Example(true)
favored!: boolean;
}
@Route("user/station")
@Tags("User")
export class UserStationController extends Controller {
@Get("favored/{evaNumber}")
@Security("better_auth")
async isFavored(
@Path() evaNumber: string,
@Request() req: express.Request,
@Res() badRequestResponse: TsoaResponse<400, { reason: string }>
): Promise<FavorizedResponse> {
if (!/^\d+$/.test(evaNumber)) {
return badRequestResponse(400, { reason: "evaNumber is not an integer" });
}
const session = await auth.api.getSession({ headers: new Headers(req.headers as Record<string, string>) });
const [result] = await db
.select()
.from(favoriteStations)
.where(and(eq(favoriteStations.userId, session?.user?.id!), eq(favoriteStations.evaNumber, Number(evaNumber))))
.limit(1);
return { evaNumber: Number(evaNumber), favored: !!result };
}
@Post("favor/{evaNumber}")
@Security("better_auth")
async favor(
@Path() evaNumber: string,
@Request() req: express.Request,
@Res() badRequestResponse: TsoaResponse<400, { reason: string }>
): Promise<FavorizedResponse> {
if (!/^\d+$/.test(evaNumber)) {
return badRequestResponse(400, { reason: "evaNumber is not an integer" });
}
const session = await auth.api.getSession({ headers: new Headers(req.headers as Record<string, string>) });
const [existing] = await db
.select()
.from(favoriteStations)
.where(and(eq(favoriteStations.userId, session?.user?.id!), eq(favoriteStations.evaNumber, Number(evaNumber))))
.limit(1);
if (existing) {
await db
.delete(favoriteStations)
.where(and(eq(favoriteStations.userId, session?.user?.id!), eq(favoriteStations.evaNumber, Number(evaNumber))));
return { evaNumber: Number(evaNumber), favored: false };
}
await db.insert(favoriteStations).values({
userId: session?.user?.id!,
evaNumber: Number(evaNumber)
});
return { evaNumber: Number(evaNumber), favored: true };
}
}