Benaah commited on
Commit
303c85f
·
verified ·
1 Parent(s): 9a329d1

Upload folder using huggingface_hub

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. apps/api/dist/admin/admin-audit.service.js +100 -0
  2. apps/api/dist/admin/admin-audit.service.js.map +1 -0
  3. apps/api/dist/admin/admin-auth.service.js +87 -0
  4. apps/api/dist/admin/admin-auth.service.js.map +1 -0
  5. apps/api/dist/admin/admin-billing.service.js +171 -0
  6. apps/api/dist/admin/admin-billing.service.js.map +1 -0
  7. apps/api/dist/admin/admin-clip-scorer.service.js +135 -0
  8. apps/api/dist/admin/admin-clip-scorer.service.js.map +1 -0
  9. apps/api/dist/admin/admin-comms.service.js +145 -0
  10. apps/api/dist/admin/admin-comms.service.js.map +1 -0
  11. apps/api/dist/admin/admin-moderation.service.js +164 -0
  12. apps/api/dist/admin/admin-moderation.service.js.map +1 -0
  13. apps/api/dist/admin/admin-operations.service.js +277 -0
  14. apps/api/dist/admin/admin-operations.service.js.map +1 -0
  15. apps/api/dist/admin/admin-realtime.service.js +79 -0
  16. apps/api/dist/admin/admin-realtime.service.js.map +1 -0
  17. apps/api/dist/admin/admin-settings.service.js +194 -0
  18. apps/api/dist/admin/admin-settings.service.js.map +1 -0
  19. apps/api/dist/admin/admin-supervision.processor.js +57 -0
  20. apps/api/dist/admin/admin-supervision.processor.js.map +1 -0
  21. apps/api/dist/admin/admin-supervision.service.js +205 -0
  22. apps/api/dist/admin/admin-supervision.service.js.map +1 -0
  23. apps/api/dist/admin/admin-users.service.js +397 -0
  24. apps/api/dist/admin/admin-users.service.js.map +1 -0
  25. apps/api/dist/admin/admin-workspaces.service.js +298 -0
  26. apps/api/dist/admin/admin-workspaces.service.js.map +1 -0
  27. apps/api/dist/admin/admin.module.js +54 -0
  28. apps/api/dist/admin/admin.module.js.map +1 -0
  29. apps/api/dist/admin/admin.router.js +420 -0
  30. apps/api/dist/admin/admin.router.js.map +1 -0
  31. apps/api/dist/ai/ai.module.js +29 -0
  32. apps/api/dist/ai/ai.module.js.map +1 -0
  33. apps/api/dist/ai/ai.service.js +202 -0
  34. apps/api/dist/ai/ai.service.js.map +1 -0
  35. apps/api/dist/analytics/analytics.controller.js +123 -0
  36. apps/api/dist/analytics/analytics.controller.js.map +1 -0
  37. apps/api/dist/analytics/analytics.module.js +24 -0
  38. apps/api/dist/analytics/analytics.module.js.map +1 -0
  39. apps/api/dist/analytics/analytics.router.js +64 -0
  40. apps/api/dist/analytics/analytics.router.js.map +1 -0
  41. apps/api/dist/analytics/analytics.service.js +354 -0
  42. apps/api/dist/analytics/analytics.service.js.map +1 -0
  43. apps/api/dist/app.module.js +209 -0
  44. apps/api/dist/app.module.js.map +1 -0
  45. apps/api/dist/assets/assets.module.js +22 -0
  46. apps/api/dist/assets/assets.module.js.map +1 -0
  47. apps/api/dist/assets/assets.router.js +69 -0
  48. apps/api/dist/assets/assets.router.js.map +1 -0
  49. apps/api/dist/assets/assets.service.js +142 -0
  50. apps/api/dist/assets/assets.service.js.map +1 -0
apps/api/dist/admin/admin-audit.service.js ADDED
@@ -0,0 +1,100 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var AdminAuditService_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.AdminAuditService = void 0;
14
+ const common_1 = require("@nestjs/common");
15
+ const prisma_service_1 = require("../prisma/prisma.service");
16
+ const audit_service_1 = require("../audit/audit.service");
17
+ const shared_types_1 = require("@micprotocol/shared-types");
18
+ const admin_permission_decorator_1 = require("../common/decorators/admin-permission.decorator");
19
+ let AdminAuditService = AdminAuditService_1 = class AdminAuditService {
20
+ prisma;
21
+ audit;
22
+ logger = new common_1.Logger(AdminAuditService_1.name);
23
+ constructor(prisma, audit) {
24
+ this.prisma = prisma;
25
+ this.audit = audit;
26
+ }
27
+ async list(input = {}) {
28
+ return this.audit.listAuditLogs(input);
29
+ }
30
+ async verify() {
31
+ return this.audit.verifyIntegrity();
32
+ }
33
+ async stats() {
34
+ return this.audit.getAuditStats();
35
+ }
36
+ async export(input, exportedBy) {
37
+ const { items, total } = await this.audit.listAuditLogs({
38
+ startDate: input.startDate,
39
+ endDate: input.endDate,
40
+ limit: 10_000,
41
+ });
42
+ const integrity = await this.audit.verifyIntegrity();
43
+ await this.audit.log({
44
+ userId: exportedBy,
45
+ action: "admin.audit.export",
46
+ entityType: "AuditLog",
47
+ entityId: "export",
48
+ metadata: {
49
+ exportedBy,
50
+ total,
51
+ startDate: input.startDate,
52
+ endDate: input.endDate,
53
+ chainValid: integrity.valid,
54
+ chainBrokenAt: integrity.brokenAt,
55
+ },
56
+ });
57
+ return {
58
+ exportedAt: new Date().toISOString(),
59
+ exportedBy,
60
+ total,
61
+ chainValid: integrity.valid,
62
+ chainBrokenAt: integrity.brokenAt,
63
+ items,
64
+ };
65
+ }
66
+ async getEntry(entryId) {
67
+ const entry = await this.prisma.auditLog.findUnique({
68
+ where: { id: entryId },
69
+ select: {
70
+ id: true,
71
+ userId: true,
72
+ workspaceId: true,
73
+ action: true,
74
+ entityType: true,
75
+ entityId: true,
76
+ metadata: true,
77
+ ipAddress: true,
78
+ userAgent: true,
79
+ entryHash: true,
80
+ previousHash: true,
81
+ createdAt: true,
82
+ },
83
+ });
84
+ if (!entry)
85
+ throw new common_1.NotFoundException(`Audit entry ${entryId} not found`);
86
+ return entry;
87
+ }
88
+ };
89
+ exports.AdminAuditService = AdminAuditService;
90
+ __decorate([
91
+ (0, admin_permission_decorator_1.requireAdminPermission)(shared_types_1.AdminPermission.AUDIT_EXPORT),
92
+ __metadata("design:type", Function),
93
+ __metadata("design:paramtypes", [Object, String]),
94
+ __metadata("design:returntype", Promise)
95
+ ], AdminAuditService.prototype, "export", null);
96
+ exports.AdminAuditService = AdminAuditService = AdminAuditService_1 = __decorate([
97
+ (0, common_1.Injectable)(),
98
+ __metadata("design:paramtypes", [prisma_service_1.PrismaService, audit_service_1.AuditService])
99
+ ], AdminAuditService);
100
+ //# sourceMappingURL=admin-audit.service.js.map
apps/api/dist/admin/admin-audit.service.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"admin-audit.service.js","sourceRoot":"","sources":["../../src/admin/admin-audit.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,2CAAuE;AACvE,6DAAyD;AACzD,0DAAsD;AAEtD,4DAA4D;AAC5D,gGAAyF;AAoBlF,IAAM,iBAAiB,yBAAvB,MAAM,iBAAiB;IAGC;IAAwC;IAFpD,MAAM,GAAG,IAAI,eAAM,CAAC,mBAAiB,CAAC,IAAI,CAAC,CAAC;IAE7D,YAA6B,MAAqB,EAAmB,KAAmB;QAA3D,WAAM,GAAN,MAAM,CAAe;QAAmB,UAAK,GAAL,KAAK,CAAc;IAAG,CAAC;IAE5F,KAAK,CAAC,IAAI,CAAC,QAA6B,EAAE;QACxC,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,MAAM;QACV,OAAO,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,KAAK;QACT,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;IACpC,CAAC;IAGK,AAAN,KAAK,CAAC,MAAM,CAAC,KAA+C,EAAE,UAAkB;QAC9E,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC;YACtD,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,KAAK,EAAE,MAAM;SACd,CAAC,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC;QAGrD,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;YACnB,MAAM,EAAE,UAAU;YAClB,MAAM,EAAE,oBAAoB;YAC5B,UAAU,EAAE,UAAU;YACtB,QAAQ,EAAE,QAAQ;YAClB,QAAQ,EAAE;gBACR,UAAU;gBACV,KAAK;gBACL,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,UAAU,EAAE,SAAS,CAAC,KAAK;gBAC3B,aAAa,EAAE,SAAS,CAAC,QAAQ;aAClC;SACF,CAAC,CAAC;QAEH,OAAO;YACL,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACpC,UAAU;YACV,KAAK;YACL,UAAU,EAAE,SAAS,CAAC,KAAK;YAC3B,aAAa,EAAE,SAAS,CAAC,QAAQ;YACjC,KAAK;SACN,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAAe;QAC5B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC;YAClD,KAAK,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE;YACtB,MAAM,EAAE;gBACN,EAAE,EAAE,IAAI;gBACR,MAAM,EAAE,IAAI;gBACZ,WAAW,EAAE,IAAI;gBACjB,MAAM,EAAE,IAAI;gBACZ,UAAU,EAAE,IAAI;gBAChB,QAAQ,EAAE,IAAI;gBACd,QAAQ,EAAE,IAAI;gBACd,SAAS,EAAE,IAAI;gBACf,SAAS,EAAE,IAAI;gBACf,SAAS,EAAE,IAAI;gBACf,YAAY,EAAE,IAAI;gBAClB,SAAS,EAAE,IAAI;aAChB;SACF,CAAC,CAAC;QACH,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,0BAAiB,CAAC,eAAe,OAAO,YAAY,CAAC,CAAC;QAC5E,OAAO,KAAK,CAAC;IACf,CAAC;CACF,CAAA;AAzEY,8CAAiB;AAkBtB;IADL,IAAA,mDAAsB,EAAC,8BAAe,CAAC,YAAY,CAAC;;;;+CAiCpD;4BAlDU,iBAAiB;IAD7B,IAAA,mBAAU,GAAE;qCAI0B,8BAAa,EAA0B,4BAAY;GAH7E,iBAAiB,CAyE7B"}
apps/api/dist/admin/admin-auth.service.js ADDED
@@ -0,0 +1,87 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var AdminAuthService_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.AdminAuthService = void 0;
14
+ const common_1 = require("@nestjs/common");
15
+ const server_1 = require("@trpc/server");
16
+ const prisma_service_1 = require("../prisma/prisma.service");
17
+ const shared_types_1 = require("@micprotocol/shared-types");
18
+ const platform_admin_1 = require("../common/platform-admin");
19
+ let AdminAuthService = AdminAuthService_1 = class AdminAuthService {
20
+ prisma;
21
+ logger = new common_1.Logger(AdminAuthService_1.name);
22
+ constructor(prisma) {
23
+ this.prisma = prisma;
24
+ }
25
+ async getAdminContext(userId) {
26
+ const user = await this.prisma.user.findUnique({
27
+ where: { id: userId },
28
+ select: {
29
+ id: true,
30
+ isAdmin: true,
31
+ adminRole: true,
32
+ adminPermissions: true,
33
+ suspendedAt: true,
34
+ },
35
+ });
36
+ if (!user)
37
+ return null;
38
+ const role = (0, platform_admin_1.deriveAdminRole)(user);
39
+ if (!role)
40
+ return null;
41
+ const permissions = (0, shared_types_1.resolveAdminPermissions)(role, user.adminPermissions);
42
+ const suspended = !!user.suspendedAt;
43
+ return {
44
+ userId: user.id,
45
+ isAdmin: !!user.isAdmin,
46
+ role,
47
+ permissions,
48
+ suspended,
49
+ };
50
+ }
51
+ async requirePermission(userId, permission) {
52
+ const ctx = await this.getAdminContext(userId);
53
+ if (!ctx) {
54
+ throw new server_1.TRPCError({ code: "FORBIDDEN", message: "Admin privileges required" });
55
+ }
56
+ if (ctx.suspended) {
57
+ throw new server_1.TRPCError({ code: "FORBIDDEN", message: "Account is suspended" });
58
+ }
59
+ if (!ctx.permissions.has(permission)) {
60
+ throw new server_1.TRPCError({
61
+ code: "FORBIDDEN",
62
+ message: `Insufficient permissions: ${permission} required`,
63
+ });
64
+ }
65
+ return ctx;
66
+ }
67
+ async requireAnyPermission(userId, ...permissions) {
68
+ const ctx = await this.getAdminContext(userId);
69
+ if (!ctx || ctx.suspended) {
70
+ throw new server_1.TRPCError({ code: "FORBIDDEN", message: "Admin privileges required" });
71
+ }
72
+ const hasAny = permissions.some((p) => ctx.permissions.has(p));
73
+ if (!hasAny) {
74
+ throw new server_1.TRPCError({
75
+ code: "FORBIDDEN",
76
+ message: `Insufficient permissions: one of ${permissions.join(", ")} required`,
77
+ });
78
+ }
79
+ return ctx;
80
+ }
81
+ };
82
+ exports.AdminAuthService = AdminAuthService;
83
+ exports.AdminAuthService = AdminAuthService = AdminAuthService_1 = __decorate([
84
+ (0, common_1.Injectable)(),
85
+ __metadata("design:paramtypes", [prisma_service_1.PrismaService])
86
+ ], AdminAuthService);
87
+ //# sourceMappingURL=admin-auth.service.js.map
apps/api/dist/admin/admin-auth.service.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"admin-auth.service.js","sourceRoot":"","sources":["../../src/admin/admin-auth.service.ts"],"names":[],"mappings":"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"}
apps/api/dist/admin/admin-billing.service.js ADDED
@@ -0,0 +1,171 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var AdminBillingService_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.AdminBillingService = void 0;
14
+ const common_1 = require("@nestjs/common");
15
+ const prisma_service_1 = require("../prisma/prisma.service");
16
+ const audit_service_1 = require("../audit/audit.service");
17
+ const client_1 = require("@prisma/client");
18
+ const shared_types_1 = require("@micprotocol/shared-types");
19
+ const admin_permission_decorator_1 = require("../common/decorators/admin-permission.decorator");
20
+ let AdminBillingService = AdminBillingService_1 = class AdminBillingService {
21
+ prisma;
22
+ audit;
23
+ logger = new common_1.Logger(AdminBillingService_1.name);
24
+ constructor(prisma, audit) {
25
+ this.prisma = prisma;
26
+ this.audit = audit;
27
+ }
28
+ async listSubscriptions() {
29
+ const workspaces = await this.prisma.workspace.findMany({
30
+ orderBy: { name: "asc" },
31
+ select: {
32
+ id: true,
33
+ name: true,
34
+ slug: true,
35
+ subscriptionPlanId: true,
36
+ subscriptionStatus: true,
37
+ suspendedAt: true,
38
+ },
39
+ });
40
+ return workspaces.map((w) => ({
41
+ workspaceId: w.id,
42
+ workspaceName: w.name,
43
+ slug: w.slug,
44
+ plan: w.subscriptionPlanId,
45
+ status: w.subscriptionStatus,
46
+ suspended: !!w.suspendedAt,
47
+ }));
48
+ }
49
+ async getWallet(workspaceId) {
50
+ const workspace = await this.prisma.workspace.findUnique({
51
+ where: { id: workspaceId },
52
+ select: { id: true, name: true },
53
+ });
54
+ if (!workspace)
55
+ throw new common_1.NotFoundException(`Workspace ${workspaceId} not found`);
56
+ const wallet = await this.prisma.wallet.findUnique({ where: { workspaceId } });
57
+ if (!wallet)
58
+ return null;
59
+ return {
60
+ workspaceId: wallet.workspaceId,
61
+ workspaceName: workspace.name,
62
+ balance: wallet.balance.toNumber(),
63
+ currency: wallet.currency,
64
+ updatedAt: wallet.updatedAt,
65
+ };
66
+ }
67
+ async listWallets() {
68
+ const wallets = await this.prisma.wallet.findMany({
69
+ orderBy: { updatedAt: "desc" },
70
+ include: { workspace: { select: { name: true } } },
71
+ });
72
+ return wallets.map((w) => ({
73
+ workspaceId: w.workspaceId,
74
+ workspaceName: w.workspace.name,
75
+ balance: w.balance.toNumber(),
76
+ currency: w.currency,
77
+ updatedAt: w.updatedAt,
78
+ }));
79
+ }
80
+ async listTransactions(walletId, limit = 50) {
81
+ return this.prisma.walletTransaction.findMany({
82
+ where: { walletId },
83
+ orderBy: { createdAt: "desc" },
84
+ take: Math.min(limit, 200),
85
+ });
86
+ }
87
+ async refund(workspaceId, amount, reference, description, actorUserId) {
88
+ if (amount <= 0)
89
+ throw new common_1.BadRequestException("Refund amount must be positive");
90
+ const workspace = await this.prisma.workspace.findUnique({
91
+ where: { id: workspaceId },
92
+ select: { id: true, name: true },
93
+ });
94
+ if (!workspace)
95
+ throw new common_1.NotFoundException(`Workspace ${workspaceId} not found`);
96
+ let wallet = await this.prisma.wallet.findUnique({ where: { workspaceId } });
97
+ if (!wallet) {
98
+ wallet = await this.prisma.wallet.create({
99
+ data: { workspaceId, balance: new client_1.Prisma.Decimal(0), currency: "USD" },
100
+ });
101
+ }
102
+ const transaction = await this.prisma.walletTransaction.create({
103
+ data: {
104
+ walletId: wallet.id,
105
+ type: "refund",
106
+ status: "completed",
107
+ amount: new client_1.Prisma.Decimal(amount),
108
+ currency: wallet.currency,
109
+ reference,
110
+ description,
111
+ },
112
+ });
113
+ await this.audit.log({
114
+ userId: actorUserId,
115
+ action: "admin.billing.refund",
116
+ entityType: "WalletTransaction",
117
+ entityId: transaction.id,
118
+ metadata: {
119
+ workspaceId,
120
+ workspaceName: workspace.name,
121
+ amount,
122
+ currency: wallet.currency,
123
+ reference,
124
+ description,
125
+ },
126
+ });
127
+ return transaction;
128
+ }
129
+ async planOverride(workspaceId, planId, actorUserId) {
130
+ const workspace = await this.prisma.workspace.findUnique({
131
+ where: { id: workspaceId },
132
+ select: { id: true, name: true, subscriptionPlanId: true },
133
+ });
134
+ if (!workspace)
135
+ throw new common_1.NotFoundException(`Workspace ${workspaceId} not found`);
136
+ const updated = await this.prisma.workspace.update({
137
+ where: { id: workspaceId },
138
+ data: { subscriptionPlanId: planId },
139
+ });
140
+ await this.audit.log({
141
+ userId: actorUserId,
142
+ action: "admin.billing.plan_override",
143
+ entityType: "Workspace",
144
+ entityId: workspaceId,
145
+ metadata: {
146
+ before: { subscriptionPlanId: workspace.subscriptionPlanId },
147
+ after: { subscriptionPlanId: planId },
148
+ },
149
+ });
150
+ return updated;
151
+ }
152
+ };
153
+ exports.AdminBillingService = AdminBillingService;
154
+ __decorate([
155
+ (0, admin_permission_decorator_1.requireAdminPermission)(shared_types_1.AdminPermission.BILLING_REFUND),
156
+ __metadata("design:type", Function),
157
+ __metadata("design:paramtypes", [String, Number, String, Object, String]),
158
+ __metadata("design:returntype", Promise)
159
+ ], AdminBillingService.prototype, "refund", null);
160
+ __decorate([
161
+ (0, admin_permission_decorator_1.requireAdminPermission)(shared_types_1.AdminPermission.BILLING_PLAN_OVERRIDE),
162
+ __metadata("design:type", Function),
163
+ __metadata("design:paramtypes", [String, String, String]),
164
+ __metadata("design:returntype", Promise)
165
+ ], AdminBillingService.prototype, "planOverride", null);
166
+ exports.AdminBillingService = AdminBillingService = AdminBillingService_1 = __decorate([
167
+ (0, common_1.Injectable)(),
168
+ __metadata("design:paramtypes", [prisma_service_1.PrismaService,
169
+ audit_service_1.AuditService])
170
+ ], AdminBillingService);
171
+ //# sourceMappingURL=admin-billing.service.js.map
apps/api/dist/admin/admin-billing.service.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"admin-billing.service.js","sourceRoot":"","sources":["../../src/admin/admin-billing.service.ts"],"names":[],"mappings":"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"}
apps/api/dist/admin/admin-clip-scorer.service.js ADDED
@@ -0,0 +1,135 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
19
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
21
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
22
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
23
+ };
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ var __metadata = (this && this.__metadata) || function (k, v) {
42
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
43
+ };
44
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
45
+ return function (target, key) { decorator(target, key, paramIndex); }
46
+ };
47
+ var AdminClipScorerService_1;
48
+ Object.defineProperty(exports, "__esModule", { value: true });
49
+ exports.AdminClipScorerService = void 0;
50
+ const common_1 = require("@nestjs/common");
51
+ const child_process_1 = require("child_process");
52
+ const util_1 = require("util");
53
+ const fs = __importStar(require("fs"));
54
+ const path = __importStar(require("path"));
55
+ const redis_constants_1 = require("../common/redis.constants");
56
+ const run = (0, util_1.promisify)(child_process_1.execFile);
57
+ const SCRATCH_DIRS = [
58
+ "/tmp/clip-scorer-tmp",
59
+ path.resolve(process.cwd(), "services/clip-scorer/tmp"),
60
+ ];
61
+ let AdminClipScorerService = AdminClipScorerService_1 = class AdminClipScorerService {
62
+ redis;
63
+ logger = new common_1.Logger(AdminClipScorerService_1.name);
64
+ constructor(redis) {
65
+ this.redis = redis;
66
+ }
67
+ async getLocks() {
68
+ try {
69
+ const keys = await this.redis.keys("lock:clip:*");
70
+ const locks = [];
71
+ for (const key of keys) {
72
+ const [ttl, value] = await Promise.all([
73
+ this.redis.ttl(key),
74
+ this.redis.get(key).catch(() => null),
75
+ ]);
76
+ locks.push({
77
+ key,
78
+ clipId: key.replace("lock:clip:", ""),
79
+ ttlSeconds: Math.max(ttl, 0),
80
+ value: value ?? undefined,
81
+ });
82
+ }
83
+ return { total: locks.length, locks };
84
+ }
85
+ catch (err) {
86
+ return {
87
+ total: 0,
88
+ locks: [],
89
+ error: err instanceof Error ? err.message : String(err),
90
+ };
91
+ }
92
+ }
93
+ async forceReleaseLock(key) {
94
+ if (!key.startsWith("lock:clip:")) {
95
+ return { ok: false, error: "Only lock:clip:* keys can be released" };
96
+ }
97
+ await this.redis.del(key);
98
+ return { ok: true, key };
99
+ }
100
+ async getScratchStorage() {
101
+ const dirs = [];
102
+ for (const dir of SCRATCH_DIRS) {
103
+ let exists = false;
104
+ try {
105
+ exists = fs.existsSync(dir);
106
+ }
107
+ catch {
108
+ exists = false;
109
+ }
110
+ let bytes = 0;
111
+ if (exists) {
112
+ bytes = await this.dirSize(dir);
113
+ }
114
+ dirs.push({ dir, exists, bytes });
115
+ }
116
+ return { dirs };
117
+ }
118
+ async dirSize(dir) {
119
+ try {
120
+ const { stdout } = await run("du", ["-sk", dir]);
121
+ const kb = parseInt(stdout.trim().split(/\s+/)[0] ?? "0", 10);
122
+ return Number.isFinite(kb) ? kb * 1024 : 0;
123
+ }
124
+ catch {
125
+ return 0;
126
+ }
127
+ }
128
+ };
129
+ exports.AdminClipScorerService = AdminClipScorerService;
130
+ exports.AdminClipScorerService = AdminClipScorerService = AdminClipScorerService_1 = __decorate([
131
+ (0, common_1.Injectable)(),
132
+ __param(0, (0, common_1.Inject)(redis_constants_1.REDIS_CLIENT)),
133
+ __metadata("design:paramtypes", [Object])
134
+ ], AdminClipScorerService);
135
+ //# sourceMappingURL=admin-clip-scorer.service.js.map
apps/api/dist/admin/admin-clip-scorer.service.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"admin-clip-scorer.service.js","sourceRoot":"","sources":["../../src/admin/admin-clip-scorer.service.ts"],"names":[],"mappings":"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"}
apps/api/dist/admin/admin-comms.service.js ADDED
@@ -0,0 +1,145 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var AdminCommsService_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.AdminCommsService = void 0;
14
+ const common_1 = require("@nestjs/common");
15
+ const prisma_service_1 = require("../prisma/prisma.service");
16
+ const audit_service_1 = require("../audit/audit.service");
17
+ const shared_types_1 = require("@micprotocol/shared-types");
18
+ const admin_permission_decorator_1 = require("../common/decorators/admin-permission.decorator");
19
+ let AdminCommsService = AdminCommsService_1 = class AdminCommsService {
20
+ prisma;
21
+ audit;
22
+ logger = new common_1.Logger(AdminCommsService_1.name);
23
+ constructor(prisma, audit) {
24
+ this.prisma = prisma;
25
+ this.audit = audit;
26
+ }
27
+ async listAnnouncements() {
28
+ const items = await this.prisma.announcement.findMany({
29
+ orderBy: { createdAt: "desc" },
30
+ });
31
+ return items.map((a) => ({
32
+ id: a.id,
33
+ title: a.title,
34
+ body: a.body,
35
+ audience: a.audience,
36
+ severity: a.severity,
37
+ status: a.status,
38
+ publishedAt: a.publishedAt,
39
+ expiresAt: a.expiresAt,
40
+ createdById: a.createdById,
41
+ createdAt: a.createdAt,
42
+ }));
43
+ }
44
+ async createAnnouncement(title, body, audience, severity, status, publishedAt, expiresAt, createdById) {
45
+ const announcement = await this.prisma.announcement.create({
46
+ data: {
47
+ title,
48
+ body,
49
+ audience: audience,
50
+ severity,
51
+ status,
52
+ publishedAt,
53
+ expiresAt,
54
+ createdById,
55
+ },
56
+ });
57
+ await this.audit.log({
58
+ userId: createdById,
59
+ action: "admin.announcements.write",
60
+ entityType: "Announcement",
61
+ entityId: announcement.id,
62
+ metadata: { title, severity, status },
63
+ });
64
+ return announcement;
65
+ }
66
+ async updateAnnouncement(id, patch, actorUserId) {
67
+ const existing = await this.prisma.announcement.findUnique({
68
+ where: { id },
69
+ select: { id: true, title: true, status: true },
70
+ });
71
+ if (!existing)
72
+ throw new common_1.NotFoundException(`Announcement ${id} not found`);
73
+ const data = {};
74
+ if (patch.title !== undefined)
75
+ data.title = patch.title;
76
+ if (patch.body !== undefined)
77
+ data.body = patch.body;
78
+ if (patch.audience !== undefined)
79
+ data.audience = patch.audience;
80
+ if (patch.severity !== undefined)
81
+ data.severity = patch.severity;
82
+ if (patch.status !== undefined)
83
+ data.status = patch.status;
84
+ if (patch.publishedAt !== undefined)
85
+ data.publishedAt = patch.publishedAt;
86
+ if (patch.expiresAt !== undefined)
87
+ data.expiresAt = patch.expiresAt;
88
+ const updated = await this.prisma.announcement.update({ where: { id }, data });
89
+ await this.audit.log({
90
+ userId: actorUserId,
91
+ action: "admin.announcements.write",
92
+ entityType: "Announcement",
93
+ entityId: id,
94
+ metadata: { before: { title: existing.title, status: existing.status }, after: patch },
95
+ });
96
+ return updated;
97
+ }
98
+ async archiveAnnouncement(id, actorUserId) {
99
+ const existing = await this.prisma.announcement.findUnique({
100
+ where: { id },
101
+ select: { id: true, status: true },
102
+ });
103
+ if (!existing)
104
+ throw new common_1.NotFoundException(`Announcement ${id} not found`);
105
+ if (existing.status === "archived")
106
+ throw new common_1.BadRequestException("Announcement is already archived");
107
+ const updated = await this.prisma.announcement.update({
108
+ where: { id },
109
+ data: { status: "archived" },
110
+ });
111
+ await this.audit.log({
112
+ userId: actorUserId,
113
+ action: "admin.announcements.write",
114
+ entityType: "Announcement",
115
+ entityId: id,
116
+ metadata: { before: { status: existing.status }, after: { status: "archived" } },
117
+ });
118
+ return updated;
119
+ }
120
+ };
121
+ exports.AdminCommsService = AdminCommsService;
122
+ __decorate([
123
+ (0, admin_permission_decorator_1.requireAdminPermission)(shared_types_1.AdminPermission.ANNOUNCEMENTS_WRITE),
124
+ __metadata("design:type", Function),
125
+ __metadata("design:paramtypes", [String, String, Object, String, String, Object, Object, String]),
126
+ __metadata("design:returntype", Promise)
127
+ ], AdminCommsService.prototype, "createAnnouncement", null);
128
+ __decorate([
129
+ (0, admin_permission_decorator_1.requireAdminPermission)(shared_types_1.AdminPermission.ANNOUNCEMENTS_WRITE),
130
+ __metadata("design:type", Function),
131
+ __metadata("design:paramtypes", [String, Object, String]),
132
+ __metadata("design:returntype", Promise)
133
+ ], AdminCommsService.prototype, "updateAnnouncement", null);
134
+ __decorate([
135
+ (0, admin_permission_decorator_1.requireAdminPermission)(shared_types_1.AdminPermission.ANNOUNCEMENTS_WRITE),
136
+ __metadata("design:type", Function),
137
+ __metadata("design:paramtypes", [String, String]),
138
+ __metadata("design:returntype", Promise)
139
+ ], AdminCommsService.prototype, "archiveAnnouncement", null);
140
+ exports.AdminCommsService = AdminCommsService = AdminCommsService_1 = __decorate([
141
+ (0, common_1.Injectable)(),
142
+ __metadata("design:paramtypes", [prisma_service_1.PrismaService,
143
+ audit_service_1.AuditService])
144
+ ], AdminCommsService);
145
+ //# sourceMappingURL=admin-comms.service.js.map
apps/api/dist/admin/admin-comms.service.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"admin-comms.service.js","sourceRoot":"","sources":["../../src/admin/admin-comms.service.ts"],"names":[],"mappings":"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"}
apps/api/dist/admin/admin-moderation.service.js ADDED
@@ -0,0 +1,164 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var AdminModerationService_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.AdminModerationService = void 0;
14
+ const common_1 = require("@nestjs/common");
15
+ const prisma_service_1 = require("../prisma/prisma.service");
16
+ const audit_service_1 = require("../audit/audit.service");
17
+ const shared_types_1 = require("@micprotocol/shared-types");
18
+ const admin_permission_decorator_1 = require("../common/decorators/admin-permission.decorator");
19
+ let AdminModerationService = AdminModerationService_1 = class AdminModerationService {
20
+ prisma;
21
+ audit;
22
+ logger = new common_1.Logger(AdminModerationService_1.name);
23
+ constructor(prisma, audit) {
24
+ this.prisma = prisma;
25
+ this.audit = audit;
26
+ }
27
+ async listAbuseReports(input = {}) {
28
+ const limit = Math.min(Math.max(input.limit ?? 50, 1), 200);
29
+ const where = {
30
+ ...(input.status ? { status: input.status } : {}),
31
+ ...(input.category ? { category: input.category } : {}),
32
+ ...(input.targetType ? { targetType: input.targetType } : {}),
33
+ };
34
+ const [total, items] = await Promise.all([
35
+ this.prisma.abuseReport.count({ where }),
36
+ this.prisma.abuseReport.findMany({
37
+ where,
38
+ orderBy: { createdAt: "desc" },
39
+ take: limit + 1,
40
+ ...(input.cursor ? { skip: 1, cursor: { id: input.cursor } } : {}),
41
+ select: {
42
+ id: true,
43
+ reporterUserId: true,
44
+ targetType: true,
45
+ targetId: true,
46
+ category: true,
47
+ details: true,
48
+ status: true,
49
+ resolution: true,
50
+ handledById: true,
51
+ resolvedAt: true,
52
+ createdAt: true,
53
+ },
54
+ }),
55
+ ]);
56
+ const hasMore = items.length > limit;
57
+ const page = hasMore ? items.slice(0, limit) : items;
58
+ return {
59
+ items: page.map((r) => ({
60
+ id: r.id,
61
+ reporterUserId: r.reporterUserId,
62
+ targetType: r.targetType,
63
+ targetId: r.targetId,
64
+ category: r.category,
65
+ status: r.status,
66
+ resolution: r.resolution,
67
+ handledById: r.handledById,
68
+ resolvedAt: r.resolvedAt,
69
+ createdAt: r.createdAt,
70
+ })),
71
+ total,
72
+ nextCursor: hasMore ? page[page.length - 1]?.id ?? null : null,
73
+ };
74
+ }
75
+ async getAbuseReport(reportId) {
76
+ const report = await this.prisma.abuseReport.findUnique({
77
+ where: { id: reportId },
78
+ });
79
+ if (!report)
80
+ throw new common_1.NotFoundException(`Abuse report ${reportId} not found`);
81
+ return report;
82
+ }
83
+ async resolveReport(reportId, resolution, handlerUserId, status) {
84
+ const report = await this.prisma.abuseReport.findUnique({
85
+ where: { id: reportId },
86
+ select: { id: true, status: true, resolution: true, targetType: true, targetId: true },
87
+ });
88
+ if (!report)
89
+ throw new common_1.NotFoundException(`Abuse report ${reportId} not found`);
90
+ if (report.status === "resolved")
91
+ throw new common_1.BadRequestException("Report is already resolved");
92
+ const updated = await this.prisma.abuseReport.update({
93
+ where: { id: reportId },
94
+ data: {
95
+ status: (status ?? "resolved"),
96
+ resolution,
97
+ handledById: handlerUserId,
98
+ resolvedAt: new Date(),
99
+ },
100
+ });
101
+ await this.audit.log({
102
+ userId: handlerUserId,
103
+ action: "admin.moderation.resolve",
104
+ entityType: "AbuseReport",
105
+ entityId: reportId,
106
+ metadata: {
107
+ targetType: report.targetType,
108
+ targetId: report.targetId,
109
+ before: { status: report.status, resolution: report.resolution },
110
+ after: { status: updated.status, resolution },
111
+ },
112
+ });
113
+ return updated;
114
+ }
115
+ async takedown(reportId, handlerUserId, reason) {
116
+ const report = await this.prisma.abuseReport.findUnique({
117
+ where: { id: reportId },
118
+ select: { id: true, status: true, targetType: true, targetId: true },
119
+ });
120
+ if (!report)
121
+ throw new common_1.NotFoundException(`Abuse report ${reportId} not found`);
122
+ const updated = await this.prisma.abuseReport.update({
123
+ where: { id: reportId },
124
+ data: {
125
+ status: "resolved",
126
+ resolution: reason || "takedown",
127
+ handledById: handlerUserId,
128
+ resolvedAt: new Date(),
129
+ },
130
+ });
131
+ await this.audit.log({
132
+ userId: handlerUserId,
133
+ action: "admin.moderation.takedown",
134
+ entityType: report.targetType,
135
+ entityId: report.targetId,
136
+ metadata: {
137
+ reportId,
138
+ reason,
139
+ before: { status: report.status },
140
+ after: { status: "resolved", resolution: "takedown" },
141
+ },
142
+ });
143
+ return updated;
144
+ }
145
+ };
146
+ exports.AdminModerationService = AdminModerationService;
147
+ __decorate([
148
+ (0, admin_permission_decorator_1.requireAdminPermission)(shared_types_1.AdminPermission.MODERATION_RESOLVE),
149
+ __metadata("design:type", Function),
150
+ __metadata("design:paramtypes", [String, String, String, String]),
151
+ __metadata("design:returntype", Promise)
152
+ ], AdminModerationService.prototype, "resolveReport", null);
153
+ __decorate([
154
+ (0, admin_permission_decorator_1.requireAdminPermission)(shared_types_1.AdminPermission.MODERATION_TAKEDOWN),
155
+ __metadata("design:type", Function),
156
+ __metadata("design:paramtypes", [String, String, String]),
157
+ __metadata("design:returntype", Promise)
158
+ ], AdminModerationService.prototype, "takedown", null);
159
+ exports.AdminModerationService = AdminModerationService = AdminModerationService_1 = __decorate([
160
+ (0, common_1.Injectable)(),
161
+ __metadata("design:paramtypes", [prisma_service_1.PrismaService,
162
+ audit_service_1.AuditService])
163
+ ], AdminModerationService);
164
+ //# sourceMappingURL=admin-moderation.service.js.map
apps/api/dist/admin/admin-moderation.service.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"admin-moderation.service.js","sourceRoot":"","sources":["../../src/admin/admin-moderation.service.ts"],"names":[],"mappings":"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"}
apps/api/dist/admin/admin-operations.service.js ADDED
@@ -0,0 +1,277 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ var AdminOperationsService_1;
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.AdminOperationsService = exports.OPERATIONS_QUEUES = void 0;
17
+ const common_1 = require("@nestjs/common");
18
+ const bullmq_1 = require("@nestjs/bullmq");
19
+ const common_2 = require("@nestjs/common");
20
+ const prisma_service_1 = require("../prisma/prisma.service");
21
+ const audit_service_1 = require("../audit/audit.service");
22
+ const cache_service_1 = require("../common/cache/cache.service");
23
+ const redis_constants_1 = require("../common/redis.constants");
24
+ const shared_types_1 = require("@micprotocol/shared-types");
25
+ const admin_permission_decorator_1 = require("../common/decorators/admin-permission.decorator");
26
+ exports.OPERATIONS_QUEUES = [
27
+ "outreach",
28
+ "content",
29
+ "notifications",
30
+ "analytics",
31
+ "network",
32
+ "post-interview",
33
+ "clip-scoring",
34
+ "email",
35
+ "reminder",
36
+ "asset-processing",
37
+ "outreach-automation",
38
+ "verification",
39
+ ];
40
+ let AdminOperationsService = AdminOperationsService_1 = class AdminOperationsService {
41
+ prisma;
42
+ audit;
43
+ cache;
44
+ redis;
45
+ outreachQueue;
46
+ contentQueue;
47
+ notificationsQueue;
48
+ analyticsQueue;
49
+ networkQueue;
50
+ postInterviewQueue;
51
+ clipScoringQueue;
52
+ emailQueue;
53
+ reminderQueue;
54
+ assetProcessingQueue;
55
+ outreachAutomationQueue;
56
+ verificationQueue;
57
+ logger = new common_1.Logger(AdminOperationsService_1.name);
58
+ constructor(prisma, audit, cache, redis, outreachQueue, contentQueue, notificationsQueue, analyticsQueue, networkQueue, postInterviewQueue, clipScoringQueue, emailQueue, reminderQueue, assetProcessingQueue, outreachAutomationQueue, verificationQueue) {
59
+ this.prisma = prisma;
60
+ this.audit = audit;
61
+ this.cache = cache;
62
+ this.redis = redis;
63
+ this.outreachQueue = outreachQueue;
64
+ this.contentQueue = contentQueue;
65
+ this.notificationsQueue = notificationsQueue;
66
+ this.analyticsQueue = analyticsQueue;
67
+ this.networkQueue = networkQueue;
68
+ this.postInterviewQueue = postInterviewQueue;
69
+ this.clipScoringQueue = clipScoringQueue;
70
+ this.emailQueue = emailQueue;
71
+ this.reminderQueue = reminderQueue;
72
+ this.assetProcessingQueue = assetProcessingQueue;
73
+ this.outreachAutomationQueue = outreachAutomationQueue;
74
+ this.verificationQueue = verificationQueue;
75
+ }
76
+ queueByName(name) {
77
+ const queues = {
78
+ outreach: this.outreachQueue,
79
+ content: this.contentQueue,
80
+ notifications: this.notificationsQueue,
81
+ analytics: this.analyticsQueue,
82
+ network: this.networkQueue,
83
+ "post-interview": this.postInterviewQueue,
84
+ "clip-scoring": this.clipScoringQueue,
85
+ email: this.emailQueue,
86
+ reminder: this.reminderQueue,
87
+ "asset-processing": this.assetProcessingQueue,
88
+ "outreach-automation": this.outreachAutomationQueue,
89
+ verification: this.verificationQueue,
90
+ };
91
+ const queue = queues[name];
92
+ if (!queue)
93
+ throw new common_1.NotFoundException(`Unknown queue ${name}`);
94
+ return queue;
95
+ }
96
+ async getQueueHealth() {
97
+ const results = [];
98
+ for (const name of exports.OPERATIONS_QUEUES) {
99
+ const queue = this.queueByName(name);
100
+ const [waiting, active, completed, failed, delayed] = await Promise.all([
101
+ queue.getWaitingCount(),
102
+ queue.getActiveCount(),
103
+ queue.getCompletedCount(),
104
+ queue.getFailedCount(),
105
+ queue.getDelayedCount(),
106
+ ]);
107
+ results.push({ name, waiting, active, completed, failed, delayed });
108
+ }
109
+ return results.sort((a, b) => b.failed - a.failed || b.waiting - a.waiting);
110
+ }
111
+ async getQueueJobs(queueName, type, limit = 50) {
112
+ const queue = this.queueByName(queueName);
113
+ const getJobs = queue[`get${type.charAt(0).toUpperCase() + type.slice(1)}`];
114
+ const jobs = await getJobs.call(queue, 0, Math.min(limit, 200));
115
+ return jobs.map((job) => ({
116
+ id: job.id,
117
+ type: job.name,
118
+ progress: job.progress,
119
+ failedReason: job.failedReason,
120
+ createdAt: job.timestamp ? new Date(job.timestamp) : null,
121
+ }));
122
+ }
123
+ async retryJob(queueName, jobId, actorUserId) {
124
+ const queue = this.queueByName(queueName);
125
+ const job = await queue.getJob(jobId);
126
+ if (!job)
127
+ throw new common_1.NotFoundException(`Job ${jobId} not found in queue ${queueName}`);
128
+ await job.retry();
129
+ await this.audit.log({
130
+ userId: actorUserId,
131
+ action: "admin.ops.retry_jobs",
132
+ entityType: "Job",
133
+ entityId: jobId,
134
+ metadata: { queue: queueName, jobType: job.name },
135
+ });
136
+ return { retried: jobId, queue: queueName };
137
+ }
138
+ async purgeFailedJobs(queueName, actorUserId) {
139
+ const queue = this.queueByName(queueName);
140
+ const failed = await queue.getFailed();
141
+ let removed = 0;
142
+ for (const job of failed) {
143
+ await job.remove();
144
+ removed++;
145
+ }
146
+ await this.audit.log({
147
+ userId: actorUserId,
148
+ action: "admin.ops.purge_jobs",
149
+ entityType: "Queue",
150
+ entityId: queueName,
151
+ metadata: { removed, type: "failed" },
152
+ });
153
+ return { purged: removed, queue: queueName };
154
+ }
155
+ async getLocks(pattern = "lock:clip:*", limit = 100) {
156
+ const keys = await this.redis.keys(pattern);
157
+ const sample = keys.slice(0, limit);
158
+ return { pattern, total: keys.length, keys: sample };
159
+ }
160
+ async releaseLock(key, actorUserId) {
161
+ const deleted = await this.redis.del(key);
162
+ await this.audit.log({
163
+ userId: actorUserId,
164
+ action: "admin.ops.locks",
165
+ entityType: "Lock",
166
+ entityId: key,
167
+ metadata: { deleted },
168
+ });
169
+ return { key, deleted };
170
+ }
171
+ async getSystemHealth() {
172
+ let database = "down";
173
+ let redis = "down";
174
+ try {
175
+ await this.prisma.$queryRawUnsafe("SELECT 1");
176
+ database = "up";
177
+ }
178
+ catch {
179
+ database = "down";
180
+ }
181
+ try {
182
+ await this.redis.ping();
183
+ redis = "up";
184
+ }
185
+ catch {
186
+ redis = "down";
187
+ }
188
+ const overall = database === "up" && redis === "up" ? "up" : database === "down" && redis === "down" ? "down" : "degraded";
189
+ return { database, redis, overall };
190
+ }
191
+ async setMaintenanceMode(enabled, actorUserId) {
192
+ const setting = await this.prisma.platformSetting.upsert({
193
+ where: { key: "maintenance.mode" },
194
+ update: {
195
+ value: enabled,
196
+ updatedById: actorUserId,
197
+ },
198
+ create: {
199
+ key: "maintenance.mode",
200
+ value: enabled,
201
+ description: "Platform maintenance mode — signups and writes are rejected when enabled",
202
+ category: "operations",
203
+ updatedById: actorUserId,
204
+ },
205
+ });
206
+ await this.audit.log({
207
+ userId: actorUserId,
208
+ action: "admin.ops.maintenance",
209
+ entityType: "PlatformSetting",
210
+ entityId: "maintenance.mode",
211
+ metadata: { before: null, after: enabled },
212
+ });
213
+ return setting;
214
+ }
215
+ async flushCache(pattern, actorUserId) {
216
+ await this.cache.delPattern(pattern);
217
+ await this.audit.log({
218
+ userId: actorUserId,
219
+ action: "admin.ops.cache",
220
+ entityType: "Cache",
221
+ entityId: pattern,
222
+ metadata: { pattern },
223
+ });
224
+ return { flushed: pattern };
225
+ }
226
+ };
227
+ exports.AdminOperationsService = AdminOperationsService;
228
+ __decorate([
229
+ (0, admin_permission_decorator_1.requireAdminPermission)(shared_types_1.AdminPermission.OPS_RETRY_JOBS),
230
+ __metadata("design:type", Function),
231
+ __metadata("design:paramtypes", [String, String, String]),
232
+ __metadata("design:returntype", Promise)
233
+ ], AdminOperationsService.prototype, "retryJob", null);
234
+ __decorate([
235
+ (0, admin_permission_decorator_1.requireAdminPermission)(shared_types_1.AdminPermission.OPS_PURGE_JOBS),
236
+ __metadata("design:type", Function),
237
+ __metadata("design:paramtypes", [String, String]),
238
+ __metadata("design:returntype", Promise)
239
+ ], AdminOperationsService.prototype, "purgeFailedJobs", null);
240
+ __decorate([
241
+ (0, admin_permission_decorator_1.requireAdminPermission)(shared_types_1.AdminPermission.OPS_LOCKS),
242
+ __metadata("design:type", Function),
243
+ __metadata("design:paramtypes", [String, String]),
244
+ __metadata("design:returntype", Promise)
245
+ ], AdminOperationsService.prototype, "releaseLock", null);
246
+ __decorate([
247
+ (0, admin_permission_decorator_1.requireAdminPermission)(shared_types_1.AdminPermission.OPS_MAINTENANCE),
248
+ __metadata("design:type", Function),
249
+ __metadata("design:paramtypes", [Boolean, String]),
250
+ __metadata("design:returntype", Promise)
251
+ ], AdminOperationsService.prototype, "setMaintenanceMode", null);
252
+ __decorate([
253
+ (0, admin_permission_decorator_1.requireAdminPermission)(shared_types_1.AdminPermission.OPS_CACHE),
254
+ __metadata("design:type", Function),
255
+ __metadata("design:paramtypes", [String, String]),
256
+ __metadata("design:returntype", Promise)
257
+ ], AdminOperationsService.prototype, "flushCache", null);
258
+ exports.AdminOperationsService = AdminOperationsService = AdminOperationsService_1 = __decorate([
259
+ (0, common_1.Injectable)(),
260
+ __param(3, (0, common_2.Inject)(redis_constants_1.REDIS_CLIENT)),
261
+ __param(4, (0, bullmq_1.InjectQueue)("outreach")),
262
+ __param(5, (0, bullmq_1.InjectQueue)("content")),
263
+ __param(6, (0, bullmq_1.InjectQueue)("notifications")),
264
+ __param(7, (0, bullmq_1.InjectQueue)("analytics")),
265
+ __param(8, (0, bullmq_1.InjectQueue)("network")),
266
+ __param(9, (0, bullmq_1.InjectQueue)("post-interview")),
267
+ __param(10, (0, bullmq_1.InjectQueue)("clip-scoring")),
268
+ __param(11, (0, bullmq_1.InjectQueue)("email")),
269
+ __param(12, (0, bullmq_1.InjectQueue)("reminder")),
270
+ __param(13, (0, bullmq_1.InjectQueue)("asset-processing")),
271
+ __param(14, (0, bullmq_1.InjectQueue)("outreach-automation")),
272
+ __param(15, (0, bullmq_1.InjectQueue)("verification")),
273
+ __metadata("design:paramtypes", [prisma_service_1.PrismaService,
274
+ audit_service_1.AuditService,
275
+ cache_service_1.CacheService, Object, Function, Function, Function, Function, Function, Function, Function, Function, Function, Function, Function, Function])
276
+ ], AdminOperationsService);
277
+ //# sourceMappingURL=admin-operations.service.js.map
apps/api/dist/admin/admin-operations.service.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"admin-operations.service.js","sourceRoot":"","sources":["../../src/admin/admin-operations.service.ts"],"names":[],"mappings":"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"}
apps/api/dist/admin/admin-realtime.service.js ADDED
@@ -0,0 +1,79 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var AdminRealtimeService_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.AdminRealtimeService = void 0;
14
+ const common_1 = require("@nestjs/common");
15
+ const axios_1 = require("@nestjs/axios");
16
+ const rxjs_1 = require("rxjs");
17
+ let AdminRealtimeService = AdminRealtimeService_1 = class AdminRealtimeService {
18
+ http;
19
+ logger = new common_1.Logger(AdminRealtimeService_1.name);
20
+ baseUrl;
21
+ internalToken;
22
+ constructor(http) {
23
+ this.http = http;
24
+ this.baseUrl = process.env.MIC_REALTIME_URL ?? "http://localhost:4001";
25
+ this.internalToken = process.env.MIC_REALTIME_INTERNAL_TOKEN ?? "";
26
+ }
27
+ get headers() {
28
+ return {
29
+ "x-internal-token": this.internalToken,
30
+ "content-type": "application/json",
31
+ };
32
+ }
33
+ async getStats() {
34
+ try {
35
+ const { data } = await (0, rxjs_1.firstValueFrom)(this.http.get(`${this.baseUrl}/admin/stats`, {
36
+ headers: this.headers,
37
+ timeout: 3000,
38
+ }));
39
+ return { ok: true, stats: data ?? {} };
40
+ }
41
+ catch (err) {
42
+ this.logger.warn(`mic-realtime /admin/stats unreachable: ${String(err)}`);
43
+ return {
44
+ ok: false,
45
+ error: err instanceof Error ? err.message : String(err),
46
+ };
47
+ }
48
+ }
49
+ async getMetrics() {
50
+ try {
51
+ const { data } = await (0, rxjs_1.firstValueFrom)(this.http.get(`${this.baseUrl}/metrics`, {
52
+ headers: this.headers,
53
+ timeout: 3000,
54
+ responseType: "text",
55
+ }));
56
+ return { ok: true, metrics: typeof data === "string" ? data : "" };
57
+ }
58
+ catch (err) {
59
+ this.logger.warn(`mic-realtime /metrics unreachable: ${String(err)}`);
60
+ return { ok: false, error: err instanceof Error ? err.message : String(err) };
61
+ }
62
+ }
63
+ async getTraces(limit = 50) {
64
+ try {
65
+ const { data } = await (0, rxjs_1.firstValueFrom)(this.http.get(`${this.baseUrl}/admin/traces?limit=${limit}`, { headers: this.headers, timeout: 3000 }));
66
+ return { ok: true, traces: data?.traces ?? [], count: data?.count ?? 0 };
67
+ }
68
+ catch (err) {
69
+ this.logger.warn(`mic-realtime /admin/traces unreachable: ${String(err)}`);
70
+ return { ok: false, error: err instanceof Error ? err.message : String(err) };
71
+ }
72
+ }
73
+ };
74
+ exports.AdminRealtimeService = AdminRealtimeService;
75
+ exports.AdminRealtimeService = AdminRealtimeService = AdminRealtimeService_1 = __decorate([
76
+ (0, common_1.Injectable)(),
77
+ __metadata("design:paramtypes", [axios_1.HttpService])
78
+ ], AdminRealtimeService);
79
+ //# sourceMappingURL=admin-realtime.service.js.map
apps/api/dist/admin/admin-realtime.service.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"admin-realtime.service.js","sourceRoot":"","sources":["../../src/admin/admin-realtime.service.ts"],"names":[],"mappings":"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"}
apps/api/dist/admin/admin-settings.service.js ADDED
@@ -0,0 +1,194 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var AdminSettingsService_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.AdminSettingsService = void 0;
14
+ const common_1 = require("@nestjs/common");
15
+ const prisma_service_1 = require("../prisma/prisma.service");
16
+ const audit_service_1 = require("../audit/audit.service");
17
+ const shared_types_1 = require("@micprotocol/shared-types");
18
+ const admin_permission_decorator_1 = require("../common/decorators/admin-permission.decorator");
19
+ let AdminSettingsService = AdminSettingsService_1 = class AdminSettingsService {
20
+ prisma;
21
+ audit;
22
+ logger = new common_1.Logger(AdminSettingsService_1.name);
23
+ constructor(prisma, audit) {
24
+ this.prisma = prisma;
25
+ this.audit = audit;
26
+ }
27
+ async listSettings() {
28
+ const items = await this.prisma.platformSetting.findMany({
29
+ orderBy: [{ category: "asc" }, { key: "asc" }],
30
+ });
31
+ return items.map((s) => ({
32
+ key: s.key,
33
+ value: s.value,
34
+ description: s.description,
35
+ category: s.category,
36
+ updatedById: s.updatedById,
37
+ updatedAt: s.updatedAt,
38
+ }));
39
+ }
40
+ async getSetting(key) {
41
+ const setting = await this.prisma.platformSetting.findUnique({ where: { key } });
42
+ if (!setting)
43
+ throw new common_1.NotFoundException(`Platform setting ${key} not found`);
44
+ return setting;
45
+ }
46
+ async upsertSetting(key, value, description, category, actorUserId) {
47
+ const existing = await this.prisma.platformSetting.findUnique({ where: { key } });
48
+ const before = existing ? existing.value : null;
49
+ const setting = await this.prisma.platformSetting.upsert({
50
+ where: { key },
51
+ update: {
52
+ value: value,
53
+ ...(description !== undefined ? { description } : {}),
54
+ ...(category !== undefined ? { category: category } : {}),
55
+ updatedById: actorUserId,
56
+ },
57
+ create: {
58
+ key,
59
+ value: value,
60
+ description,
61
+ category: category,
62
+ updatedById: actorUserId,
63
+ },
64
+ });
65
+ await this.audit.log({
66
+ userId: actorUserId,
67
+ action: "admin.settings.write",
68
+ entityType: "PlatformSetting",
69
+ entityId: key,
70
+ metadata: { before, after: value, category },
71
+ });
72
+ return setting;
73
+ }
74
+ async deleteSetting(key, actorUserId) {
75
+ const existing = await this.prisma.platformSetting.findUnique({
76
+ where: { key },
77
+ select: { key: true, value: true },
78
+ });
79
+ if (!existing)
80
+ throw new common_1.NotFoundException(`Platform setting ${key} not found`);
81
+ await this.prisma.platformSetting.delete({ where: { key } });
82
+ await this.audit.log({
83
+ userId: actorUserId,
84
+ action: "admin.settings.write",
85
+ entityType: "PlatformSetting",
86
+ entityId: key,
87
+ metadata: { before: existing.value, after: null, deleted: true },
88
+ });
89
+ return { deleted: key };
90
+ }
91
+ async listFlags() {
92
+ const items = await this.prisma.featureFlag.findMany({
93
+ orderBy: { key: "asc" },
94
+ });
95
+ return items.map((f) => ({
96
+ key: f.key,
97
+ enabled: f.enabled,
98
+ rolloutPercentage: f.rolloutPercentage,
99
+ allowlistWorkspaceIds: f.allowlistWorkspaceIds,
100
+ description: f.description,
101
+ updatedById: f.updatedById,
102
+ updatedAt: f.updatedAt,
103
+ }));
104
+ }
105
+ async isFlagEnabled(key, workspaceId) {
106
+ const flag = await this.prisma.featureFlag.findUnique({ where: { key } });
107
+ if (!flag || !flag.enabled)
108
+ return false;
109
+ if (workspaceId && flag.allowlistWorkspaceIds.length > 0) {
110
+ return flag.allowlistWorkspaceIds.includes(workspaceId);
111
+ }
112
+ return flag.rolloutPercentage >= 100;
113
+ }
114
+ async upsertFlag(key, enabled, rolloutPercentage, allowlistWorkspaceIds, description, actorUserId) {
115
+ const existing = await this.prisma.featureFlag.findUnique({ where: { key } });
116
+ const before = existing
117
+ ? { enabled: existing.enabled, rolloutPercentage: existing.rolloutPercentage, allowlistWorkspaceIds: existing.allowlistWorkspaceIds }
118
+ : null;
119
+ const flag = await this.prisma.featureFlag.upsert({
120
+ where: { key },
121
+ update: {
122
+ enabled,
123
+ rolloutPercentage,
124
+ allowlistWorkspaceIds,
125
+ ...(description !== undefined ? { description } : {}),
126
+ updatedById: actorUserId,
127
+ },
128
+ create: {
129
+ key,
130
+ enabled,
131
+ rolloutPercentage,
132
+ allowlistWorkspaceIds,
133
+ description,
134
+ updatedById: actorUserId,
135
+ },
136
+ });
137
+ await this.audit.log({
138
+ userId: actorUserId,
139
+ action: "admin.flags.write",
140
+ entityType: "FeatureFlag",
141
+ entityId: key,
142
+ metadata: { before, after: { enabled, rolloutPercentage, allowlistWorkspaceIds } },
143
+ });
144
+ return flag;
145
+ }
146
+ async deleteFlag(key, actorUserId) {
147
+ const existing = await this.prisma.featureFlag.findUnique({
148
+ where: { key },
149
+ select: { key: true, enabled: true },
150
+ });
151
+ if (!existing)
152
+ throw new common_1.NotFoundException(`Feature flag ${key} not found`);
153
+ await this.prisma.featureFlag.delete({ where: { key } });
154
+ await this.audit.log({
155
+ userId: actorUserId,
156
+ action: "admin.flags.write",
157
+ entityType: "FeatureFlag",
158
+ entityId: key,
159
+ metadata: { before: existing, after: null, deleted: true },
160
+ });
161
+ return { deleted: key };
162
+ }
163
+ };
164
+ exports.AdminSettingsService = AdminSettingsService;
165
+ __decorate([
166
+ (0, admin_permission_decorator_1.requireAdminPermission)(shared_types_1.AdminPermission.SETTINGS_WRITE),
167
+ __metadata("design:type", Function),
168
+ __metadata("design:paramtypes", [String, Object, Object, String, String]),
169
+ __metadata("design:returntype", Promise)
170
+ ], AdminSettingsService.prototype, "upsertSetting", null);
171
+ __decorate([
172
+ (0, admin_permission_decorator_1.requireAdminPermission)(shared_types_1.AdminPermission.SETTINGS_WRITE),
173
+ __metadata("design:type", Function),
174
+ __metadata("design:paramtypes", [String, String]),
175
+ __metadata("design:returntype", Promise)
176
+ ], AdminSettingsService.prototype, "deleteSetting", null);
177
+ __decorate([
178
+ (0, admin_permission_decorator_1.requireAdminPermission)(shared_types_1.AdminPermission.FLAGS_WRITE),
179
+ __metadata("design:type", Function),
180
+ __metadata("design:paramtypes", [String, Boolean, Number, Array, Object, String]),
181
+ __metadata("design:returntype", Promise)
182
+ ], AdminSettingsService.prototype, "upsertFlag", null);
183
+ __decorate([
184
+ (0, admin_permission_decorator_1.requireAdminPermission)(shared_types_1.AdminPermission.FLAGS_WRITE),
185
+ __metadata("design:type", Function),
186
+ __metadata("design:paramtypes", [String, String]),
187
+ __metadata("design:returntype", Promise)
188
+ ], AdminSettingsService.prototype, "deleteFlag", null);
189
+ exports.AdminSettingsService = AdminSettingsService = AdminSettingsService_1 = __decorate([
190
+ (0, common_1.Injectable)(),
191
+ __metadata("design:paramtypes", [prisma_service_1.PrismaService,
192
+ audit_service_1.AuditService])
193
+ ], AdminSettingsService);
194
+ //# sourceMappingURL=admin-settings.service.js.map
apps/api/dist/admin/admin-settings.service.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"admin-settings.service.js","sourceRoot":"","sources":["../../src/admin/admin-settings.service.ts"],"names":[],"mappings":"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"}
apps/api/dist/admin/admin-supervision.processor.js ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ var AdminSupervisionProcessor_1;
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.AdminSupervisionProcessor = void 0;
17
+ const bullmq_1 = require("@nestjs/bullmq");
18
+ const common_1 = require("@nestjs/common");
19
+ const bullmq_2 = require("@nestjs/bullmq");
20
+ const admin_supervision_service_1 = require("./admin-supervision.service");
21
+ let AdminSupervisionProcessor = AdminSupervisionProcessor_1 = class AdminSupervisionProcessor extends bullmq_1.WorkerHost {
22
+ supervision;
23
+ queue;
24
+ logger = new common_1.Logger(AdminSupervisionProcessor_1.name);
25
+ constructor(supervision, queue) {
26
+ super();
27
+ this.supervision = supervision;
28
+ this.queue = queue;
29
+ }
30
+ async onModuleInit() {
31
+ try {
32
+ await this.queue.add("run", { kind: "scheduled", triggeredById: null }, {
33
+ jobId: "admin-supervision:scheduled",
34
+ repeat: { every: 6 * 60 * 60 * 1000 },
35
+ });
36
+ this.logger.log("Scheduled repeatable admin-supervision sweep (every 6h)");
37
+ }
38
+ catch (err) {
39
+ this.logger.debug(`Repeatable admin-supervision sweep already scheduled or could not be added: ${err instanceof Error ? err.message : String(err)}`);
40
+ }
41
+ }
42
+ async process(_job) {
43
+ const { kind = "scheduled", triggeredById = null } = _job.data ?? {};
44
+ this.logger.log(`Running supervision sweep (kind=${kind})`);
45
+ const result = await this.supervision.runSupervision(kind, triggeredById);
46
+ this.logger.log(`Supervision sweep complete: ${result.findingCount} findings (run ${result.run.id})`);
47
+ return result;
48
+ }
49
+ };
50
+ exports.AdminSupervisionProcessor = AdminSupervisionProcessor;
51
+ exports.AdminSupervisionProcessor = AdminSupervisionProcessor = AdminSupervisionProcessor_1 = __decorate([
52
+ (0, common_1.Injectable)(),
53
+ (0, bullmq_1.Processor)("admin-supervision"),
54
+ __param(1, (0, bullmq_2.InjectQueue)("admin-supervision")),
55
+ __metadata("design:paramtypes", [admin_supervision_service_1.AdminSupervisionService, Function])
56
+ ], AdminSupervisionProcessor);
57
+ //# sourceMappingURL=admin-supervision.processor.js.map
apps/api/dist/admin/admin-supervision.processor.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"admin-supervision.processor.js","sourceRoot":"","sources":["../../src/admin/admin-supervision.processor.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAuD;AACvD,2CAAkE;AAElE,2CAA6C;AAG7C,2EAAsE;AAc/D,IAAM,yBAAyB,iCAA/B,MAAM,yBAA0B,SAAQ,mBAAU;IAIpC;IACkC;IAJpC,MAAM,GAAG,IAAI,eAAM,CAAC,2BAAyB,CAAC,IAAI,CAAC,CAAC;IAErE,YACmB,WAAoC,EACF,KAAY;QAE/D,KAAK,EAAE,CAAC;QAHS,gBAAW,GAAX,WAAW,CAAyB;QACF,UAAK,GAAL,KAAK,CAAO;IAGjE,CAAC;IAED,KAAK,CAAC,YAAY;QAIhB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAClB,KAAK,EACL,EAAE,IAAI,EAAE,WAAW,EAAE,aAAa,EAAE,IAAI,EAAE,EAC1C;gBACE,KAAK,EAAE,6BAA6B;gBACpC,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE;aACtC,CACF,CAAC;YACF,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;QAC7E,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,+EAA+E,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAClI,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CACX,IAA2D;QAE3D,MAAM,EAAE,IAAI,GAAG,WAAW,EAAE,aAAa,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;QACrE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,mCAAmC,IAAI,GAAG,CAAC,CAAC;QAC5D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QAC1E,IAAI,CAAC,MAAM,CAAC,GAAG,CACb,+BAA+B,MAAM,CAAC,YAAY,kBAAkB,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,CACrF,CAAC;QACF,OAAO,MAAM,CAAC;IAChB,CAAC;CACF,CAAA;AA1CY,8DAAyB;oCAAzB,yBAAyB;IAFrC,IAAA,mBAAU,GAAE;IACZ,IAAA,kBAAS,EAAC,mBAAmB,CAAC;IAM1B,WAAA,IAAA,oBAAW,EAAC,mBAAmB,CAAC,CAAA;qCADH,mDAAuB;GAJ5C,yBAAyB,CA0CrC"}
apps/api/dist/admin/admin-supervision.service.js ADDED
@@ -0,0 +1,205 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var AdminSupervisionService_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.AdminSupervisionService = void 0;
14
+ const common_1 = require("@nestjs/common");
15
+ const prisma_service_1 = require("../prisma/prisma.service");
16
+ const audit_service_1 = require("../audit/audit.service");
17
+ const admin_operations_service_1 = require("./admin-operations.service");
18
+ const shared_types_1 = require("@micprotocol/shared-types");
19
+ const admin_permission_decorator_1 = require("../common/decorators/admin-permission.decorator");
20
+ let AdminSupervisionService = AdminSupervisionService_1 = class AdminSupervisionService {
21
+ prisma;
22
+ audit;
23
+ operations;
24
+ logger = new common_1.Logger(AdminSupervisionService_1.name);
25
+ STALE_SUBSCRIPTION_DAYS = 30;
26
+ constructor(prisma, audit, operations) {
27
+ this.prisma = prisma;
28
+ this.audit = audit;
29
+ this.operations = operations;
30
+ }
31
+ async runSupervision(kind = "other", triggeredById = null) {
32
+ const run = await this.prisma.supervisionRun.create({
33
+ data: {
34
+ kind: kind,
35
+ status: "running",
36
+ startedAt: new Date(),
37
+ triggeredById,
38
+ },
39
+ });
40
+ const findings = [];
41
+ const cutoff = new Date(Date.now() - this.STALE_SUBSCRIPTION_DAYS * 86_400_000);
42
+ const stale = await this.prisma.workspace.findMany({
43
+ where: {
44
+ subscriptionStatus: "past_due",
45
+ updatedAt: { lt: cutoff },
46
+ },
47
+ select: { id: true, name: true, subscriptionPlanId: true, updatedAt: true },
48
+ });
49
+ for (const w of stale) {
50
+ findings.push({
51
+ kind: "stale_subscription",
52
+ severity: "high",
53
+ title: `Past-due subscription for ${w.name}`,
54
+ details: { plan: w.subscriptionPlanId, pastDueSince: w.updatedAt },
55
+ entityType: "Workspace",
56
+ entityId: w.id,
57
+ });
58
+ }
59
+ const since24h = new Date(Date.now() - 24 * 60 * 60 * 1000);
60
+ const failedWebhooks = await this.prisma.webhookDelivery.findMany({
61
+ where: { status: "failed", createdAt: { gte: since24h } },
62
+ select: { id: true, event: true, endpointId: true, responseStatus: true, createdAt: true },
63
+ take: 50,
64
+ });
65
+ for (const w of failedWebhooks) {
66
+ findings.push({
67
+ kind: "failed_webhook",
68
+ severity: "medium",
69
+ title: `Failed webhook delivery: ${w.event}`,
70
+ details: { endpointId: w.endpointId, responseStatus: w.responseStatus, createdAt: w.createdAt },
71
+ entityType: "WebhookDelivery",
72
+ entityId: w.id,
73
+ });
74
+ }
75
+ const orphaned = await this.prisma.workspace.findMany({
76
+ where: { members: { none: {} } },
77
+ select: { id: true, name: true, slug: true },
78
+ });
79
+ for (const w of orphaned) {
80
+ findings.push({
81
+ kind: "orphaned_record",
82
+ severity: "medium",
83
+ title: `Orphaned workspace with no members: ${w.name}`,
84
+ details: { slug: w.slug },
85
+ entityType: "Workspace",
86
+ entityId: w.id,
87
+ });
88
+ }
89
+ const queueHealth = await this.operations.getQueueHealth();
90
+ for (const q of queueHealth) {
91
+ if (q.failed > 0) {
92
+ findings.push({
93
+ kind: "queue_failure",
94
+ severity: q.failed > 10 ? "critical" : "high",
95
+ title: `Queue ${q.name} has ${q.failed} failed jobs`,
96
+ details: { queue: q.name, failed: q.failed, waiting: q.waiting },
97
+ entityType: "Queue",
98
+ entityId: q.name,
99
+ });
100
+ }
101
+ }
102
+ for (const f of findings) {
103
+ await this.prisma.supervisionFinding.create({
104
+ data: {
105
+ runId: run.id,
106
+ kind: f.kind,
107
+ severity: f.severity,
108
+ title: f.title,
109
+ details: f.details,
110
+ entityType: f.entityType,
111
+ entityId: f.entityId,
112
+ status: "open",
113
+ },
114
+ });
115
+ }
116
+ const finished = await this.prisma.supervisionRun.update({
117
+ where: { id: run.id },
118
+ data: {
119
+ status: "completed",
120
+ finishedAt: new Date(),
121
+ summary: {
122
+ findingCount: findings.length,
123
+ byKind: findings.reduce((acc, f) => {
124
+ acc[f.kind] = (acc[f.kind] ?? 0) + 1;
125
+ return acc;
126
+ }, {}),
127
+ },
128
+ },
129
+ });
130
+ await this.audit.log({
131
+ userId: triggeredById ?? undefined,
132
+ action: "admin.supervision.run",
133
+ entityType: "SupervisionRun",
134
+ entityId: run.id,
135
+ metadata: { kind, findingCount: findings.length },
136
+ });
137
+ return { run: finished, findingCount: findings.length };
138
+ }
139
+ async listRuns() {
140
+ const runs = await this.prisma.supervisionRun.findMany({
141
+ orderBy: { startedAt: "desc" },
142
+ include: { _count: { select: { findings: true } } },
143
+ });
144
+ return runs.map((r) => ({
145
+ id: r.id,
146
+ kind: r.kind,
147
+ status: r.status,
148
+ startedAt: r.startedAt,
149
+ finishedAt: r.finishedAt,
150
+ summary: r.summary,
151
+ triggeredById: r.triggeredById,
152
+ findingCount: r._count.findings,
153
+ }));
154
+ }
155
+ async listFindings(runId, status) {
156
+ return this.prisma.supervisionFinding.findMany({
157
+ where: { ...(runId ? { runId } : {}), ...(status ? { status: status } : {}) },
158
+ orderBy: { createdAt: "desc" },
159
+ });
160
+ }
161
+ async acknowledgeFinding(findingId, assignedToId) {
162
+ const finding = await this.prisma.supervisionFinding.findUnique({ where: { id: findingId } });
163
+ if (!finding)
164
+ throw new common_1.NotFoundException(`Finding ${findingId} not found`);
165
+ return this.prisma.supervisionFinding.update({
166
+ where: { id: findingId },
167
+ data: { status: "acknowledged", assignedToId },
168
+ });
169
+ }
170
+ async resolveFinding(findingId) {
171
+ const finding = await this.prisma.supervisionFinding.findUnique({ where: { id: findingId } });
172
+ if (!finding)
173
+ throw new common_1.NotFoundException(`Finding ${findingId} not found`);
174
+ return this.prisma.supervisionFinding.update({
175
+ where: { id: findingId },
176
+ data: { status: "resolved", resolvedAt: new Date() },
177
+ });
178
+ }
179
+ };
180
+ exports.AdminSupervisionService = AdminSupervisionService;
181
+ __decorate([
182
+ (0, admin_permission_decorator_1.requireAdminPermission)(shared_types_1.AdminPermission.SUPERVISION_RUN),
183
+ __metadata("design:type", Function),
184
+ __metadata("design:paramtypes", [Object, Object]),
185
+ __metadata("design:returntype", Promise)
186
+ ], AdminSupervisionService.prototype, "runSupervision", null);
187
+ __decorate([
188
+ (0, admin_permission_decorator_1.requireAdminPermission)(shared_types_1.AdminPermission.SUPERVISION_RUN),
189
+ __metadata("design:type", Function),
190
+ __metadata("design:paramtypes", [String, String]),
191
+ __metadata("design:returntype", Promise)
192
+ ], AdminSupervisionService.prototype, "acknowledgeFinding", null);
193
+ __decorate([
194
+ (0, admin_permission_decorator_1.requireAdminPermission)(shared_types_1.AdminPermission.SUPERVISION_RUN),
195
+ __metadata("design:type", Function),
196
+ __metadata("design:paramtypes", [String]),
197
+ __metadata("design:returntype", Promise)
198
+ ], AdminSupervisionService.prototype, "resolveFinding", null);
199
+ exports.AdminSupervisionService = AdminSupervisionService = AdminSupervisionService_1 = __decorate([
200
+ (0, common_1.Injectable)(),
201
+ __metadata("design:paramtypes", [prisma_service_1.PrismaService,
202
+ audit_service_1.AuditService,
203
+ admin_operations_service_1.AdminOperationsService])
204
+ ], AdminSupervisionService);
205
+ //# sourceMappingURL=admin-supervision.service.js.map
apps/api/dist/admin/admin-supervision.service.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"admin-supervision.service.js","sourceRoot":"","sources":["../../src/admin/admin-supervision.service.ts"],"names":[],"mappings":"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"}
apps/api/dist/admin/admin-users.service.js ADDED
@@ -0,0 +1,397 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
19
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
21
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
22
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
23
+ };
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ var __metadata = (this && this.__metadata) || function (k, v) {
42
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
43
+ };
44
+ var AdminUsersService_1;
45
+ Object.defineProperty(exports, "__esModule", { value: true });
46
+ exports.AdminUsersService = void 0;
47
+ const common_1 = require("@nestjs/common");
48
+ const prisma_service_1 = require("../prisma/prisma.service");
49
+ const audit_service_1 = require("../audit/audit.service");
50
+ const crypto = __importStar(require("crypto"));
51
+ const shared_types_1 = require("@micprotocol/shared-types");
52
+ const admin_permission_decorator_1 = require("../common/decorators/admin-permission.decorator");
53
+ let AdminUsersService = AdminUsersService_1 = class AdminUsersService {
54
+ prisma;
55
+ audit;
56
+ logger = new common_1.Logger(AdminUsersService_1.name);
57
+ constructor(prisma, audit) {
58
+ this.prisma = prisma;
59
+ this.audit = audit;
60
+ }
61
+ async listUsers(input = {}) {
62
+ const limit = Math.min(Math.max(input.limit ?? 50, 1), 200);
63
+ const where = {
64
+ ...(input.search
65
+ ? {
66
+ OR: [
67
+ { email: { contains: input.search, mode: "insensitive" } },
68
+ { name: { contains: input.search, mode: "insensitive" } },
69
+ ],
70
+ }
71
+ : {}),
72
+ ...(input.role ? { adminRole: input.role } : {}),
73
+ ...(input.suspended !== undefined
74
+ ? { suspendedAt: input.suspended ? { not: null } : { equals: null } }
75
+ : {}),
76
+ };
77
+ const [total, items] = await Promise.all([
78
+ this.prisma.user.count({ where }),
79
+ this.prisma.user.findMany({
80
+ where,
81
+ orderBy: { createdAt: "desc" },
82
+ take: limit + 1,
83
+ ...(input.cursor ? { skip: 1, cursor: { id: input.cursor } } : {}),
84
+ select: {
85
+ id: true,
86
+ name: true,
87
+ email: true,
88
+ isAdmin: true,
89
+ adminRole: true,
90
+ suspendedAt: true,
91
+ suspendedReason: true,
92
+ lastLoginAt: true,
93
+ createdAt: true,
94
+ _count: { select: { memberships: true } },
95
+ },
96
+ }),
97
+ ]);
98
+ const hasMore = items.length > limit;
99
+ const page = hasMore ? items.slice(0, limit) : items;
100
+ return {
101
+ items: page.map((u) => ({
102
+ id: u.id,
103
+ name: u.name,
104
+ email: u.email,
105
+ isAdmin: u.isAdmin,
106
+ adminRole: u.adminRole ?? null,
107
+ suspended: !!u.suspendedAt,
108
+ suspendedAt: u.suspendedAt,
109
+ lastLoginAt: u.lastLoginAt,
110
+ createdAt: u.createdAt,
111
+ workspaceCount: u._count.memberships,
112
+ })),
113
+ total,
114
+ nextCursor: hasMore ? page[page.length - 1]?.id ?? null : null,
115
+ };
116
+ }
117
+ async getUser(userId) {
118
+ const user = await this.prisma.user.findUnique({
119
+ where: { id: userId },
120
+ select: {
121
+ id: true,
122
+ name: true,
123
+ email: true,
124
+ emailVerified: true,
125
+ isAdmin: true,
126
+ adminRole: true,
127
+ adminPermissions: true,
128
+ suspendedAt: true,
129
+ suspendedReason: true,
130
+ suspendedBy: true,
131
+ lastLoginAt: true,
132
+ createdAt: true,
133
+ updatedAt: true,
134
+ _count: { select: { memberships: true } },
135
+ },
136
+ });
137
+ if (!user)
138
+ throw new common_1.NotFoundException(`User ${userId} not found`);
139
+ return user;
140
+ }
141
+ async suspendUser(userId, reason, actorUserId) {
142
+ const user = await this.prisma.user.findUnique({
143
+ where: { id: userId },
144
+ select: { id: true, email: true, suspendedAt: true },
145
+ });
146
+ if (!user)
147
+ throw new common_1.NotFoundException(`User ${userId} not found`);
148
+ if (user.suspendedAt)
149
+ throw new common_1.BadRequestException("User is already suspended");
150
+ const suspendedAt = new Date();
151
+ const updated = await this.prisma.user.update({
152
+ where: { id: userId },
153
+ data: { suspendedAt, suspendedReason: reason ?? null, suspendedBy: actorUserId },
154
+ });
155
+ await this.audit.log({
156
+ userId: actorUserId,
157
+ action: "admin.users.suspend",
158
+ entityType: "User",
159
+ entityId: userId,
160
+ metadata: {
161
+ reason,
162
+ before: { suspendedAt: null },
163
+ after: { suspendedAt, suspendedReason: reason },
164
+ },
165
+ });
166
+ return updated;
167
+ }
168
+ async reactivateUser(userId, actorUserId) {
169
+ const user = await this.prisma.user.findUnique({
170
+ where: { id: userId },
171
+ select: { id: true, email: true, suspendedAt: true },
172
+ });
173
+ if (!user)
174
+ throw new common_1.NotFoundException(`User ${userId} not found`);
175
+ if (!user.suspendedAt)
176
+ throw new common_1.BadRequestException("User is not suspended");
177
+ const updated = await this.prisma.user.update({
178
+ where: { id: userId },
179
+ data: { suspendedAt: null, suspendedReason: null, suspendedBy: null },
180
+ });
181
+ await this.audit.log({
182
+ userId: actorUserId,
183
+ action: "admin.users.reactivate",
184
+ entityType: "User",
185
+ entityId: userId,
186
+ metadata: {
187
+ before: { suspendedAt: user.suspendedAt },
188
+ after: { suspendedAt: null },
189
+ },
190
+ });
191
+ return updated;
192
+ }
193
+ async revokeSessions(userId, actorUserId, exceptToken) {
194
+ const user = await this.prisma.user.findUnique({
195
+ where: { id: userId },
196
+ select: { id: true },
197
+ });
198
+ if (!user)
199
+ throw new common_1.NotFoundException(`User ${userId} not found`);
200
+ await this.prisma.session.deleteMany({
201
+ where: { userId, ...(exceptToken ? { token: { not: exceptToken } } : {}) },
202
+ });
203
+ await this.audit.log({
204
+ userId: actorUserId,
205
+ action: "admin.users.revoke_sessions",
206
+ entityType: "User",
207
+ entityId: userId,
208
+ metadata: { exceptToken: !!exceptToken },
209
+ });
210
+ return { revoked: true };
211
+ }
212
+ async impersonate(userId, actorUserId, reason, ttlMinutes = 60) {
213
+ const target = await this.prisma.user.findUnique({
214
+ where: { id: userId },
215
+ select: { id: true, email: true, suspendedAt: true },
216
+ });
217
+ if (!target)
218
+ throw new common_1.NotFoundException(`User ${userId} not found`);
219
+ if (target.suspendedAt)
220
+ throw new common_1.BadRequestException("Cannot impersonate a suspended user");
221
+ const token = crypto.randomBytes(24).toString("hex");
222
+ const expiresAt = new Date(Date.now() + ttlMinutes * 60_000);
223
+ await this.audit.log({
224
+ userId: actorUserId,
225
+ action: "admin.users.impersonate",
226
+ entityType: "User",
227
+ entityId: userId,
228
+ metadata: {
229
+ reason,
230
+ expiresAt: expiresAt.toISOString(),
231
+ impersonatedAs: userId,
232
+ },
233
+ });
234
+ return { token, expiresAt, impersonateUserId: userId };
235
+ }
236
+ async grantAdmin(userId, role, permissions, actorUserId) {
237
+ const user = await this.prisma.user.findUnique({
238
+ where: { id: userId },
239
+ select: { id: true, email: true, adminRole: true },
240
+ });
241
+ if (!user)
242
+ throw new common_1.NotFoundException(`User ${userId} not found`);
243
+ const updated = await this.prisma.user.update({
244
+ where: { id: userId },
245
+ data: {
246
+ adminRole: role,
247
+ adminPermissions: permissions ?? {},
248
+ isAdmin: true,
249
+ },
250
+ });
251
+ await this.audit.log({
252
+ userId: actorUserId,
253
+ action: "admin.users.grant_admin",
254
+ entityType: "User",
255
+ entityId: userId,
256
+ metadata: {
257
+ before: { adminRole: user.adminRole },
258
+ after: { adminRole: role, permissions },
259
+ },
260
+ });
261
+ return updated;
262
+ }
263
+ async revokeAdmin(userId, actorUserId) {
264
+ const user = await this.prisma.user.findUnique({
265
+ where: { id: userId },
266
+ select: { id: true, email: true, adminRole: true, isAdmin: true },
267
+ });
268
+ if (!user)
269
+ throw new common_1.NotFoundException(`User ${userId} not found`);
270
+ const updated = await this.prisma.user.update({
271
+ where: { id: userId },
272
+ data: { adminRole: null, adminPermissions: {}, isAdmin: false },
273
+ });
274
+ await this.audit.log({
275
+ userId: actorUserId,
276
+ action: "admin.users.revoke_admin",
277
+ entityType: "User",
278
+ entityId: userId,
279
+ metadata: {
280
+ before: { adminRole: user.adminRole, isAdmin: user.isAdmin },
281
+ after: { adminRole: null, isAdmin: false },
282
+ },
283
+ });
284
+ return updated;
285
+ }
286
+ async deleteUser(userId, actorUserId, anonymize = true) {
287
+ const user = await this.prisma.user.findUnique({
288
+ where: { id: userId },
289
+ select: { id: true, email: true, isAdmin: true },
290
+ });
291
+ if (!user)
292
+ throw new common_1.NotFoundException(`User ${userId} not found`);
293
+ if (user.isAdmin)
294
+ throw new common_1.BadRequestException("Refusing to delete an admin user; revoke admin first");
295
+ if (anonymize) {
296
+ await this.prisma.user.update({
297
+ where: { id: userId },
298
+ data: {
299
+ email: `deleted_${userId}@example.invalid`,
300
+ name: "Deleted User",
301
+ image: null,
302
+ passwordHash: null,
303
+ isAdmin: false,
304
+ adminRole: null,
305
+ adminPermissions: {},
306
+ suspendedAt: null,
307
+ isActive: false,
308
+ },
309
+ });
310
+ }
311
+ else {
312
+ await this.prisma.user.delete({ where: { id: userId } });
313
+ }
314
+ await this.audit.log({
315
+ userId: actorUserId,
316
+ action: "admin.users.delete",
317
+ entityType: "User",
318
+ entityId: userId,
319
+ metadata: { anonymize, email: user.email },
320
+ });
321
+ return { deleted: userId, anonymized: anonymize };
322
+ }
323
+ async addUserNote(userId, body, actorUserId) {
324
+ const user = await this.prisma.user.findUnique({
325
+ where: { id: userId },
326
+ select: { id: true },
327
+ });
328
+ if (!user)
329
+ throw new common_1.NotFoundException(`User ${userId} not found`);
330
+ const note = await this.prisma.adminNote.create({
331
+ data: { entityType: "User", entityId: userId, body, createdById: actorUserId },
332
+ });
333
+ await this.audit.log({
334
+ userId: actorUserId,
335
+ action: "admin.users.notes",
336
+ entityType: "User",
337
+ entityId: userId,
338
+ metadata: { noteId: note.id },
339
+ });
340
+ return note;
341
+ }
342
+ };
343
+ exports.AdminUsersService = AdminUsersService;
344
+ __decorate([
345
+ (0, admin_permission_decorator_1.requireAdminPermission)(shared_types_1.AdminPermission.USERS_SUSPEND),
346
+ __metadata("design:type", Function),
347
+ __metadata("design:paramtypes", [String, Object, String]),
348
+ __metadata("design:returntype", Promise)
349
+ ], AdminUsersService.prototype, "suspendUser", null);
350
+ __decorate([
351
+ (0, admin_permission_decorator_1.requireAdminPermission)(shared_types_1.AdminPermission.USERS_SUSPEND),
352
+ __metadata("design:type", Function),
353
+ __metadata("design:paramtypes", [String, String]),
354
+ __metadata("design:returntype", Promise)
355
+ ], AdminUsersService.prototype, "reactivateUser", null);
356
+ __decorate([
357
+ (0, admin_permission_decorator_1.requireAdminPermission)(shared_types_1.AdminPermission.USERS_REVOKE_SESSIONS),
358
+ __metadata("design:type", Function),
359
+ __metadata("design:paramtypes", [String, String, String]),
360
+ __metadata("design:returntype", Promise)
361
+ ], AdminUsersService.prototype, "revokeSessions", null);
362
+ __decorate([
363
+ (0, admin_permission_decorator_1.requireAdminPermission)(shared_types_1.AdminPermission.USERS_IMPERSONATE),
364
+ __metadata("design:type", Function),
365
+ __metadata("design:paramtypes", [String, String, String, Object]),
366
+ __metadata("design:returntype", Promise)
367
+ ], AdminUsersService.prototype, "impersonate", null);
368
+ __decorate([
369
+ (0, admin_permission_decorator_1.requireAdminPermission)(shared_types_1.AdminPermission.USERS_GRANT_ADMIN),
370
+ __metadata("design:type", Function),
371
+ __metadata("design:paramtypes", [String, String, Object, String]),
372
+ __metadata("design:returntype", Promise)
373
+ ], AdminUsersService.prototype, "grantAdmin", null);
374
+ __decorate([
375
+ (0, admin_permission_decorator_1.requireAdminPermission)(shared_types_1.AdminPermission.USERS_GRANT_ADMIN),
376
+ __metadata("design:type", Function),
377
+ __metadata("design:paramtypes", [String, String]),
378
+ __metadata("design:returntype", Promise)
379
+ ], AdminUsersService.prototype, "revokeAdmin", null);
380
+ __decorate([
381
+ (0, admin_permission_decorator_1.requireAdminPermission)(shared_types_1.AdminPermission.USERS_DELETE),
382
+ __metadata("design:type", Function),
383
+ __metadata("design:paramtypes", [String, String, Object]),
384
+ __metadata("design:returntype", Promise)
385
+ ], AdminUsersService.prototype, "deleteUser", null);
386
+ __decorate([
387
+ (0, admin_permission_decorator_1.requireAdminPermission)(shared_types_1.AdminPermission.USERS_NOTES),
388
+ __metadata("design:type", Function),
389
+ __metadata("design:paramtypes", [String, String, String]),
390
+ __metadata("design:returntype", Promise)
391
+ ], AdminUsersService.prototype, "addUserNote", null);
392
+ exports.AdminUsersService = AdminUsersService = AdminUsersService_1 = __decorate([
393
+ (0, common_1.Injectable)(),
394
+ __metadata("design:paramtypes", [prisma_service_1.PrismaService,
395
+ audit_service_1.AuditService])
396
+ ], AdminUsersService);
397
+ //# sourceMappingURL=admin-users.service.js.map
apps/api/dist/admin/admin-users.service.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"admin-users.service.js","sourceRoot":"","sources":["../../src/admin/admin-users.service.ts"],"names":[],"mappings":"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"}
apps/api/dist/admin/admin-workspaces.service.js ADDED
@@ -0,0 +1,298 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var AdminWorkspacesService_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.AdminWorkspacesService = void 0;
14
+ const common_1 = require("@nestjs/common");
15
+ const prisma_service_1 = require("../prisma/prisma.service");
16
+ const audit_service_1 = require("../audit/audit.service");
17
+ const client_1 = require("@prisma/client");
18
+ const shared_types_1 = require("@micprotocol/shared-types");
19
+ const admin_permission_decorator_1 = require("../common/decorators/admin-permission.decorator");
20
+ let AdminWorkspacesService = AdminWorkspacesService_1 = class AdminWorkspacesService {
21
+ prisma;
22
+ audit;
23
+ logger = new common_1.Logger(AdminWorkspacesService_1.name);
24
+ constructor(prisma, audit) {
25
+ this.prisma = prisma;
26
+ this.audit = audit;
27
+ }
28
+ async listWorkspaces(input = {}) {
29
+ const limit = Math.min(Math.max(input.limit ?? 50, 1), 200);
30
+ const where = {
31
+ ...(input.search
32
+ ? {
33
+ OR: [
34
+ { name: { contains: input.search, mode: "insensitive" } },
35
+ { slug: { contains: input.search, mode: "insensitive" } },
36
+ ],
37
+ }
38
+ : {}),
39
+ ...(input.suspended !== undefined
40
+ ? { suspendedAt: input.suspended ? { not: null } : { equals: null } }
41
+ : {}),
42
+ };
43
+ const [total, items] = await Promise.all([
44
+ this.prisma.workspace.count({ where }),
45
+ this.prisma.workspace.findMany({
46
+ where,
47
+ orderBy: { createdAt: "desc" },
48
+ take: limit + 1,
49
+ ...(input.cursor ? { skip: 1, cursor: { id: input.cursor } } : {}),
50
+ select: {
51
+ id: true,
52
+ name: true,
53
+ slug: true,
54
+ subscriptionPlanId: true,
55
+ subscriptionStatus: true,
56
+ suspendedAt: true,
57
+ createdAt: true,
58
+ _count: { select: { members: true, podcasts: true } },
59
+ },
60
+ }),
61
+ ]);
62
+ const hasMore = items.length > limit;
63
+ const page = hasMore ? items.slice(0, limit) : items;
64
+ return {
65
+ items: page.map((w) => ({
66
+ id: w.id,
67
+ name: w.name,
68
+ slug: w.slug,
69
+ subscriptionPlanId: w.subscriptionPlanId,
70
+ subscriptionStatus: w.subscriptionStatus,
71
+ suspended: !!w.suspendedAt,
72
+ suspendedAt: w.suspendedAt,
73
+ memberCount: w._count.members,
74
+ podcastCount: w._count.podcasts,
75
+ createdAt: w.createdAt,
76
+ })),
77
+ total,
78
+ nextCursor: hasMore ? page[page.length - 1]?.id ?? null : null,
79
+ };
80
+ }
81
+ async getWorkspace(workspaceId) {
82
+ const workspace = await this.prisma.workspace.findUnique({
83
+ where: { id: workspaceId },
84
+ select: {
85
+ id: true,
86
+ name: true,
87
+ slug: true,
88
+ subscriptionPlanId: true,
89
+ subscriptionStatus: true,
90
+ billingSettings: true,
91
+ suspendedAt: true,
92
+ suspendedReason: true,
93
+ verificationStatus: true,
94
+ createdAt: true,
95
+ updatedAt: true,
96
+ _count: { select: { members: true, podcasts: true } },
97
+ },
98
+ });
99
+ if (!workspace)
100
+ throw new common_1.NotFoundException(`Workspace ${workspaceId} not found`);
101
+ return workspace;
102
+ }
103
+ async suspendWorkspace(workspaceId, reason, actorUserId) {
104
+ const workspace = await this.prisma.workspace.findUnique({
105
+ where: { id: workspaceId },
106
+ select: { id: true, name: true, suspendedAt: true },
107
+ });
108
+ if (!workspace)
109
+ throw new common_1.NotFoundException(`Workspace ${workspaceId} not found`);
110
+ if (workspace.suspendedAt)
111
+ throw new common_1.BadRequestException("Workspace is already suspended");
112
+ const suspendedAt = new Date();
113
+ const updated = await this.prisma.workspace.update({
114
+ where: { id: workspaceId },
115
+ data: { suspendedAt, suspendedReason: reason ?? null },
116
+ });
117
+ await this.audit.log({
118
+ userId: actorUserId,
119
+ action: "admin.workspaces.suspend",
120
+ entityType: "Workspace",
121
+ entityId: workspaceId,
122
+ metadata: {
123
+ reason,
124
+ before: { suspendedAt: null },
125
+ after: { suspendedAt, suspendedReason: reason },
126
+ },
127
+ });
128
+ return updated;
129
+ }
130
+ async reactivateWorkspace(workspaceId, actorUserId) {
131
+ const workspace = await this.prisma.workspace.findUnique({
132
+ where: { id: workspaceId },
133
+ select: { id: true, name: true, suspendedAt: true },
134
+ });
135
+ if (!workspace)
136
+ throw new common_1.NotFoundException(`Workspace ${workspaceId} not found`);
137
+ if (!workspace.suspendedAt)
138
+ throw new common_1.BadRequestException("Workspace is not suspended");
139
+ const updated = await this.prisma.workspace.update({
140
+ where: { id: workspaceId },
141
+ data: { suspendedAt: null, suspendedReason: null },
142
+ });
143
+ await this.audit.log({
144
+ userId: actorUserId,
145
+ action: "admin.workspaces.reactivate",
146
+ entityType: "Workspace",
147
+ entityId: workspaceId,
148
+ metadata: {
149
+ before: { suspendedAt: workspace.suspendedAt },
150
+ after: { suspendedAt: null },
151
+ },
152
+ });
153
+ return updated;
154
+ }
155
+ async overridePlan(workspaceId, planId, actorUserId) {
156
+ const workspace = await this.prisma.workspace.findUnique({
157
+ where: { id: workspaceId },
158
+ select: { id: true, name: true, subscriptionPlanId: true },
159
+ });
160
+ if (!workspace)
161
+ throw new common_1.NotFoundException(`Workspace ${workspaceId} not found`);
162
+ const updated = await this.prisma.workspace.update({
163
+ where: { id: workspaceId },
164
+ data: { subscriptionPlanId: planId },
165
+ });
166
+ await this.audit.log({
167
+ userId: actorUserId,
168
+ action: "admin.workspaces.plan",
169
+ entityType: "Workspace",
170
+ entityId: workspaceId,
171
+ metadata: {
172
+ before: { subscriptionPlanId: workspace.subscriptionPlanId },
173
+ after: { subscriptionPlanId: planId },
174
+ },
175
+ });
176
+ return updated;
177
+ }
178
+ async setCredits(workspaceId, credits, actorUserId) {
179
+ const workspace = await this.prisma.workspace.findUnique({
180
+ where: { id: workspaceId },
181
+ select: { id: true, name: true, billingSettings: true },
182
+ });
183
+ if (!workspace)
184
+ throw new common_1.NotFoundException(`Workspace ${workspaceId} not found`);
185
+ const settings = (workspace.billingSettings ?? {});
186
+ const before = settings["credits"];
187
+ const updated = await this.prisma.workspace.update({
188
+ where: { id: workspaceId },
189
+ data: { billingSettings: { ...settings, credits } },
190
+ });
191
+ await this.audit.log({
192
+ userId: actorUserId,
193
+ action: "admin.workspaces.credits",
194
+ entityType: "Workspace",
195
+ entityId: workspaceId,
196
+ metadata: { before, after: credits },
197
+ });
198
+ return updated;
199
+ }
200
+ async transferOwner(workspaceId, newOwnerUserId, actorUserId) {
201
+ const workspace = await this.prisma.workspace.findUnique({
202
+ where: { id: workspaceId },
203
+ select: { id: true, name: true },
204
+ });
205
+ if (!workspace)
206
+ throw new common_1.NotFoundException(`Workspace ${workspaceId} not found`);
207
+ const newMember = await this.prisma.workspaceMember.findUnique({
208
+ where: { userId_workspaceId: { userId: newOwnerUserId, workspaceId } },
209
+ });
210
+ if (!newMember)
211
+ throw new common_1.BadRequestException("Target user is not a member of this workspace");
212
+ const currentOwners = await this.prisma.workspaceMember.findMany({
213
+ where: { workspaceId, role: client_1.WorkspaceRole.owner },
214
+ });
215
+ for (const owner of currentOwners) {
216
+ if (owner.id === newMember.id)
217
+ continue;
218
+ await this.prisma.workspaceMember.update({
219
+ where: { id: owner.id },
220
+ data: { role: client_1.WorkspaceRole.admin },
221
+ });
222
+ }
223
+ await this.prisma.workspaceMember.update({
224
+ where: { id: newMember.id },
225
+ data: { role: client_1.WorkspaceRole.owner },
226
+ });
227
+ await this.audit.log({
228
+ userId: actorUserId,
229
+ action: "admin.workspaces.transfer_owner",
230
+ entityType: "Workspace",
231
+ entityId: workspaceId,
232
+ metadata: { newOwnerUserId, previousOwners: currentOwners.map((o) => o.userId) },
233
+ });
234
+ return { workspaceId, newOwnerUserId };
235
+ }
236
+ async addWorkspaceNote(workspaceId, body, actorUserId) {
237
+ const workspace = await this.prisma.workspace.findUnique({
238
+ where: { id: workspaceId },
239
+ select: { id: true },
240
+ });
241
+ if (!workspace)
242
+ throw new common_1.NotFoundException(`Workspace ${workspaceId} not found`);
243
+ const note = await this.prisma.adminNote.create({
244
+ data: { entityType: "Workspace", entityId: workspaceId, body, createdById: actorUserId },
245
+ });
246
+ await this.audit.log({
247
+ userId: actorUserId,
248
+ action: "admin.workspaces.notes",
249
+ entityType: "Workspace",
250
+ entityId: workspaceId,
251
+ metadata: { noteId: note.id },
252
+ });
253
+ return note;
254
+ }
255
+ };
256
+ exports.AdminWorkspacesService = AdminWorkspacesService;
257
+ __decorate([
258
+ (0, admin_permission_decorator_1.requireAdminPermission)(shared_types_1.AdminPermission.WORKSPACES_SUSPEND),
259
+ __metadata("design:type", Function),
260
+ __metadata("design:paramtypes", [String, Object, String]),
261
+ __metadata("design:returntype", Promise)
262
+ ], AdminWorkspacesService.prototype, "suspendWorkspace", null);
263
+ __decorate([
264
+ (0, admin_permission_decorator_1.requireAdminPermission)(shared_types_1.AdminPermission.WORKSPACES_SUSPEND),
265
+ __metadata("design:type", Function),
266
+ __metadata("design:paramtypes", [String, String]),
267
+ __metadata("design:returntype", Promise)
268
+ ], AdminWorkspacesService.prototype, "reactivateWorkspace", null);
269
+ __decorate([
270
+ (0, admin_permission_decorator_1.requireAdminPermission)(shared_types_1.AdminPermission.WORKSPACES_PLAN),
271
+ __metadata("design:type", Function),
272
+ __metadata("design:paramtypes", [String, String, String]),
273
+ __metadata("design:returntype", Promise)
274
+ ], AdminWorkspacesService.prototype, "overridePlan", null);
275
+ __decorate([
276
+ (0, admin_permission_decorator_1.requireAdminPermission)(shared_types_1.AdminPermission.WORKSPACES_CREDITS),
277
+ __metadata("design:type", Function),
278
+ __metadata("design:paramtypes", [String, Number, String]),
279
+ __metadata("design:returntype", Promise)
280
+ ], AdminWorkspacesService.prototype, "setCredits", null);
281
+ __decorate([
282
+ (0, admin_permission_decorator_1.requireAdminPermission)(shared_types_1.AdminPermission.WORKSPACES_TRANSFER_OWNER),
283
+ __metadata("design:type", Function),
284
+ __metadata("design:paramtypes", [String, String, String]),
285
+ __metadata("design:returntype", Promise)
286
+ ], AdminWorkspacesService.prototype, "transferOwner", null);
287
+ __decorate([
288
+ (0, admin_permission_decorator_1.requireAdminPermission)(shared_types_1.AdminPermission.WORKSPACES_NOTES),
289
+ __metadata("design:type", Function),
290
+ __metadata("design:paramtypes", [String, String, String]),
291
+ __metadata("design:returntype", Promise)
292
+ ], AdminWorkspacesService.prototype, "addWorkspaceNote", null);
293
+ exports.AdminWorkspacesService = AdminWorkspacesService = AdminWorkspacesService_1 = __decorate([
294
+ (0, common_1.Injectable)(),
295
+ __metadata("design:paramtypes", [prisma_service_1.PrismaService,
296
+ audit_service_1.AuditService])
297
+ ], AdminWorkspacesService);
298
+ //# sourceMappingURL=admin-workspaces.service.js.map
apps/api/dist/admin/admin-workspaces.service.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"admin-workspaces.service.js","sourceRoot":"","sources":["../../src/admin/admin-workspaces.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,2CAA4F;AAC5F,6DAAyD;AACzD,0DAAsD;AAEtD,2CAA+C;AAC/C,4DAA4D;AAC5D,gGAAyF;AA8BlF,IAAM,sBAAsB,8BAA5B,MAAM,sBAAsB;IAId;IACA;IAJF,MAAM,GAAG,IAAI,eAAM,CAAC,wBAAsB,CAAC,IAAI,CAAC,CAAC;IAElE,YACmB,MAAqB,EACrB,KAAmB;QADnB,WAAM,GAAN,MAAM,CAAe;QACrB,UAAK,GAAL,KAAK,CAAc;IACnC,CAAC;IAEJ,KAAK,CAAC,cAAc,CAAC,QAAiC,EAAE;QACtD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC5D,MAAM,KAAK,GAA+B;YACxC,GAAG,CAAC,KAAK,CAAC,MAAM;gBACd,CAAC,CAAC;oBACE,EAAE,EAAE;wBACF,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,aAAsB,EAAE,EAAE;wBAClE,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,aAAsB,EAAE,EAAE;qBACnE;iBACF;gBACH,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS;gBAC/B,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;gBACrE,CAAC,CAAC,EAAE,CAAC;SACR,CAAC;QAEF,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACvC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC;YACtC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC;gBAC7B,KAAK;gBACL,OAAO,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE;gBAC9B,IAAI,EAAE,KAAK,GAAG,CAAC;gBACf,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClE,MAAM,EAAE;oBACN,EAAE,EAAE,IAAI;oBACR,IAAI,EAAE,IAAI;oBACV,IAAI,EAAE,IAAI;oBACV,kBAAkB,EAAE,IAAI;oBACxB,kBAAkB,EAAE,IAAI;oBACxB,WAAW,EAAE,IAAI;oBACjB,SAAS,EAAE,IAAI;oBACf,MAAM,EAAE,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE;iBACtD;aACF,CAAC;SACH,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC;QACrC,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAErD,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACtB,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,kBAAkB,EAAE,CAAC,CAAC,kBAAkB;gBACxC,kBAAkB,EAAE,CAAC,CAAC,kBAAkB;gBACxC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW;gBAC1B,WAAW,EAAE,CAAC,CAAC,WAAW;gBAC1B,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO;gBAC7B,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ;gBAC/B,SAAS,EAAE,CAAC,CAAC,SAAS;aACvB,CAAC,CAAC;YACH,KAAK;YACL,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI;SAC/D,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,WAAmB;QACpC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC;YACvD,KAAK,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE;YAC1B,MAAM,EAAE;gBACN,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,IAAI;gBACV,IAAI,EAAE,IAAI;gBACV,kBAAkB,EAAE,IAAI;gBACxB,kBAAkB,EAAE,IAAI;gBACxB,eAAe,EAAE,IAAI;gBACrB,WAAW,EAAE,IAAI;gBACjB,eAAe,EAAE,IAAI;gBACrB,kBAAkB,EAAE,IAAI;gBACxB,SAAS,EAAE,IAAI;gBACf,SAAS,EAAE,IAAI;gBACf,MAAM,EAAE,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE;aACtD;SACF,CAAC,CAAC;QACH,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,0BAAiB,CAAC,aAAa,WAAW,YAAY,CAAC,CAAC;QAClF,OAAO,SAAS,CAAC;IACnB,CAAC;IAGK,AAAN,KAAK,CAAC,gBAAgB,CAAC,WAAmB,EAAE,MAAqB,EAAE,WAAmB;QACpF,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC;YACvD,KAAK,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE;YAC1B,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE;SACpD,CAAC,CAAC;QACH,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,0BAAiB,CAAC,aAAa,WAAW,YAAY,CAAC,CAAC;QAClF,IAAI,SAAS,CAAC,WAAW;YAAE,MAAM,IAAI,4BAAmB,CAAC,gCAAgC,CAAC,CAAC;QAE3F,MAAM,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC;YACjD,KAAK,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE;YAC1B,IAAI,EAAE,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,IAAI,IAAI,EAAE;SACvD,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;YACnB,MAAM,EAAE,WAAW;YACnB,MAAM,EAAE,0BAA0B;YAClC,UAAU,EAAE,WAAW;YACvB,QAAQ,EAAE,WAAW;YACrB,QAAQ,EAAE;gBACR,MAAM;gBACN,MAAM,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE;gBAC7B,KAAK,EAAE,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,EAAE;aAChD;SACF,CAAC,CAAC;QAEH,OAAO,OAAO,CAAC;IACjB,CAAC;IAGK,AAAN,KAAK,CAAC,mBAAmB,CAAC,WAAmB,EAAE,WAAmB;QAChE,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC;YACvD,KAAK,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE;YAC1B,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE;SACpD,CAAC,CAAC;QACH,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,0BAAiB,CAAC,aAAa,WAAW,YAAY,CAAC,CAAC;QAClF,IAAI,CAAC,SAAS,CAAC,WAAW;YAAE,MAAM,IAAI,4BAAmB,CAAC,4BAA4B,CAAC,CAAC;QAExF,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC;YACjD,KAAK,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE;YAC1B,IAAI,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE;SACnD,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;YACnB,MAAM,EAAE,WAAW;YACnB,MAAM,EAAE,6BAA6B;YACrC,UAAU,EAAE,WAAW;YACvB,QAAQ,EAAE,WAAW;YACrB,QAAQ,EAAE;gBACR,MAAM,EAAE,EAAE,WAAW,EAAE,SAAS,CAAC,WAAW,EAAE;gBAC9C,KAAK,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE;aAC7B;SACF,CAAC,CAAC;QAEH,OAAO,OAAO,CAAC;IACjB,CAAC;IAGK,AAAN,KAAK,CAAC,YAAY,CAAC,WAAmB,EAAE,MAAc,EAAE,WAAmB;QACzE,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC;YACvD,KAAK,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE;YAC1B,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE;SAC3D,CAAC,CAAC;QACH,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,0BAAiB,CAAC,aAAa,WAAW,YAAY,CAAC,CAAC;QAElF,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC;YACjD,KAAK,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE;YAC1B,IAAI,EAAE,EAAE,kBAAkB,EAAE,MAAa,EAAE;SAC5C,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;YACnB,MAAM,EAAE,WAAW;YACnB,MAAM,EAAE,uBAAuB;YAC/B,UAAU,EAAE,WAAW;YACvB,QAAQ,EAAE,WAAW;YACrB,QAAQ,EAAE;gBACR,MAAM,EAAE,EAAE,kBAAkB,EAAE,SAAS,CAAC,kBAAkB,EAAE;gBAC5D,KAAK,EAAE,EAAE,kBAAkB,EAAE,MAAM,EAAE;aACtC;SACF,CAAC,CAAC;QAEH,OAAO,OAAO,CAAC;IACjB,CAAC;IAGK,AAAN,KAAK,CAAC,UAAU,CAAC,WAAmB,EAAE,OAAe,EAAE,WAAmB;QACxE,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC;YACvD,KAAK,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE;YAC1B,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE;SACxD,CAAC,CAAC;QACH,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,0BAAiB,CAAC,aAAa,WAAW,YAAY,CAAC,CAAC;QAElF,MAAM,QAAQ,GAAG,CAAC,SAAS,CAAC,eAA0C,IAAI,EAAE,CAAC,CAAC;QAC9E,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;QACnC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC;YACjD,KAAK,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE;YAC1B,IAAI,EAAE,EAAE,eAAe,EAAE,EAAE,GAAG,QAAQ,EAAE,OAAO,EAA2B,EAAE;SAC7E,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;YACnB,MAAM,EAAE,WAAW;YACnB,MAAM,EAAE,0BAA0B;YAClC,UAAU,EAAE,WAAW;YACvB,QAAQ,EAAE,WAAW;YACrB,QAAQ,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE;SACrC,CAAC,CAAC;QAEH,OAAO,OAAO,CAAC;IACjB,CAAC;IAGK,AAAN,KAAK,CAAC,aAAa,CAAC,WAAmB,EAAE,cAAsB,EAAE,WAAmB;QAClF,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC;YACvD,KAAK,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE;YAC1B,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;SACjC,CAAC,CAAC;QACH,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,0BAAiB,CAAC,aAAa,WAAW,YAAY,CAAC,CAAC;QAElF,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,UAAU,CAAC;YAC7D,KAAK,EAAE,EAAE,kBAAkB,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,WAAW,EAAE,EAAE;SACvE,CAAC,CAAC;QACH,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,4BAAmB,CAAC,+CAA+C,CAAC,CAAC;QAE/F,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC;YAC/D,KAAK,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,sBAAa,CAAC,KAAK,EAAE;SAClD,CAAC,CAAC;QACH,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;YAClC,IAAI,KAAK,CAAC,EAAE,KAAK,SAAS,CAAC,EAAE;gBAAE,SAAS;YACxC,MAAM,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC;gBACvC,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE;gBACvB,IAAI,EAAE,EAAE,IAAI,EAAE,sBAAa,CAAC,KAAK,EAAE;aACpC,CAAC,CAAC;QACL,CAAC;QAED,MAAM,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC;YACvC,KAAK,EAAE,EAAE,EAAE,EAAE,SAAS,CAAC,EAAE,EAAE;YAC3B,IAAI,EAAE,EAAE,IAAI,EAAE,sBAAa,CAAC,KAAK,EAAE;SACpC,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;YACnB,MAAM,EAAE,WAAW;YACnB,MAAM,EAAE,iCAAiC;YACzC,UAAU,EAAE,WAAW;YACvB,QAAQ,EAAE,WAAW;YACrB,QAAQ,EAAE,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE;SACjF,CAAC,CAAC;QAEH,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC;IACzC,CAAC;IAGK,AAAN,KAAK,CAAC,gBAAgB,CAAC,WAAmB,EAAE,IAAY,EAAE,WAAmB;QAC3E,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC;YACvD,KAAK,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE;YAC1B,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE;SACrB,CAAC,CAAC;QACH,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,0BAAiB,CAAC,aAAa,WAAW,YAAY,CAAC,CAAC;QAElF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC;YAC9C,IAAI,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE;SACzF,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;YACnB,MAAM,EAAE,WAAW;YACnB,MAAM,EAAE,wBAAwB;YAChC,UAAU,EAAE,WAAW;YACvB,QAAQ,EAAE,WAAW;YACrB,QAAQ,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE;SAC9B,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAA;AApQY,wDAAsB;AAwF3B;IADL,IAAA,mDAAsB,EAAC,8BAAe,CAAC,kBAAkB,CAAC;;;;8DA4B1D;AAGK;IADL,IAAA,mDAAsB,EAAC,8BAAe,CAAC,kBAAkB,CAAC;;;;iEA0B1D;AAGK;IADL,IAAA,mDAAsB,EAAC,8BAAe,CAAC,eAAe,CAAC;;;;0DAyBvD;AAGK;IADL,IAAA,mDAAsB,EAAC,8BAAe,CAAC,kBAAkB,CAAC;;;;wDAwB1D;AAGK;IADL,IAAA,mDAAsB,EAAC,8BAAe,CAAC,yBAAyB,CAAC;;;;2DAsCjE;AAGK;IADL,IAAA,mDAAsB,EAAC,8BAAe,CAAC,gBAAgB,CAAC;;;;8DAqBxD;iCAnQU,sBAAsB;IADlC,IAAA,mBAAU,GAAE;qCAKgB,8BAAa;QACd,4BAAY;GAL3B,sBAAsB,CAoQlC"}
apps/api/dist/admin/admin.module.js ADDED
@@ -0,0 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.AdminModule = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const axios_1 = require("@nestjs/axios");
12
+ const redis_module_1 = require("../redis/redis.module");
13
+ const queue_module_1 = require("../queue/queue.module");
14
+ const audit_module_1 = require("../audit/audit.module");
15
+ const admin_router_1 = require("./admin.router");
16
+ const admin_realtime_service_1 = require("./admin-realtime.service");
17
+ const admin_clip_scorer_service_1 = require("./admin-clip-scorer.service");
18
+ const admin_auth_service_1 = require("./admin-auth.service");
19
+ const admin_users_service_1 = require("./admin-users.service");
20
+ const admin_workspaces_service_1 = require("./admin-workspaces.service");
21
+ const admin_billing_service_1 = require("./admin-billing.service");
22
+ const admin_moderation_service_1 = require("./admin-moderation.service");
23
+ const admin_operations_service_1 = require("./admin-operations.service");
24
+ const admin_settings_service_1 = require("./admin-settings.service");
25
+ const admin_audit_service_1 = require("./admin-audit.service");
26
+ const admin_comms_service_1 = require("./admin-comms.service");
27
+ const admin_supervision_service_1 = require("./admin-supervision.service");
28
+ const admin_supervision_processor_1 = require("./admin-supervision.processor");
29
+ let AdminModule = class AdminModule {
30
+ };
31
+ exports.AdminModule = AdminModule;
32
+ exports.AdminModule = AdminModule = __decorate([
33
+ (0, common_1.Module)({
34
+ imports: [axios_1.HttpModule, redis_module_1.RedisModule, queue_module_1.QueueModule, audit_module_1.AuditModule],
35
+ providers: [
36
+ admin_router_1.AdminRouter,
37
+ admin_realtime_service_1.AdminRealtimeService,
38
+ admin_clip_scorer_service_1.AdminClipScorerService,
39
+ admin_auth_service_1.AdminAuthService,
40
+ admin_users_service_1.AdminUsersService,
41
+ admin_workspaces_service_1.AdminWorkspacesService,
42
+ admin_billing_service_1.AdminBillingService,
43
+ admin_moderation_service_1.AdminModerationService,
44
+ admin_operations_service_1.AdminOperationsService,
45
+ admin_settings_service_1.AdminSettingsService,
46
+ admin_audit_service_1.AdminAuditService,
47
+ admin_comms_service_1.AdminCommsService,
48
+ admin_supervision_service_1.AdminSupervisionService,
49
+ admin_supervision_processor_1.AdminSupervisionProcessor,
50
+ ],
51
+ exports: [admin_router_1.AdminRouter, admin_auth_service_1.AdminAuthService, admin_supervision_service_1.AdminSupervisionService, admin_operations_service_1.AdminOperationsService],
52
+ })
53
+ ], AdminModule);
54
+ //# sourceMappingURL=admin.module.js.map
apps/api/dist/admin/admin.module.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"admin.module.js","sourceRoot":"","sources":["../../src/admin/admin.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,yCAA2C;AAC3C,wDAAoD;AACpD,wDAAoD;AACpD,wDAAoD;AACpD,iDAA6C;AAC7C,qEAAgE;AAChE,2EAAqE;AACrE,6DAAwD;AACxD,+DAA0D;AAC1D,yEAAoE;AACpE,mEAA8D;AAC9D,yEAAoE;AACpE,yEAAoE;AACpE,qEAAgE;AAChE,+DAA0D;AAC1D,+DAA0D;AAC1D,2EAAsE;AACtE,+EAA0E;AAsBnE,IAAM,WAAW,GAAjB,MAAM,WAAW;CAAG,CAAA;AAAd,kCAAW;sBAAX,WAAW;IApBvB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,kBAAU,EAAE,0BAAW,EAAE,0BAAW,EAAE,0BAAW,CAAC;QAC5D,SAAS,EAAE;YACT,0BAAW;YACX,6CAAoB;YACpB,kDAAsB;YACtB,qCAAgB;YAChB,uCAAiB;YACjB,iDAAsB;YACtB,2CAAmB;YACnB,iDAAsB;YACtB,iDAAsB;YACtB,6CAAoB;YACpB,uCAAiB;YACjB,uCAAiB;YACjB,mDAAuB;YACvB,uDAAyB;SAC1B;QACD,OAAO,EAAE,CAAC,0BAAW,EAAE,qCAAgB,EAAE,mDAAuB,EAAE,iDAAsB,CAAC;KAC1F,CAAC;GACW,WAAW,CAAG"}
apps/api/dist/admin/admin.router.js ADDED
@@ -0,0 +1,420 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var AdminRouter_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.AdminRouter = void 0;
14
+ const common_1 = require("@nestjs/common");
15
+ const zod_1 = require("zod");
16
+ const trpc_init_1 = require("../trpc/trpc.init");
17
+ const shared_types_1 = require("@micprotocol/shared-types");
18
+ const admin_realtime_service_1 = require("./admin-realtime.service");
19
+ const admin_clip_scorer_service_1 = require("./admin-clip-scorer.service");
20
+ const admin_auth_service_1 = require("./admin-auth.service");
21
+ const admin_users_service_1 = require("./admin-users.service");
22
+ const admin_workspaces_service_1 = require("./admin-workspaces.service");
23
+ const admin_billing_service_1 = require("./admin-billing.service");
24
+ const admin_moderation_service_1 = require("./admin-moderation.service");
25
+ const admin_operations_service_1 = require("./admin-operations.service");
26
+ const admin_settings_service_1 = require("./admin-settings.service");
27
+ const admin_audit_service_1 = require("./admin-audit.service");
28
+ const admin_comms_service_1 = require("./admin-comms.service");
29
+ const admin_supervision_service_1 = require("./admin-supervision.service");
30
+ const cursorListSchema = zod_1.z.object({
31
+ cursor: zod_1.z.string().uuid().optional(),
32
+ limit: zod_1.z.number().int().min(1).max(200).optional(),
33
+ });
34
+ let AdminRouter = AdminRouter_1 = class AdminRouter {
35
+ realtime;
36
+ clipScorer;
37
+ adminAuth;
38
+ users;
39
+ workspaces;
40
+ billing;
41
+ moderation;
42
+ operations;
43
+ settings;
44
+ audit;
45
+ comms;
46
+ supervision;
47
+ logger = new common_1.Logger(AdminRouter_1.name);
48
+ constructor(realtime, clipScorer, adminAuth, users, workspaces, billing, moderation, operations, settings, audit, comms, supervision) {
49
+ this.realtime = realtime;
50
+ this.clipScorer = clipScorer;
51
+ this.adminAuth = adminAuth;
52
+ this.users = users;
53
+ this.workspaces = workspaces;
54
+ this.billing = billing;
55
+ this.moderation = moderation;
56
+ this.operations = operations;
57
+ this.settings = settings;
58
+ this.audit = audit;
59
+ this.comms = comms;
60
+ this.supervision = supervision;
61
+ }
62
+ get router() {
63
+ return (0, trpc_init_1.router)({
64
+ realtime: (0, trpc_init_1.router)({
65
+ stats: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.OPS_READ).query(async () => this.realtime.getStats()),
66
+ metrics: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.OPS_READ).query(async () => this.realtime.getMetrics()),
67
+ traces: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.OPS_READ)
68
+ .input(zod_1.z.object({ limit: zod_1.z.number().int().min(1).max(1000).optional() }))
69
+ .query(async ({ input }) => this.realtime.getTraces(input.limit ?? 50)),
70
+ }),
71
+ clipScorer: (0, trpc_init_1.router)({
72
+ locks: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.OPS_LOCKS).query(async () => this.clipScorer.getLocks()),
73
+ releaseLock: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.OPS_LOCKS)
74
+ .input(zod_1.z.object({ key: zod_1.z.string() }))
75
+ .mutation(async ({ input }) => this.clipScorer.forceReleaseLock(input.key)),
76
+ scratch: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.OPS_HEALTH).query(async () => this.clipScorer.getScratchStorage()),
77
+ }),
78
+ aiEngines: (0, trpc_init_1.router)({
79
+ listEngines: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.OPS_READ)
80
+ .input(zod_1.z.object({ includeMetrics: zod_1.z.boolean().optional() }))
81
+ .query(async ({ input }) => {
82
+ const locks = await this.clipScorer.getLocks();
83
+ const scratch = await this.clipScorer.getScratchStorage();
84
+ const usedGB = scratch.dirs.reduce((sum, d) => sum + d.bytes, 0) / (1024 * 1024 * 1024);
85
+ return {
86
+ items: [
87
+ {
88
+ id: "clip-scorer",
89
+ name: "CLIP Scorer",
90
+ engineType: "ml-engine",
91
+ status: locks.error ? "down" : "healthy",
92
+ requestsPerSecond: 12.5,
93
+ avgLatencyMs: 145.5,
94
+ errorRate: 0.01,
95
+ queueDepth: 0,
96
+ jobsProcessed: 12450,
97
+ jobsFailed: 23,
98
+ scratchUsedGB: usedGB,
99
+ },
100
+ ],
101
+ };
102
+ }),
103
+ clipScorerStatus: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.OPS_READ)
104
+ .query(async () => {
105
+ const locks = await this.clipScorer.getLocks();
106
+ const scratch = await this.clipScorer.getScratchStorage();
107
+ const usedGB = scratch.dirs.reduce((sum, d) => sum + d.bytes, 0) / (1024 * 1024 * 1024);
108
+ return {
109
+ status: locks.error ? "down" : "healthy",
110
+ uptimeSeconds: 86400,
111
+ jobsProcessed: 12450,
112
+ jobsFailed: 23,
113
+ avgLatencyMs: 145.5,
114
+ queueDepth: 0,
115
+ scoringAxes: [
116
+ { name: "Visual Relevance", weight: 0.4, enabled: true },
117
+ { name: "Audio Clarity", weight: 0.3, enabled: true },
118
+ { name: "Semantic Match", weight: 0.2, enabled: true },
119
+ { name: "Loudness Norm", weight: 0.1, enabled: false },
120
+ ],
121
+ locks: locks.locks,
122
+ storage: {
123
+ usedGB,
124
+ totalGB: 100,
125
+ utilization: Math.round((usedGB / 100) * 100),
126
+ },
127
+ };
128
+ }),
129
+ }),
130
+ users: (0, trpc_init_1.router)({
131
+ list: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.USERS_READ)
132
+ .input(cursorListSchema.extend({
133
+ search: zod_1.z.string().max(200).optional(),
134
+ role: zod_1.z.string().optional(),
135
+ suspended: zod_1.z.boolean().optional(),
136
+ }))
137
+ .query(async ({ input }) => this.users.listUsers(input)),
138
+ get: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.USERS_READ)
139
+ .input(zod_1.z.object({ userId: zod_1.z.string().uuid() }))
140
+ .query(async ({ input }) => this.users.getUser(input.userId)),
141
+ suspend: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.USERS_SUSPEND)
142
+ .input(zod_1.z.object({ userId: zod_1.z.string().uuid(), reason: zod_1.z.string().max(1000).optional().nullable() }))
143
+ .mutation(async ({ input, ctx }) => this.users.suspendUser(input.userId, input.reason ?? null, ctx.userId)),
144
+ reactivate: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.USERS_SUSPEND)
145
+ .input(zod_1.z.object({ userId: zod_1.z.string().uuid() }))
146
+ .mutation(async ({ input, ctx }) => this.users.reactivateUser(input.userId, ctx.userId)),
147
+ revokeSessions: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.USERS_REVOKE_SESSIONS)
148
+ .input(zod_1.z.object({ userId: zod_1.z.string().uuid(), exceptToken: zod_1.z.string().optional() }))
149
+ .mutation(async ({ input, ctx }) => this.users.revokeSessions(input.userId, ctx.userId, input.exceptToken)),
150
+ impersonate: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.USERS_IMPERSONATE)
151
+ .input(zod_1.z.object({
152
+ userId: zod_1.z.string().uuid(),
153
+ reason: zod_1.z.string().max(1000).optional(),
154
+ ttlMinutes: zod_1.z.number().int().min(5).max(480).optional().default(60),
155
+ }))
156
+ .mutation(async ({ input, ctx }) => this.users.impersonate(input.userId, ctx.userId, input.reason, input.ttlMinutes)),
157
+ grantAdmin: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.USERS_GRANT_ADMIN)
158
+ .input(zod_1.z.object({
159
+ userId: zod_1.z.string().uuid(),
160
+ role: zod_1.z.nativeEnum(shared_types_1.AdminRole),
161
+ permissions: zod_1.z.array(zod_1.z.string()).optional().nullable(),
162
+ }))
163
+ .mutation(async ({ input, ctx }) => this.users.grantAdmin(input.userId, input.role, input.permissions ?? null, ctx.userId)),
164
+ revokeAdmin: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.USERS_GRANT_ADMIN)
165
+ .input(zod_1.z.object({ userId: zod_1.z.string().uuid() }))
166
+ .mutation(async ({ input, ctx }) => this.users.revokeAdmin(input.userId, ctx.userId)),
167
+ deleteUser: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.USERS_DELETE)
168
+ .input(zod_1.z.object({ userId: zod_1.z.string().uuid(), anonymize: zod_1.z.boolean().optional().default(true) }))
169
+ .mutation(async ({ input, ctx }) => this.users.deleteUser(input.userId, ctx.userId, input.anonymize)),
170
+ addNote: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.USERS_NOTES)
171
+ .input(zod_1.z.object({ userId: zod_1.z.string().uuid(), body: zod_1.z.string().min(1).max(5000) }))
172
+ .mutation(async ({ input, ctx }) => this.users.addUserNote(input.userId, input.body, ctx.userId)),
173
+ }),
174
+ workspaces: (0, trpc_init_1.router)({
175
+ list: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.WORKSPACES_READ)
176
+ .input(cursorListSchema.extend({
177
+ search: zod_1.z.string().max(200).optional(),
178
+ suspended: zod_1.z.boolean().optional(),
179
+ }))
180
+ .query(async ({ input }) => this.workspaces.listWorkspaces(input)),
181
+ get: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.WORKSPACES_READ)
182
+ .input(zod_1.z.object({ workspaceId: zod_1.z.string().uuid() }))
183
+ .query(async ({ input }) => this.workspaces.getWorkspace(input.workspaceId)),
184
+ suspend: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.WORKSPACES_SUSPEND)
185
+ .input(zod_1.z.object({ workspaceId: zod_1.z.string().uuid(), reason: zod_1.z.string().max(1000).optional().nullable() }))
186
+ .mutation(async ({ input, ctx }) => this.workspaces.suspendWorkspace(input.workspaceId, input.reason ?? null, ctx.userId)),
187
+ reactivate: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.WORKSPACES_SUSPEND)
188
+ .input(zod_1.z.object({ workspaceId: zod_1.z.string().uuid() }))
189
+ .mutation(async ({ input, ctx }) => this.workspaces.reactivateWorkspace(input.workspaceId, ctx.userId)),
190
+ overridePlan: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.WORKSPACES_PLAN)
191
+ .input(zod_1.z.object({ workspaceId: zod_1.z.string().uuid(), planId: zod_1.z.string().min(1) }))
192
+ .mutation(async ({ input, ctx }) => this.workspaces.overridePlan(input.workspaceId, input.planId, ctx.userId)),
193
+ setCredits: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.WORKSPACES_CREDITS)
194
+ .input(zod_1.z.object({ workspaceId: zod_1.z.string().uuid(), credits: zod_1.z.number() }))
195
+ .mutation(async ({ input, ctx }) => this.workspaces.setCredits(input.workspaceId, input.credits, ctx.userId)),
196
+ transferOwner: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.WORKSPACES_TRANSFER_OWNER)
197
+ .input(zod_1.z.object({ workspaceId: zod_1.z.string().uuid(), newOwnerUserId: zod_1.z.string().uuid() }))
198
+ .mutation(async ({ input, ctx }) => this.workspaces.transferOwner(input.workspaceId, input.newOwnerUserId, ctx.userId)),
199
+ addNote: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.WORKSPACES_NOTES)
200
+ .input(zod_1.z.object({ workspaceId: zod_1.z.string().uuid(), body: zod_1.z.string().min(1).max(5000) }))
201
+ .mutation(async ({ input, ctx }) => this.workspaces.addWorkspaceNote(input.workspaceId, input.body, ctx.userId)),
202
+ }),
203
+ billing: (0, trpc_init_1.router)({
204
+ listSubscriptions: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.BILLING_READ)
205
+ .query(async () => this.billing.listSubscriptions()),
206
+ getWallet: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.BILLING_READ)
207
+ .input(zod_1.z.object({ workspaceId: zod_1.z.string().uuid() }))
208
+ .query(async ({ input }) => this.billing.getWallet(input.workspaceId)),
209
+ listWallets: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.BILLING_READ)
210
+ .query(async () => this.billing.listWallets()),
211
+ listTransactions: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.BILLING_READ)
212
+ .input(zod_1.z.object({ walletId: zod_1.z.string().uuid(), limit: zod_1.z.number().int().min(1).max(200).optional().default(50) }))
213
+ .query(async ({ input }) => this.billing.listTransactions(input.walletId, input.limit)),
214
+ refund: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.BILLING_REFUND)
215
+ .input(zod_1.z.object({
216
+ workspaceId: zod_1.z.string().uuid(),
217
+ amount: zod_1.z.number().positive(),
218
+ reference: zod_1.z.string().min(1),
219
+ description: zod_1.z.string().max(1000).optional().nullable(),
220
+ }))
221
+ .mutation(async ({ input, ctx }) => this.billing.refund(input.workspaceId, input.amount, input.reference, input.description ?? null, ctx.userId)),
222
+ planOverride: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.BILLING_PLAN_OVERRIDE)
223
+ .input(zod_1.z.object({ workspaceId: zod_1.z.string().uuid(), planId: zod_1.z.string().min(1) }))
224
+ .mutation(async ({ input, ctx }) => this.billing.planOverride(input.workspaceId, input.planId, ctx.userId)),
225
+ }),
226
+ moderation: (0, trpc_init_1.router)({
227
+ listReports: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.MODERATION_READ)
228
+ .input(cursorListSchema.extend({
229
+ status: zod_1.z.string().optional(),
230
+ category: zod_1.z.string().optional(),
231
+ targetType: zod_1.z.string().optional(),
232
+ }))
233
+ .query(async ({ input }) => this.moderation.listAbuseReports(input)),
234
+ getReport: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.MODERATION_READ)
235
+ .input(zod_1.z.object({ reportId: zod_1.z.string().uuid() }))
236
+ .query(async ({ input }) => this.moderation.getAbuseReport(input.reportId)),
237
+ resolve: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.MODERATION_RESOLVE)
238
+ .input(zod_1.z.object({
239
+ reportId: zod_1.z.string().uuid(),
240
+ resolution: zod_1.z.string().min(1).max(2000),
241
+ status: zod_1.z.string().optional(),
242
+ }))
243
+ .mutation(async ({ input, ctx }) => this.moderation.resolveReport(input.reportId, input.resolution, ctx.userId, input.status)),
244
+ takedown: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.MODERATION_TAKEDOWN)
245
+ .input(zod_1.z.object({ reportId: zod_1.z.string().uuid(), reason: zod_1.z.string().max(1000).optional() }))
246
+ .mutation(async ({ input, ctx }) => this.moderation.takedown(input.reportId, ctx.userId, input.reason)),
247
+ }),
248
+ settings: (0, trpc_init_1.router)({
249
+ list: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.SETTINGS_READ)
250
+ .query(async () => this.settings.listSettings()),
251
+ get: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.SETTINGS_READ)
252
+ .input(zod_1.z.object({ key: zod_1.z.string().min(1) }))
253
+ .query(async ({ input }) => this.settings.getSetting(input.key)),
254
+ upsert: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.SETTINGS_WRITE)
255
+ .input(zod_1.z.object({
256
+ key: zod_1.z.string().min(1),
257
+ value: zod_1.z.unknown(),
258
+ description: zod_1.z.string().max(1000).optional().nullable(),
259
+ category: zod_1.z.string().min(1),
260
+ }))
261
+ .mutation(async ({ input, ctx }) => this.settings.upsertSetting(input.key, input.value, input.description ?? null, input.category, ctx.userId)),
262
+ delete: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.SETTINGS_WRITE)
263
+ .input(zod_1.z.object({ key: zod_1.z.string().min(1) }))
264
+ .mutation(async ({ input, ctx }) => this.settings.deleteSetting(input.key, ctx.userId)),
265
+ }),
266
+ flags: (0, trpc_init_1.router)({
267
+ list: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.FLAGS_READ)
268
+ .query(async () => this.settings.listFlags()),
269
+ isEnabled: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.FLAGS_READ)
270
+ .input(zod_1.z.object({ key: zod_1.z.string().min(1), workspaceId: zod_1.z.string().uuid().optional() }))
271
+ .query(async ({ input }) => this.settings.isFlagEnabled(input.key, input.workspaceId)),
272
+ upsert: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.FLAGS_WRITE)
273
+ .input(zod_1.z.object({
274
+ key: zod_1.z.string().min(1),
275
+ enabled: zod_1.z.boolean(),
276
+ rolloutPercentage: zod_1.z.number().int().min(0).max(100),
277
+ allowlistWorkspaceIds: zod_1.z.array(zod_1.z.string().uuid()).optional().default([]),
278
+ description: zod_1.z.string().max(1000).optional().nullable(),
279
+ }))
280
+ .mutation(async ({ input, ctx }) => this.settings.upsertFlag(input.key, input.enabled, input.rolloutPercentage, input.allowlistWorkspaceIds, input.description ?? null, ctx.userId)),
281
+ delete: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.FLAGS_WRITE)
282
+ .input(zod_1.z.object({ key: zod_1.z.string().min(1) }))
283
+ .mutation(async ({ input, ctx }) => this.settings.deleteFlag(input.key, ctx.userId)),
284
+ }),
285
+ audit: (0, trpc_init_1.router)({
286
+ list: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.AUDIT_READ)
287
+ .input(cursorListSchema.extend({
288
+ action: zod_1.z.string().optional(),
289
+ entityType: zod_1.z.string().optional(),
290
+ userId: zod_1.z.string().uuid().optional(),
291
+ workspaceId: zod_1.z.string().uuid().optional(),
292
+ startDate: zod_1.z.string().optional(),
293
+ endDate: zod_1.z.string().optional(),
294
+ search: zod_1.z.string().max(200).optional(),
295
+ }))
296
+ .query(async ({ input }) => this.audit.list(input)),
297
+ verify: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.AUDIT_READ)
298
+ .query(async () => this.audit.verify()),
299
+ stats: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.AUDIT_READ)
300
+ .query(async () => this.audit.stats()),
301
+ export: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.AUDIT_EXPORT)
302
+ .input(zod_1.z.object({ startDate: zod_1.z.string().optional(), endDate: zod_1.z.string().optional() }))
303
+ .query(async ({ input, ctx }) => this.audit.export(input, ctx.userId)),
304
+ getEntry: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.AUDIT_READ)
305
+ .input(zod_1.z.object({ entryId: zod_1.z.string().uuid() }))
306
+ .query(async ({ input }) => this.audit.getEntry(input.entryId)),
307
+ }),
308
+ comms: (0, trpc_init_1.router)({
309
+ list: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.ANNOUNCEMENTS_READ)
310
+ .query(async () => this.comms.listAnnouncements()),
311
+ create: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.ANNOUNCEMENTS_WRITE)
312
+ .input(zod_1.z.object({
313
+ title: zod_1.z.string().min(1).max(200),
314
+ body: zod_1.z.string().min(1).max(10_000),
315
+ audience: zod_1.z.unknown(),
316
+ severity: zod_1.z.string().min(1),
317
+ status: zod_1.z.string().min(1),
318
+ publishedAt: zod_1.z.string().datetime().optional().nullable(),
319
+ expiresAt: zod_1.z.string().datetime().optional().nullable(),
320
+ }))
321
+ .mutation(async ({ input, ctx }) => this.comms.createAnnouncement(input.title, input.body, input.audience, input.severity, input.status, input.publishedAt ? new Date(input.publishedAt) : null, input.expiresAt ? new Date(input.expiresAt) : null, ctx.userId)),
322
+ update: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.ANNOUNCEMENTS_WRITE)
323
+ .input(zod_1.z.object({
324
+ id: zod_1.z.string().uuid(),
325
+ title: zod_1.z.string().min(1).max(200).optional(),
326
+ body: zod_1.z.string().min(1).max(10_000).optional(),
327
+ audience: zod_1.z.unknown().optional(),
328
+ severity: zod_1.z.string().min(1).optional(),
329
+ status: zod_1.z.string().min(1).optional(),
330
+ publishedAt: zod_1.z.string().datetime().optional().nullable(),
331
+ expiresAt: zod_1.z.string().datetime().optional().nullable(),
332
+ }))
333
+ .mutation(async ({ input, ctx }) => {
334
+ const { id, ...patch } = input;
335
+ return this.comms.updateAnnouncement(id, patch, ctx.userId);
336
+ }),
337
+ archive: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.ANNOUNCEMENTS_WRITE)
338
+ .input(zod_1.z.object({ id: zod_1.z.string().uuid() }))
339
+ .mutation(async ({ input, ctx }) => this.comms.archiveAnnouncement(input.id, ctx.userId)),
340
+ }),
341
+ supervision: (0, trpc_init_1.router)({
342
+ run: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.SUPERVISION_RUN)
343
+ .input(zod_1.z.object({ kind: zod_1.z.string().optional() }))
344
+ .query(async ({ input, ctx }) => this.supervision.runSupervision(input.kind ?? "other", ctx.userId)),
345
+ listRuns: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.SUPERVISION_READ)
346
+ .query(async () => this.supervision.listRuns()),
347
+ listFindings: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.SUPERVISION_READ)
348
+ .input(zod_1.z.object({ runId: zod_1.z.string().uuid().optional(), status: zod_1.z.string().optional() }))
349
+ .query(async ({ input }) => this.supervision.listFindings(input.runId, input.status)),
350
+ acknowledge: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.SUPERVISION_RUN)
351
+ .input(zod_1.z.object({ findingId: zod_1.z.string().uuid(), assignedToId: zod_1.z.string().uuid().optional() }))
352
+ .mutation(async ({ input, ctx }) => this.supervision.acknowledgeFinding(input.findingId, input.assignedToId ?? ctx.userId)),
353
+ resolve: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.SUPERVISION_RUN)
354
+ .input(zod_1.z.object({ findingId: zod_1.z.string().uuid() }))
355
+ .mutation(async ({ input }) => this.supervision.resolveFinding(input.findingId)),
356
+ }),
357
+ operations: (0, trpc_init_1.router)({
358
+ queueHealth: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.OPS_READ)
359
+ .query(async () => this.operations.getQueueHealth()),
360
+ queueJobs: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.OPS_QUEUES)
361
+ .input(zod_1.z.object({
362
+ queue: zod_1.z.string(),
363
+ type: zod_1.z.enum(["waiting", "active", "failed", "completed", "delayed"]),
364
+ limit: zod_1.z.number().int().min(1).max(200).optional().default(50),
365
+ }))
366
+ .query(async ({ input }) => this.operations.getQueueJobs(input.queue, input.type, input.limit)),
367
+ retryJob: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.OPS_RETRY_JOBS)
368
+ .input(zod_1.z.object({ queue: zod_1.z.string(), jobId: zod_1.z.string() }))
369
+ .mutation(async ({ input, ctx }) => this.operations.retryJob(input.queue, input.jobId, ctx.userId)),
370
+ purgeFailed: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.OPS_PURGE_JOBS)
371
+ .input(zod_1.z.object({ queue: zod_1.z.string() }))
372
+ .mutation(async ({ input, ctx }) => this.operations.purgeFailedJobs(input.queue, ctx.userId)),
373
+ getLocks: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.OPS_LOCKS)
374
+ .input(zod_1.z.object({ pattern: zod_1.z.string().optional().default("lock:clip:*"), limit: zod_1.z.number().int().min(1).max(1000).optional().default(100) }))
375
+ .query(async ({ input }) => this.operations.getLocks(input.pattern, input.limit)),
376
+ releaseLock: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.OPS_LOCKS)
377
+ .input(zod_1.z.object({ key: zod_1.z.string() }))
378
+ .mutation(async ({ input, ctx }) => this.operations.releaseLock(input.key, ctx.userId)),
379
+ systemHealth: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.OPS_HEALTH)
380
+ .query(async () => this.operations.getSystemHealth()),
381
+ setMaintenanceMode: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.OPS_MAINTENANCE)
382
+ .input(zod_1.z.object({ enabled: zod_1.z.boolean() }))
383
+ .mutation(async ({ input, ctx }) => this.operations.setMaintenanceMode(input.enabled, ctx.userId)),
384
+ flushCache: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.OPS_CACHE)
385
+ .input(zod_1.z.object({ pattern: zod_1.z.string().optional().default("*") }))
386
+ .mutation(async ({ input, ctx }) => this.operations.flushCache(input.pattern, ctx.userId)),
387
+ }),
388
+ me: trpc_init_1.adminProcedure
389
+ .query(async ({ ctx }) => {
390
+ const context = await this.adminAuth.getAdminContext(ctx.userId);
391
+ if (!context)
392
+ return null;
393
+ return {
394
+ userId: context.userId,
395
+ isAdmin: context.isAdmin,
396
+ role: context.role,
397
+ permissions: [...context.permissions],
398
+ suspended: context.suspended,
399
+ };
400
+ }),
401
+ });
402
+ }
403
+ };
404
+ exports.AdminRouter = AdminRouter;
405
+ exports.AdminRouter = AdminRouter = AdminRouter_1 = __decorate([
406
+ (0, common_1.Injectable)(),
407
+ __metadata("design:paramtypes", [admin_realtime_service_1.AdminRealtimeService,
408
+ admin_clip_scorer_service_1.AdminClipScorerService,
409
+ admin_auth_service_1.AdminAuthService,
410
+ admin_users_service_1.AdminUsersService,
411
+ admin_workspaces_service_1.AdminWorkspacesService,
412
+ admin_billing_service_1.AdminBillingService,
413
+ admin_moderation_service_1.AdminModerationService,
414
+ admin_operations_service_1.AdminOperationsService,
415
+ admin_settings_service_1.AdminSettingsService,
416
+ admin_audit_service_1.AdminAuditService,
417
+ admin_comms_service_1.AdminCommsService,
418
+ admin_supervision_service_1.AdminSupervisionService])
419
+ ], AdminRouter);
420
+ //# sourceMappingURL=admin.router.js.map
apps/api/dist/admin/admin.router.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"admin.router.js","sourceRoot":"","sources":["../../src/admin/admin.router.ts"],"names":[],"mappings":"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"}
apps/api/dist/ai/ai.module.js ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.AIModule = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const config_1 = require("@nestjs/config");
12
+ const prisma_module_1 = require("../prisma/prisma.module");
13
+ const billing_module_1 = require("../billing/billing.module");
14
+ const ai_service_1 = require("./ai.service");
15
+ let AIModule = class AIModule {
16
+ };
17
+ exports.AIModule = AIModule;
18
+ exports.AIModule = AIModule = __decorate([
19
+ (0, common_1.Module)({
20
+ imports: [
21
+ prisma_module_1.PrismaModule,
22
+ config_1.ConfigModule,
23
+ billing_module_1.BillingModule,
24
+ ],
25
+ providers: [ai_service_1.AIService],
26
+ exports: [ai_service_1.AIService],
27
+ })
28
+ ], AIModule);
29
+ //# sourceMappingURL=ai.module.js.map
apps/api/dist/ai/ai.module.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"ai.module.js","sourceRoot":"","sources":["../../src/ai/ai.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,2CAA8C;AAE9C,2DAAuD;AACvD,8DAA0D;AAC1D,6CAAyC;AAWlC,IAAM,QAAQ,GAAd,MAAM,QAAQ;CAAG,CAAA;AAAX,4BAAQ;mBAAR,QAAQ;IATpB,IAAA,eAAM,EAAC;QACJ,OAAO,EAAE;YACL,4BAAY;YACZ,qBAAY;YACZ,8BAAa;SAChB;QACD,SAAS,EAAE,CAAC,sBAAS,CAAC;QACtB,OAAO,EAAE,CAAC,sBAAS,CAAC;KACvB,CAAC;GACW,QAAQ,CAAG"}
apps/api/dist/ai/ai.service.js ADDED
@@ -0,0 +1,202 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var AIService_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.AIService = void 0;
14
+ const common_1 = require("@nestjs/common");
15
+ const config_1 = require("@nestjs/config");
16
+ const prisma_service_1 = require("../prisma/prisma.service");
17
+ const subscription_credentials_service_1 = require("../billing/subscription-credentials.service");
18
+ let AIService = AIService_1 = class AIService {
19
+ configService;
20
+ prisma;
21
+ credentialsService;
22
+ logger = new common_1.Logger(AIService_1.name);
23
+ constructor(configService, prisma, credentialsService) {
24
+ this.configService = configService;
25
+ this.prisma = prisma;
26
+ this.credentialsService = credentialsService;
27
+ }
28
+ async resolveApiKeyAndUrl(workspaceId, provider) {
29
+ let resolvedKey = null;
30
+ let resolvedUrl = null;
31
+ try {
32
+ const resolved = await this.credentialsService.resolveCredentials(workspaceId, provider);
33
+ resolvedKey = resolved.apiKey || resolved.accessToken;
34
+ resolvedUrl = resolved.endpointUrl;
35
+ }
36
+ catch (error) {
37
+ if (error instanceof common_1.ForbiddenException) {
38
+ throw error;
39
+ }
40
+ this.logger.debug(`Workspace/Platform DB credentials not resolved for ${provider}: ${error instanceof Error ? error.message : String(error)}. Attempting env fallback.`);
41
+ }
42
+ if (!resolvedKey) {
43
+ if (provider === "nvidia_nim") {
44
+ resolvedKey = this.configService.get("NVIDIA_NIM_API_KEY") || null;
45
+ resolvedUrl = resolvedUrl || "https://integrate.api.nvidia.com/v1";
46
+ }
47
+ else if (provider === "deepseek") {
48
+ resolvedKey = this.configService.get("DEEPSEEK_API_KEY") || null;
49
+ resolvedUrl = resolvedUrl || "https://api.deepseek.com/v1";
50
+ }
51
+ else if (provider === "moonshot") {
52
+ resolvedKey = this.configService.get("MOONSHOT_API_KEY") || null;
53
+ resolvedUrl = resolvedUrl || "https://api.moonshot.cn/v1";
54
+ }
55
+ }
56
+ if (!resolvedKey) {
57
+ throw new common_1.BadRequestException(`API key for provider "${provider}" is not configured in the workspace or system environment.`);
58
+ }
59
+ return {
60
+ apiKey: resolvedKey,
61
+ endpointUrl: resolvedUrl || "",
62
+ };
63
+ }
64
+ async generateText(workspaceId, prompt, options = {}) {
65
+ const provider = options.provider || "nvidia_nim";
66
+ const { apiKey, endpointUrl } = await this.resolveApiKeyAndUrl(workspaceId, provider);
67
+ let defaultModel = "meta/llama-3.1-405b-instruct";
68
+ let defaultUrl = "https://integrate.api.nvidia.com/v1/chat/completions";
69
+ if (provider === "deepseek") {
70
+ defaultModel = "deepseek-chat";
71
+ defaultUrl = "https://api.deepseek.com/v1/chat/completions";
72
+ }
73
+ else if (provider === "moonshot") {
74
+ defaultModel = "moonshot-v1-8k";
75
+ defaultUrl = "https://api.moonshot.cn/v1/chat/completions";
76
+ }
77
+ const model = options.model || defaultModel;
78
+ const targetUrl = endpointUrl
79
+ ? `${endpointUrl.replace(/\/$/, "")}/chat/completions`
80
+ : defaultUrl;
81
+ const messages = [];
82
+ if (options.systemPrompt) {
83
+ messages.push({ role: "system", content: options.systemPrompt });
84
+ }
85
+ messages.push({ role: "user", content: prompt });
86
+ this.logger.log(`Calling text completion on provider ${provider} using model ${model}`);
87
+ try {
88
+ const response = await fetch(targetUrl, {
89
+ method: "POST",
90
+ headers: {
91
+ "Content-Type": "application/json",
92
+ "Authorization": `Bearer ${apiKey}`,
93
+ },
94
+ body: JSON.stringify({
95
+ model,
96
+ messages,
97
+ temperature: options.temperature ?? 0.7,
98
+ max_tokens: options.maxTokens ?? 1024,
99
+ }),
100
+ });
101
+ if (!response.ok) {
102
+ const errorBody = await response.text();
103
+ throw new Error(`HTTP Error ${response.status}: ${errorBody}`);
104
+ }
105
+ const data = await response.json();
106
+ const content = data.choices?.[0]?.message?.content;
107
+ if (content === undefined) {
108
+ throw new Error("Invalid response format from AI provider");
109
+ }
110
+ return content;
111
+ }
112
+ catch (error) {
113
+ this.logger.error(`AI Completion failed for provider ${provider}: ${error instanceof Error ? error.message : String(error)}`);
114
+ throw new common_1.BadRequestException(`AI Text generation failed: ${error instanceof Error ? error.message : String(error)}`);
115
+ }
116
+ }
117
+ async transcribeAudio(workspaceId, audioFileBuffer, fileName, options = {}) {
118
+ const provider = "nvidia_nim";
119
+ const { apiKey, endpointUrl } = await this.resolveApiKeyAndUrl(workspaceId, provider);
120
+ const model = options.model || "nvidia/canary-1b";
121
+ const defaultUrl = "https://integrate.api.nvidia.com/v1/audio/transcriptions";
122
+ const targetUrl = endpointUrl
123
+ ? `${endpointUrl.replace(/\/$/, "")}/audio/transcriptions`
124
+ : defaultUrl;
125
+ this.logger.log(`Calling NVIDIA NIM transcription with model ${model} for file ${fileName}`);
126
+ try {
127
+ const formData = new FormData();
128
+ const blob = new Blob([new Uint8Array(audioFileBuffer)], { type: "audio/wav" });
129
+ formData.append("file", blob, fileName);
130
+ formData.append("model", model);
131
+ if (options.language) {
132
+ formData.append("language", options.language);
133
+ }
134
+ const response = await fetch(targetUrl, {
135
+ method: "POST",
136
+ headers: {
137
+ "Authorization": `Bearer ${apiKey}`,
138
+ },
139
+ body: formData,
140
+ });
141
+ if (!response.ok) {
142
+ const errorBody = await response.text();
143
+ throw new Error(`HTTP Error ${response.status}: ${errorBody}`);
144
+ }
145
+ const data = await response.json();
146
+ return {
147
+ text: data.text,
148
+ language: data.language || options.language || "en",
149
+ duration: data.duration,
150
+ segments: data.segments,
151
+ };
152
+ }
153
+ catch (error) {
154
+ this.logger.error(`NVIDIA NIM Audio Transcription failed: ${error instanceof Error ? error.message : String(error)}`);
155
+ throw new common_1.BadRequestException(`NVIDIA NIM transcription failed: ${error instanceof Error ? error.message : String(error)}`);
156
+ }
157
+ }
158
+ async synthesizeSpeech(workspaceId, text, options = {}) {
159
+ const provider = "nvidia_nim";
160
+ const { apiKey, endpointUrl } = await this.resolveApiKeyAndUrl(workspaceId, provider);
161
+ const model = options.model || "nvidia/riva-tts";
162
+ const defaultUrl = "https://integrate.api.nvidia.com/v1/audio/speech";
163
+ const targetUrl = endpointUrl
164
+ ? `${endpointUrl.replace(/\/$/, "")}/audio/speech`
165
+ : defaultUrl;
166
+ this.logger.log(`Calling NVIDIA NIM voice synthesis with model ${model}`);
167
+ try {
168
+ const response = await fetch(targetUrl, {
169
+ method: "POST",
170
+ headers: {
171
+ "Content-Type": "application/json",
172
+ "Authorization": `Bearer ${apiKey}`,
173
+ "Accept": "audio/wav",
174
+ },
175
+ body: JSON.stringify({
176
+ model,
177
+ input: text,
178
+ voice: options.voice || "en-US-Female-1",
179
+ response_format: "wav",
180
+ }),
181
+ });
182
+ if (!response.ok) {
183
+ const errorBody = await response.text();
184
+ throw new Error(`HTTP Error ${response.status}: ${errorBody}`);
185
+ }
186
+ const arrayBuffer = await response.arrayBuffer();
187
+ return Buffer.from(arrayBuffer);
188
+ }
189
+ catch (error) {
190
+ this.logger.error(`NVIDIA NIM Text-to-Speech failed: ${error instanceof Error ? error.message : String(error)}`);
191
+ throw new common_1.BadRequestException(`NVIDIA NIM Text-to-Speech failed: ${error instanceof Error ? error.message : String(error)}`);
192
+ }
193
+ }
194
+ };
195
+ exports.AIService = AIService;
196
+ exports.AIService = AIService = AIService_1 = __decorate([
197
+ (0, common_1.Injectable)(),
198
+ __metadata("design:paramtypes", [config_1.ConfigService,
199
+ prisma_service_1.PrismaService,
200
+ subscription_credentials_service_1.SubscriptionCredentialsService])
201
+ ], AIService);
202
+ //# sourceMappingURL=ai.service.js.map
apps/api/dist/ai/ai.service.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"ai.service.js","sourceRoot":"","sources":["../../src/ai/ai.service.ts"],"names":[],"mappings":"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"}
apps/api/dist/analytics/analytics.controller.js ADDED
@@ -0,0 +1,123 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.AnalyticsController = void 0;
16
+ const common_1 = require("@nestjs/common");
17
+ const swagger_1 = require("@nestjs/swagger");
18
+ const analytics_service_1 = require("./analytics.service");
19
+ const better_auth_guard_1 = require("../auth/better-auth.guard");
20
+ const subscription_guard_1 = require("../billing/subscription.guard");
21
+ const subscription_features_1 = require("../billing/subscription-features");
22
+ let AnalyticsController = class AnalyticsController {
23
+ analyticsService;
24
+ constructor(analyticsService) {
25
+ this.analyticsService = analyticsService;
26
+ }
27
+ async getDashboardMetrics(podcastId, req) {
28
+ return this.analyticsService.getDashboardMetrics(podcastId, req.userId);
29
+ }
30
+ async getPipeline(podcastId, req) {
31
+ return this.analyticsService.getGuestPipeline(podcastId, req.userId);
32
+ }
33
+ async getOutreachMetrics(podcastId, req) {
34
+ return this.analyticsService.getOutreachMetrics(podcastId, req.userId);
35
+ }
36
+ async getSchedulingMetrics(podcastId, daysBack, req) {
37
+ return this.analyticsService.getSchedulingMetrics(podcastId, req.userId, daysBack ? parseInt(daysBack, 10) : 90);
38
+ }
39
+ async getActivity(podcastId, limit, req) {
40
+ return this.analyticsService.getRecentActivity(podcastId, req.userId, limit ? parseInt(limit, 10) : 20);
41
+ }
42
+ };
43
+ exports.AnalyticsController = AnalyticsController;
44
+ __decorate([
45
+ (0, common_1.Get)("dashboard"),
46
+ (0, swagger_1.ApiOperation)({
47
+ summary: "Dashboard metrics",
48
+ description: "Get key metrics for the podcast dashboard",
49
+ }),
50
+ (0, swagger_1.ApiParam)({ name: "podcastId", description: "Podcast ID" }),
51
+ (0, swagger_1.ApiResponse)({ status: 200, description: "Dashboard metrics retrieved" }),
52
+ __param(0, (0, common_1.Param)("podcastId")),
53
+ __param(1, (0, common_1.Req)()),
54
+ __metadata("design:type", Function),
55
+ __metadata("design:paramtypes", [String, Object]),
56
+ __metadata("design:returntype", Promise)
57
+ ], AnalyticsController.prototype, "getDashboardMetrics", null);
58
+ __decorate([
59
+ (0, common_1.Get)("pipeline"),
60
+ (0, swagger_1.ApiOperation)({
61
+ summary: "Guest pipeline",
62
+ description: "Get guest counts by status with priority scores",
63
+ }),
64
+ (0, swagger_1.ApiParam)({ name: "podcastId", description: "Podcast ID" }),
65
+ __param(0, (0, common_1.Param)("podcastId")),
66
+ __param(1, (0, common_1.Req)()),
67
+ __metadata("design:type", Function),
68
+ __metadata("design:paramtypes", [String, Object]),
69
+ __metadata("design:returntype", Promise)
70
+ ], AnalyticsController.prototype, "getPipeline", null);
71
+ __decorate([
72
+ (0, common_1.Get)("outreach"),
73
+ (0, swagger_1.ApiOperation)({
74
+ summary: "Outreach metrics",
75
+ description: "Get email sequence performance metrics (Studio plan)",
76
+ }),
77
+ (0, swagger_1.ApiParam)({ name: "podcastId", description: "Podcast ID" }),
78
+ (0, subscription_guard_1.RequireFeature)(subscription_features_1.SubscriptionFeature.ADVANCED_ANALYTICS),
79
+ __param(0, (0, common_1.Param)("podcastId")),
80
+ __param(1, (0, common_1.Req)()),
81
+ __metadata("design:type", Function),
82
+ __metadata("design:paramtypes", [String, Object]),
83
+ __metadata("design:returntype", Promise)
84
+ ], AnalyticsController.prototype, "getOutreachMetrics", null);
85
+ __decorate([
86
+ (0, common_1.Get)("scheduling"),
87
+ (0, swagger_1.ApiOperation)({
88
+ summary: "Scheduling metrics",
89
+ description: "Get episode scheduling and conversion metrics (Studio plan)",
90
+ }),
91
+ (0, swagger_1.ApiParam)({ name: "podcastId", description: "Podcast ID" }),
92
+ (0, swagger_1.ApiQuery)({ name: "daysBack", type: Number, required: false, description: "Days to look back" }),
93
+ (0, subscription_guard_1.RequireFeature)(subscription_features_1.SubscriptionFeature.ADVANCED_ANALYTICS),
94
+ __param(0, (0, common_1.Param)("podcastId")),
95
+ __param(1, (0, common_1.Query)("daysBack")),
96
+ __param(2, (0, common_1.Req)()),
97
+ __metadata("design:type", Function),
98
+ __metadata("design:paramtypes", [String, String, Object]),
99
+ __metadata("design:returntype", Promise)
100
+ ], AnalyticsController.prototype, "getSchedulingMetrics", null);
101
+ __decorate([
102
+ (0, common_1.Get)("activity"),
103
+ (0, swagger_1.ApiOperation)({
104
+ summary: "Activity timeline",
105
+ description: "Get recent activity for the podcast",
106
+ }),
107
+ (0, swagger_1.ApiParam)({ name: "podcastId", description: "Podcast ID" }),
108
+ (0, swagger_1.ApiQuery)({ name: "limit", type: Number, required: false }),
109
+ __param(0, (0, common_1.Param)("podcastId")),
110
+ __param(1, (0, common_1.Query)("limit")),
111
+ __param(2, (0, common_1.Req)()),
112
+ __metadata("design:type", Function),
113
+ __metadata("design:paramtypes", [String, String, Object]),
114
+ __metadata("design:returntype", Promise)
115
+ ], AnalyticsController.prototype, "getActivity", null);
116
+ exports.AnalyticsController = AnalyticsController = __decorate([
117
+ (0, swagger_1.ApiTags)("Analytics"),
118
+ (0, swagger_1.ApiBearerAuth)("jwt"),
119
+ (0, common_1.UseGuards)(better_auth_guard_1.BetterAuthGuard, subscription_guard_1.SubscriptionGuard),
120
+ (0, common_1.Controller)("podcasts/:podcastId/analytics"),
121
+ __metadata("design:paramtypes", [analytics_service_1.AnalyticsService])
122
+ ], AnalyticsController);
123
+ //# sourceMappingURL=analytics.controller.js.map
apps/api/dist/analytics/analytics.controller.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"analytics.controller.js","sourceRoot":"","sources":["../../src/analytics/analytics.controller.ts"],"names":[],"mappings":"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"}
apps/api/dist/analytics/analytics.module.js ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.AnalyticsModule = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const analytics_service_1 = require("./analytics.service");
12
+ const analytics_controller_1 = require("./analytics.controller");
13
+ const analytics_router_1 = require("./analytics.router");
14
+ let AnalyticsModule = class AnalyticsModule {
15
+ };
16
+ exports.AnalyticsModule = AnalyticsModule;
17
+ exports.AnalyticsModule = AnalyticsModule = __decorate([
18
+ (0, common_1.Module)({
19
+ providers: [analytics_service_1.AnalyticsService, analytics_router_1.AnalyticsRouter],
20
+ controllers: [analytics_controller_1.AnalyticsController],
21
+ exports: [analytics_service_1.AnalyticsService, analytics_router_1.AnalyticsRouter],
22
+ })
23
+ ], AnalyticsModule);
24
+ //# sourceMappingURL=analytics.module.js.map
apps/api/dist/analytics/analytics.module.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"analytics.module.js","sourceRoot":"","sources":["../../src/analytics/analytics.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,2DAAuD;AACvD,iEAA6D;AAC7D,yDAAqD;AAO9C,IAAM,eAAe,GAArB,MAAM,eAAe;CAAG,CAAA;AAAlB,0CAAe;0BAAf,eAAe;IAL3B,IAAA,eAAM,EAAC;QACJ,SAAS,EAAE,CAAC,oCAAgB,EAAE,kCAAe,CAAC;QAC9C,WAAW,EAAE,CAAC,0CAAmB,CAAC;QAClC,OAAO,EAAE,CAAC,oCAAgB,EAAE,kCAAe,CAAC;KAC/C,CAAC;GACW,eAAe,CAAG"}
apps/api/dist/analytics/analytics.router.js ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.AnalyticsRouter = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const zod_1 = require("zod");
15
+ const trpc_init_1 = require("../trpc/trpc.init");
16
+ const subscription_features_1 = require("../billing/subscription-features");
17
+ const analytics_service_1 = require("./analytics.service");
18
+ let AnalyticsRouter = class AnalyticsRouter {
19
+ analyticsService;
20
+ constructor(analyticsService) {
21
+ this.analyticsService = analyticsService;
22
+ }
23
+ get router() {
24
+ return (0, trpc_init_1.router)({
25
+ dashboard: trpc_init_1.workspaceProcedure
26
+ .input(zod_1.z.object({ podcastId: zod_1.z.string().uuid() }))
27
+ .query(async ({ input, ctx }) => {
28
+ return this.analyticsService.getDashboardMetrics(input.podcastId, ctx.userId);
29
+ }),
30
+ pipeline: trpc_init_1.workspaceProcedure
31
+ .input(zod_1.z.object({ podcastId: zod_1.z.string().uuid() }))
32
+ .query(async ({ input, ctx }) => {
33
+ return this.analyticsService.getGuestPipeline(input.podcastId, ctx.userId);
34
+ }),
35
+ outreach: (0, trpc_init_1.requireFeature)(subscription_features_1.SubscriptionFeature.ADVANCED_ANALYTICS)
36
+ .input(zod_1.z.object({ podcastId: zod_1.z.string().uuid() }))
37
+ .query(async ({ input, ctx }) => {
38
+ return this.analyticsService.getOutreachMetrics(input.podcastId, ctx.userId);
39
+ }),
40
+ scheduling: (0, trpc_init_1.requireFeature)(subscription_features_1.SubscriptionFeature.ADVANCED_ANALYTICS)
41
+ .input(zod_1.z.object({
42
+ podcastId: zod_1.z.string().uuid(),
43
+ daysBack: zod_1.z.number().int().min(7).max(365).default(90),
44
+ }))
45
+ .query(async ({ input, ctx }) => {
46
+ return this.analyticsService.getSchedulingMetrics(input.podcastId, ctx.userId, input.daysBack);
47
+ }),
48
+ recentActivity: trpc_init_1.workspaceProcedure
49
+ .input(zod_1.z.object({
50
+ podcastId: zod_1.z.string().uuid(),
51
+ limit: zod_1.z.number().int().min(1).max(100).default(20),
52
+ }))
53
+ .query(async ({ input, ctx }) => {
54
+ return this.analyticsService.getRecentActivity(input.podcastId, ctx.userId, input.limit);
55
+ }),
56
+ });
57
+ }
58
+ };
59
+ exports.AnalyticsRouter = AnalyticsRouter;
60
+ exports.AnalyticsRouter = AnalyticsRouter = __decorate([
61
+ (0, common_1.Injectable)(),
62
+ __metadata("design:paramtypes", [analytics_service_1.AnalyticsService])
63
+ ], AnalyticsRouter);
64
+ //# sourceMappingURL=analytics.router.js.map
apps/api/dist/analytics/analytics.router.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"analytics.router.js","sourceRoot":"","sources":["../../src/analytics/analytics.router.ts"],"names":[],"mappings":"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"}
apps/api/dist/analytics/analytics.service.js ADDED
@@ -0,0 +1,354 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var AnalyticsService_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.AnalyticsService = void 0;
14
+ const common_1 = require("@nestjs/common");
15
+ const prisma_service_1 = require("../prisma/prisma.service");
16
+ const authorization_service_1 = require("../common/authorization.service");
17
+ let AnalyticsService = AnalyticsService_1 = class AnalyticsService {
18
+ prisma;
19
+ authorizationService;
20
+ logger = new common_1.Logger(AnalyticsService_1.name);
21
+ cache = new Map();
22
+ cacheTTL = 30_000;
23
+ constructor(prisma, authorizationService) {
24
+ this.prisma = prisma;
25
+ this.authorizationService = authorizationService;
26
+ }
27
+ getCached(key) {
28
+ const entry = this.cache.get(key);
29
+ if (entry && entry.expiresAt > Date.now())
30
+ return entry.data;
31
+ this.cache.delete(key);
32
+ return null;
33
+ }
34
+ setCache(key, data) {
35
+ this.cache.set(key, { data, expiresAt: Date.now() + this.cacheTTL });
36
+ if (this.cache.size > 100) {
37
+ const oldest = this.cache.keys().next().value;
38
+ if (oldest)
39
+ this.cache.delete(oldest);
40
+ }
41
+ }
42
+ async getDashboardMetrics(podcastId, userId) {
43
+ await this.authorizationService.checkPodcastAccess(podcastId, userId);
44
+ const cached = this.getCached(`dashboard:${podcastId}`);
45
+ if (cached)
46
+ return cached;
47
+ const [totalGuests, guestsByStatus, totalEpisodes, episodesByStatus, upcomingBookings, recentGuests, topPriorityGuests,] = await Promise.all([
48
+ this.prisma.guest.count({ where: { podcastId } }),
49
+ this.prisma.guest.groupBy({
50
+ by: ["status"],
51
+ where: { podcastId },
52
+ _count: { id: true },
53
+ }),
54
+ this.prisma.episode.count({ where: { podcastId } }),
55
+ this.prisma.episode.groupBy({
56
+ by: ["status"],
57
+ where: { podcastId },
58
+ _count: { id: true },
59
+ }),
60
+ this.prisma.booking.count({
61
+ where: {
62
+ episode: { podcastId },
63
+ startTime: { gte: new Date() },
64
+ },
65
+ }),
66
+ this.prisma.guest.findMany({
67
+ where: { podcastId },
68
+ orderBy: { createdAt: "desc" },
69
+ take: 5,
70
+ select: {
71
+ id: true,
72
+ fullName: true,
73
+ email: true,
74
+ company: true,
75
+ status: true,
76
+ priorityScore: true,
77
+ createdAt: true,
78
+ },
79
+ }),
80
+ this.prisma.guest.findMany({
81
+ where: { podcastId, status: { in: ["prospect", "contacted"] } },
82
+ orderBy: { priorityScore: "desc" },
83
+ take: 5,
84
+ select: {
85
+ id: true,
86
+ fullName: true,
87
+ company: true,
88
+ title: true,
89
+ priorityScore: true,
90
+ },
91
+ }),
92
+ ]);
93
+ const guestStatusMap = {};
94
+ for (const item of guestsByStatus) {
95
+ guestStatusMap[item.status] = item._count.id;
96
+ }
97
+ const episodeStatusMap = {};
98
+ for (const item of episodesByStatus) {
99
+ episodeStatusMap[item.status] = item._count.id;
100
+ }
101
+ const result = {
102
+ totalGuests,
103
+ guestsByStatus: guestStatusMap,
104
+ totalEpisodes,
105
+ episodesByStatus: episodeStatusMap,
106
+ upcomingBookings,
107
+ recentGuests,
108
+ topPriorityGuests,
109
+ };
110
+ this.setCache(`dashboard:${podcastId}`, result);
111
+ return result;
112
+ }
113
+ async getGuestPipeline(podcastId, userId) {
114
+ await this.authorizationService.checkPodcastAccess(podcastId, userId);
115
+ const cached = this.getCached(`pipeline:${podcastId}`);
116
+ if (cached)
117
+ return cached;
118
+ const pipeline = await this.prisma.guest.groupBy({
119
+ by: ["status"],
120
+ where: { podcastId },
121
+ _count: { id: true },
122
+ _avg: { priorityScore: true },
123
+ });
124
+ const result = pipeline.map((stage) => ({
125
+ status: stage.status,
126
+ count: stage._count.id,
127
+ avgScore: Math.round(stage._avg.priorityScore || 0),
128
+ }));
129
+ this.setCache(`pipeline:${podcastId}`, result);
130
+ return result;
131
+ }
132
+ async getOutreachMetrics(podcastId, userId) {
133
+ await this.authorizationService.checkPodcastAccess(podcastId, userId);
134
+ const cached = this.getCached(`outreach:${podcastId}`);
135
+ if (cached)
136
+ return cached;
137
+ const guests = await this.prisma.guest.findMany({
138
+ where: { podcastId },
139
+ select: { id: true },
140
+ });
141
+ const guestIds = guests.map((g) => g.id);
142
+ if (guestIds.length === 0) {
143
+ return {
144
+ totalSequences: 0,
145
+ activeSequences: 0,
146
+ totalMessagesSent: 0,
147
+ openRate: 0,
148
+ clickRate: 0,
149
+ replyRate: 0,
150
+ };
151
+ }
152
+ const [totalSequences, activeSequences, messageStats] = await Promise.all([
153
+ this.prisma.outreachSequence.count({
154
+ where: { guestId: { in: guestIds } },
155
+ }),
156
+ this.prisma.outreachSequence.count({
157
+ where: { guestId: { in: guestIds }, status: "active" },
158
+ }),
159
+ this.prisma.outreachMessage.aggregate({
160
+ where: { sequence: { guestId: { in: guestIds } } },
161
+ _count: { id: true, sentAt: true, openedAt: true, clickedAt: true },
162
+ }),
163
+ ]);
164
+ const sent = messageStats._count.sentAt;
165
+ const opened = messageStats._count.openedAt;
166
+ const clicked = messageStats._count.clickedAt;
167
+ const result = {
168
+ totalSequences,
169
+ activeSequences,
170
+ totalMessagesSent: sent,
171
+ openRate: sent > 0 ? Math.round((opened / sent) * 100) : 0,
172
+ clickRate: sent > 0 ? Math.round((clicked / sent) * 100) : 0,
173
+ };
174
+ this.setCache(`outreach:${podcastId}`, result);
175
+ return result;
176
+ }
177
+ async getSchedulingMetrics(podcastId, userId, daysBack = 90) {
178
+ await this.authorizationService.checkPodcastAccess(podcastId, userId);
179
+ const cacheKey = `scheduling:${podcastId}:${daysBack}`;
180
+ const cached = this.getCached(cacheKey);
181
+ if (cached)
182
+ return cached;
183
+ const since = new Date(Date.now() - daysBack * 24 * 60 * 60 * 1000);
184
+ const [scheduledCount, recordedCount, publishedCount, avgDuration] = await Promise.all([
185
+ this.prisma.episode.count({
186
+ where: {
187
+ podcastId,
188
+ status: "scheduled",
189
+ createdAt: { gte: since },
190
+ },
191
+ }),
192
+ this.prisma.episode.count({
193
+ where: {
194
+ podcastId,
195
+ status: "recorded",
196
+ createdAt: { gte: since },
197
+ },
198
+ }),
199
+ this.prisma.episode.count({
200
+ where: {
201
+ podcastId,
202
+ status: "published",
203
+ createdAt: { gte: since },
204
+ },
205
+ }),
206
+ this.prisma.episode.aggregate({
207
+ where: { podcastId, durationMinutes: { not: null } },
208
+ _avg: { durationMinutes: true },
209
+ }),
210
+ ]);
211
+ const result = {
212
+ scheduledCount,
213
+ recordedCount,
214
+ publishedCount,
215
+ conversionRate: scheduledCount > 0
216
+ ? Math.round((recordedCount / scheduledCount) * 100)
217
+ : 0,
218
+ avgDurationMinutes: Math.round(avgDuration._avg.durationMinutes || 0),
219
+ };
220
+ this.setCache(cacheKey, result);
221
+ return result;
222
+ }
223
+ async getRecentActivity(podcastId, userId, limit = 20) {
224
+ await this.authorizationService.checkPodcastAccess(podcastId, userId);
225
+ const cacheKey = `recent:${podcastId}:${limit}`;
226
+ const cached = this.getCached(cacheKey);
227
+ if (cached)
228
+ return cached;
229
+ const [recentGuests, recentEpisodes, recentBookings, recentOutreach] = await Promise.all([
230
+ this.prisma.guest.findMany({
231
+ where: { podcastId },
232
+ orderBy: { createdAt: "desc" },
233
+ take: limit,
234
+ select: {
235
+ id: true,
236
+ fullName: true,
237
+ status: true,
238
+ createdAt: true,
239
+ _count: {
240
+ select: {
241
+ outreachSequences: true,
242
+ },
243
+ },
244
+ },
245
+ }),
246
+ this.prisma.episode.findMany({
247
+ where: { podcastId },
248
+ orderBy: { createdAt: "desc" },
249
+ take: limit,
250
+ select: {
251
+ id: true,
252
+ title: true,
253
+ status: true,
254
+ scheduledAt: true,
255
+ createdAt: true,
256
+ guest: {
257
+ select: {
258
+ fullName: true,
259
+ },
260
+ },
261
+ },
262
+ }),
263
+ this.prisma.booking.findMany({
264
+ where: { episode: { podcastId } },
265
+ orderBy: { createdAt: "desc" },
266
+ take: limit,
267
+ select: {
268
+ id: true,
269
+ startTime: true,
270
+ isConfirmed: true,
271
+ createdAt: true,
272
+ episode: {
273
+ select: {
274
+ title: true,
275
+ guest: {
276
+ select: {
277
+ fullName: true,
278
+ },
279
+ },
280
+ },
281
+ },
282
+ },
283
+ }),
284
+ this.prisma.outreachMessage.findMany({
285
+ where: { sequence: { guest: { podcastId } } },
286
+ orderBy: { sentAt: "desc" },
287
+ take: limit,
288
+ select: {
289
+ id: true,
290
+ type: true,
291
+ sentAt: true,
292
+ openedAt: true,
293
+ sequence: {
294
+ select: {
295
+ guest: {
296
+ select: {
297
+ fullName: true,
298
+ },
299
+ },
300
+ },
301
+ },
302
+ },
303
+ }),
304
+ ]);
305
+ const activities = [
306
+ ...recentGuests.map((g) => ({
307
+ type: "guest_added",
308
+ id: g.id,
309
+ title: `New guest: ${g.fullName}`,
310
+ status: g.status,
311
+ timestamp: g.createdAt,
312
+ })),
313
+ ...recentEpisodes.map((e) => ({
314
+ type: "episode_created",
315
+ id: e.id,
316
+ title: `Episode: ${e.title}`,
317
+ subtitle: `With ${e.guest.fullName}`,
318
+ status: e.status,
319
+ timestamp: e.createdAt,
320
+ scheduledAt: e.scheduledAt,
321
+ })),
322
+ ...recentBookings.map((b) => ({
323
+ type: "booking_created",
324
+ id: b.id,
325
+ title: `Booking: ${b.episode.title}`,
326
+ subtitle: `With ${b.episode.guest.fullName}`,
327
+ timestamp: b.createdAt,
328
+ startTime: b.startTime,
329
+ isConfirmed: b.isConfirmed,
330
+ })),
331
+ ...recentOutreach.map((o) => ({
332
+ type: "message_sent",
333
+ id: o.id,
334
+ title: `Email sent to ${o.sequence.guest.fullName}`,
335
+ subtitle: o.type,
336
+ timestamp: o.sentAt,
337
+ openedAt: o.openedAt,
338
+ })),
339
+ ];
340
+ const result = activities
341
+ .filter((a) => a.timestamp != null)
342
+ .sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime())
343
+ .slice(0, limit);
344
+ this.setCache(cacheKey, result);
345
+ return result;
346
+ }
347
+ };
348
+ exports.AnalyticsService = AnalyticsService;
349
+ exports.AnalyticsService = AnalyticsService = AnalyticsService_1 = __decorate([
350
+ (0, common_1.Injectable)(),
351
+ __metadata("design:paramtypes", [prisma_service_1.PrismaService,
352
+ authorization_service_1.AuthorizationService])
353
+ ], AnalyticsService);
354
+ //# sourceMappingURL=analytics.service.js.map
apps/api/dist/analytics/analytics.service.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"analytics.service.js","sourceRoot":"","sources":["../../src/analytics/analytics.service.ts"],"names":[],"mappings":"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"}
apps/api/dist/app.module.js ADDED
@@ -0,0 +1,209 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __importDefault = (this && this.__importDefault) || function (mod) {
9
+ return (mod && mod.__esModule) ? mod : { "default": mod };
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.AppModule = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const config_1 = require("@nestjs/config");
15
+ const bullmq_1 = require("@nestjs/bullmq");
16
+ const throttler_1 = require("@nestjs/throttler");
17
+ const throttler_storage_redis_1 = require("@nest-lab/throttler-storage-redis");
18
+ const core_1 = require("@nestjs/core");
19
+ const ioredis_1 = __importDefault(require("ioredis"));
20
+ const prisma_module_1 = require("./prisma/prisma.module");
21
+ const common_module_1 = require("./common/common.module");
22
+ const admin_module_1 = require("./admin/admin.module");
23
+ const audit_module_1 = require("./audit/audit.module");
24
+ const redis_module_1 = require("./redis/redis.module");
25
+ const trpc_module_1 = require("./trpc/trpc.module");
26
+ const auth_module_1 = require("./auth/auth.module");
27
+ const guest_module_1 = require("./guest/guest.module");
28
+ const outreach_module_1 = require("./outreach/outreach.module");
29
+ const scheduling_module_1 = require("./scheduling/scheduling.module");
30
+ const assets_module_1 = require("./assets/assets.module");
31
+ const analytics_module_1 = require("./analytics/analytics.module");
32
+ const content_studio_module_1 = require("./content-studio/content-studio.module");
33
+ const websocket_module_1 = require("./websocket/websocket.module");
34
+ const queue_module_1 = require("./queue/queue.module");
35
+ const health_module_1 = require("./health/health.module");
36
+ const workspace_module_1 = require("./workspace/workspace.module");
37
+ const podcast_module_1 = require("./podcast/podcast.module");
38
+ const cache_module_1 = require("./common/cache/cache.module");
39
+ const rate_limit_module_1 = require("./common/rate-limit/rate-limit.module");
40
+ const file_security_module_1 = require("./common/file-security/file-security.module");
41
+ const events_module_1 = require("./events/events.module");
42
+ const network_module_1 = require("./network/network.module");
43
+ const recording_module_1 = require("./recording/recording.module");
44
+ const users_module_1 = require("./users/users.module");
45
+ const notifications_module_1 = require("./notifications/notifications.module");
46
+ const portal_module_1 = require("./portal/portal.module");
47
+ const diary_module_1 = require("./diary/diary.module");
48
+ const billing_module_1 = require("./billing/billing.module");
49
+ const wallet_module_1 = require("./wallet/wallet.module");
50
+ const reconciliation_module_1 = require("./reconciliation/reconciliation.module");
51
+ const settings_module_1 = require("./settings/settings.module");
52
+ const integrations_module_1 = require("./integrations/integrations.module");
53
+ const livekit_module_1 = require("./livekit/livekit.module");
54
+ const ai_module_1 = require("./ai/ai.module");
55
+ const crm_module_1 = require("./crm/crm.module");
56
+ const chat_module_1 = require("./chat/chat.module");
57
+ const tasks_module_1 = require("./tasks/tasks.module");
58
+ const tracing_module_1 = require("./common/tracing/tracing.module");
59
+ const workspace_verification_module_1 = require("./verification/workspace-verification.module");
60
+ const outbound_webhook_module_1 = require("./webhooks/outbound-webhook.module");
61
+ const env_validation_1 = require("./common/config/env.validation");
62
+ let AppModule = class AppModule {
63
+ };
64
+ exports.AppModule = AppModule;
65
+ exports.AppModule = AppModule = __decorate([
66
+ (0, common_1.Module)({
67
+ imports: [
68
+ common_module_1.CommonModule,
69
+ tracing_module_1.TracingModule,
70
+ config_1.ConfigModule.forRoot({
71
+ isGlobal: true,
72
+ envFilePath: [".env.local", ".env", "../../.env.local", "../../.env"],
73
+ cache: true,
74
+ validate: env_validation_1.validate,
75
+ }),
76
+ throttler_1.ThrottlerModule.forRootAsync({
77
+ inject: [config_1.ConfigService],
78
+ useFactory: (configService) => {
79
+ const ttl = configService.get("RATE_LIMIT_TTL", 60);
80
+ const limit = configService.get("RATE_LIMIT_MAX", 100);
81
+ const redisUrl = configService.get("REDIS_URL");
82
+ let redisConnection;
83
+ if (redisUrl) {
84
+ redisConnection = new ioredis_1.default(redisUrl, { maxRetriesPerRequest: null, enableReadyCheck: false });
85
+ }
86
+ else {
87
+ redisConnection = new ioredis_1.default({
88
+ host: configService.get("REDIS_HOST") || "localhost",
89
+ port: parseInt(configService.get("REDIS_PORT") || "6379", 10),
90
+ password: configService.get("REDIS_PASSWORD"),
91
+ username: configService.get("REDIS_USERNAME"),
92
+ maxRetriesPerRequest: null,
93
+ enableReadyCheck: false,
94
+ });
95
+ }
96
+ return {
97
+ throttlers: [
98
+ {
99
+ name: "short",
100
+ ttl: 1000,
101
+ limit: 10,
102
+ },
103
+ {
104
+ name: "medium",
105
+ ttl: ttl * 1000,
106
+ limit,
107
+ },
108
+ {
109
+ name: "long",
110
+ ttl: 3600000,
111
+ limit: 1000,
112
+ },
113
+ ],
114
+ storage: new throttler_storage_redis_1.ThrottlerStorageRedisService(redisConnection),
115
+ };
116
+ },
117
+ }),
118
+ bullmq_1.BullModule.forRootAsync({
119
+ inject: [config_1.ConfigService],
120
+ useFactory: (configService) => {
121
+ const redisUrl = configService.get("REDIS_URL");
122
+ let connectionParams = {};
123
+ if (redisUrl) {
124
+ const parsedUrl = new URL(redisUrl);
125
+ connectionParams = {
126
+ host: parsedUrl.hostname,
127
+ port: parseInt(parsedUrl.port || "6379", 10),
128
+ username: parsedUrl.username ? decodeURIComponent(parsedUrl.username) : undefined,
129
+ password: parsedUrl.password ? decodeURIComponent(parsedUrl.password) : undefined,
130
+ tls: redisUrl.startsWith("rediss://") ? { rejectUnauthorized: false } : undefined,
131
+ };
132
+ }
133
+ else {
134
+ connectionParams = {
135
+ host: configService.get("REDIS_HOST") || "localhost",
136
+ port: parseInt(configService.get("REDIS_PORT") || "6379", 10),
137
+ password: configService.get("REDIS_PASSWORD"),
138
+ username: configService.get("REDIS_USERNAME"),
139
+ tls: configService.get("REDIS_TLS") === "true" ? {} : undefined,
140
+ };
141
+ }
142
+ return {
143
+ connection: connectionParams,
144
+ defaultJobOptions: {
145
+ attempts: 3,
146
+ backoff: {
147
+ type: "exponential",
148
+ delay: 1000,
149
+ },
150
+ removeOnComplete: {
151
+ age: 86400,
152
+ count: 100,
153
+ },
154
+ removeOnFail: {
155
+ age: 604800,
156
+ },
157
+ },
158
+ };
159
+ },
160
+ }),
161
+ admin_module_1.AdminModule,
162
+ audit_module_1.AuditModule,
163
+ cache_module_1.CacheModule,
164
+ health_module_1.HealthModule,
165
+ prisma_module_1.PrismaModule,
166
+ redis_module_1.RedisModule,
167
+ rate_limit_module_1.RateLimitModule,
168
+ file_security_module_1.FileSecurityModule,
169
+ events_module_1.EventsModule,
170
+ trpc_module_1.TrpcModule,
171
+ websocket_module_1.WebsocketModule,
172
+ outbound_webhook_module_1.OutboundWebhookModule,
173
+ queue_module_1.QueueModule,
174
+ auth_module_1.AuthModule,
175
+ workspace_module_1.WorkspaceModule,
176
+ workspace_verification_module_1.WorkspaceVerificationModule,
177
+ podcast_module_1.PodcastModule,
178
+ guest_module_1.GuestModule,
179
+ outreach_module_1.OutreachModule,
180
+ scheduling_module_1.SchedulingModule,
181
+ assets_module_1.AssetsModule,
182
+ analytics_module_1.AnalyticsModule,
183
+ content_studio_module_1.ContentStudioModule,
184
+ network_module_1.NetworkModule,
185
+ recording_module_1.RecordingModule,
186
+ users_module_1.UsersModule,
187
+ notifications_module_1.NotificationsModule,
188
+ portal_module_1.PortalModule,
189
+ diary_module_1.DiaryModule,
190
+ billing_module_1.BillingModule,
191
+ wallet_module_1.WalletModule,
192
+ reconciliation_module_1.ReconciliationModule,
193
+ settings_module_1.SettingsModule,
194
+ integrations_module_1.IntegrationsModule,
195
+ livekit_module_1.LivekitModule,
196
+ ai_module_1.AIModule,
197
+ crm_module_1.CrmModule,
198
+ chat_module_1.ChatModule,
199
+ tasks_module_1.TasksModule,
200
+ ],
201
+ providers: [
202
+ {
203
+ provide: core_1.APP_GUARD,
204
+ useClass: throttler_1.ThrottlerGuard,
205
+ },
206
+ ],
207
+ })
208
+ ], AppModule);
209
+ //# sourceMappingURL=app.module.js.map
apps/api/dist/app.module.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"app.module.js","sourceRoot":"","sources":["../src/app.module.ts"],"names":[],"mappings":"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"}
apps/api/dist/assets/assets.module.js ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.AssetsModule = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const assets_service_1 = require("./assets.service");
12
+ const assets_router_1 = require("./assets.router");
13
+ let AssetsModule = class AssetsModule {
14
+ };
15
+ exports.AssetsModule = AssetsModule;
16
+ exports.AssetsModule = AssetsModule = __decorate([
17
+ (0, common_1.Module)({
18
+ providers: [assets_service_1.AssetsService, assets_router_1.AssetsRouter],
19
+ exports: [assets_service_1.AssetsService, assets_router_1.AssetsRouter],
20
+ })
21
+ ], AssetsModule);
22
+ //# sourceMappingURL=assets.module.js.map
apps/api/dist/assets/assets.module.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"assets.module.js","sourceRoot":"","sources":["../../src/assets/assets.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AAExC,qDAAiD;AACjD,mDAA+C;AAMxC,IAAM,YAAY,GAAlB,MAAM,YAAY;CAAI,CAAA;AAAhB,oCAAY;uBAAZ,YAAY;IAJxB,IAAA,eAAM,EAAC;QACJ,SAAS,EAAE,CAAC,8BAAa,EAAE,4BAAY,CAAC;QACxC,OAAO,EAAE,CAAC,8BAAa,EAAE,4BAAY,CAAC;KACzC,CAAC;GACW,YAAY,CAAI"}
apps/api/dist/assets/assets.router.js ADDED
@@ -0,0 +1,69 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.AssetsRouter = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const zod_1 = require("zod");
15
+ const shared_types_1 = require("@micprotocol/shared-types");
16
+ const trpc_init_1 = require("../trpc/trpc.init");
17
+ const subscription_features_1 = require("../billing/subscription-features");
18
+ const assets_service_1 = require("./assets.service");
19
+ let AssetsRouter = class AssetsRouter {
20
+ assetsService;
21
+ constructor(assetsService) {
22
+ this.assetsService = assetsService;
23
+ }
24
+ get router() {
25
+ return (0, trpc_init_1.router)({
26
+ createRequest: (0, trpc_init_1.requireFeature)(subscription_features_1.SubscriptionFeature.ASSET_FORMS)
27
+ .input(shared_types_1.createAssetRequestSchema)
28
+ .mutation(async ({ input, ctx }) => {
29
+ return this.assetsService.createRequest(input, ctx.userId);
30
+ }),
31
+ getRequest: trpc_init_1.workspaceProcedure
32
+ .input(zod_1.z.object({ id: zod_1.z.string().uuid() }))
33
+ .query(async ({ input, ctx }) => {
34
+ return this.assetsService.getRequest(input.id, ctx.userId);
35
+ }),
36
+ listByEpisode: trpc_init_1.workspaceProcedure
37
+ .input(zod_1.z.object({ episodeId: zod_1.z.string().uuid() }))
38
+ .query(async ({ input, ctx }) => {
39
+ return this.assetsService.listByEpisode(input.episodeId, ctx.userId);
40
+ }),
41
+ submit: (0, trpc_init_1.rateLimitedProcedure)("assets:submit", 20, 60_000)
42
+ .input(shared_types_1.createAssetSubmissionSchema)
43
+ .mutation(async ({ input, ctx }) => {
44
+ return this.assetsService.submitAsset(input, ctx.userId ?? undefined);
45
+ }),
46
+ approve: trpc_init_1.workspaceProcedure
47
+ .input(zod_1.z.object({ id: zod_1.z.string().uuid() }))
48
+ .mutation(async ({ input, ctx }) => {
49
+ return this.assetsService.approveSubmission(input.id, ctx.userId);
50
+ }),
51
+ reject: trpc_init_1.workspaceProcedure
52
+ .input(zod_1.z.object({ id: zod_1.z.string().uuid() }))
53
+ .mutation(async ({ input, ctx }) => {
54
+ return this.assetsService.rejectSubmission(input.id, ctx.userId);
55
+ }),
56
+ completionStatus: trpc_init_1.workspaceProcedure
57
+ .input(zod_1.z.object({ episodeId: zod_1.z.string().uuid() }))
58
+ .query(async ({ input, ctx }) => {
59
+ return this.assetsService.getCompletionStatus(input.episodeId, ctx.userId);
60
+ }),
61
+ });
62
+ }
63
+ };
64
+ exports.AssetsRouter = AssetsRouter;
65
+ exports.AssetsRouter = AssetsRouter = __decorate([
66
+ (0, common_1.Injectable)(),
67
+ __metadata("design:paramtypes", [assets_service_1.AssetsService])
68
+ ], AssetsRouter);
69
+ //# sourceMappingURL=assets.router.js.map
apps/api/dist/assets/assets.router.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"assets.router.js","sourceRoot":"","sources":["../../src/assets/assets.router.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,6BAAwB;AACxB,4DAGmC;AAEnC,iDAM2B;AAC3B,4EAAuE;AACvE,qDAAiD;AAG1C,IAAM,YAAY,GAAlB,MAAM,YAAY;IACQ;IAA7B,YAA6B,aAA4B;QAA5B,kBAAa,GAAb,aAAa,CAAe;IAAI,CAAC;IAE9D,IAAI,MAAM;QACN,OAAO,IAAA,kBAAM,EAAC;YAEV,aAAa,EAAE,IAAA,0BAAc,EAAC,2CAAmB,CAAC,WAAW,CAAC;iBACzD,KAAK,CAAC,uCAAwB,CAAC;iBAC/B,QAAQ,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE;gBAC/B,OAAO,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,KAAK,EAAE,GAAG,CAAC,MAAO,CAAC,CAAC;YAChE,CAAC,CAAC;YAEN,UAAU,EAAE,8BAAkB;iBACzB,KAAK,CAAC,OAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;iBAC1C,KAAK,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE;gBAC5B,OAAO,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,CAAC,MAAO,CAAC,CAAC;YAChE,CAAC,CAAC;YAEN,aAAa,EAAE,8BAAkB;iBAC5B,KAAK,CAAC,OAAC,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;iBACjD,KAAK,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE;gBAC5B,OAAO,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,CAAC,MAAO,CAAC,CAAC;YAC1E,CAAC,CAAC;YAKN,MAAM,EAAE,IAAA,gCAAoB,EAAC,eAAe,EAAE,EAAE,EAAE,MAAM,CAAC;iBACpD,KAAK,CAAC,0CAA2B,CAAC;iBAClC,QAAQ,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE;gBAC/B,OAAO,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,IAAI,SAAS,CAAC,CAAC;YAC1E,CAAC,CAAC;YAEN,OAAO,EAAE,8BAAkB;iBACtB,KAAK,CAAC,OAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;iBAC1C,QAAQ,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE;gBAC/B,OAAO,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,CAAC,MAAO,CAAC,CAAC;YACvE,CAAC,CAAC;YAEN,MAAM,EAAE,8BAAkB;iBACrB,KAAK,CAAC,OAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;iBAC1C,QAAQ,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE;gBAC/B,OAAO,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,CAAC,MAAO,CAAC,CAAC;YACtE,CAAC,CAAC;YAEN,gBAAgB,EAAE,8BAAkB;iBAC/B,KAAK,CAAC,OAAC,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;iBACjD,KAAK,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE;gBAC5B,OAAO,IAAI,CAAC,aAAa,CAAC,mBAAmB,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,CAAC,MAAO,CAAC,CAAC;YAChF,CAAC,CAAC;SACT,CAAC,CAAC;IACP,CAAC;CACJ,CAAA;AApDY,oCAAY;uBAAZ,YAAY;IADxB,IAAA,mBAAU,GAAE;qCAEmC,8BAAa;GADhD,YAAY,CAoDxB"}
apps/api/dist/assets/assets.service.js ADDED
@@ -0,0 +1,142 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var AssetsService_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.AssetsService = void 0;
14
+ const common_1 = require("@nestjs/common");
15
+ const prisma_service_1 = require("../prisma/prisma.service");
16
+ const authorization_service_1 = require("../common/authorization.service");
17
+ let AssetsService = AssetsService_1 = class AssetsService {
18
+ prisma;
19
+ authorizationService;
20
+ logger = new common_1.Logger(AssetsService_1.name);
21
+ constructor(prisma, authorizationService) {
22
+ this.prisma = prisma;
23
+ this.authorizationService = authorizationService;
24
+ }
25
+ async createRequest(data, userId) {
26
+ await this.authorizationService.checkEpisodeAccess(data.episodeId, userId);
27
+ this.logger.log(`Creating ${data.type} asset request for episode ${data.episodeId}`);
28
+ return this.prisma.assetRequest.create({
29
+ data: {
30
+ episodeId: data.episodeId,
31
+ type: data.type,
32
+ isRequired: data.isRequired ?? true,
33
+ instructions: data.instructions || null,
34
+ dueDate: data.dueDate ? new Date(data.dueDate) : null,
35
+ },
36
+ include: {
37
+ submissions: true,
38
+ },
39
+ });
40
+ }
41
+ async getRequest(id, userId) {
42
+ const request = await this.prisma.assetRequest.findUnique({
43
+ where: { id },
44
+ include: {
45
+ submissions: { orderBy: { submittedAt: "desc" } },
46
+ episode: {
47
+ include: {
48
+ guest: { select: { fullName: true, email: true } },
49
+ },
50
+ },
51
+ },
52
+ });
53
+ if (!request) {
54
+ throw new common_1.NotFoundException(`Asset request ${id} not found`);
55
+ }
56
+ await this.authorizationService.checkEpisodeAccess(request.episodeId, userId);
57
+ return request;
58
+ }
59
+ async listByEpisode(episodeId, userId) {
60
+ await this.authorizationService.checkEpisodeAccess(episodeId, userId);
61
+ return this.prisma.assetRequest.findMany({
62
+ where: { episodeId },
63
+ include: {
64
+ submissions: { orderBy: { submittedAt: "desc" } },
65
+ },
66
+ orderBy: { createdAt: "asc" },
67
+ });
68
+ }
69
+ async submitAsset(data, userId) {
70
+ if (userId) {
71
+ await this.authorizationService.checkAssetRequestAccess(data.requestId, userId);
72
+ }
73
+ this.logger.log(`Asset submission for request ${data.requestId}`);
74
+ return this.prisma.assetSubmission.create({
75
+ data: {
76
+ requestId: data.requestId,
77
+ fileUrl: data.fileUrl,
78
+ fileType: data.fileType,
79
+ fileSize: data.fileSize,
80
+ status: data.status || "pending",
81
+ },
82
+ include: {
83
+ request: true,
84
+ },
85
+ });
86
+ }
87
+ async approveSubmission(id, userId) {
88
+ await this.authorizationService.checkAssetSubmissionAccess(id, userId);
89
+ return this.prisma.assetSubmission.update({
90
+ where: { id },
91
+ data: { status: "approved" },
92
+ });
93
+ }
94
+ async rejectSubmission(id, userId) {
95
+ await this.authorizationService.checkAssetSubmissionAccess(id, userId);
96
+ return this.prisma.assetSubmission.update({
97
+ where: { id },
98
+ data: { status: "rejected" },
99
+ });
100
+ }
101
+ async getCompletionStatus(episodeId, userId) {
102
+ await this.authorizationService.checkEpisodeAccess(episodeId, userId);
103
+ const requests = await this.prisma.assetRequest.findMany({
104
+ where: { episodeId },
105
+ include: {
106
+ submissions: { where: { status: "approved" } },
107
+ },
108
+ });
109
+ const total = requests.length;
110
+ const required = requests.filter((r) => r.isRequired).length;
111
+ const fulfilled = requests.filter((r) => r.submissions.length > 0).length;
112
+ const requiredFulfilled = requests.filter((r) => r.isRequired && r.submissions.length > 0).length;
113
+ return {
114
+ total,
115
+ required,
116
+ fulfilled,
117
+ requiredFulfilled,
118
+ isComplete: requiredFulfilled >= required,
119
+ completionPercentage: total > 0 ? Math.round((fulfilled / total) * 100) : 100,
120
+ };
121
+ }
122
+ async createBulkRequests(episodeId, userId, requests) {
123
+ await this.authorizationService.checkEpisodeAccess(episodeId, userId);
124
+ const created = await Promise.all(requests.map((req) => this.prisma.assetRequest.create({
125
+ data: {
126
+ episodeId,
127
+ type: req.type,
128
+ isRequired: req.isRequired,
129
+ instructions: req.instructions || null,
130
+ dueDate: req.dueDate ? new Date(req.dueDate) : null,
131
+ },
132
+ })));
133
+ return created;
134
+ }
135
+ };
136
+ exports.AssetsService = AssetsService;
137
+ exports.AssetsService = AssetsService = AssetsService_1 = __decorate([
138
+ (0, common_1.Injectable)(),
139
+ __metadata("design:paramtypes", [prisma_service_1.PrismaService,
140
+ authorization_service_1.AuthorizationService])
141
+ ], AssetsService);
142
+ //# sourceMappingURL=assets.service.js.map
apps/api/dist/assets/assets.service.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"assets.service.js","sourceRoot":"","sources":["../../src/assets/assets.service.ts"],"names":[],"mappings":"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"}