Spaces:
Running
Running
Upload folder using huggingface_hub
Browse filesThis view is limited to 50 files because it contains too many changes. See raw diff
- apps/api/dist/admin/admin-audit.service.js +100 -0
- apps/api/dist/admin/admin-audit.service.js.map +1 -0
- apps/api/dist/admin/admin-auth.service.js +87 -0
- apps/api/dist/admin/admin-auth.service.js.map +1 -0
- apps/api/dist/admin/admin-billing.service.js +171 -0
- apps/api/dist/admin/admin-billing.service.js.map +1 -0
- apps/api/dist/admin/admin-clip-scorer.service.js +135 -0
- apps/api/dist/admin/admin-clip-scorer.service.js.map +1 -0
- apps/api/dist/admin/admin-comms.service.js +145 -0
- apps/api/dist/admin/admin-comms.service.js.map +1 -0
- apps/api/dist/admin/admin-moderation.service.js +164 -0
- apps/api/dist/admin/admin-moderation.service.js.map +1 -0
- apps/api/dist/admin/admin-operations.service.js +277 -0
- apps/api/dist/admin/admin-operations.service.js.map +1 -0
- apps/api/dist/admin/admin-realtime.service.js +79 -0
- apps/api/dist/admin/admin-realtime.service.js.map +1 -0
- apps/api/dist/admin/admin-settings.service.js +194 -0
- apps/api/dist/admin/admin-settings.service.js.map +1 -0
- apps/api/dist/admin/admin-supervision.processor.js +57 -0
- apps/api/dist/admin/admin-supervision.processor.js.map +1 -0
- apps/api/dist/admin/admin-supervision.service.js +205 -0
- apps/api/dist/admin/admin-supervision.service.js.map +1 -0
- apps/api/dist/admin/admin-users.service.js +397 -0
- apps/api/dist/admin/admin-users.service.js.map +1 -0
- apps/api/dist/admin/admin-workspaces.service.js +298 -0
- apps/api/dist/admin/admin-workspaces.service.js.map +1 -0
- apps/api/dist/admin/admin.module.js +54 -0
- apps/api/dist/admin/admin.module.js.map +1 -0
- apps/api/dist/admin/admin.router.js +420 -0
- apps/api/dist/admin/admin.router.js.map +1 -0
- apps/api/dist/ai/ai.module.js +29 -0
- apps/api/dist/ai/ai.module.js.map +1 -0
- apps/api/dist/ai/ai.service.js +202 -0
- apps/api/dist/ai/ai.service.js.map +1 -0
- apps/api/dist/analytics/analytics.controller.js +123 -0
- apps/api/dist/analytics/analytics.controller.js.map +1 -0
- apps/api/dist/analytics/analytics.module.js +24 -0
- apps/api/dist/analytics/analytics.module.js.map +1 -0
- apps/api/dist/analytics/analytics.router.js +64 -0
- apps/api/dist/analytics/analytics.router.js.map +1 -0
- apps/api/dist/analytics/analytics.service.js +354 -0
- apps/api/dist/analytics/analytics.service.js.map +1 -0
- apps/api/dist/app.module.js +209 -0
- apps/api/dist/app.module.js.map +1 -0
- apps/api/dist/assets/assets.module.js +22 -0
- apps/api/dist/assets/assets.module.js.map +1 -0
- apps/api/dist/assets/assets.router.js +69 -0
- apps/api/dist/assets/assets.router.js.map +1 -0
- apps/api/dist/assets/assets.service.js +142 -0
- 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":"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"}
|
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":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,6BAAwB;AAExB,iDAA+E;AAC/E,4EAAuE;AACvE,2DAAuD;AAGhD,IAAM,eAAe,GAArB,MAAM,eAAe;IACG;IAA7B,YAA6B,gBAAkC;QAAlC,qBAAgB,GAAhB,gBAAgB,CAAkB;IAAI,CAAC;IAEpE,IAAI,MAAM;QACR,OAAO,IAAA,kBAAM,EAAC;YACZ,SAAS,EAAE,8BAAkB;iBAC1B,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;gBAC9B,OAAO,IAAI,CAAC,gBAAgB,CAAC,mBAAmB,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,CAAC,MAAO,CAAC,CAAC;YACjF,CAAC,CAAC;YAEJ,QAAQ,EAAE,8BAAkB;iBACzB,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;gBAC9B,OAAO,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,CAAC,MAAO,CAAC,CAAC;YAC9E,CAAC,CAAC;YAGJ,QAAQ,EAAE,IAAA,0BAAc,EAAC,2CAAmB,CAAC,kBAAkB,CAAC;iBAC7D,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;gBAC9B,OAAO,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,CAAC,MAAO,CAAC,CAAC;YAChF,CAAC,CAAC;YAEJ,UAAU,EAAE,IAAA,0BAAc,EAAC,2CAAmB,CAAC,kBAAkB,CAAC;iBAC/D,KAAK,CACJ,OAAC,CAAC,MAAM,CAAC;gBACP,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;gBAC5B,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;aACvD,CAAC,CACH;iBACA,KAAK,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE;gBAC9B,OAAO,IAAI,CAAC,gBAAgB,CAAC,oBAAoB,CAC/C,KAAK,CAAC,SAAS,EACf,GAAG,CAAC,MAAO,EACX,KAAK,CAAC,QAAQ,CACf,CAAC;YACJ,CAAC,CAAC;YAEJ,cAAc,EAAE,8BAAkB;iBAC/B,KAAK,CACJ,OAAC,CAAC,MAAM,CAAC;gBACP,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;gBAC5B,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;aACpD,CAAC,CACH;iBACA,KAAK,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE;gBAC9B,OAAO,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,CAC5C,KAAK,CAAC,SAAS,EACf,GAAG,CAAC,MAAO,EACX,KAAK,CAAC,KAAK,CACZ,CAAC;YACJ,CAAC,CAAC;SACL,CAAC,CAAC;IACL,CAAC;CACF,CAAA;AAvDY,0CAAe;0BAAf,eAAe;IAD3B,IAAA,mBAAU,GAAE;qCAEoC,oCAAgB;GADpD,eAAe,CAuD3B"}
|
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":"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"}
|
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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"}
|