From 2d25096ceaf29b7b14613fb402b6ffa791a3509d Mon Sep 17 00:00:00 2001 From: Wind-Explorer Date: Fri, 2 Aug 2024 20:15:02 +0800 Subject: [PATCH] events API optimization --- client/src/pages/EventsPage.tsx | 68 ++++--- client/src/pages/ManageEventsPage.tsx | 67 ++++--- server/routes/events.js | 263 +++++++++++++------------- 3 files changed, 209 insertions(+), 189 deletions(-) diff --git a/client/src/pages/EventsPage.tsx b/client/src/pages/EventsPage.tsx index 25114d2..768857b 100644 --- a/client/src/pages/EventsPage.tsx +++ b/client/src/pages/EventsPage.tsx @@ -77,12 +77,14 @@ const EventsPage: React.FC = () => { const matchTownCouncil = selectedTownCouncil ? event.location === selectedTownCouncil : true; - const matchTime = selectedTime - ? event.time.toLowerCase().trim() === selectedTime.toLowerCase().trim() - : true; + const matchTime = selectedTime + ? event.time.toLowerCase().trim() === selectedTime.toLowerCase().trim() + : true; - console.log('Event Time:', event.time); - console.log(`Filtering: ${event.title} | Category: ${matchCategory} | Town Council: ${matchTownCouncil} | Time: ${matchTime}`); + console.log("Event Time:", event.time); + console.log( + `Filtering: ${event.title} | Category: ${matchCategory} | Town Council: ${matchTownCouncil} | Time: ${matchTime}` + ); return matchCategory && matchTownCouncil && matchTime; }); @@ -141,34 +143,44 @@ const EventsPage: React.FC = () => {

No events available.

) : ( filteredEvents.map((event) => ( - +

{event.title}

- {event.evtPicture && ( -
- {event.title} -
- )} +
+ {event.title} +
- +

{event.description}

- + diff --git a/server/routes/events.js b/server/routes/events.js index 69a857f..e61fee5 100644 --- a/server/routes/events.js +++ b/server/routes/events.js @@ -1,178 +1,177 @@ -const express = require('express'); +const express = require("express"); const router = express.Router(); -const { Events } = require('../models'); -const multer = require('multer'); +const { Events } = require("../models"); +const multer = require("multer"); const { Op } = require("sequelize"); -const path = require('path'); -const yup = require('yup'); +const path = require("path"); +const yup = require("yup"); const sharp = require("sharp"); const upload = multer({ storage: multer.memoryStorage() }); router.get("/", async (req, res) => { - try { - // Extract filter criteria from query parameters - const { category, townCouncil, time } = req.query; + try { + // Extract filter criteria from query parameters + const { category, townCouncil, time } = req.query; - // Log incoming parameters - console.log("Filter Parameters:", { category, townCouncil, time }); + // Log incoming parameters + console.log("Filter Parameters:", { category, townCouncil, time }); - // Map time to category - const timeToCategory = (time) => { - if (!time) return null; - const hour = new Date(time).getHours(); - if (hour < 12) return 'Morning'; - if (hour < 18) return 'Afternoon'; - return 'Evening'; - }; + // Map time to category + const timeToCategory = (time) => { + if (!time) return null; + const hour = new Date(time).getHours(); + if (hour < 12) return "Morning"; + if (hour < 18) return "Afternoon"; + return "Evening"; + }; - // Convert the time query parameter to a category - const timeCategory = timeToCategory(time); + // Convert the time query parameter to a category + const timeCategory = timeToCategory(time); - // Construct the filter object - let filter = {}; - if (category) filter.category = category; - if (townCouncil) filter.townCouncil = townCouncil; - if (timeCategory) filter.timeCategory = timeCategory; + // Construct the filter object + let filter = {}; + if (category) filter.category = category; + if (townCouncil) filter.townCouncil = townCouncil; + if (timeCategory) filter.timeCategory = timeCategory; - // Log constructed filter object - console.log("Constructed Filter Object:", filter); + // Log constructed filter object + console.log("Constructed Filter Object:", filter); - // Fetch filtered events from the database - const filteredEvents = await Events.findAll({ - where: { - [Op.and]: [ - category ? { category } : {}, - townCouncil ? { townCouncil } : {}, - timeCategory ? { timeCategory } : {} - ] - } - }); + // Fetch filtered events from the database + const filteredEvents = await Events.findAll({ + attributes: { exclude: ["evtPicture"] }, + where: { + [Op.and]: [ + category ? { category } : {}, + townCouncil ? { townCouncil } : {}, + timeCategory ? { timeCategory } : {}, + ], + }, + }); - // Respond with the filtered events - res.json(filteredEvents); - } catch (error) { - console.error("Error fetching events:", error); - res.status(500).json({ message: "Internal Server Error" }); - } + // Respond with the filtered events + res.json(filteredEvents); + } catch (error) { + console.error("Error fetching events:", error); + res.status(500).json({ message: "Internal Server Error" }); + } }); - -router.post("/", upload.fields([ - { name: 'evtPicture', maxCount: 1 }, -]), async (req, res) => { - +router.post( + "/", + upload.fields([{ name: "evtPicture", maxCount: 1 }]), + async (req, res) => { let data = req.body; - let files = req.files;// Log incoming data - + let files = req.files; // Log incoming data + let validationSchema = yup.object({ - title: yup.string().trim().min(3).max(100).required(), - description: yup.string().trim().min(3).max(500).required(), - date: yup.date().required(), - time: yup.string().required(), - location: yup.string().required(), - category: yup.string().required(), - slotsAvailable: yup.number().integer().required(), + title: yup.string().trim().min(3).max(100).required(), + description: yup.string().trim().min(3).max(500).required(), + date: yup.date().required(), + time: yup.string().required(), + location: yup.string().required(), + category: yup.string().required(), + slotsAvailable: yup.number().integer().required(), }); try { - data = await validationSchema.validate(data, { abortEarly: false }); + data = await validationSchema.validate(data, { abortEarly: false }); - // Process valid data - let evtPicture = files.evtPicture ? files.evtPicture[0].buffer : null; + // Process valid data + let evtPicture = files.evtPicture ? files.evtPicture[0].buffer : null; - if (evtPicture) { - evtPicture = await sharp(evtPicture) - .resize(800, 600) - .jpeg() - .toBuffer(); - } + if (evtPicture) { + evtPicture = await sharp(evtPicture).resize(800, 600).jpeg().toBuffer(); + } - let result = await Events.create({ ...data, evtPicture}); + let result = await Events.create({ ...data, evtPicture }); - res.json(result); + res.json(result); } catch (err) { - console.error("Validation error:", err); // Log the validation error - res.status(400).json({ errors: err.errors }); + console.error("Validation error:", err); // Log the validation error + res.status(400).json({ errors: err.errors }); } -}); - - router.get("/", async (req, res) => { - try { - let list = await Events.findAll({ - order: [['createdAt', 'DESC']], - }); + } +); - res.json(list); - } catch (error) { - console.error("Error fetching events:", error); - res.status(500).json({ message: "Internal Server Error" }); - } - }); +router.get("/", async (req, res) => { + try { + let list = await Events.findAll({ + attributes: { exclude: ["evtPicture"] }, + order: [["createdAt", "DESC"]], + }); + + res.json(list); + } catch (error) { + console.error("Error fetching events:", error); + res.status(500).json({ message: "Internal Server Error" }); + } +}); router.get("/:id", async (req, res) => { - const id = req.params.id; - const event = await Events.findByPk(id); - if (!event) { - res.sendStatus(404); - return; - } - res.json(event); + const id = req.params.id; + const event = await Events.findByPk(id, { + attributes: { exclude: ["evtPicture"] }, + }); + if (!event) { + res.sendStatus(404); + return; + } + res.json(event); }); router.get("/evtPicture/:id", async (req, res) => { - let id = req.params.id; - let events = await Events.findByPk(id); + let id = req.params.id; + let events = await Events.findByPk(id); - if (!events || !events.evtPicture) { - res.sendStatus(404); - return; - } + if (!events || !events.evtPicture) { + res.sendStatus(404); + return; + } - try { - res.set("Content-Type", "image/jpeg"); - res.send(events.evtPicture); - } catch (err) { - res - .status(500) - .json({ message: "Error retrieving image", error: err }); - } + try { + res.set("Content-Type", "image/jpeg"); + res.send(events.evtPicture); + } catch (err) { + res.status(500).json({ message: "Error retrieving image", error: err }); + } }); router.put("/:id", async (req, res) => { - const id = req.params.id; - let data = req.body; - const validationSchema = yup.object({ - title: yup.string().trim().min(3).max(100), - description: yup.string().trim().min(3).max(500), - date: yup.date(), - time: yup.string(), - location: yup.string(), - category: yup.string(), - slotsAvailable: yup.number().integer(), - }); + const id = req.params.id; + let data = req.body; + const validationSchema = yup.object({ + title: yup.string().trim().min(3).max(100), + description: yup.string().trim().min(3).max(500), + date: yup.date(), + time: yup.string(), + location: yup.string(), + category: yup.string(), + slotsAvailable: yup.number().integer(), + }); - try { - data = await validationSchema.validate(data, { abortEarly: false }); - const event = await Events.findByPk(id); - if (!event) { - return res.status(404).json({ message: "Event not found" }); - } - await Events.update(data, { where: { id: id } }); - res.json({ message: "Event updated successfully" }); - } catch (err) { - res.status(400).json({ errors: err.errors }); + try { + data = await validationSchema.validate(data, { abortEarly: false }); + const event = await Events.findByPk(id); + if (!event) { + return res.status(404).json({ message: "Event not found" }); } + await Events.update(data, { where: { id: id } }); + res.json({ message: "Event updated successfully" }); + } catch (err) { + res.status(400).json({ errors: err.errors }); + } }); router.delete("/:id", async (req, res) => { - const id = req.params.id; - const event = await Events.findByPk(id); - if (!event) { - return res.status(404).json({ message: "Event not found" }); - } - await Events.destroy({ where: { id: id } }); - res.json({ message: "Event deleted successfully" }); + const id = req.params.id; + const event = await Events.findByPk(id); + if (!event) { + return res.status(404).json({ message: "Event not found" }); + } + await Events.destroy({ where: { id: id } }); + res.json({ message: "Event deleted successfully" }); }); module.exports = router;