- Split seeders into modular files per feature category - Added seed:auth, seed:demographics, seed:divisions, seed:services, seed:dashboard commands - Connected dashboard components to live database (Budget, SDGs, Satisfaction) - Added API endpoints: /api/dashboard/budget, /api/dashboard/sdgs, /api/dashboard/satisfaction - Updated prisma schema with dashboard metrics models - Added loading states to dashboard components - Fixed header navigation to /admin Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
73 lines
1.2 KiB
TypeScript
73 lines
1.2 KiB
TypeScript
import { Elysia, t } from "elysia";
|
|
import { prisma } from "../utils/db";
|
|
|
|
export const dashboard = new Elysia({ prefix: "/dashboard" })
|
|
.get(
|
|
"/budget",
|
|
async () => {
|
|
const data = await prisma.budget.findMany({
|
|
where: { fiscalYear: 2025 },
|
|
orderBy: { category: "asc" },
|
|
});
|
|
return { data };
|
|
},
|
|
{
|
|
response: {
|
|
200: t.Object({
|
|
data: t.Array(
|
|
t.Object({
|
|
category: t.String(),
|
|
amount: t.Number(),
|
|
percentage: t.Number(),
|
|
color: t.String(),
|
|
}),
|
|
),
|
|
}),
|
|
},
|
|
},
|
|
)
|
|
.get(
|
|
"/sdgs",
|
|
async () => {
|
|
const data = await prisma.sdgsScore.findMany({
|
|
orderBy: { score: "desc" },
|
|
});
|
|
return { data };
|
|
},
|
|
{
|
|
response: {
|
|
200: t.Object({
|
|
data: t.Array(
|
|
t.Object({
|
|
title: t.String(),
|
|
score: t.Number(),
|
|
image: t.Nullable(t.String()),
|
|
}),
|
|
),
|
|
}),
|
|
},
|
|
},
|
|
)
|
|
.get(
|
|
"/satisfaction",
|
|
async () => {
|
|
const data = await prisma.satisfactionRating.findMany({
|
|
orderBy: { value: "desc" },
|
|
});
|
|
return { data };
|
|
},
|
|
{
|
|
response: {
|
|
200: t.Object({
|
|
data: t.Array(
|
|
t.Object({
|
|
category: t.String(),
|
|
value: t.Number(),
|
|
color: t.String(),
|
|
}),
|
|
),
|
|
}),
|
|
},
|
|
},
|
|
);
|