Refactor code structure for improved readability and maintainability
This commit is contained in:
parent
7b30f17065
commit
c71e4b4cd0
27 changed files with 1738 additions and 324 deletions
|
|
@ -9,6 +9,7 @@ import { fileURLToPath } from 'node:url';
|
|||
import { config } from './config.js';
|
||||
import { signPayload, verifySignedPayload } from './auth.js';
|
||||
import { createSession, getSession, mockCatalog } from './store.js';
|
||||
import { buildRaceStorage, resolveRacePklAvailability } from './race-storage.js';
|
||||
import {
|
||||
acquireActiveSearchLock,
|
||||
createRedisConnection,
|
||||
|
|
@ -94,8 +95,24 @@ async function enforceSearchRateLimit(req, res, next) {
|
|||
next();
|
||||
}
|
||||
|
||||
function issueHandoffToken({ raceId, raceSlug, lang, returnUrl }) {
|
||||
const race = mockCatalog[raceId] || { id: raceId, slug: raceSlug || `race-${raceId}`, name: raceSlug || `Race ${raceId}` };
|
||||
function normalizeRaceForSession(raceInput) {
|
||||
return {
|
||||
...raceInput,
|
||||
storage: buildRaceStorage(raceInput?.storage || {})
|
||||
};
|
||||
}
|
||||
|
||||
async function buildRaceAvailability(race) {
|
||||
return resolveRacePklAvailability({ pklRoot: config.pklRoot, race });
|
||||
}
|
||||
|
||||
function issueHandoffToken({ raceId, raceSlug, raceName, raceStorage, lang, returnUrl }) {
|
||||
const race = mockCatalog[raceId] || {
|
||||
id: raceId,
|
||||
slug: raceSlug || `race-${raceId}`,
|
||||
name: raceName || raceSlug || `Race ${raceId}`,
|
||||
storage: buildRaceStorage(raceStorage || {})
|
||||
};
|
||||
|
||||
return signPayload({
|
||||
type: 'handoff',
|
||||
|
|
@ -108,7 +125,8 @@ function issueHandoffToken({ raceId, raceSlug, lang, returnUrl }) {
|
|||
race: {
|
||||
id: race.id,
|
||||
slug: race.slug,
|
||||
name: race.name
|
||||
name: race.name,
|
||||
storage: buildRaceStorage(raceStorage || race.storage || {})
|
||||
},
|
||||
lang: lang || 'it',
|
||||
returnUrl,
|
||||
|
|
@ -231,9 +249,21 @@ app.get('/dev/legacy/race', (req, res) => {
|
|||
app.get('/dev/legacy/launch', (req, res) => {
|
||||
const raceId = String(req.query.raceId || '101');
|
||||
const raceSlug = String(req.query.raceSlug || mockCatalog[raceId]?.slug || `race-${raceId}`);
|
||||
const raceName = String(req.query.raceName || mockCatalog[raceId]?.name || raceSlug);
|
||||
const lang = String(req.query.lang || 'it');
|
||||
const returnUrl = String(req.query.returnUrl || `${config.publicBaseUrl}/dev/legacy/race?raceId=${encodeURIComponent(raceId)}&lang=${encodeURIComponent(lang)}`);
|
||||
const token = issueHandoffToken({ raceId, raceSlug, lang, returnUrl });
|
||||
const token = issueHandoffToken({
|
||||
raceId,
|
||||
raceSlug,
|
||||
raceName,
|
||||
raceStorage: {
|
||||
year: String(req.query.raceYear || mockCatalog[raceId]?.storage?.year || ''),
|
||||
monthFolder: String(req.query.raceMonthFolder || mockCatalog[raceId]?.storage?.monthFolder || ''),
|
||||
raceFolder: String(req.query.raceFolder || mockCatalog[raceId]?.storage?.raceFolder || '')
|
||||
},
|
||||
lang,
|
||||
returnUrl
|
||||
});
|
||||
res.redirect(`${config.frontendUrl}/auth/callback?token=${encodeURIComponent(token)}`);
|
||||
});
|
||||
|
||||
|
|
@ -261,7 +291,7 @@ app.get('/dev/legacy/return', async (req, res) => {
|
|||
}
|
||||
});
|
||||
|
||||
app.post('/api/auth/exchange', (req, res) => {
|
||||
app.post('/api/auth/exchange', async (req, res) => {
|
||||
try {
|
||||
const { token } = req.body;
|
||||
const payload = verifySignedPayload(token, config.sharedSecret);
|
||||
|
|
@ -269,13 +299,18 @@ app.post('/api/auth/exchange', (req, res) => {
|
|||
throw new Error('Wrong token type');
|
||||
}
|
||||
|
||||
const race = normalizeRaceForSession(payload.race);
|
||||
const availability = await buildRaceAvailability(race);
|
||||
const faceAiAllowed = payload.user.membershipStatus === 'active' && availability.available;
|
||||
|
||||
const sessionId = createSession({
|
||||
user: payload.user,
|
||||
race: payload.race,
|
||||
race,
|
||||
lang: payload.lang,
|
||||
returnUrl: payload.returnUrl,
|
||||
availability,
|
||||
access: {
|
||||
faceAiAllowed: payload.user.membershipStatus === 'active'
|
||||
faceAiAllowed
|
||||
}
|
||||
});
|
||||
|
||||
|
|
@ -288,11 +323,12 @@ app.post('/api/auth/exchange', (req, res) => {
|
|||
|
||||
res.json({
|
||||
user: payload.user,
|
||||
race: payload.race,
|
||||
race,
|
||||
lang: payload.lang,
|
||||
returnUrl: payload.returnUrl,
|
||||
availability,
|
||||
access: {
|
||||
faceAiAllowed: true
|
||||
faceAiAllowed
|
||||
}
|
||||
});
|
||||
} catch (error) {
|
||||
|
|
@ -308,6 +344,19 @@ app.post('/api/searches', requireSession, enforceSearchRateLimit, upload.single(
|
|||
try {
|
||||
const raceId = String(req.body.raceId || req.faceaiSession.race.id);
|
||||
const userId = String(req.faceaiSession.user.id);
|
||||
const race = normalizeRaceForSession(raceId === req.faceaiSession.race.id
|
||||
? req.faceaiSession.race
|
||||
: (mockCatalog[raceId] || req.faceaiSession.race));
|
||||
const availability = await buildRaceAvailability(race);
|
||||
|
||||
if (!availability.available) {
|
||||
res.status(409).json({
|
||||
error: availability.message,
|
||||
code: availability.reasonCode || 'RACE_PKL_UNAVAILABLE'
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
const activeSearchId = await getActiveSearchId(redis, userId);
|
||||
|
||||
if (activeSearchId) {
|
||||
|
|
@ -327,10 +376,10 @@ app.post('/api/searches', requireSession, enforceSearchRateLimit, upload.single(
|
|||
return;
|
||||
}
|
||||
|
||||
const race = mockCatalog[raceId] || req.faceaiSession.race;
|
||||
const search = await createSearchRecord(redis, {
|
||||
raceId,
|
||||
raceName: race?.name || raceId,
|
||||
raceStorage: race?.storage || availability.storage,
|
||||
userId,
|
||||
returnUrl: req.faceaiSession.returnUrl,
|
||||
lang: req.faceaiSession.lang,
|
||||
|
|
@ -371,6 +420,7 @@ app.post('/api/searches', requireSession, enforceSearchRateLimit, upload.single(
|
|||
id: updatedSearch.id,
|
||||
status: updatedSearch.status,
|
||||
raceId: updatedSearch.raceId,
|
||||
raceStorage: updatedSearch.raceStorage,
|
||||
selfieName: updatedSearch.selfieName,
|
||||
matchCount: updatedSearch.matchCount,
|
||||
errorCode: updatedSearch.errorCode,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue