Skip to content

Commit 9623b34

Browse files
committed
Merge branch 'main' into feature/katelynrachel/pastevents-testimonials-ourteam
2 parents 32f2f37 + aab4fd6 commit 9623b34

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

72 files changed

+2680
-353
lines changed

.github/workflows/frontend.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,8 @@ jobs:
1717
npm ci --legacy-peer-deps
1818
npm run lint-check
1919
npm run build
20+
env:
21+
NEXT_PUBLIC_BACKEND_URL: ${{ vars.NEXT_PUBLIC_BACKEND_URL }}
22+
NEXT_PUBLIC_FIREBASE_SETTINGS: ${{ vars.NEXT_PUBLIC_FIREBASE_SETTINGS }}
23+
NEXT_PUBLIC_PAYPAL_CLIENT_SECRET: ${{ vars.NEXT_PUBLIC_PAYPAL_CLIENT_SECRET }}
24+
NEXT_PUBLIC_PAYPAL_CLIENT_ID: ${{ vars.NEXT_PUBLIC_PAYPAL_CLIENT_ID }}

.gitignore

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,6 @@ out
9292

9393
# Nuxt.js build / generate output
9494
.nuxt
95-
dist
9695

9796
# Gatsby files
9897
.cache/

backend/dist/app.js

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
"use strict";
2+
/**
3+
* Defines server and middleware.
4+
*/
5+
var __importDefault = (this && this.__importDefault) || function (mod) {
6+
return (mod && mod.__esModule) ? mod : { "default": mod };
7+
};
8+
Object.defineProperty(exports, "__esModule", { value: true });
9+
require("dotenv/config");
10+
const cors_1 = __importDefault(require("cors"));
11+
const express_1 = __importDefault(require("express"));
12+
const http_errors_1 = require("http-errors");
13+
const subscriber_1 = __importDefault(require("./routes/subscriber"));
14+
const members_1 = __importDefault(require("./routes/members"));
15+
const background_images_1 = __importDefault(require("./routes/background_images"));
16+
const eventDetails_1 = __importDefault(require("./routes/eventDetails"));
17+
const volunteerDetails_1 = __importDefault(require("./routes/volunteerDetails"));
18+
const testimonial_1 = __importDefault(require("./routes/testimonial"));
19+
const newsletter_1 = __importDefault(require("./routes/newsletter")); // Import newsletter routes
20+
const emails_1 = __importDefault(require("./routes/emails"));
21+
const pageeditor_1 = __importDefault(require("./routes/pageeditor"));
22+
const paypal_1 = __importDefault(require("./routes/paypal"));
23+
const app = (0, express_1.default)();
24+
// initializes Express to accept JSON in the request/response body
25+
app.use(express_1.default.json());
26+
// sets the "Access-Control-Allow-Origin" header on all responses to allow
27+
// requests from the frontend, which has a different origin - see the following
28+
// pages for more info:
29+
// https://expressjs.com/en/resources/middleware/cors.html
30+
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Origin
31+
app.use((0, cors_1.default)({
32+
origin: process.env.FRONTEND_ORIGIN,
33+
}));
34+
// Routes ( e.g. app.use("/api/task", taskRoutes); )
35+
app.use("/api/subscribers", subscriber_1.default);
36+
app.use("/api/member", members_1.default);
37+
app.use("/api/BackgroundImage", background_images_1.default);
38+
app.use("/api/eventDetails", eventDetails_1.default);
39+
app.use("/api/volunteerDetails", volunteerDetails_1.default);
40+
app.use("/api/testimonial", testimonial_1.default);
41+
app.use("/api/newsletter", newsletter_1.default);
42+
app.use("/api/emails", emails_1.default);
43+
app.use("/api/pageeditor", pageeditor_1.default);
44+
app.use("/api/orders", paypal_1.default); // Donation Order routes
45+
/**
46+
* Error handler; all errors thrown by server are handled here.
47+
* Explicit typings required here because TypeScript cannot infer the argument types.
48+
*
49+
* An eslint-disable is being used below because the "next" argument is never used. However,
50+
* it is still required for Express to recognize it as an error handler. For this reason, I've
51+
* disabled the eslint error. This should be used sparingly and only in situations where the lint
52+
* error cannot be fixed in another way.
53+
*/
54+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
55+
app.use((error, req, res, next) => {
56+
// 500 is the "internal server error" error code, this will be our fallback
57+
let statusCode = 500;
58+
let errorMessage = "An error has occurred.";
59+
// check is necessary because anything can be thrown, type is not guaranteed
60+
if ((0, http_errors_1.isHttpError)(error)) {
61+
// error.status is unique to the http error class, it allows us to pass status codes with errors
62+
statusCode = error.status;
63+
errorMessage = error.message;
64+
}
65+
// prefer custom http errors but if they don't exist, fallback to default
66+
else if (error instanceof Error) {
67+
errorMessage = error.message;
68+
}
69+
res.status(statusCode).json({ error: errorMessage });
70+
});
71+
exports.default = app;
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
"use strict";
2+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4+
return new (P || (P = Promise))(function (resolve, reject) {
5+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8+
step((generator = generator.apply(thisArg, _arguments || [])).next());
9+
});
10+
};
11+
var __importDefault = (this && this.__importDefault) || function (mod) {
12+
return (mod && mod.__esModule) ? mod : { "default": mod };
13+
};
14+
Object.defineProperty(exports, "__esModule", { value: true });
15+
exports.getBackgroundImages = void 0;
16+
const BackgroundImage_1 = __importDefault(require("../models/BackgroundImage"));
17+
const getBackgroundImages = (req, res, next) => __awaiter(void 0, void 0, void 0, function* () {
18+
const { page } = req.query;
19+
try {
20+
const images = yield BackgroundImage_1.default.find({ page });
21+
res.status(200).json(images);
22+
}
23+
catch (error) {
24+
next(error);
25+
}
26+
});
27+
exports.getBackgroundImages = getBackgroundImages;

backend/dist/controllers/emails.js

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
"use strict";
2+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4+
return new (P || (P = Promise))(function (resolve, reject) {
5+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8+
step((generator = generator.apply(thisArg, _arguments || [])).next());
9+
});
10+
};
11+
Object.defineProperty(exports, "__esModule", { value: true });
12+
exports.createEmail = void 0;
13+
/*
14+
* Controller for the email route, /api/email.
15+
*/
16+
const emails_1 = require("../services/emails");
17+
const createEmail = (req, res, next) => __awaiter(void 0, void 0, void 0, function* () {
18+
let EMAIL_SUBJECT = "";
19+
let EMAIL_BODY = "";
20+
if (req.body.type === "contact") {
21+
const { name, email, phone, subject, message, question } = req.body;
22+
// Extract question type from the selected option if it is "I have a _ question"
23+
let questionType = "";
24+
if (question === "Other") {
25+
questionType = "Other message";
26+
}
27+
else {
28+
console.log("question: " + question);
29+
questionType = question.split(" ").slice(3).join(" ");
30+
questionType = questionType[0].toUpperCase() + questionType.slice(1);
31+
}
32+
EMAIL_SUBJECT = `Contact Form: ${questionType} from ${name}`;
33+
EMAIL_BODY = `Name: ${name}\nEmail: ${email}\nPhone: ${phone}\nSubject: ${subject}\n\n${message}`;
34+
}
35+
else if (req.body.type === "volunteer") {
36+
const { eventName, firstName, lastName, email, phoneNumber, receiveNews } = req.body;
37+
const newsStr = receiveNews ? "Yes" : "No";
38+
EMAIL_SUBJECT = `Volunteer Form: Sign up for ${eventName} by ${firstName} ${lastName}`;
39+
EMAIL_BODY = `Event Name: ${eventName} \nFirst Name: ${firstName} \nLast Name: ${lastName}\nEmail: ${email}\nPhone Number: ${phoneNumber}\nReceive News: ${newsStr}`;
40+
}
41+
else if (req.body.type === "newsletter") {
42+
const { firstName, lastName, email, quarterlyUpdates, specialUpdates } = req.body;
43+
const quarterlyStr = quarterlyUpdates ? "Yes" : "No";
44+
const specialStr = specialUpdates ? "Yes" : "No";
45+
EMAIL_SUBJECT = `Newsletter Form: Subscription by ${firstName} ${lastName}`;
46+
EMAIL_BODY = `First Name: ${firstName} \nLast Name: ${lastName}\nEmail: ${email}\nReceive Quarterly Updates: ${quarterlyStr}\nReceive Special Events Updates: ${specialStr}`;
47+
}
48+
else if (req.body.type === "donation") {
49+
const { firstName, lastName, email, phone, comment } = req.body;
50+
EMAIL_SUBJECT = `Physical Donation Form: Donation from ${firstName} ${lastName}`;
51+
EMAIL_BODY = `First Name: ${firstName}\nLast Name: ${lastName}\nEmail: ${email}\nPhone Number: ${phone}\nDonation Comment:\n${comment}`;
52+
}
53+
try {
54+
const sentEmail = yield (0, emails_1.sendContactEmail)(EMAIL_SUBJECT, EMAIL_BODY);
55+
// Successfully sent email
56+
res.status(200).json(sentEmail);
57+
}
58+
catch (error) {
59+
next(error);
60+
}
61+
});
62+
exports.createEmail = createEmail;
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
"use strict";
2+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4+
return new (P || (P = Promise))(function (resolve, reject) {
5+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8+
step((generator = generator.apply(thisArg, _arguments || [])).next());
9+
});
10+
};
11+
var __importDefault = (this && this.__importDefault) || function (mod) {
12+
return (mod && mod.__esModule) ? mod : { "default": mod };
13+
};
14+
Object.defineProperty(exports, "__esModule", { value: true });
15+
exports.updateEventDetails = exports.createEventDetails = exports.getEventDetails = exports.getAllEventDetails = void 0;
16+
const express_validator_1 = require("express-validator");
17+
const http_errors_1 = __importDefault(require("http-errors"));
18+
const eventDetails_1 = __importDefault(require("../models/eventDetails"));
19+
const validationErrorParser_1 = __importDefault(require("../util/validationErrorParser"));
20+
const getAllEventDetails = (req, res, next) => __awaiter(void 0, void 0, void 0, function* () {
21+
try {
22+
const events = yield eventDetails_1.default.find({});
23+
if (!events) {
24+
res.status(200).json({ message: "No events found." });
25+
}
26+
res.status(200).json(events);
27+
}
28+
catch (error) {
29+
next(error);
30+
}
31+
});
32+
exports.getAllEventDetails = getAllEventDetails;
33+
const getEventDetails = (req, res, next) => __awaiter(void 0, void 0, void 0, function* () {
34+
const { id } = req.params;
35+
try {
36+
const eventDetails = yield eventDetails_1.default.findById(id);
37+
if (!eventDetails) {
38+
throw (0, http_errors_1.default)(404, "Event not found.");
39+
}
40+
res.status(200).json(eventDetails);
41+
}
42+
catch (error) {
43+
next(error);
44+
}
45+
});
46+
exports.getEventDetails = getEventDetails;
47+
const createEventDetails = (req, res, next) => __awaiter(void 0, void 0, void 0, function* () {
48+
const errors = (0, express_validator_1.validationResult)(req);
49+
const { name, description, guidelines, date, location, imageURI } = req.body;
50+
try {
51+
(0, validationErrorParser_1.default)(errors);
52+
const eventDetails = yield eventDetails_1.default.create({
53+
name,
54+
description,
55+
guidelines,
56+
date,
57+
location,
58+
imageURI,
59+
});
60+
res.status(201).json(eventDetails);
61+
}
62+
catch (error) {
63+
next(error);
64+
}
65+
});
66+
exports.createEventDetails = createEventDetails;
67+
const updateEventDetails = (req, res, next) => __awaiter(void 0, void 0, void 0, function* () {
68+
const errors = (0, express_validator_1.validationResult)(req);
69+
const { id } = req.params;
70+
if (id !== req.body._id) {
71+
// If the _id in the URL does not match the _id in the body, bad request
72+
res.status(400);
73+
}
74+
try {
75+
(0, validationErrorParser_1.default)(errors);
76+
const eventDetails = yield eventDetails_1.default.findByIdAndUpdate(id, req.body);
77+
if (eventDetails === null) {
78+
// No event found
79+
res.status(404);
80+
}
81+
const updatedEventDetails = yield eventDetails_1.default.findById(id);
82+
if (updatedEventDetails === null) {
83+
// No event found, something went wrong
84+
res.status(404);
85+
}
86+
res.status(200).json(updatedEventDetails);
87+
}
88+
catch (error) {
89+
next(error);
90+
}
91+
});
92+
exports.updateEventDetails = updateEventDetails;

backend/dist/controllers/member.js

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
"use strict";
2+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4+
return new (P || (P = Promise))(function (resolve, reject) {
5+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8+
step((generator = generator.apply(thisArg, _arguments || [])).next());
9+
});
10+
};
11+
var __importDefault = (this && this.__importDefault) || function (mod) {
12+
return (mod && mod.__esModule) ? mod : { "default": mod };
13+
};
14+
Object.defineProperty(exports, "__esModule", { value: true });
15+
exports.getAllMembers = exports.getMember = exports.createMember = void 0;
16+
const member_1 = __importDefault(require("../models/member"));
17+
const mongoose_1 = require("mongoose");
18+
const createMember = (req, res, next) => __awaiter(void 0, void 0, void 0, function* () {
19+
const { name, role, profilePictureURL } = req.body;
20+
try {
21+
const member = yield member_1.default.create({
22+
name: name,
23+
role: role,
24+
profilePictureURL: profilePictureURL,
25+
});
26+
res.status(201).json(member);
27+
}
28+
catch (error) {
29+
next(error);
30+
}
31+
});
32+
exports.createMember = createMember;
33+
const getMember = (req, res, next) => __awaiter(void 0, void 0, void 0, function* () {
34+
const { id } = req.params;
35+
try {
36+
const member = mongoose_1.Types.ObjectId.isValid(id) ? yield member_1.default.findById(id) : null;
37+
res.status(200).json(member);
38+
}
39+
catch (error) {
40+
next(error);
41+
}
42+
});
43+
exports.getMember = getMember;
44+
const getAllMembers = (req, res, next) => __awaiter(void 0, void 0, void 0, function* () {
45+
try {
46+
const members = yield member_1.default.find({});
47+
res.status(200).json(members);
48+
}
49+
catch (error) {
50+
next(error);
51+
}
52+
});
53+
exports.getAllMembers = getAllMembers;

0 commit comments

Comments
 (0)