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.
Files changed (157) 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 +36 -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/payloadcms-publish.md +34 -14
  144. package/src/templates/codex/commands/myai-astro-publish.md +8 -2
  145. package/src/templates/codex/commands/myai-content-writer.md +8 -2
  146. package/src/templates/codex/commands/myai-coolify-deploy.md +8 -2
  147. package/src/templates/codex/commands/myai-dev-architect.md +8 -2
  148. package/src/templates/codex/commands/myai-dev-code.md +8 -2
  149. package/src/templates/codex/commands/myai-dev-docs.md +8 -2
  150. package/src/templates/codex/commands/myai-dev-review.md +8 -2
  151. package/src/templates/codex/commands/myai-dev-test.md +8 -2
  152. package/src/templates/codex/commands/myai-docusaurus-publish.md +8 -2
  153. package/src/templates/codex/commands/myai-mintlify-publish.md +8 -2
  154. package/src/templates/codex/commands/myai-payloadcms-publish.md +17 -3
  155. package/src/templates/codex/commands/myai-sparc-workflow.md +8 -2
  156. package/src/templates/codex/commands/myai-wordpress-admin.md +8 -2
  157. package/src/templates/codex/commands/myai-wordpress-publish.md +8 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UserRepository.d.ts","sourceRoot":"","sources":["../../../../src/server/auth/services/UserRepository.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,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAE/D,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;CACvB;;qBAKoB,CACf,IAAI,EAAE,cAAc,KACjB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC;uBACpB,CACjB,EAAE,EAAE,MAAM,KACP,MAAM,CAAC,MAAM,CAAC,IAAI,GAAG,SAAS,EAAE,aAAa,CAAC;0BAC7B,CACpB,KAAK,EAAE,MAAM,KACV,MAAM,CAAC,MAAM,CAAC,IAAI,GAAG,SAAS,EAAE,aAAa,CAAC;6BAC1B,CACvB,QAAQ,EAAE,MAAM,KACb,MAAM,CAAC,MAAM,CAAC,IAAI,GAAG,SAAS,EAAE,aAAa,CAAC;qBAClC,CACf,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,KAChB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC;oCACP,CAC9B,EAAE,EAAE,MAAM,KACP,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC;gCACX,CAC1B,EAAE,EAAE,MAAM,KACP,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC;;AAxB3C,qBAAa,cAAe,SAAQ,mBA0BjC;IACD,MAAM,CAAC,IAAI,sDAqRT;CACH"}
@@ -0,0 +1,168 @@
1
+ import { Context, Effect, Layer } from "effect";
2
+ import { randomUUID } from "node:crypto";
3
+ import { DatabaseService } from "../../database/db.js";
4
+ import { DatabaseError } from "../../../shared/types.js";
5
+ export class UserRepository extends Context.Tag("UserRepository")() {
6
+ static Live = Layer.effect(this, Effect.gen(function* (_) {
7
+ const db = yield* _(DatabaseService);
8
+ const create = (data) => Effect.gen(function* (_) {
9
+ const id = randomUUID();
10
+ const now = Date.now();
11
+ yield* _(db.run(`INSERT INTO users (
12
+ id, username, email, password_hash, linux_username,
13
+ created_at, updated_at, is_active, email_verified,
14
+ failed_login_attempts, last_login_at
15
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
16
+ id,
17
+ data.username,
18
+ data.email,
19
+ data.passwordHash,
20
+ data.linuxUsername,
21
+ now,
22
+ now,
23
+ 1, // is_active = true
24
+ 0, // email_verified = false
25
+ 0, // failed_login_attempts = 0
26
+ null, // last_login_at = null
27
+ ]));
28
+ const user = yield* _(findById(id));
29
+ if (!user) {
30
+ return yield* _(Effect.fail(new DatabaseError("Failed to retrieve created user")));
31
+ }
32
+ return user;
33
+ });
34
+ const findById = (id) => Effect.gen(function* (_) {
35
+ const row = yield* _(db.get("SELECT * FROM users WHERE id = ?", [id]));
36
+ if (!row) {
37
+ return undefined;
38
+ }
39
+ return {
40
+ id: row.id,
41
+ username: row.username,
42
+ email: row.email,
43
+ passwordHash: row.password_hash,
44
+ linuxUsername: row.linux_username,
45
+ createdAt: row.created_at,
46
+ updatedAt: row.updated_at,
47
+ isActive: row.is_active === 1,
48
+ emailVerified: row.email_verified === 1,
49
+ failedLoginAttempts: row.failed_login_attempts,
50
+ lastLoginAt: row.last_login_at,
51
+ };
52
+ });
53
+ const findByEmail = (email) => Effect.gen(function* (_) {
54
+ const row = yield* _(db.get("SELECT * FROM users WHERE email = ?", [email]));
55
+ if (!row) {
56
+ return undefined;
57
+ }
58
+ return {
59
+ id: row.id,
60
+ username: row.username,
61
+ email: row.email,
62
+ passwordHash: row.password_hash,
63
+ linuxUsername: row.linux_username,
64
+ createdAt: row.created_at,
65
+ updatedAt: row.updated_at,
66
+ isActive: row.is_active === 1,
67
+ emailVerified: row.email_verified === 1,
68
+ failedLoginAttempts: row.failed_login_attempts,
69
+ lastLoginAt: row.last_login_at,
70
+ };
71
+ });
72
+ const findByUsername = (username) => Effect.gen(function* (_) {
73
+ const row = yield* _(db.get("SELECT * FROM users WHERE username = ?", [username]));
74
+ if (!row) {
75
+ return undefined;
76
+ }
77
+ return {
78
+ id: row.id,
79
+ username: row.username,
80
+ email: row.email,
81
+ passwordHash: row.password_hash,
82
+ linuxUsername: row.linux_username,
83
+ createdAt: row.created_at,
84
+ updatedAt: row.updated_at,
85
+ isActive: row.is_active === 1,
86
+ emailVerified: row.email_verified === 1,
87
+ failedLoginAttempts: row.failed_login_attempts,
88
+ lastLoginAt: row.last_login_at,
89
+ };
90
+ });
91
+ const update = (id, data) => Effect.gen(function* (_) {
92
+ const updateFields = [];
93
+ const updateValues = [];
94
+ if (data.username !== undefined) {
95
+ updateFields.push("username = ?");
96
+ updateValues.push(data.username);
97
+ }
98
+ if (data.email !== undefined) {
99
+ updateFields.push("email = ?");
100
+ updateValues.push(data.email);
101
+ }
102
+ if (data.passwordHash !== undefined) {
103
+ updateFields.push("password_hash = ?");
104
+ updateValues.push(data.passwordHash);
105
+ }
106
+ if (data.linuxUsername !== undefined) {
107
+ updateFields.push("linux_username = ?");
108
+ updateValues.push(data.linuxUsername);
109
+ }
110
+ if (data.isActive !== undefined) {
111
+ updateFields.push("is_active = ?");
112
+ updateValues.push(data.isActive ? 1 : 0);
113
+ }
114
+ if (data.emailVerified !== undefined) {
115
+ updateFields.push("email_verified = ?");
116
+ updateValues.push(data.emailVerified ? 1 : 0);
117
+ }
118
+ if (data.failedLoginAttempts !== undefined) {
119
+ updateFields.push("failed_login_attempts = ?");
120
+ updateValues.push(data.failedLoginAttempts);
121
+ }
122
+ if (data.lastLoginAt !== undefined) {
123
+ updateFields.push("last_login_at = ?");
124
+ updateValues.push(data.lastLoginAt);
125
+ }
126
+ // Always update updated_at
127
+ updateFields.push("updated_at = ?");
128
+ updateValues.push(Date.now());
129
+ if (updateFields.length === 1) {
130
+ // Only updated_at, nothing to update
131
+ const user = yield* _(findById(id));
132
+ if (!user) {
133
+ return yield* _(Effect.fail(new DatabaseError("User not found")));
134
+ }
135
+ return user;
136
+ }
137
+ updateValues.push(id);
138
+ yield* _(db.run(`UPDATE users SET ${updateFields.join(", ")} WHERE id = ?`, updateValues));
139
+ const user = yield* _(findById(id));
140
+ if (!user) {
141
+ return yield* _(Effect.fail(new DatabaseError("User not found after update")));
142
+ }
143
+ return user;
144
+ });
145
+ const incrementFailedLogins = (id) => Effect.gen(function* (_) {
146
+ yield* _(db.run(`UPDATE users
147
+ SET failed_login_attempts = failed_login_attempts + 1,
148
+ updated_at = ?
149
+ WHERE id = ?`, [Date.now(), id]));
150
+ });
151
+ const resetFailedLogins = (id) => Effect.gen(function* (_) {
152
+ yield* _(db.run(`UPDATE users
153
+ SET failed_login_attempts = 0,
154
+ updated_at = ?
155
+ WHERE id = ?`, [Date.now(), id]));
156
+ });
157
+ return {
158
+ create,
159
+ findById,
160
+ findByEmail,
161
+ findByUsername,
162
+ update,
163
+ incrementFailedLogins,
164
+ resetFailedLogins,
165
+ };
166
+ }));
167
+ }
168
+ //# sourceMappingURL=UserRepository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UserRepository.js","sourceRoot":"","sources":["../../../../src/server/auth/services/UserRepository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Example usage of authentication services
3
+ *
4
+ * This file demonstrates how to use all authentication services together
5
+ * following Effect-TS patterns from the ccviewer codebase.
6
+ */
7
+ import { Effect, Layer } from "effect";
8
+ import { DatabaseService } from "../../database/db.js";
9
+ import { PasswordService, TokenService, UserRepository, SessionRepository, AuditLogService } from "./index.js";
10
+ export declare const registerUser: (username: string, email: string, password: string, linuxUsername: string, ipAddress: string | null, userAgent: string | null) => Effect.Effect<import("../../../shared/types.js").User, import("../../../shared/types.js").DatabaseError | import("../../../shared/types.js").AuthError | import("../../../shared/types.js").ValidationError, PasswordService | UserRepository | AuditLogService>;
11
+ export declare const loginUser: (email: string, password: string, ipAddress: string | null, userAgent: string | null) => Effect.Effect<{
12
+ user: import("../../../shared/types.js").User;
13
+ token: string;
14
+ session: import("../../../shared/types.js").Session;
15
+ }, import("../../../shared/types.js").DatabaseError | import("../../../shared/types.js").AuthError | Error, SessionRepository | PasswordService | TokenService | UserRepository | AuditLogService>;
16
+ export declare const verifyToken: (token: string) => Effect.Effect<{
17
+ user: import("../../../shared/types.js").User;
18
+ session: import("../../../shared/types.js").Session;
19
+ payload: import("../../../shared/types.js").JWTPayload;
20
+ }, import("../../../shared/types.js").DatabaseError | import("../../../shared/types.js").AuthError | Error, SessionRepository | TokenService | UserRepository>;
21
+ export declare const logoutUser: (token: string) => Effect.Effect<{
22
+ success: boolean;
23
+ }, import("../../../shared/types.js").DatabaseError | import("../../../shared/types.js").AuthError | Error, SessionRepository | TokenService | AuditLogService>;
24
+ export declare const AuthenticationLayer: Layer.Layer<SessionRepository | PasswordService | TokenService | UserRepository | AuditLogService, import("../../../shared/types.js").AuthError, DatabaseService>;
25
+ export declare const runAuthExample: () => Promise<void>;
26
+ //# sourceMappingURL=example.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"example.d.ts","sourceRoot":"","sources":["../../../../src/server/auth/services/example.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EACL,eAAe,EACf,YAAY,EACZ,cAAc,EACd,iBAAiB,EACjB,eAAe,EAEhB,MAAM,YAAY,CAAC;AAGpB,eAAO,MAAM,YAAY,GACvB,UAAU,MAAM,EAChB,OAAO,MAAM,EACb,UAAU,MAAM,EAChB,eAAe,MAAM,EACrB,WAAW,MAAM,GAAG,IAAI,EACxB,WAAW,MAAM,GAAG,IAAI,qQAqCtB,CAAC;AAGL,eAAO,MAAM,SAAS,GACpB,OAAO,MAAM,EACb,UAAU,MAAM,EAChB,WAAW,MAAM,GAAG,IAAI,EACxB,WAAW,MAAM,GAAG,IAAI;;;;kMAgItB,CAAC;AAGL,eAAO,MAAM,WAAW,GAAI,OAAO,MAAM;;;;8JAyCrC,CAAC;AAGL,eAAO,MAAM,UAAU,GAAI,OAAO,MAAM;;+JAiCpC,CAAC;AAGL,eAAO,MAAM,mBAAmB,mKAM/B,CAAC;AAGF,eAAO,MAAM,cAAc,qBAqD1B,CAAC"}
@@ -0,0 +1,221 @@
1
+ /**
2
+ * Example usage of authentication services
3
+ *
4
+ * This file demonstrates how to use all authentication services together
5
+ * following Effect-TS patterns from the ccviewer codebase.
6
+ */
7
+ import { Effect, Layer } from "effect";
8
+ import { DatabaseService } from "../../database/db.js";
9
+ import { PasswordService, TokenService, UserRepository, SessionRepository, AuditLogService, } from "./index.js";
10
+ // Example: Complete user registration flow
11
+ export const registerUser = (username, email, password, linuxUsername, ipAddress, userAgent) => Effect.gen(function* (_) {
12
+ // Get services
13
+ const passwordService = yield* _(PasswordService);
14
+ const userRepo = yield* _(UserRepository);
15
+ const auditLog = yield* _(AuditLogService);
16
+ // Validate password strength
17
+ yield* _(passwordService.validatePasswordStrength(password));
18
+ // Hash the password
19
+ const passwordHash = yield* _(passwordService.hash(password));
20
+ // Create user data
21
+ const userData = {
22
+ username,
23
+ email,
24
+ passwordHash,
25
+ linuxUsername,
26
+ };
27
+ // Create user in database
28
+ const user = yield* _(userRepo.create(userData));
29
+ // Log the registration
30
+ yield* _(auditLog.log({
31
+ userId: user.id,
32
+ action: "USER_REGISTERED",
33
+ ipAddress,
34
+ userAgent,
35
+ details: JSON.stringify({ username, email }),
36
+ }));
37
+ return user;
38
+ });
39
+ // Example: Complete login flow
40
+ export const loginUser = (email, password, ipAddress, userAgent) => Effect.gen(function* (_) {
41
+ // Get services
42
+ const passwordService = yield* _(PasswordService);
43
+ const tokenService = yield* _(TokenService);
44
+ const userRepo = yield* _(UserRepository);
45
+ const sessionRepo = yield* _(SessionRepository);
46
+ const auditLog = yield* _(AuditLogService);
47
+ // Find user by email
48
+ const user = yield* _(userRepo.findByEmail(email));
49
+ if (!user) {
50
+ // Log failed login attempt
51
+ yield* _(auditLog.log({
52
+ userId: null,
53
+ action: "LOGIN_FAILED",
54
+ ipAddress,
55
+ userAgent,
56
+ details: JSON.stringify({ email, reason: "User not found" }),
57
+ }));
58
+ return yield* _(Effect.fail(new Error("Invalid email or password")));
59
+ }
60
+ // Check if user is active
61
+ if (!user.isActive) {
62
+ yield* _(auditLog.log({
63
+ userId: user.id,
64
+ action: "LOGIN_FAILED",
65
+ ipAddress,
66
+ userAgent,
67
+ details: JSON.stringify({ reason: "Account inactive" }),
68
+ }));
69
+ return yield* _(Effect.fail(new Error("Account is inactive")));
70
+ }
71
+ // Check if password hash exists
72
+ if (!user.passwordHash) {
73
+ yield* _(auditLog.log({
74
+ userId: user.id,
75
+ action: "LOGIN_FAILED",
76
+ ipAddress,
77
+ userAgent,
78
+ details: JSON.stringify({ reason: "No password set" }),
79
+ }));
80
+ return yield* _(Effect.fail(new Error("Invalid email or password")));
81
+ }
82
+ // Verify password
83
+ const isValid = yield* _(passwordService.verify(password, user.passwordHash));
84
+ if (!isValid) {
85
+ // Increment failed login attempts
86
+ yield* _(userRepo.incrementFailedLogins(user.id));
87
+ yield* _(auditLog.log({
88
+ userId: user.id,
89
+ action: "LOGIN_FAILED",
90
+ ipAddress,
91
+ userAgent,
92
+ details: JSON.stringify({ reason: "Invalid password" }),
93
+ }));
94
+ return yield* _(Effect.fail(new Error("Invalid email or password")));
95
+ }
96
+ // Reset failed login attempts on successful login
97
+ yield* _(userRepo.resetFailedLogins(user.id));
98
+ // Generate JWT token
99
+ const tokenPayload = {
100
+ sub: user.id,
101
+ username: user.username,
102
+ email: user.email,
103
+ jti: "", // Will be set to session ID
104
+ };
105
+ const token = yield* _(tokenService.generateToken(tokenPayload));
106
+ // Hash the token for storage
107
+ const tokenHash = yield* _(tokenService.hashToken(token));
108
+ // Verify token to get the actual payload with jti
109
+ const verifiedPayload = yield* _(tokenService.verifyToken(token));
110
+ // Create session
111
+ const session = yield* _(sessionRepo.create({
112
+ userId: user.id,
113
+ tokenHash,
114
+ ipAddress,
115
+ userAgent,
116
+ expiresAt: verifiedPayload.exp * 1000, // Convert to milliseconds
117
+ }));
118
+ // Update last login timestamp
119
+ yield* _(userRepo.update(user.id, {
120
+ lastLoginAt: Date.now(),
121
+ }));
122
+ // Log successful login
123
+ yield* _(auditLog.log({
124
+ userId: user.id,
125
+ action: "USER_LOGIN",
126
+ resourceType: "session",
127
+ resourceId: session.id,
128
+ ipAddress,
129
+ userAgent,
130
+ }));
131
+ return { user, token, session };
132
+ });
133
+ // Example: Verify and validate a token
134
+ export const verifyToken = (token) => Effect.gen(function* (_) {
135
+ const tokenService = yield* _(TokenService);
136
+ const sessionRepo = yield* _(SessionRepository);
137
+ const userRepo = yield* _(UserRepository);
138
+ // Verify token signature and expiration
139
+ const payload = yield* _(tokenService.verifyToken(token));
140
+ // Hash the token to look up session
141
+ const tokenHash = yield* _(tokenService.hashToken(token));
142
+ // Find session by token hash
143
+ const session = yield* _(sessionRepo.findByTokenHash(tokenHash));
144
+ if (!session) {
145
+ return yield* _(Effect.fail(new Error("Session not found")));
146
+ }
147
+ // Check if session is revoked
148
+ if (session.isRevoked) {
149
+ return yield* _(Effect.fail(new Error("Session has been revoked")));
150
+ }
151
+ // Check if session is expired
152
+ if (session.expiresAt < Date.now()) {
153
+ return yield* _(Effect.fail(new Error("Session has expired")));
154
+ }
155
+ // Get user
156
+ const user = yield* _(userRepo.findById(payload.sub));
157
+ if (!user) {
158
+ return yield* _(Effect.fail(new Error("User not found")));
159
+ }
160
+ if (!user.isActive) {
161
+ return yield* _(Effect.fail(new Error("User account is inactive")));
162
+ }
163
+ return { user, session, payload };
164
+ });
165
+ // Example: Logout user
166
+ export const logoutUser = (token) => Effect.gen(function* (_) {
167
+ const tokenService = yield* _(TokenService);
168
+ const sessionRepo = yield* _(SessionRepository);
169
+ const auditLog = yield* _(AuditLogService);
170
+ // Verify token
171
+ const payload = yield* _(tokenService.verifyToken(token));
172
+ // Hash token to find session
173
+ const tokenHash = yield* _(tokenService.hashToken(token));
174
+ // Find session
175
+ const session = yield* _(sessionRepo.findByTokenHash(tokenHash));
176
+ if (!session) {
177
+ return yield* _(Effect.fail(new Error("Session not found")));
178
+ }
179
+ // Revoke session
180
+ yield* _(sessionRepo.revoke(session.id));
181
+ // Log logout
182
+ yield* _(auditLog.log({
183
+ userId: payload.sub,
184
+ action: "USER_LOGOUT",
185
+ resourceType: "session",
186
+ resourceId: session.id,
187
+ }));
188
+ return { success: true };
189
+ });
190
+ // Example: Create the complete authentication layer
191
+ export const AuthenticationLayer = Layer.mergeAll(PasswordService.Live, TokenService.Live, UserRepository.Live, SessionRepository.Live, AuditLogService.Live);
192
+ // Example: Run a complete authentication flow with all dependencies
193
+ export const runAuthExample = () => {
194
+ const program = Effect.gen(function* (_) {
195
+ // Register a new user
196
+ const user = yield* _(registerUser("johndoe", "john@example.com", "SecurePass123", "john-doe", "127.0.0.1", "Mozilla/5.0"));
197
+ console.log("User registered:", user);
198
+ // Login the user
199
+ const loginResult = yield* _(loginUser("john@example.com", "SecurePass123", "127.0.0.1", "Mozilla/5.0"));
200
+ console.log("Login successful:", loginResult);
201
+ // Verify the token
202
+ const verifyResult = yield* _(verifyToken(loginResult.token));
203
+ console.log("Token verified:", verifyResult);
204
+ // Logout the user
205
+ const logoutResult = yield* _(logoutUser(loginResult.token));
206
+ console.log("Logout successful:", logoutResult);
207
+ });
208
+ // Create database configuration
209
+ const dbConfig = {
210
+ path: "./auth-example.db",
211
+ };
212
+ // Combine all layers - properly merging DatabaseService with AuthenticationLayer
213
+ const AppLayer = DatabaseService.Live(dbConfig).pipe(Layer.provideMerge(AuthenticationLayer));
214
+ // Run the program with all dependencies provided
215
+ // Effect-TS Layer type inference limitation
216
+ // @ts-ignore
217
+ return Effect.runPromise(Effect.provide(program, AppLayer));
218
+ };
219
+ // Uncomment to run the example:
220
+ // runAuthExample().catch(console.error);
221
+ //# sourceMappingURL=example.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"example.js","sourceRoot":"","sources":["../../../../src/server/auth/services/example.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export * from "./PasswordService.js";
2
+ export * from "./TokenService.js";
3
+ export * from "./UserRepository.js";
4
+ export * from "./SessionRepository.js";
5
+ export * from "./AuditLogService.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/server/auth/services/index.ts"],"names":[],"mappings":"AACA,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC"}
@@ -0,0 +1,7 @@
1
+ // Export all authentication services
2
+ export * from "./PasswordService.js";
3
+ export * from "./TokenService.js";
4
+ export * from "./UserRepository.js";
5
+ export * from "./SessionRepository.js";
6
+ export * from "./AuditLogService.js";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/server/auth/services/index.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC"}
@@ -0,0 +1,28 @@
1
+ import Database from "better-sqlite3";
2
+ import { Context, Effect, Layer } from "effect";
3
+ export declare class DatabaseError {
4
+ readonly message: string;
5
+ readonly cause?: unknown | undefined;
6
+ readonly _tag = "DatabaseError";
7
+ constructor(message: string, cause?: unknown | undefined);
8
+ }
9
+ export interface DatabaseConfig {
10
+ readonly path: string;
11
+ readonly readOnly?: boolean;
12
+ readonly fileMustExist?: boolean;
13
+ readonly timeout?: number;
14
+ readonly verbose?: boolean;
15
+ }
16
+ declare const DatabaseService_base: Context.TagClass<DatabaseService, "DatabaseService", {
17
+ readonly db: Database.Database;
18
+ readonly run: <T = Database.RunResult>(sql: string, params?: unknown[]) => Effect.Effect<T, DatabaseError>;
19
+ readonly get: <T = unknown>(sql: string, params?: unknown[]) => Effect.Effect<T | undefined, DatabaseError>;
20
+ readonly all: <T = unknown>(sql: string, params?: unknown[]) => Effect.Effect<T[], DatabaseError>;
21
+ readonly exec: (sql: string) => Effect.Effect<void, DatabaseError>;
22
+ readonly close: () => Effect.Effect<void, DatabaseError>;
23
+ }>;
24
+ export declare class DatabaseService extends DatabaseService_base {
25
+ static Live: (config: DatabaseConfig) => Layer.Layer<DatabaseService, DatabaseError, never>;
26
+ }
27
+ export {};
28
+ //# sourceMappingURL=db.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../../src/server/database/db.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAQhD,qBAAa,aAAa;IAEZ,QAAQ,CAAC,OAAO,EAAE,MAAM;IAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO;IAD9D,QAAQ,CAAC,IAAI,mBAAmB;gBACX,OAAO,EAAE,MAAM,EAAW,KAAK,CAAC,EAAE,OAAO,YAAA;CAC/D;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;;iBAKgB,QAAQ,CAAC,QAAQ;kBAChB,CAAC,CAAC,GAAG,QAAQ,CAAC,SAAS,EACnC,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,OAAO,EAAE,KACf,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,aAAa,CAAC;kBACtB,CAAC,CAAC,GAAG,OAAO,EACxB,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,OAAO,EAAE,KACf,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,SAAS,EAAE,aAAa,CAAC;kBAClC,CAAC,CAAC,GAAG,OAAO,EACxB,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,OAAO,EAAE,KACf,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,aAAa,CAAC;mBACvB,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC;oBAClD,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC;;AAjB5D,qBAAa,eAAgB,SAAQ,oBAmBlC;IACD,MAAM,CAAC,IAAI,GAAI,QAAQ,cAAc,wDAqHjC;CACL"}
@@ -0,0 +1,91 @@
1
+ import Database from "better-sqlite3";
2
+ import { Context, Effect, Layer } from "effect";
3
+ import { readFileSync } from "node:fs";
4
+ import { fileURLToPath } from "node:url";
5
+ import { dirname, join } from "node:path";
6
+ const __filename = fileURLToPath(import.meta.url);
7
+ const __dirname = dirname(__filename);
8
+ export class DatabaseError {
9
+ message;
10
+ cause;
11
+ _tag = "DatabaseError";
12
+ constructor(message, cause) {
13
+ this.message = message;
14
+ this.cause = cause;
15
+ }
16
+ }
17
+ export class DatabaseService extends Context.Tag("DatabaseService")() {
18
+ static Live = (config) => Layer.effect(this, Effect.gen(function* (_) {
19
+ const db = yield* _(Effect.try({
20
+ try: () => {
21
+ const options = {};
22
+ if (config.readOnly !== undefined) {
23
+ options.readonly = config.readOnly;
24
+ }
25
+ if (config.fileMustExist !== undefined) {
26
+ options.fileMustExist = config.fileMustExist;
27
+ }
28
+ if (config.timeout !== undefined) {
29
+ options.timeout = config.timeout;
30
+ }
31
+ if (config.verbose) {
32
+ options.verbose = (message) => console.log(message);
33
+ }
34
+ return new Database(config.path, options);
35
+ },
36
+ catch: (error) => new DatabaseError("Failed to open database", error),
37
+ }));
38
+ yield* _(Effect.try({
39
+ try: () => {
40
+ db.pragma("journal_mode = WAL");
41
+ db.pragma("foreign_keys = ON");
42
+ db.pragma("synchronous = NORMAL");
43
+ },
44
+ catch: (error) => new DatabaseError("Failed to set pragmas", error),
45
+ }));
46
+ const schemaPath = join(__dirname, "schema.sql");
47
+ const schema = yield* _(Effect.try({
48
+ try: () => readFileSync(schemaPath, "utf-8"),
49
+ catch: (error) => new DatabaseError("Failed to read schema file", error),
50
+ }));
51
+ yield* _(Effect.try({
52
+ try: () => db.exec(schema),
53
+ catch: (error) => new DatabaseError("Failed to initialize schema", error),
54
+ }));
55
+ const run = (sql, params) => Effect.try({
56
+ try: () => {
57
+ const stmt = db.prepare(sql);
58
+ return stmt.run(...(params ?? []));
59
+ },
60
+ catch: (error) => new DatabaseError("Query execution failed", error),
61
+ });
62
+ const get = (sql, params) => Effect.try({
63
+ try: () => {
64
+ const stmt = db.prepare(sql);
65
+ return stmt.get(...(params ?? []));
66
+ },
67
+ catch: (error) => new DatabaseError("Query execution failed", error),
68
+ });
69
+ const all = (sql, params) => Effect.try({
70
+ try: () => {
71
+ const stmt = db.prepare(sql);
72
+ return stmt.all(...(params ?? []));
73
+ },
74
+ catch: (error) => new DatabaseError("Query execution failed", error),
75
+ });
76
+ const exec = (sql) => Effect.try({
77
+ try: () => {
78
+ db.exec(sql);
79
+ },
80
+ catch: (error) => new DatabaseError("Exec failed", error),
81
+ });
82
+ const close = () => Effect.try({
83
+ try: () => {
84
+ db.close();
85
+ },
86
+ catch: (error) => new DatabaseError("Close failed", error),
87
+ });
88
+ return { db, run, get, all, exec, close };
89
+ }));
90
+ }
91
+ //# sourceMappingURL=db.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../../../src/server/database/db.ts"],"names":[],"mappings":"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"}