Skip to content

Commit 68e29d1

Browse files
authored
fix: ereputation erefernce (#943)
* fix: ereputation erefernce * fix: erep build script * fix: ename dedupe * fix: strip `@`
1 parent 2416ed1 commit 68e29d1

3 files changed

Lines changed: 37 additions & 6 deletions

File tree

platforms/cerberus/client/src/services/ReferenceWriterService.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ export class ReferenceWriterService {
8686
targetType: "user",
8787
targetId: violation.targetId,
8888
targetName: violation.targetName,
89+
targetEname: violation.targetEname,
8990
content: violation.content,
9091
referenceType: "violation",
9192
numericScore: violation.numericScore,

platforms/ereputation/api/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"scripts": {
77
"start": "ts-node --project tsconfig.json src/index.ts",
88
"dev": "nodemon --exec \"npx ts-node\" src/index.ts",
9-
"build": "tsc",
9+
"build": "tsc && cp -r src/web3adapter/mappings dist/web3adapter/",
1010
"typeorm": "typeorm-ts-node-commonjs",
1111
"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'",
1212
"migration:run": "typeorm-ts-node-commonjs migration:run -d src/database/data-source.ts",

platforms/ereputation/api/src/controllers/ReferenceController.ts

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
import { Request, Response } from "express";
2+
import { AppDataSource } from "../database/data-source";
3+
import { User } from "../database/entities/User";
24
import { ReferenceService } from "../services/ReferenceService";
35
import { ReferenceSigningSessionService } from "../services/ReferenceSigningSessionService";
46
import { authGuard } from "../middleware/auth";
57

8+
const SYSTEM_AUTHOR_NAME = "Cerberus Platform";
9+
610
export class ReferenceController {
711
private referenceService: ReferenceService;
812
private signingSessionService: ReferenceSigningSessionService;
@@ -307,25 +311,51 @@ export class ReferenceController {
307311
return res.status(401).json({ error: "Unauthorized" });
308312
}
309313

310-
const { targetType, targetId, targetName, content, referenceType, numericScore, authorId, anonymous } = req.body;
314+
const { targetType, targetId, targetName, targetEname, content, referenceType, numericScore, anonymous } = req.body;
311315

312-
if (!targetType || !targetId || !targetName || !content || !authorId) {
313-
return res.status(400).json({ error: "Missing required fields: targetType, targetId, targetName, content, authorId" });
316+
if (!targetType || !targetName || !content) {
317+
return res.status(400).json({ error: "Missing required fields: targetType, targetName, content" });
314318
}
315319

316320
if (numericScore && (numericScore < 1 || numericScore > 5)) {
317321
return res.status(400).json({ error: "Numeric score must be between 1 and 5" });
318322
}
319323

324+
// Resolve the system author — use the "Cerberus Platform" user
325+
const userRepo = AppDataSource.getRepository(User);
326+
let systemUser = await userRepo.findOneBy({ name: SYSTEM_AUTHOR_NAME });
327+
if (!systemUser) {
328+
systemUser = userRepo.create({ name: SYSTEM_AUTHOR_NAME, handle: "cerberus" });
329+
systemUser = await userRepo.save(systemUser);
330+
console.log(`[erep] Created system user "${SYSTEM_AUTHOR_NAME}" id=${systemUser.id}`);
331+
}
332+
333+
// Resolve the target user by ename to get the correct local eReputation user ID.
334+
// Cross-platform calls (e.g. from Cerberus) send their own DB user ID which
335+
// won't match eReputation's user ID — ename is the shared identifier.
336+
let resolvedTargetId = targetId;
337+
if (targetEname && targetType === "user") {
338+
// Try both with and without @ prefix
339+
const cleanEname = targetEname.replace(/^@/, "");
340+
const targetUser = await userRepo.findOneBy({ ename: cleanEname })
341+
?? await userRepo.findOneBy({ ename: `@${cleanEname}` });
342+
if (targetUser) {
343+
resolvedTargetId = targetUser.id;
344+
console.log(`[erep] Resolved target ename=${targetEname} to local id=${targetUser.id}`);
345+
} else {
346+
console.warn(`[erep] Could not resolve target ename=${targetEname}, using provided targetId=${targetId}`);
347+
}
348+
}
349+
320350
// Create reference directly with "signed" status (trusted platform call)
321351
const reference = this.referenceService.referenceRepository.create({
322352
targetType,
323-
targetId,
353+
targetId: resolvedTargetId,
324354
targetName,
325355
content,
326356
referenceType: referenceType || "violation",
327357
numericScore,
328-
authorId,
358+
authorId: systemUser.id,
329359
anonymous: anonymous ?? false,
330360
status: "signed"
331361
});

0 commit comments

Comments
 (0)