Skip to content

Commit c4442ce

Browse files
authored
feat: network metrics (#30)
1 parent 3c94343 commit c4442ce

7 files changed

Lines changed: 91 additions & 12 deletions

File tree

apps/web-app/server/api/kitchen/revenue/iiko-daily.post.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,22 @@ async function parseFileAndUpdateData(file: MultiPartData) {
153153
kitchen.commonTotal = commonTotal
154154
}
155155

156+
// Create or update metrics
157+
const metrics = await repository.network.listMetrics()
158+
const existingMetrics = metrics.find((metric) => metric.date === dateOnly)
159+
if (!existingMetrics) {
160+
await repository.network.createMetrics({
161+
date: dateOnly,
162+
averageCheck: commonAverageCheck,
163+
total: commonTotal,
164+
})
165+
} else {
166+
await repository.network.updateMetrics(existingMetrics.id, {
167+
averageCheck: commonAverageCheck,
168+
total: commonTotal,
169+
})
170+
}
171+
156172
// Every kitchen: find in DB and add amount for this day
157173
const kitchens = await repository.kitchen.list()
158174
let rowsUpdated = 0

apps/web-app/server/tasks/kitchen/average-update.ts

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,27 @@ export default defineTask({
77
},
88
async run() {
99
try {
10-
const revenuesToUpdate = await repository.kitchen.listRevenuesToUpdate()
11-
for (const revenue of revenuesToUpdate) {
12-
// common
10+
const revenues = await repository.kitchen.listRevenuesToUpdate()
11+
let metrics = await repository.network.listMetrics()
12+
13+
for (const revenue of revenues) {
14+
// If have metric for this date
15+
if (metrics.find((metric) => metric.date === revenue.date)) {
16+
continue
17+
}
18+
1319
const allRevenuesThisPeriod = await repository.kitchen.listRevenuesForDate(revenue.date)
14-
const commonAverageCheck = Math.round(allRevenuesThisPeriod.reduce((acc, curr) => acc + curr.averageCheck, 0) / allRevenuesThisPeriod.length)
15-
await repository.kitchen.updateRevenue(revenue.id, {
16-
commonAverageCheck,
20+
const averageCheck = Math.round(allRevenuesThisPeriod.reduce((acc, curr) => acc + curr.averageCheck, 0) / allRevenuesThisPeriod.length)
21+
const total = Math.round(allRevenuesThisPeriod.reduce((acc, curr) => acc + curr.total, 0) / allRevenuesThisPeriod.length)
22+
23+
await repository.network.createMetrics({
24+
date: revenue.date,
25+
averageCheck,
26+
total,
1727
})
28+
29+
// Update
30+
metrics = await repository.network.listMetrics()
1831
}
1932
} catch (error) {
2033
errorResolver(error)

packages/database/src/repository/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { File } from './file'
99
import { Kitchen } from './kitchen'
1010
import { Media } from './media'
1111
import { Menu } from './menu'
12+
import { Network } from './network'
1213
import { Notification } from './notification'
1314
import { Partner } from './partner'
1415
import { Payment } from './payment'
@@ -30,6 +31,7 @@ class Repository {
3031
readonly kitchen = Kitchen
3132
readonly media = Media
3233
readonly menu = Menu
34+
readonly network = Network
3335
readonly notification = Notification
3436
readonly partner = Partner
3537
readonly payment = Payment

packages/database/src/repository/kitchen.ts

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -64,12 +64,7 @@ export class Kitchen {
6464
}
6565

6666
static async listRevenuesToUpdate() {
67-
return useDatabase().query.kitchenRevenues.findMany({
68-
where: (revenues, { eq, or }) => or(
69-
eq(revenues.commonAverageCheck, 0),
70-
),
71-
limit: 50,
72-
})
67+
return useDatabase().query.kitchenRevenues.findMany()
7368
}
7469

7570
static async create(data: KitchenDraft) {
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import type { NetworkMetricsDraft } from '../types'
2+
import { eq, sql } from 'drizzle-orm'
3+
import { useDatabase } from '../database'
4+
import { networkMetrics } from '../tables'
5+
6+
export class Network {
7+
static async findMetrics(id: string) {
8+
return useDatabase().query.networkMetrics.findFirst({
9+
where: (metrics, { eq }) => eq(metrics.id, id),
10+
})
11+
}
12+
13+
static async listMetrics() {
14+
return useDatabase().query.networkMetrics.findMany({
15+
orderBy: (metrics, { desc }) => desc(metrics.date),
16+
})
17+
}
18+
19+
static async listMetricsForDate(date: string) {
20+
return useDatabase().query.networkMetrics.findMany({
21+
where: (metrics, { and }) => and(
22+
sql`date(${metrics.date}) >= date(${date})`,
23+
sql`date(${metrics.date}) <= date(${date})`,
24+
),
25+
})
26+
}
27+
28+
static async createMetrics(data: NetworkMetricsDraft) {
29+
const [metrics] = await useDatabase().insert(networkMetrics).values(data).returning()
30+
return metrics
31+
}
32+
33+
static async updateMetrics(id: string, data: Partial<NetworkMetricsDraft>) {
34+
const [metrics] = await useDatabase()
35+
.update(networkMetrics)
36+
.set(data)
37+
.where(eq(networkMetrics.id, id))
38+
.returning()
39+
return metrics
40+
}
41+
}

packages/database/src/tables.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -577,6 +577,15 @@ export const clientReviews = pgTable('client_reviews', {
577577
feedbackPointId: cuid2('feedback_point_id').references(() => feedbackPoints.id),
578578
})
579579

580+
export const networkMetrics = pgTable('network_metrics', {
581+
id: cuid2('id').defaultRandom().primaryKey(),
582+
createdAt: timestamp('created_at', { precision: 3, withTimezone: true, mode: 'string' }).notNull().defaultNow(),
583+
updatedAt: timestamp('updated_at', { precision: 3, withTimezone: true, mode: 'string' }).notNull().defaultNow(),
584+
date: date('date', { mode: 'string' }).notNull(),
585+
total: numeric('total', { mode: 'number' }).notNull().default(0),
586+
averageCheck: numeric('average_check', { mode: 'number' }).notNull().default(0),
587+
})
588+
580589
export const userRelations = relations(users, ({ many, one }) => ({
581590
chatMessages: many(chatMessages),
582591
chatMembers: many(chatMembers),

packages/database/src/types.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,3 +125,6 @@ export type FeedbackPointDraft = InferInsertModel<typeof tables.feedbackPoints>
125125

126126
export type ClientReview = InferSelectModel<typeof tables.clientReviews>
127127
export type ClientReviewDraft = InferInsertModel<typeof tables.clientReviews>
128+
129+
export type NetworkMetrics = InferSelectModel<typeof tables.networkMetrics>
130+
export type NetworkMetricsDraft = InferInsertModel<typeof tables.networkMetrics>

0 commit comments

Comments
 (0)