Skip to content

Commit 797ff55

Browse files
authored
fix: ereputation signing session logic and cosmetic changes (#458)
* fix: ereputation signing session logic * chore: fix wishlist prompt and UI for search * feat: add ename below groups too * feat: enforce `@` prefix on ename display * fix: ename display
1 parent f8b9b1f commit 797ff55

File tree

5 files changed

+42
-20
lines changed

5 files changed

+42
-20
lines changed

platforms/eReputation-api/src/controllers/GroupController.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ export class GroupController {
2929
res.json(groups.map(group => ({
3030
id: group.id,
3131
name: group.name,
32+
ename: group.ename,
3233
description: group.description,
3334
charter: group.charter,
3435
createdAt: group.createdAt,

platforms/eReputation-api/src/services/CalculationService.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ export class CalculationService {
155155

156156
private buildPrompt(userValues: string, references: any[], targetName: string): string {
157157
return `
158-
You are analyzing the reputation of "${targetName}" based on the following user values and references.
158+
You are analyzing the reputation of "${targetName}" based on the following user values and references. Remember that the user may also supply a wishlist, only focus on the part of the wishlist and values which mentions what the user values in a person, group, or platform, depending on what type of profile it is that you are evaluating, do not care about anything else in the wishlist.
159159
160160
USER VALUES (what the evaluator cares about):
161161
${userValues}

platforms/eReputation-api/src/services/ReferenceSigningSessionService.ts

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,10 @@ export interface ReferenceSigningResult {
3838
type: "signed" | "security_violation";
3939
}
4040

41+
// Module-level singleton session storage - shared across all service instances
42+
const sessionStorage: Map<string, ReferenceSigningSession> = new Map();
43+
4144
export class ReferenceSigningSessionService {
42-
private sessions: Map<string, ReferenceSigningSession> = new Map();
4345
private signatureService = new ReferenceSignatureService();
4446

4547
async createSession(referenceId: string, referenceData: any, userId: string): Promise<ReferenceSigningSession> {
@@ -55,7 +57,7 @@ export class ReferenceSigningSessionService {
5557
});
5658

5759
const base64Data = Buffer.from(messageData).toString('base64');
58-
const apiBaseUrl = process.env.PUBLIC_EREPUTATION_BASE_URL || "http://localhost:8765";
60+
const apiBaseUrl = process.env.VITE_EREPUTATION_BASE_URL;
5961
const redirectUri = `${apiBaseUrl}/api/references/signing/callback`;
6062

6163
const qrData = `w3ds://sign?session=${sessionId}&data=${base64Data}&redirect_uri=${encodeURIComponent(redirectUri)}`;
@@ -71,23 +73,23 @@ export class ReferenceSigningSessionService {
7173
status: "pending"
7274
};
7375

74-
this.sessions.set(sessionId, session);
75-
console.log(`Created reference signing session ${sessionId}, total sessions: ${this.sessions.size}`);
76+
sessionStorage.set(sessionId, session);
77+
console.log(`Created reference signing session ${sessionId}, total sessions: ${sessionStorage.size}`);
7678

7779
// Set up expiration cleanup
7880
setTimeout(() => {
79-
const session = this.sessions.get(sessionId);
81+
const session = sessionStorage.get(sessionId);
8082
if (session && session.status === "pending") {
8183
session.status = "expired";
82-
this.sessions.set(sessionId, session);
84+
sessionStorage.set(sessionId, session);
8385
}
8486
}, 15 * 60 * 1000);
8587

8688
return session;
8789
}
8890

8991
async getSession(sessionId: string): Promise<ReferenceSigningSession | null> {
90-
const session = this.sessions.get(sessionId);
92+
const session = sessionStorage.get(sessionId);
9193

9294
if (!session) {
9395
return null;
@@ -96,18 +98,21 @@ export class ReferenceSigningSessionService {
9698
// Check if session has expired
9799
if (session.status === "pending" && new Date() > session.expiresAt) {
98100
session.status = "expired";
99-
this.sessions.set(sessionId, session);
101+
sessionStorage.set(sessionId, session);
100102
}
101103

102104
return session;
103105
}
104106

105107
async processSignedPayload(sessionId: string, signature: string, publicKey: string, message: string): Promise<ReferenceSigningResult> {
106108
console.log(`Processing signed payload for reference session: ${sessionId}`);
109+
console.log(`Current session storage size: ${sessionStorage.size}`);
110+
console.log(`Session IDs in storage:`, Array.from(sessionStorage.keys()));
107111

108112
const session = await this.getSession(sessionId);
109113

110114
if (!session) {
115+
console.error(`Session ${sessionId} not found in storage. Available sessions:`, Array.from(sessionStorage.keys()));
111116
throw new Error("Session not found");
112117
}
113118

@@ -145,7 +150,7 @@ export class ReferenceSigningSessionService {
145150

146151
// Update session status to indicate security violation
147152
session.status = "security_violation";
148-
this.sessions.set(sessionId, session);
153+
sessionStorage.set(sessionId, session);
149154

150155
// Return error result instead of throwing
151156
return {
@@ -184,7 +189,7 @@ export class ReferenceSigningSessionService {
184189

185190
// Update session status
186191
session.status = "completed";
187-
this.sessions.set(sessionId, session);
192+
sessionStorage.set(sessionId, session);
188193

189194
const result: ReferenceSigningResult = {
190195
success: true,

platforms/eReputation/client/src/components/modals/other-calculation-modal.tsx

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -474,9 +474,15 @@ export default function OtherCalculationModal({ open, onOpenChange }: OtherCalcu
474474
</svg>
475475
)}
476476
</div>
477-
<div>
478-
<div className="font-bold text-fig">{result.name || result.ename || result.handle || 'Unknown'}</div>
479-
<div className="text-xs text-fig/70 capitalize">{result.type || result.category || targetType}</div>
477+
<div className="flex-1 min-w-0">
478+
<div className="font-bold text-fig truncate">{result.name || result.ename || result.handle || 'Unknown'}</div>
479+
<div className="text-xs text-fig/70">
480+
{targetType === 'user' ? (
481+
result.ename ? (result.ename.startsWith('@') ? result.ename : `@${result.ename}`) : 'no ename'
482+
) : (
483+
<span className="capitalize">{result.type || result.category || targetType}</span>
484+
)}
485+
</div>
480486
</div>
481487
</div>
482488
</button>

platforms/eReputation/client/src/components/modals/reference-modal.tsx

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -516,9 +516,17 @@ export default function ReferenceModal({ open, onOpenChange }: ReferenceModalPro
516516
</svg>
517517
)}
518518
</div>
519-
<div>
520-
<div className="font-bold text-fig">{result.name || result.ename || result.handle || 'Unknown'}</div>
521-
<div className="text-xs text-fig/70 capitalize">{result.type || result.category || targetType}</div>
519+
<div className="flex-1 min-w-0">
520+
<div className="font-bold text-fig truncate">
521+
{result.name || result.ename || result.handle || 'Unknown'}
522+
</div>
523+
<div className="text-xs text-fig/70">
524+
{targetType === 'user' ? (
525+
result.ename ? (result.ename.startsWith('@') ? result.ename : `@${result.ename}`) : 'no ename'
526+
) : (
527+
<span className="capitalize">{result.type || result.category || targetType}</span>
528+
)}
529+
</div>
522530
</div>
523531
</div>
524532
</button>
@@ -536,11 +544,13 @@ export default function ReferenceModal({ open, onOpenChange }: ReferenceModalPro
536544
{selectedTarget && (
537545
<div className="mt-2 p-3 border-2 border-fig/20 rounded-2xl bg-fig-10">
538546
<div className="flex items-center justify-between">
539-
<div className="flex items-center gap-2">
540-
<svg className="w-4 h-4 text-swiss-cheese" fill="currentColor" viewBox="0 0 20 20">
547+
<div className="flex items-center gap-2 flex-1 min-w-0">
548+
<svg className="w-4 h-4 text-swiss-cheese flex-shrink-0" fill="currentColor" viewBox="0 0 20 20">
541549
<path fillRule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clipRule="evenodd" />
542550
</svg>
543-
<span className="font-black text-fig">{selectedTarget.name || selectedTarget.ename || selectedTarget.handle || 'Unknown'}</span>
551+
<span className="font-black text-fig truncate">
552+
{selectedTarget.name || selectedTarget.ename || selectedTarget.handle || 'Unknown'}
553+
</span>
544554
</div>
545555
<button
546556
onClick={() => {

0 commit comments

Comments
 (0)