myaidev-method 0.2.8 → 0.2.10

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 (158) hide show
  1. package/.claude/agents/wordpress-admin.md +271 -0
  2. package/.env.example +0 -1
  3. package/PACKAGE_FIXES_SUMMARY.md +319 -0
  4. package/PAYLOADCMS_AUTH_UPDATE.md +248 -0
  5. package/USER_GUIDE.md +260 -0
  6. package/bin/cli.js +70 -0
  7. package/dist/server/.tsbuildinfo +1 -0
  8. package/dist/server/auth/controllers/AuthController.d.ts +34 -0
  9. package/dist/server/auth/controllers/AuthController.d.ts.map +1 -0
  10. package/dist/server/auth/controllers/AuthController.js +43 -0
  11. package/dist/server/auth/controllers/AuthController.js.map +1 -0
  12. package/dist/server/auth/example-usage.d.ts +53 -0
  13. package/dist/server/auth/example-usage.d.ts.map +1 -0
  14. package/dist/server/auth/example-usage.js +129 -0
  15. package/dist/server/auth/example-usage.js.map +1 -0
  16. package/dist/server/auth/index.d.ts +11 -0
  17. package/dist/server/auth/index.d.ts.map +1 -0
  18. package/dist/server/auth/index.js +15 -0
  19. package/dist/server/auth/index.js.map +1 -0
  20. package/dist/server/auth/layers.d.ts +19 -0
  21. package/dist/server/auth/layers.d.ts.map +1 -0
  22. package/dist/server/auth/layers.js +33 -0
  23. package/dist/server/auth/layers.js.map +1 -0
  24. package/dist/server/auth/middleware/authMiddleware.d.ts +24 -0
  25. package/dist/server/auth/middleware/authMiddleware.d.ts.map +1 -0
  26. package/dist/server/auth/middleware/authMiddleware.js +65 -0
  27. package/dist/server/auth/middleware/authMiddleware.js.map +1 -0
  28. package/dist/server/auth/routes/authRoutes.d.ts +11 -0
  29. package/dist/server/auth/routes/authRoutes.d.ts.map +1 -0
  30. package/dist/server/auth/routes/authRoutes.js +213 -0
  31. package/dist/server/auth/routes/authRoutes.js.map +1 -0
  32. package/dist/server/auth/services/AuditLogService.d.ts +21 -0
  33. package/dist/server/auth/services/AuditLogService.d.ts.map +1 -0
  34. package/dist/server/auth/services/AuditLogService.js +28 -0
  35. package/dist/server/auth/services/AuditLogService.js.map +1 -0
  36. package/dist/server/auth/services/AuthService.d.ts +27 -0
  37. package/dist/server/auth/services/AuthService.d.ts.map +1 -0
  38. package/dist/server/auth/services/AuthService.js +246 -0
  39. package/dist/server/auth/services/AuthService.js.map +1 -0
  40. package/dist/server/auth/services/PasswordService.d.ts +12 -0
  41. package/dist/server/auth/services/PasswordService.d.ts.map +1 -0
  42. package/dist/server/auth/services/PasswordService.js +31 -0
  43. package/dist/server/auth/services/PasswordService.js.map +1 -0
  44. package/dist/server/auth/services/SessionRepository.d.ts +24 -0
  45. package/dist/server/auth/services/SessionRepository.d.ts.map +1 -0
  46. package/dist/server/auth/services/SessionRepository.js +101 -0
  47. package/dist/server/auth/services/SessionRepository.js.map +1 -0
  48. package/dist/server/auth/services/TokenService.d.ts +12 -0
  49. package/dist/server/auth/services/TokenService.d.ts.map +1 -0
  50. package/dist/server/auth/services/TokenService.js +86 -0
  51. package/dist/server/auth/services/TokenService.js.map +1 -0
  52. package/dist/server/auth/services/UserRepository.d.ts +23 -0
  53. package/dist/server/auth/services/UserRepository.d.ts.map +1 -0
  54. package/dist/server/auth/services/UserRepository.js +168 -0
  55. package/dist/server/auth/services/UserRepository.js.map +1 -0
  56. package/dist/server/auth/services/example.d.ts +26 -0
  57. package/dist/server/auth/services/example.d.ts.map +1 -0
  58. package/dist/server/auth/services/example.js +221 -0
  59. package/dist/server/auth/services/example.js.map +1 -0
  60. package/dist/server/auth/services/index.d.ts +6 -0
  61. package/dist/server/auth/services/index.d.ts.map +1 -0
  62. package/dist/server/auth/services/index.js +7 -0
  63. package/dist/server/auth/services/index.js.map +1 -0
  64. package/dist/server/database/db.d.ts +28 -0
  65. package/dist/server/database/db.d.ts.map +1 -0
  66. package/dist/server/database/db.js +91 -0
  67. package/dist/server/database/db.js.map +1 -0
  68. package/dist/server/database/schema.sql +95 -0
  69. package/dist/server/hono/app.d.ts +10 -0
  70. package/dist/server/hono/app.d.ts.map +1 -0
  71. package/dist/server/hono/app.js +26 -0
  72. package/dist/server/hono/app.js.map +1 -0
  73. package/dist/server/hono/routes.d.ts +12 -0
  74. package/dist/server/hono/routes.d.ts.map +1 -0
  75. package/dist/server/hono/routes.js +40 -0
  76. package/dist/server/hono/routes.js.map +1 -0
  77. package/dist/server/main.d.ts +2 -0
  78. package/dist/server/main.d.ts.map +1 -0
  79. package/dist/server/main.js +94 -0
  80. package/dist/server/main.js.map +1 -0
  81. package/dist/server/user-management/DirectoryService.d.ts +62 -0
  82. package/dist/server/user-management/DirectoryService.d.ts.map +1 -0
  83. package/dist/server/user-management/DirectoryService.js +201 -0
  84. package/dist/server/user-management/DirectoryService.js.map +1 -0
  85. package/dist/server/user-management/LinuxUserService.d.ts +71 -0
  86. package/dist/server/user-management/LinuxUserService.d.ts.map +1 -0
  87. package/dist/server/user-management/LinuxUserService.js +192 -0
  88. package/dist/server/user-management/LinuxUserService.js.map +1 -0
  89. package/dist/server/user-management/QuotaService.d.ts +59 -0
  90. package/dist/server/user-management/QuotaService.d.ts.map +1 -0
  91. package/dist/server/user-management/QuotaService.js +148 -0
  92. package/dist/server/user-management/QuotaService.js.map +1 -0
  93. package/dist/server/user-management/UserManagementService.d.ts +74 -0
  94. package/dist/server/user-management/UserManagementService.d.ts.map +1 -0
  95. package/dist/server/user-management/UserManagementService.js +122 -0
  96. package/dist/server/user-management/UserManagementService.js.map +1 -0
  97. package/dist/server/user-management/index.d.ts +26 -0
  98. package/dist/server/user-management/index.d.ts.map +1 -0
  99. package/dist/server/user-management/index.js +26 -0
  100. package/dist/server/user-management/index.js.map +1 -0
  101. package/dist/server/user-management/layers.d.ts +27 -0
  102. package/dist/server/user-management/layers.d.ts.map +1 -0
  103. package/dist/server/user-management/layers.js +37 -0
  104. package/dist/server/user-management/layers.js.map +1 -0
  105. package/dist/shared/types.d.ts +94 -0
  106. package/dist/shared/types.d.ts.map +1 -0
  107. package/dist/shared/types.js +32 -0
  108. package/dist/shared/types.js.map +1 -0
  109. package/package.json +25 -5
  110. package/src/lib/payloadcms-utils.js +5 -12
  111. package/src/server/auth/ARCHITECTURE.md +575 -0
  112. package/src/server/auth/IMPLEMENTATION_SUMMARY.md +287 -0
  113. package/src/server/auth/QUICK_START.md +283 -0
  114. package/src/server/auth/README.md +290 -0
  115. package/src/server/auth/controllers/AuthController.ts +129 -0
  116. package/src/server/auth/example-usage.ts +159 -0
  117. package/src/server/auth/index.ts +19 -0
  118. package/src/server/auth/layers.ts +57 -0
  119. package/src/server/auth/middleware/authMiddleware.ts +118 -0
  120. package/src/server/auth/routes/authRoutes.ts +319 -0
  121. package/src/server/auth/services/AuditLogService.ts +81 -0
  122. package/src/server/auth/services/AuthService.ts +408 -0
  123. package/src/server/auth/services/IMPLEMENTATION_SUMMARY.md +404 -0
  124. package/src/server/auth/services/PasswordService.ts +85 -0
  125. package/src/server/auth/services/README.md +361 -0
  126. package/src/server/auth/services/SessionRepository.ts +227 -0
  127. package/src/server/auth/services/TokenService.ts +174 -0
  128. package/src/server/auth/services/UserRepository.ts +318 -0
  129. package/src/server/auth/services/example.ts +346 -0
  130. package/src/server/auth/services/index.ts +6 -0
  131. package/src/server/database/db.ts +161 -0
  132. package/src/server/database/schema.sql +95 -0
  133. package/src/server/hono/app.ts +41 -0
  134. package/src/server/main.ts +115 -0
  135. package/src/server/user-management/DirectoryService.ts +348 -0
  136. package/src/server/user-management/LinuxUserService.ts +338 -0
  137. package/src/server/user-management/QuotaService.ts +256 -0
  138. package/src/server/user-management/README.md +333 -0
  139. package/src/server/user-management/UserManagementService.ts +335 -0
  140. package/src/server/user-management/index.ts +26 -0
  141. package/src/server/user-management/layers.ts +51 -0
  142. package/src/shared/types.ts +111 -0
  143. package/src/templates/claude/agents/coolify-deploy.md +50 -50
  144. package/src/templates/claude/agents/payloadcms-publish.md +46 -18
  145. package/src/templates/codex/commands/myai-astro-publish.md +8 -2
  146. package/src/templates/codex/commands/myai-content-writer.md +8 -2
  147. package/src/templates/codex/commands/myai-coolify-deploy.md +8 -2
  148. package/src/templates/codex/commands/myai-dev-architect.md +8 -2
  149. package/src/templates/codex/commands/myai-dev-code.md +8 -2
  150. package/src/templates/codex/commands/myai-dev-docs.md +8 -2
  151. package/src/templates/codex/commands/myai-dev-review.md +8 -2
  152. package/src/templates/codex/commands/myai-dev-test.md +8 -2
  153. package/src/templates/codex/commands/myai-docusaurus-publish.md +8 -2
  154. package/src/templates/codex/commands/myai-mintlify-publish.md +8 -2
  155. package/src/templates/codex/commands/myai-payloadcms-publish.md +17 -3
  156. package/src/templates/codex/commands/myai-sparc-workflow.md +8 -2
  157. package/src/templates/codex/commands/myai-wordpress-admin.md +8 -2
  158. package/src/templates/codex/commands/myai-wordpress-publish.md +8 -2
@@ -0,0 +1,129 @@
1
+ /**
2
+ * Example usage of the authentication system
3
+ * This file demonstrates how to integrate the auth system with Hono
4
+ */
5
+ import { Hono } from "hono";
6
+ import { Layer } from "effect";
7
+ import { createAuthRoutes, createAuthMiddleware } from "./index.js";
8
+ import { PasswordService } from "./services/PasswordService.js";
9
+ import { TokenService } from "./services/TokenService.js";
10
+ import { UserRepository } from "./services/UserRepository.js";
11
+ import { SessionRepository } from "./services/SessionRepository.js";
12
+ import { AuditLogService } from "./services/AuditLogService.js";
13
+ import { AuthService } from "./services/AuthService.js";
14
+ import { DatabaseService } from "../database/db.js";
15
+ // Build the complete application layer with all services
16
+ const DbLayer = DatabaseService.Live({
17
+ path: process.env["DB_PATH"] || "./auth.db",
18
+ timeout: 5000,
19
+ verbose: process.env["NODE_ENV"] === "development",
20
+ });
21
+ const IndependentServices = Layer.mergeAll(PasswordService.Live, TokenService.Live, AuditLogService.Live);
22
+ const Repositories = Layer.mergeAll(UserRepository.Live, SessionRepository.Live);
23
+ const Auth = AuthService.Live;
24
+ const AppLayer = Layer.mergeAll(IndependentServices, Repositories, Auth).pipe(Layer.provide(DbLayer));
25
+ // Create main app
26
+ const app = new Hono();
27
+ // Create middleware and routes with AppLayer
28
+ const authMiddleware = createAuthMiddleware(AppLayer);
29
+ const authRouter = createAuthRoutes(AppLayer, authMiddleware);
30
+ // Mount authentication routes (public)
31
+ app.route("/api/auth", authRouter);
32
+ // Protected route example - requires authentication
33
+ app.get("/api/protected/profile", authMiddleware, (c) => {
34
+ const user = c.get("user");
35
+ const session = c.get("session");
36
+ return c.json({
37
+ message: "This is a protected endpoint",
38
+ user: {
39
+ id: user.id,
40
+ username: user.username,
41
+ email: user.email,
42
+ },
43
+ session: {
44
+ id: session.id,
45
+ createdAt: session.createdAt,
46
+ expiresAt: session.expiresAt,
47
+ },
48
+ });
49
+ });
50
+ // Protected route example - user data
51
+ app.get("/api/protected/data", authMiddleware, (c) => {
52
+ const user = c.get("user");
53
+ return c.json({
54
+ data: {
55
+ userId: user.id,
56
+ username: user.username,
57
+ linuxUsername: user.linuxUsername,
58
+ isActive: user.isActive,
59
+ emailVerified: user.emailVerified,
60
+ },
61
+ });
62
+ });
63
+ // Admin-only route example
64
+ app.get("/api/protected/admin", authMiddleware, (c) => {
65
+ const user = c.get("user");
66
+ // Add your own admin check logic here
67
+ // For example, check if user has admin role
68
+ if (user.email !== "admin@example.com") {
69
+ return c.json({ error: "FORBIDDEN", message: "Admin access required" }, 403);
70
+ }
71
+ return c.json({
72
+ message: "Welcome to admin panel",
73
+ adminData: "Sensitive information",
74
+ });
75
+ });
76
+ // Health check endpoint (public)
77
+ app.get("/health", (c) => {
78
+ return c.json({ status: "ok", timestamp: Date.now() });
79
+ });
80
+ // Start server
81
+ const port = process.env["PORT"] || 3000;
82
+ console.log(`Server starting on port ${port}`);
83
+ export default app;
84
+ /**
85
+ * To run this example:
86
+ *
87
+ * 1. Install dependencies:
88
+ * npm install hono effect bcrypt jose
89
+ *
90
+ * 2. Set up environment:
91
+ * export NODE_ENV=development
92
+ * export PORT=3000
93
+ *
94
+ * 3. Initialize database:
95
+ * node --import tsx/esm src/server/database/init-db.ts
96
+ *
97
+ * 4. Run the server:
98
+ * node --import tsx/esm src/server/auth/example-usage.ts
99
+ *
100
+ * API Usage Examples:
101
+ *
102
+ * Register:
103
+ * curl -X POST http://localhost:3000/api/auth/register \
104
+ * -H "Content-Type: application/json" \
105
+ * -d '{"username":"testuser","email":"test@example.com","password":"SecurePass123"}'
106
+ *
107
+ * Login:
108
+ * curl -X POST http://localhost:3000/api/auth/login \
109
+ * -H "Content-Type: application/json" \
110
+ * -d '{"email":"test@example.com","password":"SecurePass123"}' \
111
+ * -c cookies.txt
112
+ *
113
+ * Access protected endpoint (with cookie):
114
+ * curl http://localhost:3000/api/protected/profile \
115
+ * -b cookies.txt
116
+ *
117
+ * Access protected endpoint (with Bearer token):
118
+ * curl http://localhost:3000/api/protected/profile \
119
+ * -H "Authorization: Bearer <token>"
120
+ *
121
+ * Get current user:
122
+ * curl http://localhost:3000/api/auth/me \
123
+ * -b cookies.txt
124
+ *
125
+ * Logout:
126
+ * curl -X POST http://localhost:3000/api/auth/logout \
127
+ * -b cookies.txt
128
+ */
129
+ //# sourceMappingURL=example-usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"example-usage.js","sourceRoot":"","sources":["../../../src/server/auth/example-usage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export { AuthService } from "./services/AuthService.js";
2
+ export { PasswordService } from "./services/PasswordService.js";
3
+ export { TokenService } from "./services/TokenService.js";
4
+ export { UserRepository } from "./services/UserRepository.js";
5
+ export { SessionRepository } from "./services/SessionRepository.js";
6
+ export { AuditLogService } from "./services/AuditLogService.js";
7
+ export { AuthController } from "./controllers/AuthController.js";
8
+ export { createAuthMiddleware } from "./middleware/authMiddleware.js";
9
+ export type { AppRuntimeContext } from "./middleware/authMiddleware.js";
10
+ export { createAuthRoutes } from "./routes/authRoutes.js";
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/auth/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAGhE,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAGjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,YAAY,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAGxE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,15 @@
1
+ // Authentication module exports
2
+ // Services
3
+ export { AuthService } from "./services/AuthService.js";
4
+ export { PasswordService } from "./services/PasswordService.js";
5
+ export { TokenService } from "./services/TokenService.js";
6
+ export { UserRepository } from "./services/UserRepository.js";
7
+ export { SessionRepository } from "./services/SessionRepository.js";
8
+ export { AuditLogService } from "./services/AuditLogService.js";
9
+ // Controllers
10
+ export { AuthController } from "./controllers/AuthController.js";
11
+ // Middleware
12
+ export { createAuthMiddleware } from "./middleware/authMiddleware.js";
13
+ // Routes
14
+ export { createAuthRoutes } from "./routes/authRoutes.js";
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/server/auth/index.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAEhC,WAAW;AACX,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAEhE,cAAc;AACd,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEjE,aAAa;AACb,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAGtE,SAAS;AACT,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { Layer } from "effect";
2
+ import { PasswordService } from "./services/PasswordService.js";
3
+ import { TokenService } from "./services/TokenService.js";
4
+ import { UserRepository } from "./services/UserRepository.js";
5
+ import { SessionRepository } from "./services/SessionRepository.js";
6
+ import { AuditLogService } from "./services/AuditLogService.js";
7
+ import { AuthService } from "./services/AuthService.js";
8
+ import { DatabaseService } from "../database/db.js";
9
+ /**
10
+ * Creates the complete application layer with all auth services
11
+ * @param dbConfig Database configuration
12
+ * @returns Complete layer with all services including DatabaseService
13
+ */
14
+ export declare const createAppLayer: (dbConfig: {
15
+ path: string;
16
+ timeout?: number;
17
+ verbose?: boolean;
18
+ }) => Layer.Layer<AuthService | PasswordService | TokenService | AuditLogService | DatabaseService | UserRepository | SessionRepository | import("../user-management/LinuxUserService.js").LinuxUserService | import("../user-management/DirectoryService.js").DirectoryService | import("../user-management/QuotaService.js").QuotaService | import("../user-management/UserManagementService.js").UserManagementService, import("../../shared/types.js").AuthError | import("../database/db.js").DatabaseError, never>;
19
+ //# sourceMappingURL=layers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layers.d.ts","sourceRoot":"","sources":["../../../src/server/auth/layers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD;;;;GAIG;AACH,eAAO,MAAM,cAAc,GAAI,UAAU;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,ufAyC7F,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { Layer } from "effect";
2
+ import { PasswordService } from "./services/PasswordService.js";
3
+ import { TokenService } from "./services/TokenService.js";
4
+ import { UserRepository } from "./services/UserRepository.js";
5
+ import { SessionRepository } from "./services/SessionRepository.js";
6
+ import { AuditLogService } from "./services/AuditLogService.js";
7
+ import { AuthService } from "./services/AuthService.js";
8
+ import { DatabaseService } from "../database/db.js";
9
+ import { UserManagementLayer } from "../user-management/layers.js";
10
+ /**
11
+ * Creates the complete application layer with all auth services
12
+ * @param dbConfig Database configuration
13
+ * @returns Complete layer with all services including DatabaseService
14
+ */
15
+ export const createAppLayer = (dbConfig) => {
16
+ // Base database layer
17
+ const DbLayer = DatabaseService.Live(dbConfig);
18
+ // Service layers that don't require DatabaseService
19
+ const IndependentServices = Layer.mergeAll(PasswordService.Live, TokenService.Live);
20
+ // Services and repositories that require DatabaseService
21
+ const DbDependentServices = Layer.mergeAll(AuditLogService.Live, UserRepository.Live, SessionRepository.Live);
22
+ // Provide DatabaseService to dependent services
23
+ const DbDependentWithDb = Layer.provide(DbDependentServices, DbLayer);
24
+ // Merge all services and database
25
+ const BaseServices = Layer.mergeAll(IndependentServices, DbDependentWithDb, DbLayer);
26
+ // Add user management layer
27
+ const ServicesWithUserManagement = Layer.mergeAll(BaseServices, UserManagementLayer);
28
+ // Provide all dependencies to AuthService
29
+ const AuthWithDeps = Layer.provide(AuthService.Live, ServicesWithUserManagement);
30
+ // Complete application layer - merge everything
31
+ return Layer.mergeAll(ServicesWithUserManagement, AuthWithDeps);
32
+ };
33
+ //# sourceMappingURL=layers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layers.js","sourceRoot":"","sources":["../../../src/server/auth/layers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAEnE;;;;GAIG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,QAA+D,EAAE,EAAE;IAChG,sBAAsB;IACtB,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAE/C,oDAAoD;IACpD,MAAM,mBAAmB,GAAG,KAAK,CAAC,QAAQ,CACxC,eAAe,CAAC,IAAI,EACpB,YAAY,CAAC,IAAI,CAClB,CAAC;IAEF,yDAAyD;IACzD,MAAM,mBAAmB,GAAG,KAAK,CAAC,QAAQ,CACxC,eAAe,CAAC,IAAI,EACpB,cAAc,CAAC,IAAI,EACnB,iBAAiB,CAAC,IAAI,CACvB,CAAC;IAEF,gDAAgD;IAChD,MAAM,iBAAiB,GAAG,KAAK,CAAC,OAAO,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;IAEtE,kCAAkC;IAClC,MAAM,YAAY,GAAG,KAAK,CAAC,QAAQ,CACjC,mBAAmB,EACnB,iBAAiB,EACjB,OAAO,CACR,CAAC;IAEF,4BAA4B;IAC5B,MAAM,0BAA0B,GAAG,KAAK,CAAC,QAAQ,CAC/C,YAAY,EACZ,mBAAmB,CACpB,CAAC;IAEF,0CAA0C;IAC1C,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,EAAE,0BAA0B,CAAC,CAAC;IAEjF,gDAAgD;IAChD,OAAO,KAAK,CAAC,QAAQ,CACnB,0BAA0B,EAC1B,YAAY,CACb,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { MiddlewareHandler } from "hono";
2
+ import { ManagedRuntime } from "effect";
3
+ import { AuthService } from "../services/AuthService.js";
4
+ import { PasswordService } from "../services/PasswordService.js";
5
+ import { TokenService } from "../services/TokenService.js";
6
+ import { UserRepository } from "../services/UserRepository.js";
7
+ import { SessionRepository } from "../services/SessionRepository.js";
8
+ import { AuditLogService } from "../services/AuditLogService.js";
9
+ import { DatabaseService } from "../../database/db.js";
10
+ import { Session, User } from "../../../shared/types.js";
11
+ declare module "hono" {
12
+ interface ContextVariableMap {
13
+ user: User;
14
+ session: Session;
15
+ }
16
+ }
17
+ export type AppRuntimeContext = PasswordService | TokenService | UserRepository | SessionRepository | AuditLogService | AuthService | DatabaseService;
18
+ /**
19
+ * Factory function to create auth middleware with proper Effect-TS ManagedRuntime injection
20
+ * @param runtime - The Effect-TS ManagedRuntime with all required services
21
+ * @returns Configured Hono middleware handler
22
+ */
23
+ export declare const createAuthMiddleware: (runtime: ManagedRuntime.ManagedRuntime<AppRuntimeContext, never>) => MiddlewareHandler;
24
+ //# sourceMappingURL=authMiddleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authMiddleware.d.ts","sourceRoot":"","sources":["../../../../src/server/auth/middleware/authMiddleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAEzC,OAAO,EAAU,cAAc,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAGzD,OAAO,QAAQ,MAAM,CAAC;IACpB,UAAU,kBAAkB;QAC1B,IAAI,EAAE,IAAI,CAAC;QACX,OAAO,EAAE,OAAO,CAAC;KAClB;CACF;AAGD,MAAM,MAAM,iBAAiB,GACzB,eAAe,GACf,YAAY,GACZ,cAAc,GACd,iBAAiB,GACjB,eAAe,GACf,WAAW,GACX,eAAe,CAAC;AAEpB;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,GAC/B,SAAS,cAAc,CAAC,cAAc,CAAC,iBAAiB,EAAE,KAAK,CAAC,KAC/D,iBAgFF,CAAC"}
@@ -0,0 +1,65 @@
1
+ import { getCookie } from "hono/cookie";
2
+ import { Effect } from "effect";
3
+ import { AuthService } from "../services/AuthService.js";
4
+ /**
5
+ * Factory function to create auth middleware with proper Effect-TS ManagedRuntime injection
6
+ * @param runtime - The Effect-TS ManagedRuntime with all required services
7
+ * @returns Configured Hono middleware handler
8
+ */
9
+ export const createAuthMiddleware = (runtime) => {
10
+ return async (c, next) => {
11
+ // Extract token from Authorization header or cookie
12
+ let token;
13
+ const authHeader = c.req.header("Authorization");
14
+ if (authHeader?.startsWith("Bearer ")) {
15
+ token = authHeader.substring(7);
16
+ }
17
+ else {
18
+ token = getCookie(c, "auth_token");
19
+ }
20
+ if (!token) {
21
+ return c.json({
22
+ error: "UNAUTHORIZED",
23
+ message: "No authentication token provided",
24
+ }, 401);
25
+ }
26
+ // Verify token using AuthService with runtime
27
+ const verifyEffect = Effect.gen(function* () {
28
+ const authService = yield* AuthService;
29
+ return yield* authService.verifyToken(token);
30
+ });
31
+ const result = await runtime.runPromiseExit(verifyEffect);
32
+ if (result._tag === "Failure") {
33
+ const cause = result.cause;
34
+ if (cause._tag === "Fail") {
35
+ const failureError = cause.error;
36
+ if (failureError && typeof failureError === "object" && "_tag" in failureError) {
37
+ const typedError = failureError;
38
+ switch (typedError._tag) {
39
+ case "AuthError":
40
+ return c.json({
41
+ error: "AUTH_ERROR",
42
+ message: typedError.message,
43
+ }, 401);
44
+ case "DatabaseError":
45
+ return c.json({
46
+ error: "INTERNAL_ERROR",
47
+ message: "Database error occurred",
48
+ }, 500);
49
+ }
50
+ }
51
+ }
52
+ // Handle unknown errors
53
+ return c.json({
54
+ error: "INTERNAL_ERROR",
55
+ message: "An unexpected error occurred",
56
+ }, 500);
57
+ }
58
+ // Success - inject user and session into context
59
+ const verifyResult = result.value;
60
+ c.set("user", verifyResult.user);
61
+ c.set("session", verifyResult.session);
62
+ return await next();
63
+ };
64
+ };
65
+ //# sourceMappingURL=authMiddleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authMiddleware.js","sourceRoot":"","sources":["../../../../src/server/auth/middleware/authMiddleware.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,MAAM,EAAkB,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AA2BzD;;;;GAIG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,OAAgE,EAC7C,EAAE;IACrB,OAAO,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;QACvB,oDAAoD;QACpD,IAAI,KAAyB,CAAC;QAE9B,MAAM,UAAU,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;QACjD,IAAI,UAAU,EAAE,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACtC,KAAK,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC;aAAM,CAAC;YACN,KAAK,GAAG,SAAS,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;QACrC,CAAC;QAED,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,CAAC,IAAI,CACX;gBACE,KAAK,EAAE,cAAc;gBACrB,OAAO,EAAE,kCAAkC;aAC5C,EACD,GAAG,CACJ,CAAC;QACJ,CAAC;QAED,8CAA8C;QAC9C,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YACvC,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC;YACvC,OAAO,KAAK,CAAC,CAAC,WAAW,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;QAE1D,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;YAE3B,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC1B,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC;gBAEjC,IAAI,YAAY,IAAI,OAAO,YAAY,KAAK,QAAQ,IAAI,MAAM,IAAI,YAAY,EAAE,CAAC;oBAC/E,MAAM,UAAU,GAAG,YAGlB,CAAC;oBAEF,QAAQ,UAAU,CAAC,IAAI,EAAE,CAAC;wBACxB,KAAK,WAAW;4BACd,OAAO,CAAC,CAAC,IAAI,CACX;gCACE,KAAK,EAAE,YAAY;gCACnB,OAAO,EAAE,UAAU,CAAC,OAAO;6BAC5B,EACD,GAAG,CACJ,CAAC;wBACJ,KAAK,eAAe;4BAClB,OAAO,CAAC,CAAC,IAAI,CACX;gCACE,KAAK,EAAE,gBAAgB;gCACvB,OAAO,EAAE,yBAAyB;6BACnC,EACD,GAAG,CACJ,CAAC;oBACN,CAAC;gBACH,CAAC;YACH,CAAC;YAED,wBAAwB;YACxB,OAAO,CAAC,CAAC,IAAI,CACX;gBACE,KAAK,EAAE,gBAAgB;gBACvB,OAAO,EAAE,8BAA8B;aACxC,EACD,GAAG,CACJ,CAAC;QACJ,CAAC;QAED,iDAAiD;QACjD,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC;QAClC,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC,CAAC,GAAG,CAAC,SAAS,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;QAEvC,OAAO,MAAM,IAAI,EAAE,CAAC;IACtB,CAAC,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { Hono } from "hono";
2
+ import { ManagedRuntime } from "effect";
3
+ import { AppRuntimeContext } from "../middleware/authMiddleware.js";
4
+ /**
5
+ * Factory function to create auth routes with proper Effect-TS ManagedRuntime injection
6
+ * @param runtime - The Effect-TS ManagedRuntime with all required services
7
+ * @param authMiddleware - The configured auth middleware instance
8
+ * @returns Configured Hono router instance
9
+ */
10
+ export declare const createAuthRoutes: (runtime: ManagedRuntime.ManagedRuntime<AppRuntimeContext, never>, authMiddleware: ReturnType<typeof import("../middleware/authMiddleware.js").createAuthMiddleware>) => Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
11
+ //# sourceMappingURL=authRoutes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authRoutes.d.ts","sourceRoot":"","sources":["../../../../src/server/auth/routes/authRoutes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAU,cAAc,EAAE,MAAM,QAAQ,CAAC;AAEhD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAgBpE;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,GAC3B,SAAS,cAAc,CAAC,cAAc,CAAC,iBAAiB,EAAE,KAAK,CAAC,EAChE,gBAAgB,UAAU,CAAC,cAAc,iCAAiC,EAAE,oBAAoB,CAAC,+EAkSlG,CAAC"}
@@ -0,0 +1,213 @@
1
+ import { Hono } from "hono";
2
+ import { setCookie } from "hono/cookie";
3
+ import { Effect } from "effect";
4
+ import { AuthService } from "../services/AuthService.js";
5
+ // Cookie configuration
6
+ const COOKIE_OPTIONS = {
7
+ httpOnly: true,
8
+ secure: process.env["NODE_ENV"] === "production",
9
+ sameSite: "strict",
10
+ maxAge: 7 * 24 * 60 * 60, // 7 days in seconds
11
+ path: "/",
12
+ };
13
+ /**
14
+ * Factory function to create auth routes with proper Effect-TS ManagedRuntime injection
15
+ * @param runtime - The Effect-TS ManagedRuntime with all required services
16
+ * @param authMiddleware - The configured auth middleware instance
17
+ * @returns Configured Hono router instance
18
+ */
19
+ export const createAuthRoutes = (runtime, authMiddleware) => {
20
+ const authRouter = new Hono();
21
+ /**
22
+ * POST /api/auth/register
23
+ * Register a new user
24
+ */
25
+ authRouter.post("/register", async (c) => {
26
+ const body = await c.req.json();
27
+ const { username, email, password } = body;
28
+ if (!username || !email || !password) {
29
+ return c.json({
30
+ error: "VALIDATION_ERROR",
31
+ message: "Username, email, and password are required",
32
+ }, 400);
33
+ }
34
+ // Extract IP address and user agent
35
+ const ipAddress = c.req.header("x-forwarded-for") || c.req.header("x-real-ip") || null;
36
+ const userAgent = c.req.header("user-agent") || null;
37
+ // Register user
38
+ const registerEffect = Effect.gen(function* () {
39
+ const authService = yield* AuthService;
40
+ return yield* authService.register(username, email, password, ipAddress, userAgent);
41
+ });
42
+ const result = await runtime.runPromiseExit(registerEffect);
43
+ if (result._tag === "Failure") {
44
+ const cause = result.cause;
45
+ if (cause._tag === "Fail") {
46
+ const failureError = cause.error;
47
+ if (failureError && typeof failureError === "object" && "_tag" in failureError) {
48
+ const typedError = failureError;
49
+ switch (typedError._tag) {
50
+ case "ValidationError":
51
+ return c.json({
52
+ error: "VALIDATION_ERROR",
53
+ field: typedError.field,
54
+ message: typedError.message,
55
+ }, 400);
56
+ case "AuthError":
57
+ return c.json({
58
+ error: "AUTH_ERROR",
59
+ message: typedError.message,
60
+ }, 400);
61
+ case "DatabaseError":
62
+ return c.json({
63
+ error: "INTERNAL_ERROR",
64
+ message: "Database error occurred",
65
+ }, 500);
66
+ }
67
+ }
68
+ }
69
+ return c.json({
70
+ error: "INTERNAL_ERROR",
71
+ message: "An unexpected error occurred",
72
+ }, 500);
73
+ }
74
+ const user = result.value;
75
+ return c.json({
76
+ user: {
77
+ id: user.id,
78
+ username: user.username,
79
+ email: user.email,
80
+ emailVerified: user.emailVerified,
81
+ },
82
+ }, 201);
83
+ });
84
+ /**
85
+ * POST /api/auth/login
86
+ * Login user and create session
87
+ */
88
+ authRouter.post("/login", async (c) => {
89
+ const body = await c.req.json();
90
+ const { email, password } = body;
91
+ if (!email || !password) {
92
+ return c.json({
93
+ error: "VALIDATION_ERROR",
94
+ message: "Email and password are required",
95
+ }, 400);
96
+ }
97
+ // Extract IP address and user agent
98
+ const ipAddress = c.req.header("x-forwarded-for") || c.req.header("x-real-ip") || null;
99
+ const userAgent = c.req.header("user-agent") || null;
100
+ // Login user
101
+ const loginEffect = Effect.gen(function* () {
102
+ const authService = yield* AuthService;
103
+ return yield* authService.login(email, password, ipAddress, userAgent);
104
+ });
105
+ const result = await runtime.runPromiseExit(loginEffect);
106
+ if (result._tag === "Failure") {
107
+ const cause = result.cause;
108
+ if (cause._tag === "Fail") {
109
+ const failureError = cause.error;
110
+ if (failureError && typeof failureError === "object" && "_tag" in failureError) {
111
+ const typedError = failureError;
112
+ switch (typedError._tag) {
113
+ case "AuthError":
114
+ return c.json({
115
+ error: "AUTH_ERROR",
116
+ message: typedError.message,
117
+ }, 401);
118
+ case "DatabaseError":
119
+ return c.json({
120
+ error: "INTERNAL_ERROR",
121
+ message: "Database error occurred",
122
+ }, 500);
123
+ }
124
+ }
125
+ }
126
+ return c.json({
127
+ error: "INTERNAL_ERROR",
128
+ message: "An unexpected error occurred",
129
+ }, 500);
130
+ }
131
+ const loginResult = result.value;
132
+ // Set httpOnly cookie with token
133
+ setCookie(c, "auth_token", loginResult.token, COOKIE_OPTIONS);
134
+ const response = {
135
+ user: {
136
+ id: loginResult.user.id,
137
+ username: loginResult.user.username,
138
+ email: loginResult.user.email,
139
+ emailVerified: loginResult.user.emailVerified,
140
+ },
141
+ token: loginResult.token,
142
+ };
143
+ return c.json(response, 200);
144
+ });
145
+ /**
146
+ * POST /api/auth/logout
147
+ * Logout user and revoke session
148
+ * Requires authentication
149
+ */
150
+ authRouter.post("/logout", authMiddleware, async (c) => {
151
+ const user = c.get("user");
152
+ const session = c.get("session");
153
+ // Logout user
154
+ const logoutEffect = Effect.gen(function* () {
155
+ const authService = yield* AuthService;
156
+ return yield* authService.logout(session.id, user.id);
157
+ });
158
+ const result = await runtime.runPromiseExit(logoutEffect);
159
+ if (result._tag === "Failure") {
160
+ const cause = result.cause;
161
+ if (cause._tag === "Fail") {
162
+ const failureError = cause.error;
163
+ if (failureError && typeof failureError === "object" && "_tag" in failureError) {
164
+ const typedError = failureError;
165
+ if (typedError._tag === "DatabaseError") {
166
+ return c.json({
167
+ error: "INTERNAL_ERROR",
168
+ message: "Database error occurred",
169
+ }, 500);
170
+ }
171
+ }
172
+ }
173
+ return c.json({
174
+ error: "INTERNAL_ERROR",
175
+ message: "An unexpected error occurred",
176
+ }, 500);
177
+ }
178
+ // Clear cookie
179
+ setCookie(c, "auth_token", "", {
180
+ ...COOKIE_OPTIONS,
181
+ maxAge: 0,
182
+ });
183
+ return c.json({ message: "Logged out successfully" }, 200);
184
+ });
185
+ /**
186
+ * GET /api/auth/me
187
+ * Get current authenticated user
188
+ * Requires authentication
189
+ */
190
+ authRouter.get("/me", authMiddleware, async (c) => {
191
+ try {
192
+ const user = c.get("user");
193
+ return c.json({
194
+ user: {
195
+ id: user.id,
196
+ username: user.username,
197
+ email: user.email,
198
+ emailVerified: user.emailVerified,
199
+ createdAt: user.createdAt,
200
+ lastLoginAt: user.lastLoginAt,
201
+ },
202
+ }, 200);
203
+ }
204
+ catch (error) {
205
+ return c.json({
206
+ error: "INTERNAL_ERROR",
207
+ message: "An unexpected error occurred",
208
+ }, 500);
209
+ }
210
+ });
211
+ return authRouter;
212
+ };
213
+ //# sourceMappingURL=authRoutes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authRoutes.js","sourceRoot":"","sources":["../../../../src/server/auth/routes/authRoutes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { Context, Effect, Layer } from "effect";
2
+ import { DatabaseService } from "../../database/db.js";
3
+ import { DatabaseError } from "../../../shared/types.js";
4
+ export interface CreateAuditLogData {
5
+ userId: string | null;
6
+ action: AuditAction;
7
+ resourceType?: string | null;
8
+ resourceId?: string | null;
9
+ ipAddress?: string | null;
10
+ userAgent?: string | null;
11
+ details?: string | null;
12
+ }
13
+ export type AuditAction = "USER_REGISTERED" | "USER_LOGIN" | "USER_LOGOUT" | "LOGIN_FAILED" | "PASSWORD_CHANGED" | "PASSWORD_RESET_REQUESTED" | "PASSWORD_RESET_COMPLETED" | "EMAIL_VERIFIED" | "EMAIL_CHANGED" | "PROFILE_UPDATED" | "ACCOUNT_LOCKED" | "ACCOUNT_UNLOCKED" | "SESSION_CREATED" | "SESSION_REVOKED" | "TOKEN_REFRESHED" | "OAUTH_LINKED" | "OAUTH_UNLINKED" | "TWO_FACTOR_ENABLED" | "TWO_FACTOR_DISABLED";
14
+ declare const AuditLogService_base: Context.TagClass<AuditLogService, "AuditLogService", {
15
+ readonly log: (data: CreateAuditLogData) => Effect.Effect<void, DatabaseError>;
16
+ }>;
17
+ export declare class AuditLogService extends AuditLogService_base {
18
+ static Live: Layer.Layer<AuditLogService, never, DatabaseService>;
19
+ }
20
+ export {};
21
+ //# sourceMappingURL=AuditLogService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuditLogService.d.ts","sourceRoot":"","sources":["../../../../src/server/auth/services/AuditLogService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAEhD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzD,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,WAAW,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,MAAM,WAAW,GACnB,iBAAiB,GACjB,YAAY,GACZ,aAAa,GACb,cAAc,GACd,kBAAkB,GAClB,0BAA0B,GAC1B,0BAA0B,GAC1B,gBAAgB,GAChB,eAAe,GACf,iBAAiB,GACjB,gBAAgB,GAChB,kBAAkB,GAClB,iBAAiB,GACjB,iBAAiB,GACjB,iBAAiB,GACjB,cAAc,GACd,gBAAgB,GAChB,oBAAoB,GACpB,qBAAqB,CAAC;;kBAKR,CACZ,IAAI,EAAE,kBAAkB,KACrB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC;;AAL3C,qBAAa,eAAgB,SAAQ,oBAOlC;IACD,MAAM,CAAC,IAAI,uDAmCT;CACH"}
@@ -0,0 +1,28 @@
1
+ import { Context, Effect, Layer } from "effect";
2
+ import { randomUUID } from "node:crypto";
3
+ import { DatabaseService } from "../../database/db.js";
4
+ export class AuditLogService extends Context.Tag("AuditLogService")() {
5
+ static Live = Layer.effect(this, Effect.gen(function* (_) {
6
+ const db = yield* _(DatabaseService);
7
+ const log = (data) => Effect.gen(function* (_) {
8
+ const id = randomUUID();
9
+ const now = Date.now();
10
+ yield* _(db.run(`INSERT INTO audit_logs (
11
+ id, user_id, action, resource_type, resource_id,
12
+ ip_address, user_agent, details, created_at
13
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
14
+ id,
15
+ data.userId,
16
+ data.action,
17
+ data.resourceType ?? null,
18
+ data.resourceId ?? null,
19
+ data.ipAddress ?? null,
20
+ data.userAgent ?? null,
21
+ data.details ?? null,
22
+ now,
23
+ ]));
24
+ });
25
+ return { log };
26
+ }));
27
+ }
28
+ //# sourceMappingURL=AuditLogService.js.map