Update matcher binary path to /app/bin/face_matcher in configuration and documentation
All checks were successful
Publish FaceAI Container / publish (push) Successful in 2m53s

This commit is contained in:
MaddoScientisto 2026-04-19 11:38:09 +02:00
commit c0732c142c
7 changed files with 76 additions and 8 deletions

View file

@ -60,6 +60,35 @@ app.use(cors({
credentials: true
}));
function summarizeRace(race) {
return {
id: race?.id || null,
name: race?.name || null,
storage: race?.storage || null
};
}
function summarizeUser(user) {
return {
id: user?.id || null,
displayName: user?.displayName || null,
membershipStatus: user?.membershipStatus || null
};
}
function clientIp(req) {
const forwardedFor = String(req.headers['x-forwarded-for'] || '').split(',')[0].trim();
return forwardedFor || req.ip || req.socket?.remoteAddress || null;
}
function logFaceAiAccess(event, req, details = {}) {
console.log(`[FaceAI] ${event} ${JSON.stringify({
ip: clientIp(req),
userAgent: req.headers['user-agent'] || null,
...details
})}`);
}
function getFaceAiSession(req) {
const sessionId = req.cookies[config.sessionCookieName];
return sessionId ? getSession(sessionId) : null;
@ -318,6 +347,15 @@ app.post('/api/auth/exchange', async (req, res) => {
}
});
logFaceAiAccess('Session exchange', req, {
sessionId,
user: summarizeUser(payload.user),
race: summarizeRace(race),
lang: payload.lang,
availability,
returnUrl: payload.returnUrl
});
res.cookie(config.sessionCookieName, sessionId, {
httpOnly: true,
sameSite: 'lax',
@ -341,6 +379,13 @@ app.post('/api/auth/exchange', async (req, res) => {
});
app.get('/api/session', requireSession, (req, res) => {
logFaceAiAccess('Session viewed', req, {
sessionId: req.cookies[config.sessionCookieName] || null,
user: summarizeUser(req.faceaiSession.user),
race: summarizeRace(req.faceaiSession.race),
lang: req.faceaiSession.lang,
availability: req.faceaiSession.availability || null
});
res.json(req.faceaiSession);
});
@ -420,6 +465,16 @@ app.post('/api/searches', requireSession, enforceSearchRateLimit, upload.single(
removeOnFail: 100
});
logFaceAiAccess('Identification requested', req, {
searchId: updatedSearch.id,
user: summarizeUser(req.faceaiSession.user),
race: summarizeRace(race),
lang: req.faceaiSession.lang,
selfieName: updatedSearch.selfieName,
uploadPath: updatedSearch.uploadPath,
availability
});
res.status(201).json({
id: updatedSearch.id,
status: updatedSearch.status,
@ -476,8 +531,19 @@ app.get('/api/searches/:id/redirect', requireSession, async (req, res) => {
const token = issueReturnToken(result);
const redirectUrl = `${config.legacyReturnUrl}?resultId=${encodeURIComponent(result.id)}&token=${encodeURIComponent(token)}`;
logFaceAiAccess('Identification redirect issued', req, {
searchId: search.id,
resultId: result.id,
user: summarizeUser(req.faceaiSession.user),
race: summarizeRace(req.faceaiSession.race),
matchCount: result.matches?.length || 0,
redirectUrl
});
res.json({
url: `${config.legacyReturnUrl}?resultId=${encodeURIComponent(result.id)}&token=${encodeURIComponent(token)}`
url: redirectUrl
});
});