1- import express from 'express' ;
1+ import express , { Router } from 'express' ;
22import cors from 'cors' ;
33import cookieParser from 'cookie-parser' ;
44import { getUserAndOrganization , prodHeaders , requireJwtDev , requireJwtProd } from './src/utils/auth.utils.js' ;
@@ -12,19 +12,21 @@ import descriptionBulletsRouter from './src/routes/description-bullets.routes.js
1212import tasksRouter from './src/routes/tasks.routes.js' ;
1313import reimbursementRequestsRouter from './src/routes/reimbursement-requests.routes.js' ;
1414import notificationsRouter from './src/routes/notifications.routes.js' ;
15- import designReviewsRouter from './src/routes/design-reviews.routes.js' ;
1615import wbsElementTemplatesRouter from './src/routes/wbs-element-templates.routes.js' ;
1716import carsRouter from './src/routes/cars.routes.js' ;
1817import organizationRouter from './src/routes/organizations.routes.js' ;
1918import recruitmentRouter from './src/routes/recruitment.routes.js' ;
20- import { slackEvents } from './src/routes/slack.routes.js' ;
19+ import { getReceiver } from './src/integrations/slack.js' ;
20+ import './src/routes/slack.routes.js' ;
2121import announcementsRouter from './src/routes/announcements.routes.js' ;
2222import onboardingRouter from './src/routes/onboarding.routes.js' ;
2323import popUpsRouter from './src/routes/pop-up.routes.js' ;
2424import statisticsRouter from './src/routes/statistics.routes.js' ;
2525import retrospectiveRouter from './src/routes/retrospective.routes.js' ;
2626import partsRouter from './src/routes/parts.routes.js' ;
2727import financeRouter from './src/routes/finance.routes.js' ;
28+ import calendarRouter from './src/routes/calendar.routes.js' ;
29+ import prospectiveSponsorRouter from './src/routes/prospective-sponsor.routes.js' ;
2830
2931const app = express ( ) ;
3032
@@ -61,9 +63,15 @@ const options: cors.CorsOptions = {
6163 allowedHeaders
6264} ;
6365
64- // so we can listen to slack messages
65- // NOTE: must be done before using json
66- app . use ( '/slack' , slackEvents . requestListener ( ) ) ;
66+ // Mount Slack Bolt receiver BEFORE other middleware to handle raw body parsing
67+ // Bolt's receiver handles its own body parsing and request verification
68+ // The receiver is configured to handle requests at /slack/events
69+ // Only mount if Slack is configured (when SLACK_BOT_TOKEN is set)
70+ const receiver = getReceiver ( ) ;
71+ if ( receiver ) {
72+ app . use ( receiver . router as unknown as Router ) ;
73+ }
74+
6775app . get ( '/health' , ( _req , res ) => {
6876 res . status ( 200 ) . json ( { status : 'healthy' } ) ;
6977} ) ;
@@ -90,7 +98,6 @@ app.use('/change-requests', changeRequestsRouter);
9098app . use ( '/description-bullets' , descriptionBulletsRouter ) ;
9199app . use ( '/tasks' , tasksRouter ) ;
92100app . use ( '/reimbursement-requests' , reimbursementRequestsRouter ) ;
93- app . use ( '/design-reviews' , designReviewsRouter ) ;
94101app . use ( '/notifications' , notificationsRouter ) ;
95102app . use ( '/templates' , wbsElementTemplatesRouter ) ;
96103app . use ( '/cars' , carsRouter ) ;
@@ -103,6 +110,8 @@ app.use('/statistics', statisticsRouter);
103110app . use ( '/retrospective' , retrospectiveRouter ) ;
104111app . use ( '/parts' , partsRouter ) ;
105112app . use ( '/finance' , financeRouter ) ;
113+ app . use ( '/calendar' , calendarRouter ) ;
114+ app . use ( '/prospective-sponsors' , prospectiveSponsorRouter ) ;
106115app . use ( '/' , ( _req , res ) => {
107116 res . status ( 200 ) . json ( 'Welcome to FinishLine' ) ;
108117} ) ;
0 commit comments