From e40272790ae4412a65e0d9870e7a888ac391cd80 Mon Sep 17 00:00:00 2001 From: coodos Date: Fri, 3 Apr 2026 15:20:15 +0530 Subject: [PATCH 1/4] fix: ereputation erefernce --- .../src/controllers/ReferenceController.ts | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/platforms/ereputation/api/src/controllers/ReferenceController.ts b/platforms/ereputation/api/src/controllers/ReferenceController.ts index e20bd2467..53c274031 100644 --- a/platforms/ereputation/api/src/controllers/ReferenceController.ts +++ b/platforms/ereputation/api/src/controllers/ReferenceController.ts @@ -1,8 +1,12 @@ import { Request, Response } from "express"; +import { AppDataSource } from "../database/data-source"; +import { User } from "../database/entities/User"; import { ReferenceService } from "../services/ReferenceService"; import { ReferenceSigningSessionService } from "../services/ReferenceSigningSessionService"; import { authGuard } from "../middleware/auth"; +const SYSTEM_AUTHOR_NAME = "Cerberus Platform"; + export class ReferenceController { private referenceService: ReferenceService; private signingSessionService: ReferenceSigningSessionService; @@ -307,16 +311,26 @@ export class ReferenceController { return res.status(401).json({ error: "Unauthorized" }); } - const { targetType, targetId, targetName, content, referenceType, numericScore, authorId, anonymous } = req.body; + const { targetType, targetId, targetName, content, referenceType, numericScore, anonymous } = req.body; - if (!targetType || !targetId || !targetName || !content || !authorId) { - return res.status(400).json({ error: "Missing required fields: targetType, targetId, targetName, content, authorId" }); + if (!targetType || !targetId || !targetName || !content) { + return res.status(400).json({ error: "Missing required fields: targetType, targetId, targetName, content" }); } if (numericScore && (numericScore < 1 || numericScore > 5)) { return res.status(400).json({ error: "Numeric score must be between 1 and 5" }); } + // Resolve the system author — use the "Cerberus Platform" user + const userRepo = AppDataSource.getRepository(User); + let systemUser = await userRepo.findOneBy({ name: SYSTEM_AUTHOR_NAME }); + if (!systemUser) { + // Auto-create the system user if it doesn't exist + systemUser = userRepo.create({ name: SYSTEM_AUTHOR_NAME, handle: "cerberus" }); + systemUser = await userRepo.save(systemUser); + console.log(`[erep] Created system user "${SYSTEM_AUTHOR_NAME}" id=${systemUser.id}`); + } + // Create reference directly with "signed" status (trusted platform call) const reference = this.referenceService.referenceRepository.create({ targetType, @@ -325,7 +339,7 @@ export class ReferenceController { content, referenceType: referenceType || "violation", numericScore, - authorId, + authorId: systemUser.id, anonymous: anonymous ?? false, status: "signed" }); From 8f8da1db3fa29938fc9b090e959990738028a940 Mon Sep 17 00:00:00 2001 From: coodos Date: Fri, 3 Apr 2026 15:24:03 +0530 Subject: [PATCH 2/4] fix: erep build script --- platforms/ereputation/api/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platforms/ereputation/api/package.json b/platforms/ereputation/api/package.json index 9809baab1..7cdb482f9 100644 --- a/platforms/ereputation/api/package.json +++ b/platforms/ereputation/api/package.json @@ -6,7 +6,7 @@ "scripts": { "start": "ts-node --project tsconfig.json src/index.ts", "dev": "nodemon --exec \"npx ts-node\" src/index.ts", - "build": "tsc", + "build": "tsc && cp -r src/web3adapter/mappings dist/web3adapter/", "typeorm": "typeorm-ts-node-commonjs", "migration:generate": "bash -c 'read -p \"Migration name: \" name && npx typeorm-ts-node-commonjs migration:generate src/database/migrations/$name -d src/database/data-source.ts'", "migration:run": "typeorm-ts-node-commonjs migration:run -d src/database/data-source.ts", From e761b9c690aa3eb2fc2fcb4dc405b333649e2f1b Mon Sep 17 00:00:00 2001 From: coodos Date: Fri, 3 Apr 2026 15:31:51 +0530 Subject: [PATCH 3/4] fix: ename dedupe --- .../src/services/ReferenceWriterService.ts | 1 + .../src/controllers/ReferenceController.ts | 23 +++++++++++++++---- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/platforms/cerberus/client/src/services/ReferenceWriterService.ts b/platforms/cerberus/client/src/services/ReferenceWriterService.ts index 3fc933476..efa8dc960 100644 --- a/platforms/cerberus/client/src/services/ReferenceWriterService.ts +++ b/platforms/cerberus/client/src/services/ReferenceWriterService.ts @@ -86,6 +86,7 @@ export class ReferenceWriterService { targetType: "user", targetId: violation.targetId, targetName: violation.targetName, + targetEname: violation.targetEname, content: violation.content, referenceType: "violation", numericScore: violation.numericScore, diff --git a/platforms/ereputation/api/src/controllers/ReferenceController.ts b/platforms/ereputation/api/src/controllers/ReferenceController.ts index 53c274031..3a92e0df7 100644 --- a/platforms/ereputation/api/src/controllers/ReferenceController.ts +++ b/platforms/ereputation/api/src/controllers/ReferenceController.ts @@ -311,10 +311,10 @@ export class ReferenceController { return res.status(401).json({ error: "Unauthorized" }); } - const { targetType, targetId, targetName, content, referenceType, numericScore, anonymous } = req.body; + const { targetType, targetId, targetName, targetEname, content, referenceType, numericScore, anonymous } = req.body; - if (!targetType || !targetId || !targetName || !content) { - return res.status(400).json({ error: "Missing required fields: targetType, targetId, targetName, content" }); + if (!targetType || !targetName || !content) { + return res.status(400).json({ error: "Missing required fields: targetType, targetName, content" }); } if (numericScore && (numericScore < 1 || numericScore > 5)) { @@ -325,16 +325,29 @@ export class ReferenceController { const userRepo = AppDataSource.getRepository(User); let systemUser = await userRepo.findOneBy({ name: SYSTEM_AUTHOR_NAME }); if (!systemUser) { - // Auto-create the system user if it doesn't exist systemUser = userRepo.create({ name: SYSTEM_AUTHOR_NAME, handle: "cerberus" }); systemUser = await userRepo.save(systemUser); console.log(`[erep] Created system user "${SYSTEM_AUTHOR_NAME}" id=${systemUser.id}`); } + // Resolve the target user by ename to get the correct local eReputation user ID. + // Cross-platform calls (e.g. from Cerberus) send their own DB user ID which + // won't match eReputation's user ID — ename is the shared identifier. + let resolvedTargetId = targetId; + if (targetEname && targetType === "user") { + const targetUser = await userRepo.findOneBy({ ename: targetEname }); + if (targetUser) { + resolvedTargetId = targetUser.id; + console.log(`[erep] Resolved target ename=${targetEname} to local id=${targetUser.id}`); + } else { + console.warn(`[erep] Could not resolve target ename=${targetEname}, using provided targetId=${targetId}`); + } + } + // Create reference directly with "signed" status (trusted platform call) const reference = this.referenceService.referenceRepository.create({ targetType, - targetId, + targetId: resolvedTargetId, targetName, content, referenceType: referenceType || "violation", From 2ecc1c237dc16dc49a41df6b57cdaf1caf53ae04 Mon Sep 17 00:00:00 2001 From: coodos Date: Fri, 3 Apr 2026 15:38:36 +0530 Subject: [PATCH 4/4] fix: strip `@` --- .../ereputation/api/src/controllers/ReferenceController.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/platforms/ereputation/api/src/controllers/ReferenceController.ts b/platforms/ereputation/api/src/controllers/ReferenceController.ts index 3a92e0df7..fc6b6cf16 100644 --- a/platforms/ereputation/api/src/controllers/ReferenceController.ts +++ b/platforms/ereputation/api/src/controllers/ReferenceController.ts @@ -335,7 +335,10 @@ export class ReferenceController { // won't match eReputation's user ID — ename is the shared identifier. let resolvedTargetId = targetId; if (targetEname && targetType === "user") { - const targetUser = await userRepo.findOneBy({ ename: targetEname }); + // Try both with and without @ prefix + const cleanEname = targetEname.replace(/^@/, ""); + const targetUser = await userRepo.findOneBy({ ename: cleanEname }) + ?? await userRepo.findOneBy({ ename: `@${cleanEname}` }); if (targetUser) { resolvedTargetId = targetUser.id; console.log(`[erep] Resolved target ename=${targetEname} to local id=${targetUser.id}`);