diff --git a/src/api/v1/controllers/analytics.controller.js b/src/api/v1/controllers/analytics.controller.js new file mode 100644 index 0000000..3aefd16 --- /dev/null +++ b/src/api/v1/controllers/analytics.controller.js @@ -0,0 +1,26 @@ +import { errorHandler } from "@/lib/error-handler"; +import * as analyticsService from "../services/analytics.service"; + +export const getRestaurantAnalytics = async (req, res) => { + try { + const { restaurantId } = req.params; + const { startDate, endDate } = req.query; + + const [userAnalytics, orderAnalytics, staffAnalytics, customerBehavior] = + await Promise.all([ + analyticsService.getUserAnalytics(restaurantId), + analyticsService.getOrderAnalytics(restaurantId, startDate, endDate), + analyticsService.getStaffAnalytics(restaurantId), + analyticsService.getCustomerBehaviorAnalytics(restaurantId), + ]); + + res.json({ + ...userAnalytics, + ...orderAnalytics, + ...staffAnalytics, + ...customerBehavior, + }); + } catch (error) { + errorHandler(error, res); + } +}; \ No newline at end of file diff --git a/src/api/v1/routes/analytics.routes.js b/src/api/v1/routes/analytics.routes.js new file mode 100644 index 0000000..171ec44 --- /dev/null +++ b/src/api/v1/routes/analytics.routes.js @@ -0,0 +1,20 @@ +import express from "express"; +import { + authenticateStaff, + authorizeRestaurantRole, +} from "../middlewares/auth.middleware"; +import { validate } from "../middlewares/validate.middleware"; +import { analyticsQuerySchema } from "../schemas/analytics.schema"; +import * as analyticsController from "../controllers/analytics.controller"; + +const router = express.Router({ mergeParams: true }); + +router.get( + "/", + authenticateStaff, + authorizeRestaurantRole(["OWNER", "MANAGER"]), + validate(analyticsQuerySchema), + analyticsController.getRestaurantAnalytics +); + +export const analyticsRouter = router; \ No newline at end of file diff --git a/src/api/v1/schemas/analytics.schema.js b/src/api/v1/schemas/analytics.schema.js new file mode 100644 index 0000000..3778293 --- /dev/null +++ b/src/api/v1/schemas/analytics.schema.js @@ -0,0 +1,7 @@ +import { z } from "zod"; + +export const analyticsQuerySchema = z.object({ + startDate: z.string().optional(), + endDate: z.string().optional(), + interval: z.enum(["daily", "weekly", "monthly", "yearly"]).optional(), +}); \ No newline at end of file