-
Notifications
You must be signed in to change notification settings - Fork 106
/
Copy pathapp.js
119 lines (105 loc) · 3.12 KB
/
app.js
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
"use strict";
const { Hono } = require("hono");
const { logger } = require("hono/logger");
const { html } = require("hono/html");
const { HTTPException } = require("hono/http-exception");
const { secureHeaders } = require("hono/secure-headers");
const { env } = require("hono/adapter");
const { serveStatic } = require("@hono/node-server/serve-static");
const { trimTrailingSlash } = require("hono/trailing-slash");
const { githubAuth } = require("@hono/oauth-providers/github");
const { getIronSession } = require("iron-session");
const { PrismaClient } = require("@prisma/client");
const layout = require("./layout");
const prisma = new PrismaClient({ log: ["query"] });
const indexRouter = require("./routes/index");
const loginRouter = require("./routes/#");
const logoutRouter = require("./routes/logout");
const scheduleRouter = require("./routes/schedules");
const availabilitiesRouter = require("./routes/availabilities");
const commentsRouter = require("./routes/comments");
const app = new Hono();
app.use(logger());
app.use(serveStatic({ root: "./public" }));
app.use(secureHeaders());
app.use(trimTrailingSlash());
// セッション管理用のミドルウェア
app.use(async (c, next) => {
const { SESSION_PASSWORD } = env(c);
const session = await getIronSession(c.req.raw, c.res, {
password: SESSION_PASSWORD,
cookieName: "session",
});
c.set("session", session);
await next();
});
// GitHub 認証
app.use("/auth/github", async (c, next) => {
const { GITHUB_CLIENT_ID, GITHUB_CLIENT_SECRET } = env(c);
const authHandler = githubAuth({
client_id: GITHUB_CLIENT_ID,
client_secret: GITHUB_CLIENT_SECRET,
scope: ["user:email"],
oauthApp: true,
});
return await authHandler(c, next);
});
// GitHub 認証の後の処理
app.get("/auth/github", async (c) => {
const session = c.get("session");
session.user = c.get("user-github");
await session.save();
// ユーザ情報をデータベースに保存
const userId = session.user.id;
const data = {
userId,
username: session.user.login,
};
await prisma.user.upsert({
where: { userId },
update: data,
create: data,
});
return c.redirect("/");
});
// ルーティング
app.route("/", indexRouter);
app.route("/#", loginRouter);
app.route("/logout", logoutRouter);
app.route("/schedules", scheduleRouter);
app.route("/schedules", availabilitiesRouter);
app.route("/schedules", commentsRouter);
// 404 Not Found
app.notFound((c) => {
return c.html(
layout(
c,
"Not Found",
html`
<h1>Not Found</h1>
<p>${c.req.url} の内容が見つかりませんでした。</p>
`,
),
404,
);
});
// エラーハンドリング
app.onError((error, c) => {
console.error(error);
const statusCode = error instanceof HTTPException ? error.status : 500;
const { NODE_ENV } = env(c);
return c.html(
layout(
c,
"Error",
html`
<h1>Error</h1>
<h2>${error.name} (${statusCode})</h2>
<p>${error.message}</p>
${NODE_ENV === "development" ? html`<pre>${error.stack}</pre>` : ""}
`,
),
statusCode,
);
});
module.exports = app;