myaidev-method 0.2.8 → 0.2.9
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/.claude/agents/wordpress-admin.md +271 -0
- package/.env.example +0 -1
- package/PACKAGE_FIXES_SUMMARY.md +319 -0
- package/PAYLOADCMS_AUTH_UPDATE.md +248 -0
- package/USER_GUIDE.md +260 -0
- package/bin/cli.js +36 -0
- package/dist/server/.tsbuildinfo +1 -0
- package/dist/server/auth/controllers/AuthController.d.ts +34 -0
- package/dist/server/auth/controllers/AuthController.d.ts.map +1 -0
- package/dist/server/auth/controllers/AuthController.js +43 -0
- package/dist/server/auth/controllers/AuthController.js.map +1 -0
- package/dist/server/auth/example-usage.d.ts +53 -0
- package/dist/server/auth/example-usage.d.ts.map +1 -0
- package/dist/server/auth/example-usage.js +129 -0
- package/dist/server/auth/example-usage.js.map +1 -0
- package/dist/server/auth/index.d.ts +11 -0
- package/dist/server/auth/index.d.ts.map +1 -0
- package/dist/server/auth/index.js +15 -0
- package/dist/server/auth/index.js.map +1 -0
- package/dist/server/auth/layers.d.ts +19 -0
- package/dist/server/auth/layers.d.ts.map +1 -0
- package/dist/server/auth/layers.js +33 -0
- package/dist/server/auth/layers.js.map +1 -0
- package/dist/server/auth/middleware/authMiddleware.d.ts +24 -0
- package/dist/server/auth/middleware/authMiddleware.d.ts.map +1 -0
- package/dist/server/auth/middleware/authMiddleware.js +65 -0
- package/dist/server/auth/middleware/authMiddleware.js.map +1 -0
- package/dist/server/auth/routes/authRoutes.d.ts +11 -0
- package/dist/server/auth/routes/authRoutes.d.ts.map +1 -0
- package/dist/server/auth/routes/authRoutes.js +213 -0
- package/dist/server/auth/routes/authRoutes.js.map +1 -0
- package/dist/server/auth/services/AuditLogService.d.ts +21 -0
- package/dist/server/auth/services/AuditLogService.d.ts.map +1 -0
- package/dist/server/auth/services/AuditLogService.js +28 -0
- package/dist/server/auth/services/AuditLogService.js.map +1 -0
- package/dist/server/auth/services/AuthService.d.ts +27 -0
- package/dist/server/auth/services/AuthService.d.ts.map +1 -0
- package/dist/server/auth/services/AuthService.js +246 -0
- package/dist/server/auth/services/AuthService.js.map +1 -0
- package/dist/server/auth/services/PasswordService.d.ts +12 -0
- package/dist/server/auth/services/PasswordService.d.ts.map +1 -0
- package/dist/server/auth/services/PasswordService.js +31 -0
- package/dist/server/auth/services/PasswordService.js.map +1 -0
- package/dist/server/auth/services/SessionRepository.d.ts +24 -0
- package/dist/server/auth/services/SessionRepository.d.ts.map +1 -0
- package/dist/server/auth/services/SessionRepository.js +101 -0
- package/dist/server/auth/services/SessionRepository.js.map +1 -0
- package/dist/server/auth/services/TokenService.d.ts +12 -0
- package/dist/server/auth/services/TokenService.d.ts.map +1 -0
- package/dist/server/auth/services/TokenService.js +86 -0
- package/dist/server/auth/services/TokenService.js.map +1 -0
- package/dist/server/auth/services/UserRepository.d.ts +23 -0
- package/dist/server/auth/services/UserRepository.d.ts.map +1 -0
- package/dist/server/auth/services/UserRepository.js +168 -0
- package/dist/server/auth/services/UserRepository.js.map +1 -0
- package/dist/server/auth/services/example.d.ts +26 -0
- package/dist/server/auth/services/example.d.ts.map +1 -0
- package/dist/server/auth/services/example.js +221 -0
- package/dist/server/auth/services/example.js.map +1 -0
- package/dist/server/auth/services/index.d.ts +6 -0
- package/dist/server/auth/services/index.d.ts.map +1 -0
- package/dist/server/auth/services/index.js +7 -0
- package/dist/server/auth/services/index.js.map +1 -0
- package/dist/server/database/db.d.ts +28 -0
- package/dist/server/database/db.d.ts.map +1 -0
- package/dist/server/database/db.js +91 -0
- package/dist/server/database/db.js.map +1 -0
- package/dist/server/database/schema.sql +95 -0
- package/dist/server/hono/app.d.ts +10 -0
- package/dist/server/hono/app.d.ts.map +1 -0
- package/dist/server/hono/app.js +26 -0
- package/dist/server/hono/app.js.map +1 -0
- package/dist/server/hono/routes.d.ts +12 -0
- package/dist/server/hono/routes.d.ts.map +1 -0
- package/dist/server/hono/routes.js +40 -0
- package/dist/server/hono/routes.js.map +1 -0
- package/dist/server/main.d.ts +2 -0
- package/dist/server/main.d.ts.map +1 -0
- package/dist/server/main.js +94 -0
- package/dist/server/main.js.map +1 -0
- package/dist/server/user-management/DirectoryService.d.ts +62 -0
- package/dist/server/user-management/DirectoryService.d.ts.map +1 -0
- package/dist/server/user-management/DirectoryService.js +201 -0
- package/dist/server/user-management/DirectoryService.js.map +1 -0
- package/dist/server/user-management/LinuxUserService.d.ts +71 -0
- package/dist/server/user-management/LinuxUserService.d.ts.map +1 -0
- package/dist/server/user-management/LinuxUserService.js +192 -0
- package/dist/server/user-management/LinuxUserService.js.map +1 -0
- package/dist/server/user-management/QuotaService.d.ts +59 -0
- package/dist/server/user-management/QuotaService.d.ts.map +1 -0
- package/dist/server/user-management/QuotaService.js +148 -0
- package/dist/server/user-management/QuotaService.js.map +1 -0
- package/dist/server/user-management/UserManagementService.d.ts +74 -0
- package/dist/server/user-management/UserManagementService.d.ts.map +1 -0
- package/dist/server/user-management/UserManagementService.js +122 -0
- package/dist/server/user-management/UserManagementService.js.map +1 -0
- package/dist/server/user-management/index.d.ts +26 -0
- package/dist/server/user-management/index.d.ts.map +1 -0
- package/dist/server/user-management/index.js +26 -0
- package/dist/server/user-management/index.js.map +1 -0
- package/dist/server/user-management/layers.d.ts +27 -0
- package/dist/server/user-management/layers.d.ts.map +1 -0
- package/dist/server/user-management/layers.js +37 -0
- package/dist/server/user-management/layers.js.map +1 -0
- package/dist/shared/types.d.ts +94 -0
- package/dist/shared/types.d.ts.map +1 -0
- package/dist/shared/types.js +32 -0
- package/dist/shared/types.js.map +1 -0
- package/package.json +25 -5
- package/src/lib/payloadcms-utils.js +5 -12
- package/src/server/auth/ARCHITECTURE.md +575 -0
- package/src/server/auth/IMPLEMENTATION_SUMMARY.md +287 -0
- package/src/server/auth/QUICK_START.md +283 -0
- package/src/server/auth/README.md +290 -0
- package/src/server/auth/controllers/AuthController.ts +129 -0
- package/src/server/auth/example-usage.ts +159 -0
- package/src/server/auth/index.ts +19 -0
- package/src/server/auth/layers.ts +57 -0
- package/src/server/auth/middleware/authMiddleware.ts +118 -0
- package/src/server/auth/routes/authRoutes.ts +319 -0
- package/src/server/auth/services/AuditLogService.ts +81 -0
- package/src/server/auth/services/AuthService.ts +408 -0
- package/src/server/auth/services/IMPLEMENTATION_SUMMARY.md +404 -0
- package/src/server/auth/services/PasswordService.ts +85 -0
- package/src/server/auth/services/README.md +361 -0
- package/src/server/auth/services/SessionRepository.ts +227 -0
- package/src/server/auth/services/TokenService.ts +174 -0
- package/src/server/auth/services/UserRepository.ts +318 -0
- package/src/server/auth/services/example.ts +346 -0
- package/src/server/auth/services/index.ts +6 -0
- package/src/server/database/db.ts +161 -0
- package/src/server/database/schema.sql +95 -0
- package/src/server/hono/app.ts +41 -0
- package/src/server/main.ts +115 -0
- package/src/server/user-management/DirectoryService.ts +348 -0
- package/src/server/user-management/LinuxUserService.ts +338 -0
- package/src/server/user-management/QuotaService.ts +256 -0
- package/src/server/user-management/README.md +333 -0
- package/src/server/user-management/UserManagementService.ts +335 -0
- package/src/server/user-management/index.ts +26 -0
- package/src/server/user-management/layers.ts +51 -0
- package/src/shared/types.ts +111 -0
- package/src/templates/claude/agents/payloadcms-publish.md +34 -14
- package/src/templates/codex/commands/myai-astro-publish.md +8 -2
- package/src/templates/codex/commands/myai-content-writer.md +8 -2
- package/src/templates/codex/commands/myai-coolify-deploy.md +8 -2
- package/src/templates/codex/commands/myai-dev-architect.md +8 -2
- package/src/templates/codex/commands/myai-dev-code.md +8 -2
- package/src/templates/codex/commands/myai-dev-docs.md +8 -2
- package/src/templates/codex/commands/myai-dev-review.md +8 -2
- package/src/templates/codex/commands/myai-dev-test.md +8 -2
- package/src/templates/codex/commands/myai-docusaurus-publish.md +8 -2
- package/src/templates/codex/commands/myai-mintlify-publish.md +8 -2
- package/src/templates/codex/commands/myai-payloadcms-publish.md +17 -3
- package/src/templates/codex/commands/myai-sparc-workflow.md +8 -2
- package/src/templates/codex/commands/myai-wordpress-admin.md +8 -2
- 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
|