create-nexwire 4.0.0 → 4.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/README.md +5 -4
- package/express/.env +1 -1
- package/express/README.md +13 -7
- package/express/package.json +2 -2
- package/express/src/config/session.ts +1 -1
- package/express/src/database/migrations/sqlite/meta/0000_snapshot.json +1 -1
- package/express/src/database/migrations/sqlite/meta/_journal.json +1 -1
- package/express/src/database/schema.ts +3 -3
- package/express/src/framework/cache/cache.ts +82 -81
- package/express/src/framework/database/seed.ts +1 -1
- package/express/src/framework/facade.ts +1 -24
- package/express/src/framework/http/app.ts +5 -5
- package/express/src/framework/http/openapi.ts +1 -1
- package/express/src/framework/http/router.ts +3 -18
- package/express/src/framework/http/types.ts +19 -0
- package/express/src/framework/http/validation.ts +18 -18
- package/express/src/framework/maker-cli/middleware/core.mjs +41 -47
- package/express/src/framework/maker-cli/module/core.mjs +920 -684
- package/express/src/framework/maker-cli/module/index.mjs +202 -140
- package/express/src/framework/maker-cli/runtime/core.mjs +1 -2
- package/express/src/framework/maker-cli/stubs/controller/openapi.ts.stub +40 -14
- package/express/src/framework/maker-cli/stubs/controller/openapi.with-model.ts.stub +40 -15
- package/express/src/framework/maker-cli/stubs/controller/plain.ts.stub +42 -16
- package/express/src/framework/maker-cli/stubs/controller/standalone.ts.stub +47 -0
- package/express/src/framework/maker-cli/stubs/facade/name.ts.stub +12 -0
- package/express/src/framework/maker-cli/stubs/helper/name.ts.stub +14 -0
- package/express/src/framework/maker-cli/stubs/middleware/name.local.ts.stub +15 -0
- package/express/src/framework/maker-cli/stubs/model/name.mysql.ts.stub +9 -8
- package/express/src/framework/maker-cli/stubs/model/name.postgresql.ts.stub +9 -8
- package/express/src/framework/maker-cli/stubs/model/name.sqlite.ts.stub +9 -8
- package/express/src/framework/maker-cli/stubs/notification/route.api.ts.stub +50 -50
- package/express/src/framework/maker-cli/stubs/notification/route.plain.ts.stub +11 -11
- package/express/src/framework/maker-cli/stubs/route/api.ts.stub +93 -79
- package/express/src/framework/maker-cli/stubs/route/plain.ts.stub +23 -10
- package/express/src/framework/maker-cli/stubs/route/standalone.api.ts.stub +113 -0
- package/express/src/framework/maker-cli/stubs/route/standalone.plain.ts.stub +37 -0
- package/express/src/framework/maker-cli/stubs/{controller/schema.plain.ts.stub → schema/name.plain.ts.stub} +13 -13
- package/express/src/framework/maker-cli/stubs/{controller/schema.ts.stub → schema/name.ts.stub} +32 -32
- package/express/src/framework/maker-cli/stubs/service/name.plain.ts.stub +67 -0
- package/express/src/framework/maker-cli/stubs/service/name.ts.stub +65 -0
- package/express/src/framework/maker-cli/stubs/type/name.ts.stub +22 -0
- package/express/src/framework/maker-cli/utils/naming.mjs +56 -13
- package/express/src/framework/modules/discover.ts +57 -54
- package/express/src/framework/notification/index.ts +1 -1
- package/express/src/framework/realtime/broadcast.ts +46 -46
- package/express/src/framework/server.ts +2 -1
- package/express/src/framework/session/session.ts +102 -98
- package/express/src/framework/support/mail.ts +48 -48
- package/express/src/framework/support/status-codes.ts +75 -0
- package/express/src/middlewares/auth-middleware.ts +1 -1
- package/express/src/modules/auth/__tests__/forgetpass.test.ts +200 -0
- package/express/src/modules/auth/__tests__/login.test.ts +171 -0
- package/express/src/modules/auth/__tests__/logout.test.ts +60 -0
- package/express/src/modules/auth/__tests__/logoutalldevices.test.ts +49 -0
- package/express/src/modules/auth/__tests__/me.test.ts +91 -0
- package/express/src/modules/auth/__tests__/refreshtoken.test.ts +305 -0
- package/express/src/modules/auth/__tests__/register.test.ts +291 -0
- package/express/src/modules/auth/__tests__/resetpass.test.ts +206 -0
- package/express/src/modules/auth/__tests__/verifyemail.test.ts +183 -0
- package/express/src/modules/auth/controllers/auth.ts +254 -0
- package/express/src/modules/auth/controllers/{role.controller.ts → role.ts} +25 -15
- package/{hono/src/modules/auth/database/models/notifications.ts → express/src/modules/auth/database/models/notification.ts} +1 -1
- package/express/src/modules/auth/database/models/role.ts +1 -1
- package/express/src/modules/auth/database/models/user.ts +1 -1
- package/express/src/modules/auth/facade.ts +12 -0
- package/express/src/modules/auth/{controllers/auth.helpers.ts → helpers/auth.ts} +3 -4
- package/express/src/modules/auth/jobs/registeruser.ts +23 -23
- package/express/src/modules/auth/routes/{api.ts → index.ts} +150 -150
- package/express/src/modules/auth/routes/role.ts +33 -33
- package/{hono/src/modules/auth/controllers/auth.schema.ts → express/src/modules/auth/schemas/auth.ts} +102 -102
- package/express/src/modules/auth/services/forgetpassword.ts +66 -0
- package/express/src/modules/auth/services/login.ts +63 -0
- package/express/src/modules/auth/services/logout.ts +25 -0
- package/express/src/modules/auth/services/logoutalldevices.ts +19 -0
- package/express/src/modules/auth/services/me.ts +31 -0
- package/express/src/modules/auth/services/refreshtoken.ts +110 -0
- package/express/src/modules/auth/services/register.ts +141 -0
- package/express/src/modules/auth/services/resetpassword.ts +69 -0
- package/express/src/modules/auth/services/verifyemail.ts +77 -0
- package/express/src/modules/auth/types/auth.ts +31 -0
- package/express/src/resources/src/assets/images/logo.png +0 -0
- package/express/src/resources/src/pages/auth/forgetPassword.vue +1 -0
- package/express/src/resources/src/pages/auth/login.vue +1 -1
- package/express/src/storage/database/nexwire.sqlite +0 -0
- package/hono/.env +1 -1
- package/hono/README.md +13 -7
- package/hono/package.json +1 -1
- package/hono/src/config/session.ts +1 -1
- package/hono/src/database/migrations/sqlite/meta/0000_snapshot.json +1 -1
- package/hono/src/database/migrations/sqlite/meta/_journal.json +1 -1
- package/hono/src/database/schema.ts +3 -3
- package/hono/src/framework/cache/cache.ts +82 -81
- package/hono/src/framework/database/seed.ts +1 -1
- package/hono/src/framework/http/app.ts +5 -5
- package/hono/src/framework/http/validation.ts +21 -21
- package/hono/src/framework/maker-cli/middleware/core.mjs +40 -46
- package/hono/src/framework/maker-cli/module/core.mjs +401 -168
- package/hono/src/framework/maker-cli/module/index.mjs +73 -11
- package/hono/src/framework/maker-cli/stubs/controller/openapi.ts.stub +28 -16
- package/hono/src/framework/maker-cli/stubs/controller/openapi.with-model.ts.stub +28 -17
- package/hono/src/framework/maker-cli/stubs/controller/plain.ts.stub +28 -16
- package/hono/src/framework/maker-cli/stubs/controller/standalone.ts.stub +56 -0
- package/hono/src/framework/maker-cli/stubs/facade/name.ts.stub +12 -0
- package/hono/src/framework/maker-cli/stubs/helper/name.ts.stub +14 -0
- package/hono/src/framework/maker-cli/stubs/middleware/name.local.ts.stub +15 -0
- package/hono/src/framework/maker-cli/stubs/model/name.mysql.ts.stub +9 -8
- package/hono/src/framework/maker-cli/stubs/model/name.postgresql.ts.stub +9 -8
- package/hono/src/framework/maker-cli/stubs/model/name.sqlite.ts.stub +9 -8
- package/hono/src/framework/maker-cli/stubs/notification/route.api.ts.stub +49 -49
- package/hono/src/framework/maker-cli/stubs/notification/route.plain.ts.stub +11 -11
- package/hono/src/framework/maker-cli/stubs/route/api.ts.stub +93 -79
- package/hono/src/framework/maker-cli/stubs/route/plain.ts.stub +23 -10
- package/hono/src/framework/maker-cli/stubs/route/standalone.api.ts.stub +112 -0
- package/hono/src/framework/maker-cli/stubs/route/standalone.plain.ts.stub +37 -0
- package/hono/src/framework/maker-cli/stubs/{controller/schema.plain.ts.stub → schema/name.plain.ts.stub} +13 -13
- package/hono/src/framework/maker-cli/stubs/{controller/schema.ts.stub → schema/name.ts.stub} +32 -32
- package/hono/src/framework/maker-cli/stubs/service/name.plain.ts.stub +67 -0
- package/hono/src/framework/maker-cli/stubs/service/name.ts.stub +65 -0
- package/hono/src/framework/maker-cli/stubs/type/name.ts.stub +22 -0
- package/hono/src/framework/maker-cli/utils/naming.mjs +56 -13
- package/hono/src/framework/modules/discover.ts +57 -54
- package/hono/src/framework/notification/index.ts +1 -1
- package/hono/src/framework/realtime/broadcast.ts +46 -46
- package/hono/src/framework/server.ts +1 -1
- package/hono/src/framework/session/session.ts +121 -116
- package/hono/src/middlewares/auth-middleware.ts +1 -1
- package/hono/src/modules/auth/__tests__/forgetpass.test.ts +170 -0
- package/hono/src/modules/auth/__tests__/login.test.ts +154 -0
- package/hono/src/modules/auth/__tests__/logout.test.ts +53 -0
- package/hono/src/modules/auth/__tests__/logoutalldevices.test.ts +34 -0
- package/hono/src/modules/auth/__tests__/me.test.ts +87 -0
- package/hono/src/modules/auth/__tests__/refreshtoken.test.ts +305 -0
- package/hono/src/modules/auth/__tests__/register.test.ts +258 -0
- package/hono/src/modules/auth/__tests__/resetpass.test.ts +214 -0
- package/hono/src/modules/auth/__tests__/verifyemail.test.ts +189 -0
- package/hono/src/modules/auth/controllers/auth.ts +238 -0
- package/hono/src/modules/auth/controllers/{role.controller.ts → role.ts} +25 -25
- package/{express/src/modules/auth/database/models/notifications.ts → hono/src/modules/auth/database/models/notification.ts} +1 -1
- package/hono/src/modules/auth/database/models/role.ts +1 -1
- package/hono/src/modules/auth/database/models/user.ts +1 -1
- package/hono/src/modules/auth/facade.ts +12 -0
- package/hono/src/modules/auth/{controllers/auth.helpers.ts → helpers/auth.ts} +5 -6
- package/hono/src/modules/auth/jobs/registeruser.ts +23 -23
- package/hono/src/modules/auth/routes/{api.ts → index.ts} +150 -150
- package/hono/src/modules/auth/routes/role.ts +33 -33
- package/{express/src/modules/auth/controllers/auth.schema.ts → hono/src/modules/auth/schemas/auth.ts} +102 -102
- package/hono/src/modules/auth/services/forgetpassword.ts +58 -0
- package/hono/src/modules/auth/services/login.ts +61 -0
- package/hono/src/modules/auth/services/logout.ts +24 -0
- package/hono/src/modules/auth/services/logoutalldevices.ts +19 -0
- package/hono/src/modules/auth/services/me.ts +31 -0
- package/hono/src/modules/auth/services/refreshtoken.ts +110 -0
- package/hono/src/modules/auth/services/register.ts +132 -0
- package/hono/src/modules/auth/services/resetpassword.ts +69 -0
- package/hono/src/modules/auth/services/verifyemail.ts +77 -0
- package/hono/src/modules/auth/types/auth.ts +31 -0
- package/hono/src/resources/src/assets/images/logo.png +0 -0
- package/hono/src/storage/database/nexwire.sqlite +0 -0
- package/package.json +1 -1
- package/express/src/framework/maker-cli/stubs/example/console.ts.stub +0 -34
- package/express/src/framework/maker-cli/stubs/example/controller.ts.stub +0 -418
- package/express/src/framework/maker-cli/stubs/example/job.ts.stub +0 -75
- package/express/src/framework/maker-cli/stubs/example/route.api.ts.stub +0 -207
- package/express/src/framework/maker-cli/stubs/example/route.plain.ts.stub +0 -18
- package/express/src/framework/maker-cli/stubs/example/schema.plain.ts.stub +0 -42
- package/express/src/framework/maker-cli/stubs/example/schema.ts.stub +0 -42
- package/express/src/modules/auth/controllers/auth.controller.ts +0 -358
- package/hono/src/framework/maker-cli/stubs/example/console.ts.stub +0 -34
- package/hono/src/framework/maker-cli/stubs/example/controller.ts.stub +0 -505
- package/hono/src/framework/maker-cli/stubs/example/job.ts.stub +0 -75
- package/hono/src/framework/maker-cli/stubs/example/route.api.ts.stub +0 -207
- package/hono/src/framework/maker-cli/stubs/example/route.plain.ts.stub +0 -18
- package/hono/src/framework/maker-cli/stubs/example/schema.plain.ts.stub +0 -42
- package/hono/src/framework/maker-cli/stubs/example/schema.ts.stub +0 -42
- package/hono/src/modules/auth/controllers/auth.controller.ts +0 -413
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public API for the auth module.
|
|
3
|
+
*
|
|
4
|
+
* Other modules import from this file, never from controllers/ or services/ directly.
|
|
5
|
+
* Re-export the pieces they are allowed to depend on:
|
|
6
|
+
*
|
|
7
|
+
* export { list, findOne } from "./services/auth.js";
|
|
8
|
+
*
|
|
9
|
+
* Rule: a facade must never import another module's facade.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
export { getCurrentUser, hasRole } from "@/modules/auth/helpers/auth.js";
|
|
@@ -3,8 +3,7 @@ import { eq } from "drizzle-orm";
|
|
|
3
3
|
import type { Request, Response } from "express";
|
|
4
4
|
import { jwtConfig } from "@/config/index.js";
|
|
5
5
|
import { cookie, db, jwt } from "@/framework/facade.js";
|
|
6
|
-
import { refreshTokens } from "@/modules/auth/database/models/user.js";
|
|
7
|
-
import { users } from "@/modules/auth/database/models/user.js";
|
|
6
|
+
import { refreshTokens, users } from "@/modules/auth/database/models/user.js";
|
|
8
7
|
|
|
9
8
|
export function hasRole(auth: any, rolesToMatch: string[]) {
|
|
10
9
|
const role = String(auth?.role || "").toLowerCase();
|
|
@@ -18,7 +17,7 @@ export async function getCurrentUser(auth: any) {
|
|
|
18
17
|
with: { role: true },
|
|
19
18
|
columns: {
|
|
20
19
|
password: false,
|
|
21
|
-
rememberToken: false
|
|
20
|
+
rememberToken: false
|
|
22
21
|
}
|
|
23
22
|
});
|
|
24
23
|
}
|
|
@@ -62,7 +61,7 @@ export async function revokeCurrentRefreshToken(req: Request, _res: Response) {
|
|
|
62
61
|
}
|
|
63
62
|
}
|
|
64
63
|
|
|
65
|
-
export async function issueTokens(_req: Request, res: Response, user: any, options?: { remember?: boolean
|
|
64
|
+
export async function issueTokens(_req: Request, res: Response, user: any, options?: { remember?: boolean }) {
|
|
66
65
|
const remember = !!options?.remember;
|
|
67
66
|
const refreshExpiry = remember ? jwtConfig.refreshRememberExpirySeconds : jwtConfig.refreshExpirySeconds;
|
|
68
67
|
const role = user.role || null;
|
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
import { DateTime as Datetime } from "luxon";
|
|
2
|
-
import { dispatchEvent, mail, shouldQueue } from "@/framework/facade.js";
|
|
3
|
-
|
|
4
|
-
shouldQueue("user:signup", "mail", async (job: any) => {
|
|
5
|
-
const { email, name,
|
|
6
|
-
|
|
7
|
-
await mail.sendMail({
|
|
8
|
-
to: email,
|
|
9
|
-
subject: "
|
|
10
|
-
html: `
|
|
11
|
-
<p>Hello ${name},</p>
|
|
12
|
-
<p>Your account was created successfully.</p>
|
|
13
|
-
<p>
|
|
14
|
-
<p>
|
|
15
|
-
`
|
|
16
|
-
});
|
|
17
|
-
|
|
18
|
-
await dispatchEvent("admin.user.registered", { userId, name, email, createdAt: Datetime.now() }, { broadcast: { roles: ["admin"] } });
|
|
19
|
-
|
|
20
|
-
await dispatchEvent("user.registered", { message: "Welcome! Your account has been created." }, { broadcast: { users: [userId] } });
|
|
21
|
-
|
|
22
|
-
return { ok: true, userId };
|
|
23
|
-
});
|
|
1
|
+
import { DateTime as Datetime } from "luxon";
|
|
2
|
+
import { dispatchEvent, mail, shouldQueue } from "@/framework/facade.js";
|
|
3
|
+
|
|
4
|
+
shouldQueue("user:signup", "mail", async (job: any) => {
|
|
5
|
+
const { email, name, userId } = job.data;
|
|
6
|
+
|
|
7
|
+
await mail.sendMail({
|
|
8
|
+
to: email,
|
|
9
|
+
subject: "Welcome to <AppName>",
|
|
10
|
+
html: `
|
|
11
|
+
<p>Hello ${name},</p>
|
|
12
|
+
<p>Your account was created successfully.</p>
|
|
13
|
+
<p>You can log in with the email and password you chose during signup.</p>
|
|
14
|
+
<p><a href="https://app.example.com/login">Log in</a></p>
|
|
15
|
+
`
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
await dispatchEvent("admin.user.registered", { userId, name, email, createdAt: Datetime.now() }, { broadcast: { roles: ["admin"] } });
|
|
19
|
+
|
|
20
|
+
await dispatchEvent("user.registered", { message: "Welcome! Your account has been created." }, { broadcast: { users: [userId] } });
|
|
21
|
+
|
|
22
|
+
return { ok: true, userId };
|
|
23
|
+
});
|
|
@@ -1,150 +1,150 @@
|
|
|
1
|
-
import { createRoute, createRouter, HttpStatusCodes, jsonContent, z } from "@/framework/facade.js";
|
|
2
|
-
import { loginLimiter } from "@/framework/http/ratelimiter.js";
|
|
3
|
-
import { authMiddleware } from "@/middlewares/auth-middleware.js";
|
|
4
|
-
import {
|
|
5
|
-
forgotPassword,
|
|
6
|
-
login,
|
|
7
|
-
logout,
|
|
8
|
-
logoutAllDevices,
|
|
9
|
-
me,
|
|
10
|
-
refreshToken,
|
|
11
|
-
register,
|
|
12
|
-
resetPassword,
|
|
13
|
-
verifyEmail
|
|
14
|
-
} from "@/modules/auth/controllers/auth.
|
|
15
|
-
import {
|
|
16
|
-
AuthResponseSchema,
|
|
17
|
-
ForgotPasswordSchema,
|
|
18
|
-
LoginSchema,
|
|
19
|
-
MessageSchema,
|
|
20
|
-
RefreshTokenSchema,
|
|
21
|
-
RegisterSchema,
|
|
22
|
-
ResetPasswordSchema,
|
|
23
|
-
UserSchema,
|
|
24
|
-
VerifyEmailSchema
|
|
25
|
-
} from "@/modules/auth/
|
|
26
|
-
|
|
27
|
-
const registerRoute = createRoute({
|
|
28
|
-
path: "/register",
|
|
29
|
-
method: "post",
|
|
30
|
-
tags: ["Auth"],
|
|
31
|
-
description: "Register a new user",
|
|
32
|
-
request: {
|
|
33
|
-
body: jsonContent(RegisterSchema, "Register payload")
|
|
34
|
-
},
|
|
35
|
-
responses: {
|
|
36
|
-
[HttpStatusCodes.CREATED]: jsonContent(AuthResponseSchema, "Registered")
|
|
37
|
-
}
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
const loginRoute = createRoute({
|
|
41
|
-
path: "/login",
|
|
42
|
-
method: "post",
|
|
43
|
-
tags: ["Auth"],
|
|
44
|
-
description: "Login user",
|
|
45
|
-
request: {
|
|
46
|
-
body: jsonContent(LoginSchema, "Login payload")
|
|
47
|
-
},
|
|
48
|
-
responses: {
|
|
49
|
-
[HttpStatusCodes.OK]: jsonContent(AuthResponseSchema, "Logged in")
|
|
50
|
-
}
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
const meRoute = createRoute({
|
|
54
|
-
path: "/me",
|
|
55
|
-
method: "get",
|
|
56
|
-
tags: ["Auth"],
|
|
57
|
-
description: "Get authenticated user",
|
|
58
|
-
responses: {
|
|
59
|
-
[HttpStatusCodes.OK]: jsonContent(z.object({ message: z.string(), data: UserSchema }), "Authenticated user")
|
|
60
|
-
}
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
const logoutRoute = createRoute({
|
|
64
|
-
path: "/logout",
|
|
65
|
-
method: "post",
|
|
66
|
-
tags: ["Auth"],
|
|
67
|
-
description: "Logout user from current device",
|
|
68
|
-
responses: {
|
|
69
|
-
[HttpStatusCodes.OK]: jsonContent(MessageSchema, "Logged out")
|
|
70
|
-
}
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
const logoutAllDevicesRoute = createRoute({
|
|
74
|
-
path: "/logout-all",
|
|
75
|
-
method: "post",
|
|
76
|
-
tags: ["Auth"],
|
|
77
|
-
description: "Logout user from all devices",
|
|
78
|
-
responses: {
|
|
79
|
-
[HttpStatusCodes.OK]: jsonContent(MessageSchema, "Logged out from all devices")
|
|
80
|
-
}
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
const forgotPasswordRoute = createRoute({
|
|
84
|
-
path: "/forgot-password",
|
|
85
|
-
method: "post",
|
|
86
|
-
tags: ["Auth"],
|
|
87
|
-
description: "Send reset password email",
|
|
88
|
-
request: {
|
|
89
|
-
body: jsonContent(ForgotPasswordSchema, "Forgot password payload")
|
|
90
|
-
},
|
|
91
|
-
responses: {
|
|
92
|
-
[HttpStatusCodes.OK]: jsonContent(MessageSchema, "Reset email sent")
|
|
93
|
-
}
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
const resetPasswordRoute = createRoute({
|
|
97
|
-
path: "/reset-password",
|
|
98
|
-
method: "post",
|
|
99
|
-
tags: ["Auth"],
|
|
100
|
-
description: "Reset password using token",
|
|
101
|
-
request: {
|
|
102
|
-
body: jsonContent(ResetPasswordSchema, "Reset password payload")
|
|
103
|
-
},
|
|
104
|
-
responses: {
|
|
105
|
-
[HttpStatusCodes.OK]: jsonContent(MessageSchema, "Password reset")
|
|
106
|
-
}
|
|
107
|
-
});
|
|
108
|
-
|
|
109
|
-
const refreshTokenRoute = createRoute({
|
|
110
|
-
path: "/refresh-token",
|
|
111
|
-
method: "post",
|
|
112
|
-
tags: ["Auth"],
|
|
113
|
-
description: "Refresh access token",
|
|
114
|
-
request: {
|
|
115
|
-
body: jsonContent(RefreshTokenSchema, "Refresh token payload")
|
|
116
|
-
},
|
|
117
|
-
responses: {
|
|
118
|
-
[HttpStatusCodes.OK]: jsonContent(AuthResponseSchema, "Token refreshed")
|
|
119
|
-
}
|
|
120
|
-
});
|
|
121
|
-
|
|
122
|
-
const verifyEmailRoute = createRoute({
|
|
123
|
-
path: "/verify-email",
|
|
124
|
-
method: "post",
|
|
125
|
-
tags: ["Auth"],
|
|
126
|
-
description: "Verify user email using token",
|
|
127
|
-
request: {
|
|
128
|
-
body: jsonContent(VerifyEmailSchema, "Verify email payload")
|
|
129
|
-
},
|
|
130
|
-
responses: {
|
|
131
|
-
[HttpStatusCodes.OK]: jsonContent(MessageSchema, "Email verified")
|
|
132
|
-
}
|
|
133
|
-
});
|
|
134
|
-
|
|
135
|
-
const publicRoute = createRouter()
|
|
136
|
-
.group(loginLimiter)
|
|
137
|
-
.api(registerRoute, register)
|
|
138
|
-
.api(loginRoute, login)
|
|
139
|
-
.api(forgotPasswordRoute, forgotPassword)
|
|
140
|
-
.api(resetPasswordRoute, resetPassword)
|
|
141
|
-
.api(verifyEmailRoute, verifyEmail)
|
|
142
|
-
.api(refreshTokenRoute, refreshToken);
|
|
143
|
-
|
|
144
|
-
const protectedRoute = createRouter()
|
|
145
|
-
.group(authMiddleware)
|
|
146
|
-
.api(meRoute, me)
|
|
147
|
-
.api(logoutRoute, logout)
|
|
148
|
-
.api(logoutAllDevicesRoute, logoutAllDevices);
|
|
149
|
-
|
|
150
|
-
export default createRouter().route("/", publicRoute).route("/", protectedRoute);
|
|
1
|
+
import { createRoute, createRouter, HttpStatusCodes, jsonContent, z } from "@/framework/facade.js";
|
|
2
|
+
import { loginLimiter } from "@/framework/http/ratelimiter.js";
|
|
3
|
+
import { authMiddleware } from "@/middlewares/auth-middleware.js";
|
|
4
|
+
import {
|
|
5
|
+
forgotPassword,
|
|
6
|
+
login,
|
|
7
|
+
logout,
|
|
8
|
+
logoutAllDevices,
|
|
9
|
+
me,
|
|
10
|
+
refreshToken,
|
|
11
|
+
register,
|
|
12
|
+
resetPassword,
|
|
13
|
+
verifyEmail
|
|
14
|
+
} from "@/modules/auth/controllers/auth.js";
|
|
15
|
+
import {
|
|
16
|
+
AuthResponseSchema,
|
|
17
|
+
ForgotPasswordSchema,
|
|
18
|
+
LoginSchema,
|
|
19
|
+
MessageSchema,
|
|
20
|
+
RefreshTokenSchema,
|
|
21
|
+
RegisterSchema,
|
|
22
|
+
ResetPasswordSchema,
|
|
23
|
+
UserSchema,
|
|
24
|
+
VerifyEmailSchema
|
|
25
|
+
} from "@/modules/auth/schemas/auth.js";
|
|
26
|
+
|
|
27
|
+
const registerRoute = createRoute({
|
|
28
|
+
path: "/register",
|
|
29
|
+
method: "post",
|
|
30
|
+
tags: ["Auth"],
|
|
31
|
+
description: "Register a new user",
|
|
32
|
+
request: {
|
|
33
|
+
body: jsonContent(RegisterSchema, "Register payload")
|
|
34
|
+
},
|
|
35
|
+
responses: {
|
|
36
|
+
[HttpStatusCodes.CREATED]: jsonContent(AuthResponseSchema, "Registered")
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
const loginRoute = createRoute({
|
|
41
|
+
path: "/login",
|
|
42
|
+
method: "post",
|
|
43
|
+
tags: ["Auth"],
|
|
44
|
+
description: "Login user",
|
|
45
|
+
request: {
|
|
46
|
+
body: jsonContent(LoginSchema, "Login payload")
|
|
47
|
+
},
|
|
48
|
+
responses: {
|
|
49
|
+
[HttpStatusCodes.OK]: jsonContent(AuthResponseSchema, "Logged in")
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
const meRoute = createRoute({
|
|
54
|
+
path: "/me",
|
|
55
|
+
method: "get",
|
|
56
|
+
tags: ["Auth"],
|
|
57
|
+
description: "Get authenticated user",
|
|
58
|
+
responses: {
|
|
59
|
+
[HttpStatusCodes.OK]: jsonContent(z.object({ message: z.string(), data: UserSchema }), "Authenticated user")
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
const logoutRoute = createRoute({
|
|
64
|
+
path: "/logout",
|
|
65
|
+
method: "post",
|
|
66
|
+
tags: ["Auth"],
|
|
67
|
+
description: "Logout user from current device",
|
|
68
|
+
responses: {
|
|
69
|
+
[HttpStatusCodes.OK]: jsonContent(MessageSchema, "Logged out")
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
const logoutAllDevicesRoute = createRoute({
|
|
74
|
+
path: "/logout-all",
|
|
75
|
+
method: "post",
|
|
76
|
+
tags: ["Auth"],
|
|
77
|
+
description: "Logout user from all devices",
|
|
78
|
+
responses: {
|
|
79
|
+
[HttpStatusCodes.OK]: jsonContent(MessageSchema, "Logged out from all devices")
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
const forgotPasswordRoute = createRoute({
|
|
84
|
+
path: "/forgot-password",
|
|
85
|
+
method: "post",
|
|
86
|
+
tags: ["Auth"],
|
|
87
|
+
description: "Send reset password email",
|
|
88
|
+
request: {
|
|
89
|
+
body: jsonContent(ForgotPasswordSchema, "Forgot password payload")
|
|
90
|
+
},
|
|
91
|
+
responses: {
|
|
92
|
+
[HttpStatusCodes.OK]: jsonContent(MessageSchema, "Reset email sent")
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
const resetPasswordRoute = createRoute({
|
|
97
|
+
path: "/reset-password",
|
|
98
|
+
method: "post",
|
|
99
|
+
tags: ["Auth"],
|
|
100
|
+
description: "Reset password using token",
|
|
101
|
+
request: {
|
|
102
|
+
body: jsonContent(ResetPasswordSchema, "Reset password payload")
|
|
103
|
+
},
|
|
104
|
+
responses: {
|
|
105
|
+
[HttpStatusCodes.OK]: jsonContent(MessageSchema, "Password reset")
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
const refreshTokenRoute = createRoute({
|
|
110
|
+
path: "/refresh-token",
|
|
111
|
+
method: "post",
|
|
112
|
+
tags: ["Auth"],
|
|
113
|
+
description: "Refresh access token",
|
|
114
|
+
request: {
|
|
115
|
+
body: jsonContent(RefreshTokenSchema, "Refresh token payload")
|
|
116
|
+
},
|
|
117
|
+
responses: {
|
|
118
|
+
[HttpStatusCodes.OK]: jsonContent(AuthResponseSchema, "Token refreshed")
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
const verifyEmailRoute = createRoute({
|
|
123
|
+
path: "/verify-email",
|
|
124
|
+
method: "post",
|
|
125
|
+
tags: ["Auth"],
|
|
126
|
+
description: "Verify user email using token",
|
|
127
|
+
request: {
|
|
128
|
+
body: jsonContent(VerifyEmailSchema, "Verify email payload")
|
|
129
|
+
},
|
|
130
|
+
responses: {
|
|
131
|
+
[HttpStatusCodes.OK]: jsonContent(MessageSchema, "Email verified")
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
const publicRoute = createRouter()
|
|
136
|
+
.group(loginLimiter)
|
|
137
|
+
.api(registerRoute, register)
|
|
138
|
+
.api(loginRoute, login)
|
|
139
|
+
.api(forgotPasswordRoute, forgotPassword)
|
|
140
|
+
.api(resetPasswordRoute, resetPassword)
|
|
141
|
+
.api(verifyEmailRoute, verifyEmail)
|
|
142
|
+
.api(refreshTokenRoute, refreshToken);
|
|
143
|
+
|
|
144
|
+
const protectedRoute = createRouter()
|
|
145
|
+
.group(authMiddleware)
|
|
146
|
+
.api(meRoute, me)
|
|
147
|
+
.api(logoutRoute, logout)
|
|
148
|
+
.api(logoutAllDevicesRoute, logoutAllDevices);
|
|
149
|
+
|
|
150
|
+
export default createRouter().route("/", publicRoute).route("/", protectedRoute);
|
|
@@ -1,33 +1,33 @@
|
|
|
1
|
-
import { createRoute, createRouter, HttpStatusCodes, jsonContent, z } from "@/framework/facade.js";
|
|
2
|
-
import { authMiddleware } from "@/middlewares/auth-middleware.js";
|
|
3
|
-
import { requireRole } from "@/middlewares/role-middleware.js";
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
const indexRoute = createRoute({
|
|
8
|
-
path: "/role",
|
|
9
|
-
method: "get",
|
|
10
|
-
tags: ["Role"],
|
|
11
|
-
description: "List all roles",
|
|
12
|
-
responses: {
|
|
13
|
-
[HttpStatusCodes.OK]: jsonContent(z.object({ message: z.string(), data: z.array(RoleSchema) }), "Role list")
|
|
14
|
-
}
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
const showRoute = createRoute({
|
|
18
|
-
path: "/role/{id}",
|
|
19
|
-
method: "get",
|
|
20
|
-
tags: ["Role"],
|
|
21
|
-
description: "Show one role",
|
|
22
|
-
request: {
|
|
23
|
-
params: IdParamsSchema
|
|
24
|
-
},
|
|
25
|
-
responses: {
|
|
26
|
-
[HttpStatusCodes.OK]: jsonContent(z.object({ message: z.string(), data: RoleSchema.nullable() }), "Role item")
|
|
27
|
-
}
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
export default createRouter()
|
|
31
|
-
.group(authMiddleware)
|
|
32
|
-
.api(indexRoute, [requireRole("admin")], index)
|
|
33
|
-
.api(showRoute, [requireRole("admin")], show);
|
|
1
|
+
import { createRoute, createRouter, HttpStatusCodes, jsonContent, z } from "@/framework/facade.js";
|
|
2
|
+
import { authMiddleware } from "@/middlewares/auth-middleware.js";
|
|
3
|
+
import { requireRole } from "@/middlewares/role-middleware.js";
|
|
4
|
+
import { index, show } from "@/modules/auth/controllers/role.js";
|
|
5
|
+
import { IdParamsSchema, RoleSchema } from "@/modules/auth/schemas/auth.js";
|
|
6
|
+
|
|
7
|
+
const indexRoute = createRoute({
|
|
8
|
+
path: "/role",
|
|
9
|
+
method: "get",
|
|
10
|
+
tags: ["Role"],
|
|
11
|
+
description: "List all roles",
|
|
12
|
+
responses: {
|
|
13
|
+
[HttpStatusCodes.OK]: jsonContent(z.object({ message: z.string(), data: z.array(RoleSchema) }), "Role list")
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
const showRoute = createRoute({
|
|
18
|
+
path: "/role/{id}",
|
|
19
|
+
method: "get",
|
|
20
|
+
tags: ["Role"],
|
|
21
|
+
description: "Show one role",
|
|
22
|
+
request: {
|
|
23
|
+
params: IdParamsSchema
|
|
24
|
+
},
|
|
25
|
+
responses: {
|
|
26
|
+
[HttpStatusCodes.OK]: jsonContent(z.object({ message: z.string(), data: RoleSchema.nullable() }), "Role item")
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
export default createRouter()
|
|
31
|
+
.group(authMiddleware)
|
|
32
|
+
.api(indexRoute, [requireRole("admin")], index)
|
|
33
|
+
.api(showRoute, [requireRole("admin")], show);
|