create-nexwire 4.0.0 → 4.1.1
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/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/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";
|
|
@@ -2,8 +2,7 @@ import { createHash, randomBytes } from "node:crypto";
|
|
|
2
2
|
import { eq } from "drizzle-orm";
|
|
3
3
|
import { jwtConfig } from "@/config/index.js";
|
|
4
4
|
import { cookie, db, jwt } from "@/framework/facade.js";
|
|
5
|
-
import { refreshTokens } from "@/modules/auth/database/models/user.js";
|
|
6
|
-
import { users } from "@/modules/auth/database/models/user.js";
|
|
5
|
+
import { refreshTokens, users } from "@/modules/auth/database/models/user.js";
|
|
7
6
|
|
|
8
7
|
export function hasRole(auth: any, rolesToMatch: string[]) {
|
|
9
8
|
const role = String(auth?.role || "").toLowerCase();
|
|
@@ -17,7 +16,7 @@ export async function getCurrentUser(auth: any) {
|
|
|
17
16
|
with: { role: true },
|
|
18
17
|
columns: {
|
|
19
18
|
password: false,
|
|
20
|
-
rememberToken: false
|
|
19
|
+
rememberToken: false
|
|
21
20
|
}
|
|
22
21
|
});
|
|
23
22
|
}
|
|
@@ -25,7 +24,7 @@ export async function getCurrentUser(auth: any) {
|
|
|
25
24
|
/**
|
|
26
25
|
* Why: Removes sensitive/internal fields before returning user payload.
|
|
27
26
|
* When: Used in auth responses like register/login/me.
|
|
28
|
-
* Where: Called by auth
|
|
27
|
+
* Where: Called by auth controllers.
|
|
29
28
|
*/
|
|
30
29
|
export function sanitizeUser(user: any) {
|
|
31
30
|
return {
|
|
@@ -84,9 +83,9 @@ export async function revokeCurrentRefreshToken(c: any) {
|
|
|
84
83
|
/**
|
|
85
84
|
* Why: Issues access+refresh tokens, persists refresh token, sets cookies.
|
|
86
85
|
* When: Used after successful auth actions (register/login/refresh patterns).
|
|
87
|
-
* Where: Called by auth
|
|
86
|
+
* Where: Called by auth controllers.
|
|
88
87
|
*/
|
|
89
|
-
export async function issueTokens(c: any, user: any, options?: { remember?: boolean
|
|
88
|
+
export async function issueTokens(c: any, user: any, options?: { remember?: boolean }) {
|
|
90
89
|
const remember = !!options?.remember;
|
|
91
90
|
const refreshExpiry = remember ? jwtConfig.refreshRememberExpirySeconds : jwtConfig.refreshExpirySeconds;
|
|
92
91
|
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) => {
|
|
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) => {
|
|
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 any time with the email address and password you chose during signup.</p>
|
|
14
|
+
<p><a href="https://app.example.com/login">Log in to your account</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);
|