File tree Expand file tree Collapse file tree
api/kitchen/id/[kitchenId]
packages/database/src/repository Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -38,6 +38,7 @@ export default defineNuxtConfig({
3838 } ,
3939 scheduledTasks : {
4040 '* * * * *' : [ 'task:auto-create' ] , // Every minute
41+ '0 * * * *' : [ 'kitchen:revenue-update' ] , // Every hour
4142 '0 0 * * *' : [ 'kitchen:rating-update' ] , // Every day
4243 } ,
4344 } ,
Original file line number Diff line number Diff line change 1+ import { repository } from '@roll-stack/database'
2+
3+ export default defineEventHandler ( async ( event ) => {
4+ const kitchenId = getRouterParam ( event , 'kitchenId' )
5+ if ( ! kitchenId ) {
6+ throw createError ( {
7+ statusCode : 400 ,
8+ message : 'Id is required' ,
9+ } )
10+ }
11+
12+ const query = getQuery ( event )
13+ const start = query . start ? new Date ( query . start . toString ( ) ) : null
14+ const end = query . end ? new Date ( query . end . toString ( ) ) : null
15+ if ( ! start || ! end || Number . isNaN ( start . getTime ( ) ) || Number . isNaN ( end . getTime ( ) ) ) {
16+ throw createError ( {
17+ statusCode : 400 ,
18+ message : 'Valid start and end dates are required' ,
19+ } )
20+ }
21+
22+ return repository . kitchen . listRevenuesByKitchenForPeriod ( kitchenId , start , end )
23+ } )
Original file line number Diff line number Diff line change 1+ import { repository } from '@roll-stack/database'
2+ import { endOfWeek , startOfWeek } from 'date-fns'
3+
4+ const logger = useLogger ( 'kitchen:revenue-update' )
5+
6+ export default defineTask ( {
7+ meta : {
8+ name : 'kitchen:revenue-update' ,
9+ description : 'Update weekly revenue of kitchens' ,
10+ } ,
11+ async run ( ) {
12+ try {
13+ const kitchens = await repository . kitchen . list ( )
14+
15+ // From this monday to sunday (use UTC+0 time zone)
16+ const now = new Date ( )
17+ const utcNow = new Date ( now . getTime ( ) + now . getTimezoneOffset ( ) * 60000 )
18+
19+ const thisMonday = startOfWeek ( utcNow , { weekStartsOn : 1 } )
20+ const thisSunday = endOfWeek ( utcNow , { weekStartsOn : 1 } )
21+
22+ logger . log ( thisMonday , thisSunday )
23+
24+ for ( const kitchen of kitchens ) {
25+ const revenues = await repository . kitchen . listRevenuesByKitchenForPeriod ( kitchen . id , thisMonday , thisSunday )
26+
27+ const revenueForThisWeek = revenues . reduce ( ( acc , curr ) => acc + curr . total , 0 )
28+
29+ await repository . kitchen . update ( kitchen . id , {
30+ revenueForThisWeek,
31+ } )
32+
33+ // logger.log(`Kitchen ${kitchen.id}: Revenue updated from ${kitchen.revenueForThisWeek} to ${revenueForThisWeek}`)
34+ }
35+ } catch ( error ) {
36+ errorResolver ( error )
37+ }
38+
39+ return { result : true }
40+ } ,
41+ } )
Original file line number Diff line number Diff line change @@ -42,6 +42,18 @@ export class Kitchen {
4242 } )
4343 }
4444
45+ static async listRevenuesByKitchenForPeriod ( kitchenId : string , start : Date , end : Date ) {
46+ return useDatabase ( ) . query . kitchenRevenues . findMany ( {
47+ where : ( revenues , { eq, and } ) => and (
48+ eq ( revenues . kitchenId , kitchenId ) ,
49+ sql `date(${ revenues . date } ) >= date(${ start } )` ,
50+ sql `date(${ revenues . date } ) <= date(${ end } )` ,
51+ ) ,
52+ orderBy : ( revenues , { desc } ) => desc ( revenues . date ) ,
53+ limit : 1000 ,
54+ } )
55+ }
56+
4557 static async create ( data : KitchenDraft ) {
4658 const [ kitchen ] = await useDatabase ( ) . insert ( kitchens ) . values ( data ) . returning ( )
4759 return kitchen
You can’t perform that action at this time.
0 commit comments