@commonpub/server 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +59 -0
  3. package/dist/admin/admin.d.ts +113 -0
  4. package/dist/admin/admin.d.ts.map +1 -0
  5. package/dist/admin/admin.js +426 -0
  6. package/dist/admin/admin.js.map +1 -0
  7. package/dist/admin/index.d.ts +3 -0
  8. package/dist/admin/index.d.ts.map +1 -0
  9. package/dist/admin/index.js +2 -0
  10. package/dist/admin/index.js.map +1 -0
  11. package/dist/content/content.d.ts +39 -0
  12. package/dist/content/content.d.ts.map +1 -0
  13. package/dist/content/content.js +507 -0
  14. package/dist/content/content.js.map +1 -0
  15. package/dist/content/index.d.ts +3 -0
  16. package/dist/content/index.d.ts.map +1 -0
  17. package/dist/content/index.js +2 -0
  18. package/dist/content/index.js.map +1 -0
  19. package/dist/contest/contest.d.ts +92 -0
  20. package/dist/contest/contest.d.ts.map +1 -0
  21. package/dist/contest/contest.js +343 -0
  22. package/dist/contest/contest.js.map +1 -0
  23. package/dist/contest/index.d.ts +3 -0
  24. package/dist/contest/index.d.ts.map +1 -0
  25. package/dist/contest/index.js +2 -0
  26. package/dist/contest/index.js.map +1 -0
  27. package/dist/docs/docs.d.ts +71 -0
  28. package/dist/docs/docs.d.ts.map +1 -0
  29. package/dist/docs/docs.js +398 -0
  30. package/dist/docs/docs.js.map +1 -0
  31. package/dist/docs/index.d.ts +2 -0
  32. package/dist/docs/index.d.ts.map +1 -0
  33. package/dist/docs/index.js +2 -0
  34. package/dist/docs/index.js.map +1 -0
  35. package/dist/email.d.ts +3 -0
  36. package/dist/email.d.ts.map +1 -0
  37. package/dist/email.js +3 -0
  38. package/dist/email.js.map +1 -0
  39. package/dist/federation/federation.d.ts +46 -0
  40. package/dist/federation/federation.d.ts.map +1 -0
  41. package/dist/federation/federation.js +308 -0
  42. package/dist/federation/federation.js.map +1 -0
  43. package/dist/federation/index.d.ts +2 -0
  44. package/dist/federation/index.d.ts.map +1 -0
  45. package/dist/federation/index.js +2 -0
  46. package/dist/federation/index.js.map +1 -0
  47. package/dist/hub/hub.d.ts +110 -0
  48. package/dist/hub/hub.d.ts.map +1 -0
  49. package/dist/hub/hub.js +917 -0
  50. package/dist/hub/hub.js.map +1 -0
  51. package/dist/hub/index.d.ts +2 -0
  52. package/dist/hub/index.d.ts.map +1 -0
  53. package/dist/hub/index.js +2 -0
  54. package/dist/hub/index.js.map +1 -0
  55. package/dist/image.d.ts +3 -0
  56. package/dist/image.d.ts.map +1 -0
  57. package/dist/image.js +3 -0
  58. package/dist/image.js.map +1 -0
  59. package/dist/index.d.ts +38 -0
  60. package/dist/index.d.ts.map +1 -0
  61. package/dist/index.js +43 -0
  62. package/dist/index.js.map +1 -0
  63. package/dist/learning/index.d.ts +6 -0
  64. package/dist/learning/index.d.ts.map +1 -0
  65. package/dist/learning/index.js +6 -0
  66. package/dist/learning/index.js.map +1 -0
  67. package/dist/learning/learning.d.ts +85 -0
  68. package/dist/learning/learning.d.ts.map +1 -0
  69. package/dist/learning/learning.js +681 -0
  70. package/dist/learning/learning.js.map +1 -0
  71. package/dist/messaging/index.d.ts +3 -0
  72. package/dist/messaging/index.d.ts.map +1 -0
  73. package/dist/messaging/index.js +2 -0
  74. package/dist/messaging/index.js.map +1 -0
  75. package/dist/messaging/messaging.d.ts +27 -0
  76. package/dist/messaging/messaging.d.ts.map +1 -0
  77. package/dist/messaging/messaging.js +132 -0
  78. package/dist/messaging/messaging.js.map +1 -0
  79. package/dist/notification/index.d.ts +3 -0
  80. package/dist/notification/index.d.ts.map +1 -0
  81. package/dist/notification/index.js +2 -0
  82. package/dist/notification/index.js.map +1 -0
  83. package/dist/notification/notification.d.ts +38 -0
  84. package/dist/notification/notification.d.ts.map +1 -0
  85. package/dist/notification/notification.js +92 -0
  86. package/dist/notification/notification.js.map +1 -0
  87. package/dist/oauthCodes.d.ts +14 -0
  88. package/dist/oauthCodes.d.ts.map +1 -0
  89. package/dist/oauthCodes.js +40 -0
  90. package/dist/oauthCodes.js.map +1 -0
  91. package/dist/product/index.d.ts +3 -0
  92. package/dist/product/index.d.ts.map +1 -0
  93. package/dist/product/index.js +2 -0
  94. package/dist/product/index.js.map +1 -0
  95. package/dist/product/product.d.ts +143 -0
  96. package/dist/product/product.d.ts.map +1 -0
  97. package/dist/product/product.js +493 -0
  98. package/dist/product/product.js.map +1 -0
  99. package/dist/profile/index.d.ts +2 -0
  100. package/dist/profile/index.d.ts.map +1 -0
  101. package/dist/profile/index.js +2 -0
  102. package/dist/profile/index.js.map +1 -0
  103. package/dist/profile/profile.d.ts +28 -0
  104. package/dist/profile/profile.d.ts.map +1 -0
  105. package/dist/profile/profile.js +122 -0
  106. package/dist/profile/profile.js.map +1 -0
  107. package/dist/query.d.ts +331 -0
  108. package/dist/query.d.ts.map +1 -0
  109. package/dist/query.js +103 -0
  110. package/dist/query.js.map +1 -0
  111. package/dist/security.d.ts +3 -0
  112. package/dist/security.d.ts.map +1 -0
  113. package/dist/security.js +3 -0
  114. package/dist/security.js.map +1 -0
  115. package/dist/social/index.d.ts +3 -0
  116. package/dist/social/index.d.ts.map +1 -0
  117. package/dist/social/index.js +2 -0
  118. package/dist/social/index.js.map +1 -0
  119. package/dist/social/social.d.ts +84 -0
  120. package/dist/social/social.d.ts.map +1 -0
  121. package/dist/social/social.js +353 -0
  122. package/dist/social/social.js.map +1 -0
  123. package/dist/storage.d.ts +3 -0
  124. package/dist/storage.d.ts.map +1 -0
  125. package/dist/storage.js +3 -0
  126. package/dist/storage.js.map +1 -0
  127. package/dist/theme.d.ts +12 -0
  128. package/dist/theme.d.ts.map +1 -0
  129. package/dist/theme.js +55 -0
  130. package/dist/theme.js.map +1 -0
  131. package/dist/types.d.ts +266 -0
  132. package/dist/types.d.ts.map +1 -0
  133. package/dist/types.js +2 -0
  134. package/dist/types.js.map +1 -0
  135. package/dist/utils.d.ts +7 -0
  136. package/dist/utils.d.ts.map +1 -0
  137. package/dist/utils.js +46 -0
  138. package/dist/utils.js.map +1 -0
  139. package/dist/video/index.d.ts +3 -0
  140. package/dist/video/index.d.ts.map +1 -0
  141. package/dist/video/index.js +2 -0
  142. package/dist/video/index.js.map +1 -0
  143. package/dist/video/video.d.ts +61 -0
  144. package/dist/video/video.d.ts.map +1 -0
  145. package/dist/video/video.js +157 -0
  146. package/dist/video/video.js.map +1 -0
  147. package/package.json +129 -0
package/README.md ADDED
@@ -0,0 +1,59 @@
1
+ # @commonpub/server
2
+
3
+ Framework-agnostic business logic for CommonPub.
4
+
5
+ ## Overview
6
+
7
+ Consolidates all server-side business logic (content CRUD, social interactions, communities, learning, docs, federation, admin, audit) into a single package with no framework dependency. Server routes in `apps/reference` are thin wrappers that call into this package.
8
+
9
+ ## Installation
10
+
11
+ ```bash
12
+ pnpm add @commonpub/server
13
+ ```
14
+
15
+ ## Architecture
16
+
17
+ All functions accept explicit dependencies (database connection, config) rather than importing globals. This makes the logic testable and portable across frameworks.
18
+
19
+ ```ts
20
+ import { createContent, getContentBySlug } from '@commonpub/server';
21
+
22
+ // Functions take (db, config, ...args) — no framework coupling
23
+ const content = await createContent(db, config, { title, type, authorId });
24
+ const published = await getContentBySlug(db, 'project', 'my-project');
25
+ ```
26
+
27
+ ## Modules
28
+
29
+ | Module | Purpose |
30
+ |--------|---------|
31
+ | `content` | Content CRUD, publishing, view counts, federation hooks |
32
+ | `social` | Likes, comments, bookmarks |
33
+ | `hub` | Hub CRUD (community/product/company), membership, posts, moderation, bans |
34
+ | `learning` | Paths, modules, lessons, enrollment, progress, certificates |
35
+ | `docs` | Sites, versions, pages, navigation, search |
36
+ | `federation` | Keypairs, actor resolution, follow management, content federation |
37
+ | `admin` | Platform stats, user management, reports, instance settings |
38
+ | `audit` | Audit log creation and listing |
39
+ | `security` | CSP builder, security headers |
40
+ | `rateLimit` | Sliding-window rate limiter with 5 tiers |
41
+ | `oauthCodes` | Authorization code store with TTL |
42
+
43
+ ## Dependencies
44
+
45
+ - `@commonpub/schema` — Table definitions and validators
46
+ - `@commonpub/config` — Feature flags and instance config
47
+ - `@commonpub/auth` — Auth types and guards
48
+ - `@commonpub/protocol` — AP protocol types
49
+ - `@commonpub/docs` — Docs rendering pipeline
50
+ - `@commonpub/learning` — Learning path engine
51
+ - `drizzle-orm` — Database queries
52
+
53
+ ## Development
54
+
55
+ ```bash
56
+ pnpm build # Compile TypeScript
57
+ pnpm test # Run tests
58
+ pnpm typecheck # Type-check without emitting
59
+ ```
@@ -0,0 +1,113 @@
1
+ import type { DB } from '../types.js';
2
+ import type { AdminUpdateRoleInput, AdminUpdateStatusInput } from '@commonpub/schema';
3
+ export interface AuditEntry {
4
+ userId: string;
5
+ action: string;
6
+ targetType: string;
7
+ targetId?: string;
8
+ metadata?: Record<string, unknown>;
9
+ ipAddress?: string;
10
+ }
11
+ export interface AuditLogItem {
12
+ id: string;
13
+ action: string;
14
+ targetType: string;
15
+ targetId: string | null;
16
+ metadata: unknown;
17
+ ipAddress: string | null;
18
+ createdAt: Date;
19
+ user: {
20
+ id: string;
21
+ username: string;
22
+ displayName: string | null;
23
+ };
24
+ }
25
+ export interface AuditFilters {
26
+ action?: string;
27
+ userId?: string;
28
+ targetType?: string;
29
+ limit?: number;
30
+ offset?: number;
31
+ }
32
+ export interface PlatformStats {
33
+ users: {
34
+ total: number;
35
+ byRole: Record<string, number>;
36
+ byStatus: Record<string, number>;
37
+ };
38
+ content: {
39
+ total: number;
40
+ byType: Record<string, number>;
41
+ byStatus: Record<string, number>;
42
+ };
43
+ hubs: {
44
+ total: number;
45
+ };
46
+ reports: {
47
+ pending: number;
48
+ total: number;
49
+ };
50
+ }
51
+ export interface UserListItem {
52
+ id: string;
53
+ email: string;
54
+ username: string;
55
+ displayName: string | null;
56
+ avatarUrl: string | null;
57
+ role: string;
58
+ status: string;
59
+ createdAt: Date;
60
+ }
61
+ export interface UserFilters {
62
+ search?: string;
63
+ role?: AdminUpdateRoleInput['role'];
64
+ status?: AdminUpdateStatusInput['status'];
65
+ limit?: number;
66
+ offset?: number;
67
+ }
68
+ export interface ReportListItem {
69
+ id: string;
70
+ targetType: string;
71
+ targetId: string;
72
+ reason: string;
73
+ description: string | null;
74
+ status: string;
75
+ resolution: string | null;
76
+ createdAt: Date;
77
+ reporter: {
78
+ id: string;
79
+ username: string;
80
+ };
81
+ reviewer: {
82
+ id: string;
83
+ username: string;
84
+ } | null;
85
+ }
86
+ export interface ReportFilters {
87
+ status?: 'pending' | 'reviewed' | 'resolved' | 'dismissed';
88
+ limit?: number;
89
+ offset?: number;
90
+ }
91
+ export declare function createAuditEntry(db: DB, entry: AuditEntry): Promise<void>;
92
+ export declare function listAuditLogs(db: DB, filters?: AuditFilters): Promise<{
93
+ items: AuditLogItem[];
94
+ total: number;
95
+ }>;
96
+ export declare function getPlatformStats(db: DB): Promise<PlatformStats>;
97
+ export declare function listUsers(db: DB, filters?: UserFilters): Promise<{
98
+ items: UserListItem[];
99
+ total: number;
100
+ }>;
101
+ export declare function updateUserRole(db: DB, userId: string, newRole: AdminUpdateRoleInput['role'], adminId: string, ip?: string): Promise<void>;
102
+ export declare function updateUserStatus(db: DB, userId: string, newStatus: AdminUpdateStatusInput['status'], adminId: string, ip?: string): Promise<void>;
103
+ export declare function listReports(db: DB, filters?: ReportFilters): Promise<{
104
+ items: ReportListItem[];
105
+ total: number;
106
+ }>;
107
+ export declare function resolveReport(db: DB, reportId: string, resolution: string, status: 'resolved' | 'dismissed', adminId: string, ip?: string): Promise<void>;
108
+ export declare function getInstanceSettings(db: DB): Promise<Map<string, unknown>>;
109
+ export declare function getInstanceSetting(db: DB, key: string): Promise<unknown | null>;
110
+ export declare function setInstanceSetting(db: DB, key: string, value: unknown, adminId: string, ip?: string): Promise<void>;
111
+ export declare function deleteUser(db: DB, userId: string, adminId: string, ip?: string): Promise<void>;
112
+ export declare function removeContent(db: DB, contentId: string, adminId: string, ip?: string): Promise<void>;
113
+ //# sourceMappingURL=admin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../../src/admin/admin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,426 @@
1
+ import { eq, and, desc, sql, ilike } from 'drizzle-orm';
2
+ import { alias } from 'drizzle-orm/pg-core';
3
+ import { normalizePagination, countRows, escapeLike } from '../query.js';
4
+ import { users, sessions, contentItems, hubs, hubMembers, hubPosts, comments, likes, enrollments, learningPaths, reports, instanceSettings, auditLogs, } from '@commonpub/schema';
5
+ // --- Audit Log ---
6
+ export async function createAuditEntry(db, entry) {
7
+ await db.insert(auditLogs).values({
8
+ userId: entry.userId,
9
+ action: entry.action,
10
+ targetType: entry.targetType,
11
+ targetId: entry.targetId,
12
+ metadata: entry.metadata ?? null,
13
+ ipAddress: entry.ipAddress ?? null,
14
+ });
15
+ }
16
+ export async function listAuditLogs(db, filters = {}) {
17
+ const conditions = [];
18
+ if (filters.action) {
19
+ conditions.push(eq(auditLogs.action, filters.action));
20
+ }
21
+ if (filters.userId) {
22
+ conditions.push(eq(auditLogs.userId, filters.userId));
23
+ }
24
+ if (filters.targetType) {
25
+ conditions.push(eq(auditLogs.targetType, filters.targetType));
26
+ }
27
+ const where = conditions.length > 0 ? and(...conditions) : undefined;
28
+ const limit = Math.min(filters.limit ?? 50, 100);
29
+ const offset = filters.offset ?? 0;
30
+ const [rows, total] = await Promise.all([
31
+ db
32
+ .select({
33
+ log: auditLogs,
34
+ user: {
35
+ id: users.id,
36
+ username: users.username,
37
+ displayName: users.displayName,
38
+ },
39
+ })
40
+ .from(auditLogs)
41
+ .innerJoin(users, eq(auditLogs.userId, users.id))
42
+ .where(where)
43
+ .orderBy(desc(auditLogs.createdAt))
44
+ .limit(limit)
45
+ .offset(offset),
46
+ countRows(db, auditLogs, where),
47
+ ]);
48
+ const items = rows.map((row) => ({
49
+ id: row.log.id,
50
+ action: row.log.action,
51
+ targetType: row.log.targetType,
52
+ targetId: row.log.targetId,
53
+ metadata: row.log.metadata,
54
+ ipAddress: row.log.ipAddress,
55
+ createdAt: row.log.createdAt,
56
+ user: {
57
+ id: row.user.id,
58
+ username: row.user.username,
59
+ displayName: row.user.displayName,
60
+ },
61
+ }));
62
+ return { items, total };
63
+ }
64
+ // --- Platform Stats ---
65
+ export async function getPlatformStats(db) {
66
+ const [usersByRole, usersByStatus, contentByType, contentByStatus, hubCount, pendingReports, totalReports,] = await Promise.all([
67
+ db
68
+ .select({ role: users.role, count: sql `count(*)::int` })
69
+ .from(users)
70
+ .groupBy(users.role),
71
+ db
72
+ .select({ status: users.status, count: sql `count(*)::int` })
73
+ .from(users)
74
+ .groupBy(users.status),
75
+ db
76
+ .select({ type: contentItems.type, count: sql `count(*)::int` })
77
+ .from(contentItems)
78
+ .groupBy(contentItems.type),
79
+ db
80
+ .select({ status: contentItems.status, count: sql `count(*)::int` })
81
+ .from(contentItems)
82
+ .groupBy(contentItems.status),
83
+ db.select({ count: sql `count(*)::int` }).from(hubs),
84
+ db
85
+ .select({ count: sql `count(*)::int` })
86
+ .from(reports)
87
+ .where(eq(reports.status, 'pending')),
88
+ db.select({ count: sql `count(*)::int` }).from(reports),
89
+ ]);
90
+ const byRole = {};
91
+ let totalUsers = 0;
92
+ for (const row of usersByRole) {
93
+ byRole[row.role] = row.count;
94
+ totalUsers += row.count;
95
+ }
96
+ const byStatus = {};
97
+ for (const row of usersByStatus) {
98
+ byStatus[row.status] = row.count;
99
+ }
100
+ const byType = {};
101
+ let totalContent = 0;
102
+ for (const row of contentByType) {
103
+ byType[row.type] = row.count;
104
+ totalContent += row.count;
105
+ }
106
+ const byContentStatus = {};
107
+ for (const row of contentByStatus) {
108
+ byContentStatus[row.status] = row.count;
109
+ }
110
+ return {
111
+ users: { total: totalUsers, byRole, byStatus },
112
+ content: { total: totalContent, byType, byStatus: byContentStatus },
113
+ hubs: { total: hubCount[0]?.count ?? 0 },
114
+ reports: {
115
+ pending: pendingReports[0]?.count ?? 0,
116
+ total: totalReports[0]?.count ?? 0,
117
+ },
118
+ };
119
+ }
120
+ // --- User Management ---
121
+ export async function listUsers(db, filters = {}) {
122
+ const conditions = [];
123
+ if (filters.search) {
124
+ const term = `%${escapeLike(filters.search)}%`;
125
+ conditions.push(sql `(${ilike(users.username, term)} OR ${ilike(users.email, term)})`);
126
+ }
127
+ if (filters.role) {
128
+ conditions.push(eq(users.role, filters.role));
129
+ }
130
+ if (filters.status) {
131
+ conditions.push(eq(users.status, filters.status));
132
+ }
133
+ const where = conditions.length > 0 ? and(...conditions) : undefined;
134
+ const { limit, offset } = normalizePagination(filters);
135
+ const [rows, total] = await Promise.all([
136
+ db
137
+ .select({
138
+ id: users.id,
139
+ email: users.email,
140
+ username: users.username,
141
+ displayName: users.displayName,
142
+ avatarUrl: users.avatarUrl,
143
+ role: users.role,
144
+ status: users.status,
145
+ createdAt: users.createdAt,
146
+ })
147
+ .from(users)
148
+ .where(where)
149
+ .orderBy(desc(users.createdAt))
150
+ .limit(limit)
151
+ .offset(offset),
152
+ countRows(db, users, where),
153
+ ]);
154
+ return {
155
+ items: rows,
156
+ total,
157
+ };
158
+ }
159
+ export async function updateUserRole(db, userId, newRole, adminId, ip) {
160
+ const [user] = await db.select({ role: users.role }).from(users).where(eq(users.id, userId));
161
+ if (!user)
162
+ throw new Error('User not found');
163
+ await db
164
+ .update(users)
165
+ .set({
166
+ role: newRole,
167
+ updatedAt: new Date(),
168
+ })
169
+ .where(eq(users.id, userId));
170
+ await createAuditEntry(db, {
171
+ userId: adminId,
172
+ action: 'user.role_changed',
173
+ targetType: 'user',
174
+ targetId: userId,
175
+ metadata: { previousRole: user.role, newRole },
176
+ ipAddress: ip,
177
+ });
178
+ }
179
+ export async function updateUserStatus(db, userId, newStatus, adminId, ip) {
180
+ const [user] = await db
181
+ .select({ status: users.status })
182
+ .from(users)
183
+ .where(eq(users.id, userId));
184
+ if (!user)
185
+ throw new Error('User not found');
186
+ await db
187
+ .update(users)
188
+ .set({ status: newStatus, updatedAt: new Date() })
189
+ .where(eq(users.id, userId));
190
+ // Invalidate all sessions when suspending or deleting a user
191
+ if (newStatus === 'suspended' || newStatus === 'deleted') {
192
+ await db.delete(sessions).where(eq(sessions.userId, userId));
193
+ }
194
+ await createAuditEntry(db, {
195
+ userId: adminId,
196
+ action: 'user.status_changed',
197
+ targetType: 'user',
198
+ targetId: userId,
199
+ metadata: { previousStatus: user.status, newStatus },
200
+ ipAddress: ip,
201
+ });
202
+ }
203
+ // --- Reports ---
204
+ export async function listReports(db, filters = {}) {
205
+ const conditions = [];
206
+ if (filters.status) {
207
+ conditions.push(eq(reports.status, filters.status));
208
+ }
209
+ const where = conditions.length > 0 ? and(...conditions) : undefined;
210
+ const { limit, offset } = normalizePagination(filters);
211
+ const reviewerAlias = alias(users, 'reviewer');
212
+ const [rows, total] = await Promise.all([
213
+ db
214
+ .select({
215
+ report: reports,
216
+ reporter: {
217
+ id: users.id,
218
+ username: users.username,
219
+ },
220
+ reviewer: {
221
+ id: reviewerAlias.id,
222
+ username: reviewerAlias.username,
223
+ },
224
+ })
225
+ .from(reports)
226
+ .innerJoin(users, eq(reports.reporterId, users.id))
227
+ .leftJoin(reviewerAlias, eq(reports.reviewedById, reviewerAlias.id))
228
+ .where(where)
229
+ .orderBy(desc(reports.createdAt))
230
+ .limit(limit)
231
+ .offset(offset),
232
+ countRows(db, reports, where),
233
+ ]);
234
+ const items = rows.map((row) => ({
235
+ id: row.report.id,
236
+ targetType: row.report.targetType,
237
+ targetId: row.report.targetId,
238
+ reason: row.report.reason,
239
+ description: row.report.description,
240
+ status: row.report.status,
241
+ resolution: row.report.resolution,
242
+ createdAt: row.report.createdAt,
243
+ reporter: { id: row.reporter.id, username: row.reporter.username },
244
+ reviewer: row.reviewer?.id ? { id: row.reviewer.id, username: row.reviewer.username } : null,
245
+ }));
246
+ return { items, total };
247
+ }
248
+ export async function resolveReport(db, reportId, resolution, status, adminId, ip) {
249
+ const [report] = await db.select().from(reports).where(eq(reports.id, reportId));
250
+ if (!report)
251
+ throw new Error('Report not found');
252
+ await db
253
+ .update(reports)
254
+ .set({
255
+ status,
256
+ resolution,
257
+ reviewedById: adminId,
258
+ reviewedAt: new Date(),
259
+ })
260
+ .where(eq(reports.id, reportId));
261
+ await createAuditEntry(db, {
262
+ userId: adminId,
263
+ action: `report.${status}`,
264
+ targetType: 'report',
265
+ targetId: reportId,
266
+ metadata: {
267
+ reason: report.reason,
268
+ targetType: report.targetType,
269
+ targetId: report.targetId,
270
+ },
271
+ ipAddress: ip,
272
+ });
273
+ }
274
+ // --- Instance Settings ---
275
+ export async function getInstanceSettings(db) {
276
+ const rows = await db.select().from(instanceSettings);
277
+ const map = new Map();
278
+ for (const row of rows) {
279
+ map.set(row.key, row.value);
280
+ }
281
+ return map;
282
+ }
283
+ export async function getInstanceSetting(db, key) {
284
+ const [row] = await db
285
+ .select()
286
+ .from(instanceSettings)
287
+ .where(eq(instanceSettings.key, key));
288
+ return row?.value ?? null;
289
+ }
290
+ export async function setInstanceSetting(db, key, value, adminId, ip) {
291
+ const existing = await db
292
+ .select()
293
+ .from(instanceSettings)
294
+ .where(eq(instanceSettings.key, key));
295
+ if (existing.length > 0) {
296
+ await db
297
+ .update(instanceSettings)
298
+ .set({ value, updatedBy: adminId, updatedAt: new Date() })
299
+ .where(eq(instanceSettings.key, key));
300
+ }
301
+ else {
302
+ await db.insert(instanceSettings).values({
303
+ key,
304
+ value,
305
+ updatedBy: adminId,
306
+ updatedAt: new Date(),
307
+ });
308
+ }
309
+ await createAuditEntry(db, {
310
+ userId: adminId,
311
+ action: 'setting.updated',
312
+ targetType: 'instance_setting',
313
+ targetId: key,
314
+ metadata: { value },
315
+ ipAddress: ip,
316
+ });
317
+ }
318
+ // --- Content Moderation ---
319
+ export async function deleteUser(db, userId, adminId, ip) {
320
+ const [user] = await db
321
+ .select({ id: users.id, username: users.username })
322
+ .from(users)
323
+ .where(eq(users.id, userId));
324
+ if (!user)
325
+ throw new Error('User not found');
326
+ await db.transaction(async (tx) => {
327
+ const userLikes = await tx
328
+ .select({ targetType: likes.targetType, targetId: likes.targetId })
329
+ .from(likes)
330
+ .where(eq(likes.userId, userId));
331
+ for (const like of userLikes) {
332
+ switch (like.targetType) {
333
+ case 'comment':
334
+ await tx
335
+ .update(comments)
336
+ .set({ likeCount: sql `GREATEST(${comments.likeCount} - 1, 0)` })
337
+ .where(eq(comments.id, like.targetId));
338
+ break;
339
+ case 'post':
340
+ await tx
341
+ .update(hubPosts)
342
+ .set({ likeCount: sql `GREATEST(${hubPosts.likeCount} - 1, 0)` })
343
+ .where(eq(hubPosts.id, like.targetId));
344
+ break;
345
+ default:
346
+ await tx
347
+ .update(contentItems)
348
+ .set({ likeCount: sql `GREATEST(${contentItems.likeCount} - 1, 0)` })
349
+ .where(eq(contentItems.id, like.targetId));
350
+ break;
351
+ }
352
+ }
353
+ const userComments = await tx
354
+ .select({ targetType: comments.targetType, targetId: comments.targetId })
355
+ .from(comments)
356
+ .where(eq(comments.authorId, userId));
357
+ for (const comment of userComments) {
358
+ if (comment.targetType === 'post') {
359
+ await tx
360
+ .update(hubPosts)
361
+ .set({ replyCount: sql `GREATEST(${hubPosts.replyCount} - 1, 0)` })
362
+ .where(eq(hubPosts.id, comment.targetId));
363
+ }
364
+ else {
365
+ await tx
366
+ .update(contentItems)
367
+ .set({ commentCount: sql `GREATEST(${contentItems.commentCount} - 1, 0)` })
368
+ .where(eq(contentItems.id, comment.targetId));
369
+ }
370
+ }
371
+ const memberships = await tx
372
+ .select({ hubId: hubMembers.hubId })
373
+ .from(hubMembers)
374
+ .where(eq(hubMembers.userId, userId));
375
+ for (const m of memberships) {
376
+ await tx
377
+ .update(hubs)
378
+ .set({ memberCount: sql `GREATEST(${hubs.memberCount} - 1, 0)` })
379
+ .where(eq(hubs.id, m.hubId));
380
+ }
381
+ const userEnrollments = await tx
382
+ .select({ pathId: enrollments.pathId })
383
+ .from(enrollments)
384
+ .where(eq(enrollments.userId, userId));
385
+ for (const e of userEnrollments) {
386
+ await tx
387
+ .update(learningPaths)
388
+ .set({ enrollmentCount: sql `GREATEST(${learningPaths.enrollmentCount} - 1, 0)` })
389
+ .where(eq(learningPaths.id, e.pathId));
390
+ }
391
+ await tx.delete(users).where(eq(users.id, userId));
392
+ });
393
+ await createAuditEntry(db, {
394
+ userId: adminId,
395
+ action: 'user.deleted',
396
+ targetType: 'user',
397
+ targetId: userId,
398
+ metadata: { username: user.username },
399
+ ipAddress: ip,
400
+ });
401
+ }
402
+ export async function removeContent(db, contentId, adminId, ip) {
403
+ const [item] = await db
404
+ .select({
405
+ id: contentItems.id,
406
+ title: contentItems.title,
407
+ authorId: contentItems.authorId,
408
+ })
409
+ .from(contentItems)
410
+ .where(eq(contentItems.id, contentId));
411
+ if (!item)
412
+ throw new Error('Content not found');
413
+ await db
414
+ .update(contentItems)
415
+ .set({ status: 'archived' })
416
+ .where(eq(contentItems.id, contentId));
417
+ await createAuditEntry(db, {
418
+ userId: adminId,
419
+ action: 'content.removed',
420
+ targetType: 'content',
421
+ targetId: contentId,
422
+ metadata: { title: item.title, authorId: item.authorId },
423
+ ipAddress: ip,
424
+ });
425
+ }
426
+ //# sourceMappingURL=admin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin.js","sourceRoot":"","sources":["../../src/admin/admin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { createAuditEntry, listAuditLogs, getPlatformStats, listUsers, updateUserRole, updateUserStatus, listReports, resolveReport, getInstanceSettings, getInstanceSetting, setInstanceSetting, deleteUser, removeContent, } from './admin.js';
2
+ export type { AuditEntry, AuditLogItem, AuditFilters, PlatformStats, UserListItem, UserFilters, ReportListItem, ReportFilters, } from './admin.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/admin/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,SAAS,EACT,cAAc,EACd,gBAAgB,EAChB,WAAW,EACX,aAAa,EACb,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,UAAU,EACV,aAAa,GACd,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,WAAW,EACX,cAAc,EACd,aAAa,GACd,MAAM,YAAY,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { createAuditEntry, listAuditLogs, getPlatformStats, listUsers, updateUserRole, updateUserStatus, listReports, resolveReport, getInstanceSettings, getInstanceSetting, setInstanceSetting, deleteUser, removeContent, } from './admin.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/admin/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,SAAS,EACT,cAAc,EACd,gBAAgB,EAChB,WAAW,EACX,aAAa,EACb,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,UAAU,EACV,aAAa,GACd,MAAM,YAAY,CAAC"}