Skip to content

Commit

Permalink
Testimonial and Team delete if empty
Browse files Browse the repository at this point in the history
  • Loading branch information
katelynpdn committed May 28, 2024
1 parent 4c6dfb8 commit 7524b5a
Show file tree
Hide file tree
Showing 9 changed files with 175 additions and 102 deletions.
17 changes: 17 additions & 0 deletions backend/src/controllers/testimonial.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { RequestHandler } from "express";
import TestimonialModel from "src/models/testimonial";
import { validationResult } from "express-validator";
import createHttpError from "http-errors";
import validationErrorParser from "src/util/validationErrorParser";

export const createTestimonial: RequestHandler = async (req, res, next) => {
Expand Down Expand Up @@ -65,3 +66,19 @@ export const updateTestimonial: RequestHandler = async (req, res, next) => {
next(error);
}
};

export const deleteTestimonial: RequestHandler = async (req, res, next) => {
const { id } = req.params;

try {
const testimonial = await TestimonialModel.findByIdAndDelete(id);

if (!testimonial) {
throw createHttpError(404, "Testimonial not found.");
}

res.status(200).json(testimonial);
} catch (error) {
next(error);
}
};
9 changes: 5 additions & 4 deletions backend/src/routes/testimonial.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,11 @@ const router = express.Router();
router.get("/get", TestimonialController.getAllTestimonials);
router.get("/get/quote", TestimonialController.getAllQuotes);
router.post("/post", TestimonialController.createTestimonial);
router.put(
"/:id", // getNewsletter validator works to just check ID
TestimonialValidator.updateTestimonial,
TestimonialController.updateTestimonial,
router.put("/:id", TestimonialValidator.updateTestimonial, TestimonialController.updateTestimonial);
router.delete(
"/:id",
TestimonialValidator.deleteTestimonial,
TestimonialController.deleteTestimonial,
);

export default router;
17 changes: 5 additions & 12 deletions backend/src/validators/testimonial.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ const makeIDValidator = () =>
.exists()
.withMessage("_id is required")
.bail()
.isMongoId()
.isString()
.withMessage("_id must be a MongoDB object ID");

const makeTitleValidator = () =>
Expand Down Expand Up @@ -49,15 +49,8 @@ const makeImageValidator = () =>
.notEmpty()
.withMessage("image cannot be empty");

export const createTestimonial = [
makeTitleValidator(),
makeDescriptionValidator(),
makeImageValidator(),
];
export const createTestimonial = [makeTitleValidator(), makeImageValidator()];

export const updateTestimonial = [makeIDValidator(), makeImageValidator()];

export const updateTestimonial = [
makeIDValidator(),
makeTitleValidator(),
makeDescriptionValidator(),
makeImageValidator(),
];
export const deleteTestimonial = [makeIDValidator()];
12 changes: 11 additions & 1 deletion frontend/src/api/testimonial.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { get, handleAPIError, post, put } from "./requests";
import { del, get, handleAPIError, post, put } from "./requests";

import type { APIResult } from "./requests";
export type Testimonial = {
Expand Down Expand Up @@ -60,3 +60,13 @@ export async function updateTestimonial(testimonial: Testimonial): Promise<APIRe
return handleAPIError(error);
}
}

export async function deleteTestimonial(id: string): Promise<APIResult<Testimonial>> {
try {
const response = await del(`/api/testimonial/${id}`);
const json = (await response.json()) as Testimonial;
return { success: true, data: json };
} catch (error) {
return handleAPIError(error);
}
}
12 changes: 7 additions & 5 deletions frontend/src/app/admin/page-editor/about/page.module.css
Original file line number Diff line number Diff line change
Expand Up @@ -29,15 +29,17 @@
.grayOut {
opacity: 0.3;
background: #484848;
position: absolute;
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 130%;
height: 100%;
z-index: 2;
}

.warningPopup {
position: relative;
left: 250px;
z-index: 5;
position: fixed;
left: 35%;
z-index: 3;
width: 100%;
}
100 changes: 55 additions & 45 deletions frontend/src/app/admin/page-editor/team/page.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,13 @@
"use client";
import React, { useEffect, useState } from "react";

import { Member, createMember, getAllMembers, updateMember, deleteMember } from "../../../../api/member";
import {
Member,
createMember,
deleteMember,
getAllMembers,
updateMember,
} from "../../../../api/member";
import { getPageText, updatePage } from "../../../../api/pageeditor";
import styles from "../testimonials/page.module.css";

Expand All @@ -17,7 +23,7 @@ import { WarningModule } from "@/components/WarningModule";
export default function TeamEditor() {
const [members, setMembers] = useState<Member[]>([]);
const [membersArray, setMembersArray] = useState<string[][]>([]);
const [editedMembers] = useState<Set<number>>(new Set()); //Indices of edited testimonials
const [editedMembers, setEditedMembers] = useState<Set<number>>(new Set()); //Indices of edited testimonials

const [isEdited, setIsEdited] = useState(false);
const [phSubtitle, setPhSubtitle] = useState<string>("");
Expand Down Expand Up @@ -128,56 +134,60 @@ export default function TeamEditor() {
if (editedMembers.size > 0) {
for (const index of Array.from(editedMembers)) {
if (index >= members.length) {
createMember({
name: membersArray[index][0],
role: membersArray[index][1],
// profilePictureURL: "/impact1.png"
})
.then((response2) => {
if (response2.success) {
setShowAlert(true);
} else {
alert(response2.error);
}
//Check title & description aren't empty
if (membersArray[index][0] !== "" || membersArray[index][1] !== "") {
createMember({
name: membersArray[index][0],
role: membersArray[index][1],
// profilePictureURL: "/impact1.png"
})
.catch((error) => {
alert(error);
});
.then((response2) => {
if (response2.success) {
setShowAlert(true);
} else {
// If adding and missing title/desc
alert(response2.error);
setMembersArray(membersArray.filter((elem, elemIndex) => elemIndex !== index));
}
})
.catch((error) => {
alert(error);
});
}
} else {
members[index].name = membersArray[index][0];
members[index].role = membersArray[index][1];
updateMember(members[index])
.then((response) => {
if (response.success) {
setShowAlert(true);
} else {
alert(response.error);
}
})
.catch((error) => {
alert(error);
});
}
}
}

for(let index = 0; index < membersArray.length; index++) {
const name = membersArray[index][0];
const role = membersArray[index][1];
if (name === "" && role === "") {
deleteMember(members[index])
.then((response) => {
if (response.success) {
setShowAlert(true);
//If deleting member
if (members[index].name === "" && members[index].role === "") {
deleteMember(members[index])
.then((response) => {
if (response.success) {
setShowAlert(true);
} else {
alert(response.error);
}
})
.catch((error) => {
alert(error);
});
} else {
alert(response.error);
//If updating member
updateMember(members[index])
.then((response) => {
if (response.success) {
setShowAlert(true);
} else {
alert(response.error);
}
})
.catch((error) => {
alert(error);
});
}
})
.catch((error) => {
alert(error);
});
}
}

setMembersArray(membersArray.filter((elem) => elem[0] !== "" || elem[1] !== ""));
setEditedMembers(new Set());
}

setIsEdited(false);
Expand Down
19 changes: 14 additions & 5 deletions frontend/src/app/admin/page-editor/testimonials/page.module.css
Original file line number Diff line number Diff line change
Expand Up @@ -29,17 +29,26 @@
.grayOut {
opacity: 0.3;
background: #484848;
position: absolute;
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 130%;
height: 100%;
z-index: 2;
}

.warningPopup {
position: relative;
left: 250px;
z-index: 5;
position: fixed;
left: 35%;
z-index: 3;
width: 100%;
}

.fixedPosition {
/* position: fixed; */
/* top: 0;
bottom: 0;
right: 0; */
}

.addButton {
Expand Down
Loading

0 comments on commit 7524b5a

Please sign in to comment.