@@ -2,7 +2,8 @@ import type { Event } from '@prisma/client';
22
33import { prisma } from '../prisma.js' ;
44import { NotFoundError } from '../utils/AppError.js' ;
5- import { getAllEateriesData } from '../utils/cache.js' ;
5+ import { getAllEateriesData , refreshCacheFromDB } from '../utils/cache.js' ;
6+ import type { EateryWithEvents } from '../utils/cache.js' ;
67
78export const getAllEateries = async ( days : number = 0 ) => {
89 // Calculate date range for filtering events
@@ -22,36 +23,26 @@ export const getAllEateries = async (days: number = 0) => {
2223 const cachedEateries = getAllEateriesData ( ) ;
2324
2425 // Filter events to only include those on the specified day
25- const filteredEateries = cachedEateries . map ( ( eatery ) => ( {
26- ...eatery ,
27- events : eatery . events . filter ( ( event : Event ) => {
28- const eventStart = new Date ( event . startTimestamp ) ;
29- const eventEnd = new Date ( event . endTimestamp ) ;
30-
31- // Include event if it overlaps with the target day
32- return eventStart <= endOfDay && eventEnd >= startOfDay ;
33- } ) ,
34- } ) ) ;
26+ const filteredEateries = filterEateries (
27+ cachedEateries ,
28+ startOfDay ,
29+ endOfDay ,
30+ ) ;
3531
3632 return filteredEateries ;
3733 } catch {
3834 // If cache is cold (should never happen), fall back to database
39- const eateries = await prisma . eatery . findMany ( {
40- include : {
41- events : {
42- where : {
43- startTimestamp : {
44- lte : endOfDay ,
45- } ,
46- endTimestamp : {
47- gte : startOfDay ,
48- } ,
49- } ,
50- } ,
51- } ,
52- } ) ;
35+ refreshCacheFromDB ( ) ;
36+ const cachedEateries = getAllEateriesData ( ) ;
37+
38+ // Filter events to only include those on the specified day
39+ const filteredEateries = filterEateries (
40+ cachedEateries ,
41+ startOfDay ,
42+ endOfDay ,
43+ ) ;
5344
54- return eateries ;
45+ return filteredEateries ;
5546 }
5647} ;
5748
@@ -71,8 +62,16 @@ export const getEateryById = async (eateryId: number) => {
7162 if ( error instanceof NotFoundError ) {
7263 throw error ;
7364 }
65+ refreshCacheFromDB ( ) ;
66+ const cachedEateries = getAllEateriesData ( ) ;
67+ const eatery = cachedEateries . find ( ( e ) => e . id === eateryId ) ;
68+
69+ if ( eatery ) {
70+ return eatery ;
71+ }
7472
75- const eatery = await prisma . eatery . findUnique ( {
73+ // As a last resort, fetch directly from the database
74+ const fromDB = await prisma . eatery . findUnique ( {
7675 where : { id : eateryId } ,
7776 include : {
7877 events : {
@@ -96,10 +95,28 @@ export const getEateryById = async (eateryId: number) => {
9695 } ,
9796 } ) ;
9897
99- if ( ! eatery ) {
100- throw new NotFoundError ( 'Eatery not found ' ) ;
98+ if ( ! fromDB ) {
99+ throw new NotFoundError ( 'Eatery not in DB ' ) ;
101100 }
102101
103- return eatery ;
102+ return fromDB ;
104103 }
105104} ;
105+
106+ function filterEateries (
107+ cachedEateries : EateryWithEvents [ ] ,
108+ startOfDay : Date ,
109+ endOfDay : Date ,
110+ ) {
111+ const filteredEateries = cachedEateries . map ( ( eatery ) => ( {
112+ ...eatery ,
113+ events : eatery . events . filter ( ( event : Event ) => {
114+ const eventStart = new Date ( event . startTimestamp ) ;
115+ const eventEnd = new Date ( event . endTimestamp ) ;
116+
117+ // Include event if it overlaps with the target day
118+ return eventStart <= endOfDay && eventEnd >= startOfDay ;
119+ } ) ,
120+ } ) ) ;
121+ return filteredEateries ;
122+ }
0 commit comments