refactor: tighten backend and logic boundaries
This commit is contained in:
@@ -7,14 +7,6 @@ import { loadCurrentGameTime, type CurrentGameTime } from '../services/gameClock
|
||||
|
||||
interface RedisSortedSetClient {
|
||||
zAdd(key: string, values: Array<{ score: number; value: string }>): Promise<number>;
|
||||
zRem(key: string, values: string | string[]): Promise<number>;
|
||||
}
|
||||
|
||||
export interface AuctionEventUpdate {
|
||||
auctionId: number;
|
||||
closeAt: Date;
|
||||
eventId: string;
|
||||
eventAt: Date;
|
||||
}
|
||||
|
||||
export const resolveAuctionTimerScore = (time: CurrentGameTime, closeAt: Date, closeTick?: bigint | null): number => {
|
||||
@@ -58,50 +50,3 @@ export const seedAuctionTimers = async (
|
||||
await redis.zAdd(keys.timerKey, payload);
|
||||
return payload.length;
|
||||
};
|
||||
|
||||
export const applyAuctionEvent = async (
|
||||
db: DatabaseClient,
|
||||
redis: RedisSortedSetClient,
|
||||
keys: AuctionTimerKeys,
|
||||
event: AuctionEventUpdate
|
||||
): Promise<boolean> => {
|
||||
const now = new Date();
|
||||
const gameTime = await loadCurrentGameTime(db, now);
|
||||
const closeTick = gameTime.dateToTick(event.closeAt);
|
||||
const updated = await db.$executeRaw(
|
||||
GamePrisma.sql`
|
||||
UPDATE auction
|
||||
SET close_at = ${event.closeAt},
|
||||
close_tick = ${closeTick === null ? null : BigInt(closeTick)},
|
||||
latest_event_id = ${event.eventId},
|
||||
latest_event_at = ${event.eventAt},
|
||||
updated_at = ${now}
|
||||
WHERE id = ${event.auctionId}
|
||||
AND status = 'OPEN'
|
||||
AND (
|
||||
latest_event_at < ${event.eventAt}
|
||||
OR (latest_event_at = ${event.eventAt} AND latest_event_id < ${event.eventId})
|
||||
)
|
||||
`
|
||||
);
|
||||
|
||||
if (updated > 0) {
|
||||
await redis.zAdd(keys.timerKey, [
|
||||
{
|
||||
score: resolveAuctionTimerScore(gameTime, event.closeAt, closeTick === null ? null : BigInt(closeTick)),
|
||||
value: String(event.auctionId),
|
||||
},
|
||||
]);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
};
|
||||
|
||||
export const removeAuctionTimer = async (
|
||||
redis: RedisSortedSetClient,
|
||||
keys: AuctionTimerKeys,
|
||||
auctionId: number
|
||||
): Promise<void> => {
|
||||
await redis.zRem(keys.timerKey, String(auctionId));
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user