diff --git a/nginx.conf b/nginx.conf index 802988f08..e605d3586 100644 --- a/nginx.conf +++ b/nginx.conf @@ -150,6 +150,17 @@ http { } #Load balancer + location /api/scevents/ { + resolver 127.0.0.11 valid=15s; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + set $upstream http://scevents-server:8002; + rewrite ^/api/scevents/?(.*)$ /$1 break; + proxy_pass $upstream; + } location /api { proxy_pass http://mainendpoints; } diff --git a/src/APIFunctions/SCEvents.js b/src/APIFunctions/SCEvents.js index c14d6bc46..1f434a4b7 100644 --- a/src/APIFunctions/SCEvents.js +++ b/src/APIFunctions/SCEvents.js @@ -1,6 +1,7 @@ import { ApiResponse } from './ApiResponses'; +import config from '../config/config.json'; -const SCEVENTS_API_URL = 'http://localhost:8002'; +const SCEVENTS_API_URL = config.SCEvents?.BASE_URL || '/api/scevents'; export async function getAllSCEvents() { const status = new ApiResponse(); try { diff --git a/src/Components/Navbar/AdminNavbar.js b/src/Components/Navbar/AdminNavbar.js index de9754ab6..93f428c39 100644 --- a/src/Components/Navbar/AdminNavbar.js +++ b/src/Components/Navbar/AdminNavbar.js @@ -1,6 +1,5 @@ import React from 'react'; import { useSCE } from '../context/SceContext'; -import config from '../../config/config.json'; import { membershipState } from '../../Enums'; export default function UserNavBar(props) { @@ -44,27 +43,25 @@ export default function UserNavBar(props) { ]; const sceventsAdminNavLinks = []; - if (config.SCEvents?.ENABLED) { + sceventsAdminNavLinks.push({ + title: 'Events', + route: '/events', + icon: ( + + + + ), + }); + if (user?.accessLevel >= membershipState.OFFICER) { sceventsAdminNavLinks.push({ - title: 'Events', - route: '/events', + title: 'Create event', + route: '/events/create', icon: ( - + ), }); - if (user?.accessLevel >= membershipState.OFFICER) { - sceventsAdminNavLinks.push({ - title: 'Create event', - route: '/events/create', - icon: ( - - - - ), - }); - } } const adminLinks = [ diff --git a/src/Components/Navbar/UserNavbar.js b/src/Components/Navbar/UserNavbar.js index 763608282..301860e9d 100644 --- a/src/Components/Navbar/UserNavbar.js +++ b/src/Components/Navbar/UserNavbar.js @@ -1,7 +1,6 @@ import React, { useState, useEffect, useRef } from 'react'; import { membershipState } from '../../Enums'; import { useSCE } from '../context/SceContext'; -import config from '../../config/config.json'; export default function UserNavbar(props) { const { user, authenticated } = useSCE(); @@ -15,14 +14,12 @@ export default function UserNavbar(props) { { title: 'About', route: '/about' }, { title: 'Projects', route: '/projects' }, { title: 'Summer Internship', route: '/s/internship', newTab: true }, - ...(config.SCEvents?.ENABLED ? [{ title: 'Events', route: '/events' }] : []), ]; const authedRoutes = [ { title: 'Printing', route: '/2DPrinting' }, { title: 'Chat', route: '/messaging' }, { title: 'LED Sign', route: '/led-sign' }, - ...(config.SCEvents?.ENABLED ? [{ title: 'Events', route: '/events' }] : []), ]; const authentication = [ diff --git a/src/Pages/Events/CreateEventPage.js b/src/Pages/Events/CreateEventPage.js index 59ba96d48..fe23a89bc 100644 --- a/src/Pages/Events/CreateEventPage.js +++ b/src/Pages/Events/CreateEventPage.js @@ -1,11 +1,10 @@ /* eslint-disable camelcase -- mirrors SCEvents JSON field names in state and payloads */ import React, { useMemo, useState } from 'react'; -import { Link, useHistory, Redirect } from 'react-router-dom'; +import { Link, useHistory } from 'react-router-dom'; import { useSCE } from '../../Components/context/SceContext.js'; import { createSCEvent } from '../../APIFunctions/SCEvents.js'; import CreateEventFormQuestionBlock from './CreateEventFormQuestionBlock.js'; import { membershipState } from '../../Enums'; -import config from '../../config/config.json'; /** Matches SCEvents `max_attendees` when there is no cap. */ const UNLIMITED_ATTENDEES = -1; @@ -71,7 +70,6 @@ function toApiRegistrationForm(questions) { export default function CreateEventPage() { const { user } = useSCE(); const history = useHistory(); - const isSCEventsEnabled = config.SCEvents?.ENABLED; const [eventId] = useState(() => crypto.randomUUID()); const [eventName, setEventName] = useState(''); @@ -234,10 +232,6 @@ export default function CreateEventPage() { history.push('/events'); } - if (!isSCEventsEnabled) { - return ; - } - if (!isOfficerOrAdmin) { return (
diff --git a/src/Pages/Events/EditEventPage.js b/src/Pages/Events/EditEventPage.js index e758a5e08..b1c212d94 100644 --- a/src/Pages/Events/EditEventPage.js +++ b/src/Pages/Events/EditEventPage.js @@ -1,11 +1,10 @@ /* eslint-disable camelcase -- mirrors SCEvents JSON field names in state and payloads */ import React, { useMemo, useState, useEffect } from 'react'; -import { Link, useHistory, useParams, Redirect } from 'react-router-dom'; +import { Link, useHistory, useParams } from 'react-router-dom'; import { useSCE } from '../../Components/context/SceContext.js'; import { getEventByID, updateSCEvent } from '../../APIFunctions/SCEvents.js'; import CreateEventFormQuestionBlock from './CreateEventFormQuestionBlock.js'; import { membershipState } from '../../Enums'; -import config from '../../config/config.json'; /** Matches SCEvents `max_attendees` when there is no cap. */ const UNLIMITED_ATTENDEES = -1; @@ -46,7 +45,6 @@ export default function EditEventPage() { const { id } = useParams(); const { user } = useSCE(); const history = useHistory(); - const isSCEventsEnabled = config.SCEvents?.ENABLED; const [isLoading, setIsLoading] = useState(true); const [fetchError, setFetchError] = useState(''); @@ -96,12 +94,8 @@ export default function EditEventPage() { setEventAdmins(evt.admins || []); } - if (!isSCEventsEnabled) { - return; - } - loadEvent(); - }, [id, isSCEventsEnabled]); + }, [id]); function addQuestion() { setQuestions((prev) => [...prev, newQuestionTemplate()]); @@ -229,10 +223,6 @@ export default function EditEventPage() { history.push('/events'); } - if (!isSCEventsEnabled) { - return ; - } - if (!isOfficerOrAdmin) { return (
diff --git a/src/Pages/Events/Events.js b/src/Pages/Events/Events.js index 83be3d926..bf949bb0e 100644 --- a/src/Pages/Events/Events.js +++ b/src/Pages/Events/Events.js @@ -1,6 +1,5 @@ import React, { useEffect, useState } from 'react'; -import config from '../../config/config.json'; -import { Link, Redirect } from 'react-router-dom'; +import { Link } from 'react-router-dom'; import { getAllSCEvents, getEventAttendanceSummary } from '../../APIFunctions/SCEvents'; import { useSCE } from '../../Components/context/SceContext'; import { membershipState } from '../../Enums'; @@ -281,14 +280,11 @@ export default function EventsPage() { const [isLoading, setIsLoading] = useState(true); const [hasError, setHasError] = useState(false); - const isSCEventsEnabled = config.SCEvents?.ENABLED; const canCreateEvent = user?.accessLevel >= membershipState.OFFICER; const visibleEvents = events.filter((event) => canUserSeeEvent(event, user)); const isAdminView = canCreateEvent; useEffect(() => { - if (!isSCEventsEnabled) return; - async function fetchEvents() { setIsLoading(true); setHasError(false); @@ -305,11 +301,7 @@ export default function EventsPage() { } fetchEvents(); - }, [isSCEventsEnabled]); - - if (!isSCEventsEnabled) { - return ; - } + }, []); return (
diff --git a/src/Pages/Events/EventsRegistation.js b/src/Pages/Events/EventsRegistation.js index 8348f9743..83d0c7cc8 100644 --- a/src/Pages/Events/EventsRegistation.js +++ b/src/Pages/Events/EventsRegistation.js @@ -1,7 +1,6 @@ /* eslint-disable camelcase -- mirrors SCEvents JSON field names in state and payloads */ import React, { useState, useEffect } from 'react'; -import { useParams, useHistory, Redirect } from 'react-router-dom'; -import config from '../../config/config.json'; +import { useParams, useHistory } from 'react-router-dom'; import { useSCE } from '../../Components/context/SceContext'; import { getEventByID, getEventAttendanceSummary, registerForSCEvent } from '../../APIFunctions/SCEvents'; @@ -24,7 +23,6 @@ export default function EventRegistration() { const { user } = useSCE(); const { id } = useParams(); const history = useHistory(); - const isSCEventsEnabled = Boolean(config.SCEvents?.ENABLED); const [event, setEvent] = useState(null); const [formData, setFormData] = useState({}); const [isLoading, setIsLoading] = useState(true); @@ -36,10 +34,6 @@ export default function EventRegistration() { const [attendanceLoading, setAttendanceLoading] = useState(false); useEffect(() => { - if (!isSCEventsEnabled) { - return; - } - async function fetchEvent() { setIsLoading(true); setHasError(false); @@ -58,10 +52,10 @@ export default function EventRegistration() { setIsLoading(false); } fetchEvent(); - }, [id, isSCEventsEnabled]); + }, [id]); useEffect(() => { - if (!isSCEventsEnabled || !id) { + if (!id) { return; } let isCurrent = true; @@ -86,11 +80,7 @@ export default function EventRegistration() { return () => { isCurrent = false; }; - }, [id, isSCEventsEnabled]); - - if (!isSCEventsEnabled) { - return ; - } + }, [id]); const handleInputChange = (fieldId, value, type) => { if (type === 'checkbox') { diff --git a/src/Routes.js b/src/Routes.js index d57d97ad5..3768c1e3c 100644 --- a/src/Routes.js +++ b/src/Routes.js @@ -186,6 +186,14 @@ export const officerOrAdminRoutes = [ redirect: '/', inAdminNavbar: false }, + { + Component: EventsPage, + path: '/events', + pageName: 'Events', + allowedIf: allowedIf.OFFICER_OR_ADMIN, + redirect: '/', + inAdminNavbar: true + }, ...memberRoutes, ]; @@ -217,11 +225,6 @@ export const signedOutRoutes = [ path: '/projects', pageName: 'Projects' }, - { - Component: EventsPage, - path: '/events', - pageName: 'Events' - }, { Component: EventRegistration, path: '/events/:id/register', diff --git a/src/config/config.example.json b/src/config/config.example.json index 031ea1559..1afbb2902 100644 --- a/src/config/config.example.json +++ b/src/config/config.example.json @@ -3,6 +3,6 @@ "TINYMCE_API_KEY": "XXXXXXXXXXXXXXXXXXXXX", "GOOGLE_API_CLIENT_ID": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.apps.googleusercontent.com", "SCEvents": { - "ENABLED": false + "BASE_URL": "/api/scevents" } }