diff --git a/src/app/api/monitoring/[[...slug]]/route.ts b/src/app/api/monitoring/[[...slug]]/route.ts index 80333a0..f8785a6 100644 --- a/src/app/api/monitoring/[[...slug]]/route.ts +++ b/src/app/api/monitoring/[[...slug]]/route.ts @@ -117,50 +117,32 @@ const MonitoringServer = new Elysia({ prefix: "/api/monitoring" }) ) .get("/daily-activity", async ({ query, set }) => { try { - // const data = await prisma.userLog.findMany({ - // where: { - // User: { - // Village: { - // isDummy: false - // } - // }, - // createdAt: { - // gte: moment().subtract(7, 'days').toDate(), - // lte: moment().toDate(), - // } - // }, - // select: { - // createdAt: true, - // } - // }) + const VALID_RANGES = [7, 30, 90]; + const range = VALID_RANGES.includes(Number(query.range)) ? Number(query.range) : 7; const data = await prisma.$queryRaw` - SELECT + SELECT DATE(ul."createdAt") AS tanggal, COUNT(*) AS total FROM "UserLog" ul JOIN "User" u ON ul."idUser" = u."id" JOIN "Village" v ON u."idVillage" = v."id" WHERE v."isDummy" = false - AND ul."createdAt" >= NOW() - INTERVAL '7 days' + AND ul."createdAt" >= NOW() - (${range} * INTERVAL '1 day') GROUP BY tanggal ORDER BY tanggal;` as any[]; const result = []; - // ubah data ke map biar gampang lookup const map = data.reduce((acc: any, item: any) => { const key = moment(item.tanggal).format('YYYY-MM-DD'); acc[key] = Number(item.total); return acc; }, {}); - // generate 7 hari terakhir - for (let i = 6; i >= 0; i--) { + for (let i = range - 1; i >= 0; i--) { const date = moment().subtract(i, 'days'); - const key = date.format('YYYY-MM-DD'); - result.push({ date: date.format('DD MMM'), logs: map[key] || 0 @@ -183,45 +165,39 @@ const MonitoringServer = new Elysia({ prefix: "/api/monitoring" }) } }, { + query: t.Object({ + range: t.Optional(t.String({ description: "Rentang hari: 7, 30, atau 90 (default: 7)" })), + }), detail: { summary: "Daily Activity", - description: "Menu Overview - Mendapatkan data grafik aktivitas harian semua desa.", + description: "Menu Overview - Mendapatkan data grafik aktivitas harian semua desa. Gunakan ?range=30 atau ?range=90 untuk rentang lebih panjang.", tags: ["overview"], }, } ) .get("/comparison-activity", async ({ query, set }) => { try { - const villages = await prisma.village.findMany({ - where: { isDummy: false }, - select: { name: true }, - }); + const VALID_RANGES = [7, 30, 90]; + const range = VALID_RANGES.includes(Number(query.range)) ? Number(query.range) : 7; const data = await prisma.$queryRaw` - SELECT + SELECT v."name", COUNT(ul."id") AS total_logs FROM "UserLog" ul JOIN "User" u ON ul."idUser" = u."id" JOIN "Village" v ON u."idVillage" = v."id" WHERE v."isDummy" = false - AND ul."createdAt" >= NOW() - INTERVAL '7 days' + AND ul."createdAt" >= NOW() - (${range} * INTERVAL '1 day') GROUP BY v."id", v."name" ORDER BY total_logs DESC; ` as any[]; - const logMap: Record = {}; - - data.forEach((item) => { - logMap[item.name] = Number(item.total_logs); - }); - - const result = villages.map((v) => ({ - village: v.name, - activity: logMap[v.name] || 0, + const result = data.map((item: any) => ({ + village: item.name, + activity: Number(item.total_logs), })); - return { success: true, message: "Berhasil mendapatkan data", @@ -238,9 +214,12 @@ const MonitoringServer = new Elysia({ prefix: "/api/monitoring" }) } }, { + query: t.Object({ + range: t.Optional(t.String({ description: "Rentang hari: 7, 30, atau 90 (default: 7)" })), + }), detail: { summary: "Comparison Activity", - description: "Menu Overview - Mendapatkan data grafik perbandingan aktivitas desa selama 7 hari terakhir.", + description: "Menu Overview - Mendapatkan data grafik perbandingan aktivitas desa. Gunakan ?range=30 atau ?range=90 untuk rentang lebih panjang.", tags: ["overview"], }, }