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.
Files changed (175) hide show
  1. package/README.md +5 -4
  2. package/express/.env +1 -1
  3. package/express/README.md +13 -7
  4. package/express/package.json +2 -2
  5. package/express/src/config/session.ts +1 -1
  6. package/express/src/database/migrations/sqlite/meta/0000_snapshot.json +1 -1
  7. package/express/src/database/migrations/sqlite/meta/_journal.json +1 -1
  8. package/express/src/database/schema.ts +3 -3
  9. package/express/src/framework/cache/cache.ts +82 -81
  10. package/express/src/framework/database/seed.ts +1 -1
  11. package/express/src/framework/facade.ts +1 -24
  12. package/express/src/framework/http/app.ts +5 -5
  13. package/express/src/framework/http/openapi.ts +1 -1
  14. package/express/src/framework/http/router.ts +3 -18
  15. package/express/src/framework/http/types.ts +19 -0
  16. package/express/src/framework/http/validation.ts +18 -18
  17. package/express/src/framework/maker-cli/middleware/core.mjs +41 -47
  18. package/express/src/framework/maker-cli/module/core.mjs +920 -684
  19. package/express/src/framework/maker-cli/module/index.mjs +202 -140
  20. package/express/src/framework/maker-cli/runtime/core.mjs +1 -2
  21. package/express/src/framework/maker-cli/stubs/controller/openapi.ts.stub +40 -14
  22. package/express/src/framework/maker-cli/stubs/controller/openapi.with-model.ts.stub +40 -15
  23. package/express/src/framework/maker-cli/stubs/controller/plain.ts.stub +42 -16
  24. package/express/src/framework/maker-cli/stubs/controller/standalone.ts.stub +47 -0
  25. package/express/src/framework/maker-cli/stubs/facade/name.ts.stub +12 -0
  26. package/express/src/framework/maker-cli/stubs/helper/name.ts.stub +14 -0
  27. package/express/src/framework/maker-cli/stubs/middleware/name.local.ts.stub +15 -0
  28. package/express/src/framework/maker-cli/stubs/model/name.mysql.ts.stub +9 -8
  29. package/express/src/framework/maker-cli/stubs/model/name.postgresql.ts.stub +9 -8
  30. package/express/src/framework/maker-cli/stubs/model/name.sqlite.ts.stub +9 -8
  31. package/express/src/framework/maker-cli/stubs/notification/route.api.ts.stub +50 -50
  32. package/express/src/framework/maker-cli/stubs/notification/route.plain.ts.stub +11 -11
  33. package/express/src/framework/maker-cli/stubs/route/api.ts.stub +93 -79
  34. package/express/src/framework/maker-cli/stubs/route/plain.ts.stub +23 -10
  35. package/express/src/framework/maker-cli/stubs/route/standalone.api.ts.stub +113 -0
  36. package/express/src/framework/maker-cli/stubs/route/standalone.plain.ts.stub +37 -0
  37. package/express/src/framework/maker-cli/stubs/{controller/schema.plain.ts.stub → schema/name.plain.ts.stub} +13 -13
  38. package/express/src/framework/maker-cli/stubs/{controller/schema.ts.stub → schema/name.ts.stub} +32 -32
  39. package/express/src/framework/maker-cli/stubs/service/name.plain.ts.stub +67 -0
  40. package/express/src/framework/maker-cli/stubs/service/name.ts.stub +65 -0
  41. package/express/src/framework/maker-cli/stubs/type/name.ts.stub +22 -0
  42. package/express/src/framework/maker-cli/utils/naming.mjs +56 -13
  43. package/express/src/framework/modules/discover.ts +57 -54
  44. package/express/src/framework/notification/index.ts +1 -1
  45. package/express/src/framework/realtime/broadcast.ts +46 -46
  46. package/express/src/framework/server.ts +2 -1
  47. package/express/src/framework/session/session.ts +102 -98
  48. package/express/src/framework/support/mail.ts +48 -48
  49. package/express/src/framework/support/status-codes.ts +75 -0
  50. package/express/src/middlewares/auth-middleware.ts +1 -1
  51. package/express/src/modules/auth/__tests__/forgetpass.test.ts +200 -0
  52. package/express/src/modules/auth/__tests__/login.test.ts +171 -0
  53. package/express/src/modules/auth/__tests__/logout.test.ts +60 -0
  54. package/express/src/modules/auth/__tests__/logoutalldevices.test.ts +49 -0
  55. package/express/src/modules/auth/__tests__/me.test.ts +91 -0
  56. package/express/src/modules/auth/__tests__/refreshtoken.test.ts +305 -0
  57. package/express/src/modules/auth/__tests__/register.test.ts +291 -0
  58. package/express/src/modules/auth/__tests__/resetpass.test.ts +206 -0
  59. package/express/src/modules/auth/__tests__/verifyemail.test.ts +183 -0
  60. package/express/src/modules/auth/controllers/auth.ts +254 -0
  61. package/express/src/modules/auth/controllers/{role.controller.ts → role.ts} +25 -15
  62. package/{hono/src/modules/auth/database/models/notifications.ts → express/src/modules/auth/database/models/notification.ts} +1 -1
  63. package/express/src/modules/auth/database/models/role.ts +1 -1
  64. package/express/src/modules/auth/database/models/user.ts +1 -1
  65. package/express/src/modules/auth/facade.ts +12 -0
  66. package/express/src/modules/auth/{controllers/auth.helpers.ts → helpers/auth.ts} +3 -4
  67. package/express/src/modules/auth/jobs/registeruser.ts +23 -23
  68. package/express/src/modules/auth/routes/{api.ts → index.ts} +150 -150
  69. package/express/src/modules/auth/routes/role.ts +33 -33
  70. package/{hono/src/modules/auth/controllers/auth.schema.ts → express/src/modules/auth/schemas/auth.ts} +102 -102
  71. package/express/src/modules/auth/services/forgetpassword.ts +66 -0
  72. package/express/src/modules/auth/services/login.ts +63 -0
  73. package/express/src/modules/auth/services/logout.ts +25 -0
  74. package/express/src/modules/auth/services/logoutalldevices.ts +19 -0
  75. package/express/src/modules/auth/services/me.ts +31 -0
  76. package/express/src/modules/auth/services/refreshtoken.ts +110 -0
  77. package/express/src/modules/auth/services/register.ts +141 -0
  78. package/express/src/modules/auth/services/resetpassword.ts +69 -0
  79. package/express/src/modules/auth/services/verifyemail.ts +77 -0
  80. package/express/src/modules/auth/types/auth.ts +31 -0
  81. package/express/src/resources/src/assets/images/logo.png +0 -0
  82. package/express/src/resources/src/pages/auth/forgetPassword.vue +1 -0
  83. package/express/src/resources/src/pages/auth/login.vue +1 -1
  84. package/express/src/storage/database/nexwire.sqlite +0 -0
  85. package/hono/.env +1 -1
  86. package/hono/README.md +13 -7
  87. package/hono/package.json +1 -1
  88. package/hono/src/config/session.ts +1 -1
  89. package/hono/src/database/migrations/sqlite/meta/0000_snapshot.json +1 -1
  90. package/hono/src/database/migrations/sqlite/meta/_journal.json +1 -1
  91. package/hono/src/database/schema.ts +3 -3
  92. package/hono/src/framework/cache/cache.ts +82 -81
  93. package/hono/src/framework/database/seed.ts +1 -1
  94. package/hono/src/framework/http/app.ts +5 -5
  95. package/hono/src/framework/http/validation.ts +21 -21
  96. package/hono/src/framework/maker-cli/middleware/core.mjs +40 -46
  97. package/hono/src/framework/maker-cli/module/core.mjs +401 -168
  98. package/hono/src/framework/maker-cli/module/index.mjs +73 -11
  99. package/hono/src/framework/maker-cli/stubs/controller/openapi.ts.stub +28 -16
  100. package/hono/src/framework/maker-cli/stubs/controller/openapi.with-model.ts.stub +28 -17
  101. package/hono/src/framework/maker-cli/stubs/controller/plain.ts.stub +28 -16
  102. package/hono/src/framework/maker-cli/stubs/controller/standalone.ts.stub +56 -0
  103. package/hono/src/framework/maker-cli/stubs/facade/name.ts.stub +12 -0
  104. package/hono/src/framework/maker-cli/stubs/helper/name.ts.stub +14 -0
  105. package/hono/src/framework/maker-cli/stubs/middleware/name.local.ts.stub +15 -0
  106. package/hono/src/framework/maker-cli/stubs/model/name.mysql.ts.stub +9 -8
  107. package/hono/src/framework/maker-cli/stubs/model/name.postgresql.ts.stub +9 -8
  108. package/hono/src/framework/maker-cli/stubs/model/name.sqlite.ts.stub +9 -8
  109. package/hono/src/framework/maker-cli/stubs/notification/route.api.ts.stub +49 -49
  110. package/hono/src/framework/maker-cli/stubs/notification/route.plain.ts.stub +11 -11
  111. package/hono/src/framework/maker-cli/stubs/route/api.ts.stub +93 -79
  112. package/hono/src/framework/maker-cli/stubs/route/plain.ts.stub +23 -10
  113. package/hono/src/framework/maker-cli/stubs/route/standalone.api.ts.stub +112 -0
  114. package/hono/src/framework/maker-cli/stubs/route/standalone.plain.ts.stub +37 -0
  115. package/hono/src/framework/maker-cli/stubs/{controller/schema.plain.ts.stub → schema/name.plain.ts.stub} +13 -13
  116. package/hono/src/framework/maker-cli/stubs/{controller/schema.ts.stub → schema/name.ts.stub} +32 -32
  117. package/hono/src/framework/maker-cli/stubs/service/name.plain.ts.stub +67 -0
  118. package/hono/src/framework/maker-cli/stubs/service/name.ts.stub +65 -0
  119. package/hono/src/framework/maker-cli/stubs/type/name.ts.stub +22 -0
  120. package/hono/src/framework/maker-cli/utils/naming.mjs +56 -13
  121. package/hono/src/framework/modules/discover.ts +57 -54
  122. package/hono/src/framework/notification/index.ts +1 -1
  123. package/hono/src/framework/realtime/broadcast.ts +46 -46
  124. package/hono/src/framework/server.ts +1 -1
  125. package/hono/src/framework/session/session.ts +121 -116
  126. package/hono/src/middlewares/auth-middleware.ts +1 -1
  127. package/hono/src/modules/auth/__tests__/forgetpass.test.ts +170 -0
  128. package/hono/src/modules/auth/__tests__/login.test.ts +154 -0
  129. package/hono/src/modules/auth/__tests__/logout.test.ts +53 -0
  130. package/hono/src/modules/auth/__tests__/logoutalldevices.test.ts +34 -0
  131. package/hono/src/modules/auth/__tests__/me.test.ts +87 -0
  132. package/hono/src/modules/auth/__tests__/refreshtoken.test.ts +305 -0
  133. package/hono/src/modules/auth/__tests__/register.test.ts +258 -0
  134. package/hono/src/modules/auth/__tests__/resetpass.test.ts +214 -0
  135. package/hono/src/modules/auth/__tests__/verifyemail.test.ts +189 -0
  136. package/hono/src/modules/auth/controllers/auth.ts +238 -0
  137. package/hono/src/modules/auth/controllers/{role.controller.ts → role.ts} +25 -25
  138. package/{express/src/modules/auth/database/models/notifications.ts → hono/src/modules/auth/database/models/notification.ts} +1 -1
  139. package/hono/src/modules/auth/database/models/role.ts +1 -1
  140. package/hono/src/modules/auth/database/models/user.ts +1 -1
  141. package/hono/src/modules/auth/facade.ts +12 -0
  142. package/hono/src/modules/auth/{controllers/auth.helpers.ts → helpers/auth.ts} +5 -6
  143. package/hono/src/modules/auth/jobs/registeruser.ts +23 -23
  144. package/hono/src/modules/auth/routes/{api.ts → index.ts} +150 -150
  145. package/hono/src/modules/auth/routes/role.ts +33 -33
  146. package/{express/src/modules/auth/controllers/auth.schema.ts → hono/src/modules/auth/schemas/auth.ts} +102 -102
  147. package/hono/src/modules/auth/services/forgetpassword.ts +58 -0
  148. package/hono/src/modules/auth/services/login.ts +61 -0
  149. package/hono/src/modules/auth/services/logout.ts +24 -0
  150. package/hono/src/modules/auth/services/logoutalldevices.ts +19 -0
  151. package/hono/src/modules/auth/services/me.ts +31 -0
  152. package/hono/src/modules/auth/services/refreshtoken.ts +110 -0
  153. package/hono/src/modules/auth/services/register.ts +132 -0
  154. package/hono/src/modules/auth/services/resetpassword.ts +69 -0
  155. package/hono/src/modules/auth/services/verifyemail.ts +77 -0
  156. package/hono/src/modules/auth/types/auth.ts +31 -0
  157. package/hono/src/resources/src/assets/images/logo.png +0 -0
  158. package/hono/src/storage/database/nexwire.sqlite +0 -0
  159. package/package.json +1 -1
  160. package/express/src/framework/maker-cli/stubs/example/console.ts.stub +0 -34
  161. package/express/src/framework/maker-cli/stubs/example/controller.ts.stub +0 -418
  162. package/express/src/framework/maker-cli/stubs/example/job.ts.stub +0 -75
  163. package/express/src/framework/maker-cli/stubs/example/route.api.ts.stub +0 -207
  164. package/express/src/framework/maker-cli/stubs/example/route.plain.ts.stub +0 -18
  165. package/express/src/framework/maker-cli/stubs/example/schema.plain.ts.stub +0 -42
  166. package/express/src/framework/maker-cli/stubs/example/schema.ts.stub +0 -42
  167. package/express/src/modules/auth/controllers/auth.controller.ts +0 -358
  168. package/hono/src/framework/maker-cli/stubs/example/console.ts.stub +0 -34
  169. package/hono/src/framework/maker-cli/stubs/example/controller.ts.stub +0 -505
  170. package/hono/src/framework/maker-cli/stubs/example/job.ts.stub +0 -75
  171. package/hono/src/framework/maker-cli/stubs/example/route.api.ts.stub +0 -207
  172. package/hono/src/framework/maker-cli/stubs/example/route.plain.ts.stub +0 -18
  173. package/hono/src/framework/maker-cli/stubs/example/schema.plain.ts.stub +0 -42
  174. package/hono/src/framework/maker-cli/stubs/example/schema.ts.stub +0 -42
  175. package/hono/src/modules/auth/controllers/auth.controller.ts +0 -413
@@ -11,4 +11,4 @@ export const roles = sqliteTable("roles", {
11
11
 
12
12
  export const rolesRelations = relations(roles, ({ many }) => ({
13
13
  users: many(users)
14
- }));
14
+ }));
@@ -43,4 +43,4 @@ export const usersRelations = relations(users, ({ one }) => ({
43
43
  fields: [users.roleId],
44
44
  references: [roles.id]
45
45
  })
46
- }));
46
+ }));
@@ -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.controller handlers.
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.controller handlers.
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, password, userId } = job.data;
6
-
7
- await mail.sendMail({
8
- to: email,
9
- subject: "Account Creation",
10
- html: `
11
- <p>Hello ${name},</p>
12
- <p>Your account was created successfully.</p>
13
- <p>Email: ${email}</p>
14
- <p>Password: ${password}</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.controller.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/controllers/auth.schema.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
+ 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 { IdParamsSchema, RoleSchema } from "@/modules/auth/controllers/auth.schema.js";
5
- import { index, show } from "@/modules/auth/controllers/role.controller.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);
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);