Skip to content

Commit 84f75ec

Browse files
committed
Merge branch 'develop' into #4042-SaraJohnson-credits
2 parents 1fd83f4 + df34297 commit 84f75ec

390 files changed

Lines changed: 46067 additions & 10474 deletions

File tree

Some content is hidden

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

.github/workflows/system-tests.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ on:
55
push:
66
branches:
77
- main
8+
- multitenancy
89
- develop
910
- feature/**
1011

.gitignore

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@
2828
*.env
2929
.agent
3030

31+
# Generated Claude skills (source is src/docs-site/docs/)
32+
.claude/skills/
33+
3134
npm-debug.log*
3235
yarn-debug.log*
3336
yarn-error.log*
@@ -64,3 +67,8 @@ eb-deploy/
6467
# Docker
6568
*.bak
6669
*.backup
70+
71+
# Claude Code Files
72+
CLAUDE.md
73+
.playwright-mcp/
74+
docs/

Dockerfile

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# Build stage - compile TypeScript
2-
FROM node:20 AS builder
2+
FROM node:25 AS builder
33
WORKDIR /app
44

55
COPY package.json tsconfig.build.json ./
@@ -11,11 +11,11 @@ RUN cd src/backend && npx prisma generate
1111
RUN yarn build:shared
1212
RUN yarn build:backend
1313

14-
FROM node:20-slim
14+
FROM platformatic/node-caged:25-slim
1515
WORKDIR /app
1616

1717
# Install OpenSSL for Prisma (slim image needs this)
18-
RUN apt-get update -y && apt-get install -y openssl && rm -rf /var/lib/apt/lists/*
18+
RUN apt-get update -y && apt-get install -y openssl && rm -rf /var/lib/apt/lists/* && npm install -g yarn
1919

2020
COPY package.json ./
2121

devContainerization/Dockerfile.backend.dev

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
FROM node:20
1+
FROM node:25
22

33
COPY package.json tsconfig.build.json ./
44
COPY ./src/backend/package.json ./src/backend/tsconfig.json src/backend/

devContainerization/Dockerfile.frontend.dev

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
FROM node:20-alpine
1+
FROM node:25-alpine
22

33
COPY package.json tsconfig.build.json ./
44
COPY ./src/frontend/package.json ./src/frontend/tsconfig.json src/frontend/
@@ -11,4 +11,4 @@ COPY ./src/frontend src/frontend
1111
COPY ./src/shared src/shared
1212

1313
EXPOSE 3000
14-
CMD [ "yarn", "workspace", "frontend", "vite", "--force", "--host" ]
14+
CMD [ "yarn", "workspace", "frontend", "vite", "--force", "--host" ]

infrastructure/modules/amplify-frontend/main.tf

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,6 @@ resource "aws_amplify_app" "frontend" {
2929
baseDirectory: src/frontend/dist
3030
files:
3131
- '**/*'
32-
cache:
33-
paths:
34-
- node_modules/**/*
35-
- src/frontend/node_modules/**/*
36-
- src/backend/node_modules/**/*
37-
- src/shared/node_modules/**/*
3832
EOT
3933

4034
# Environment variables for the build

package.json

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,15 @@
66
"workspaces": [
77
"src/backend",
88
"src/frontend",
9-
"src/shared"
9+
"src/shared",
10+
"src/docs-site"
1011
],
1112
"scripts": {
1213
"prettier-check": "yarn prettier --check .",
1314
"frontend": "yarn workspace frontend start",
1415
"backend": "yarn workspace backend start",
1516
"backend:dev": "yarn workspace backend dev",
16-
"start": "yarn workspace shared build; concurrently --kill-others-on-fail \"yarn backend:dev\" \"yarn frontend\"",
17+
"start": "yarn workspace shared build; concurrently --kill-others-on-fail --hide 2 \"yarn backend:dev\" \"yarn frontend\" \"yarn docs:dev\"",
1718
"prisma:seed": "cd src/backend; npx prisma db seed",
1819
"prisma:reset:force": "yarn workspace shared build; cd src/backend; npx prisma migrate reset --force",
1920
"prisma:reset": "yarn workspace shared build; cd src/backend; npx prisma migrate reset",
@@ -59,7 +60,11 @@
5960
"docker:i": "cd devContainerization && docker compose -f docker-compose.dev.yml exec -T backend sh -c \"yarn install && cd src/backend && npx prisma generate\" && docker compose -f docker-compose.dev.yml exec -T frontend sh -c \"yarn install\"",
6061
"docker:test": "yarn test:setup && cd devContainerization && docker compose -f docker-compose.dev.yml exec backend bash -c \"yarn test:backend\" && docker compose -f docker-compose.dev.yml exec frontend sh -c \"yarn test:frontend\" && yarn test:teardown",
6162
"docker:rebuild": "docker compose -f devContainerization/docker-compose.dev.yml rm -f -s && yarn docker:start",
62-
"db:pull": "node scripts/db-pull.mjs"
63+
"db:pull": "node scripts/db-pull.mjs",
64+
"docs:dev": "yarn workspace finishline-docs docs:dev",
65+
"docs:build": "yarn workspace finishline-docs docs:build",
66+
"docs:serve": "yarn workspace finishline-docs serve",
67+
"skills:sync": "yarn workspace finishline-docs sync-skills"
6368
},
6469
"resolutions": {
6570
"@types/react": "17.0.1",
@@ -81,7 +86,7 @@
8186
"@babel/preset-typescript": "^7.18.6",
8287
"@types/canvas-confetti": "^1.9.0",
8388
"@types/jest": "^29.5.14",
84-
"@types/node": "20.0.0",
89+
"@types/node": "^25.0.0",
8590
"@typescript-eslint/eslint-plugin": "8.20.0",
8691
"@typescript-eslint/parser": "8.20.0",
8792
"concurrently": "^9.1.0",
@@ -153,6 +158,8 @@
153158
"build",
154159
"coverage",
155160
"docs",
161+
"src/docs-site/.docusaurus",
162+
"src/docs-site/build",
156163
"lambda",
157164
"node_modules",
158165
"public",

src/backend/Dockerfile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
# TO BE RUN FROM DOCKER COMPOSE. DO NOT RUN MANUALLY AS CONTEXT IS NOT SET CORRECTLY
2-
FROM node:20
2+
FROM platformatic/node-caged:25-slim
3+
RUN npm install -g yarn
34

45
WORKDIR /base
56

src/backend/index.ts

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import express from 'express';
1+
import express, { Router } from 'express';
22
import cors from 'cors';
33
import cookieParser from 'cookie-parser';
44
import { getUserAndOrganization, prodHeaders, requireJwtDev, requireJwtProd } from './src/utils/auth.utils.js';
@@ -12,19 +12,21 @@ import descriptionBulletsRouter from './src/routes/description-bullets.routes.js
1212
import tasksRouter from './src/routes/tasks.routes.js';
1313
import reimbursementRequestsRouter from './src/routes/reimbursement-requests.routes.js';
1414
import notificationsRouter from './src/routes/notifications.routes.js';
15-
import designReviewsRouter from './src/routes/design-reviews.routes.js';
1615
import wbsElementTemplatesRouter from './src/routes/wbs-element-templates.routes.js';
1716
import carsRouter from './src/routes/cars.routes.js';
1817
import organizationRouter from './src/routes/organizations.routes.js';
1918
import 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';
2121
import announcementsRouter from './src/routes/announcements.routes.js';
2222
import onboardingRouter from './src/routes/onboarding.routes.js';
2323
import popUpsRouter from './src/routes/pop-up.routes.js';
2424
import statisticsRouter from './src/routes/statistics.routes.js';
2525
import retrospectiveRouter from './src/routes/retrospective.routes.js';
2626
import partsRouter from './src/routes/parts.routes.js';
2727
import 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

2931
const 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+
6775
app.get('/health', (_req, res) => {
6876
res.status(200).json({ status: 'healthy' });
6977
});
@@ -90,7 +98,6 @@ app.use('/change-requests', changeRequestsRouter);
9098
app.use('/description-bullets', descriptionBulletsRouter);
9199
app.use('/tasks', tasksRouter);
92100
app.use('/reimbursement-requests', reimbursementRequestsRouter);
93-
app.use('/design-reviews', designReviewsRouter);
94101
app.use('/notifications', notificationsRouter);
95102
app.use('/templates', wbsElementTemplatesRouter);
96103
app.use('/cars', carsRouter);
@@ -103,6 +110,8 @@ app.use('/statistics', statisticsRouter);
103110
app.use('/retrospective', retrospectiveRouter);
104111
app.use('/parts', partsRouter);
105112
app.use('/finance', financeRouter);
113+
app.use('/calendar', calendarRouter);
114+
app.use('/prospective-sponsors', prospectiveSponsorRouter);
106115
app.use('/', (_req, res) => {
107116
res.status(200).json('Welcome to FinishLine');
108117
});

src/backend/package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@
1111
},
1212
"dependencies": {
1313
"@prisma/client": "^6.2.1",
14-
"@slack/events-api": "^3.0.1",
15-
"@slack/web-api": "^7.8.0",
14+
"@slack/bolt": "^3.22.0",
1615
"@types/concat-stream": "^2.0.0",
1716
"@types/cookie-parser": "^1.4.3",
1817
"@types/cors": "^2.8.12",
@@ -23,6 +22,7 @@
2322
"concat-stream": "^2.0.0",
2423
"cookie-parser": "^1.4.5",
2524
"cors": "^2.8.5",
25+
"dayjs": "^1.11.19",
2626
"decimal.js": "^10.4.3",
2727
"dotenv": "^16.0.1",
2828
"express": "^5.0.0",
@@ -39,7 +39,7 @@
3939
"devDependencies": {
4040
"@types/express-jwt": "^6.0.4",
4141
"@types/jsonwebtoken": "^8.5.9",
42-
"@types/node": "^20.0.0",
42+
"@types/node": "^25.0.0",
4343
"@types/supertest": "^2.0.12",
4444
"nodemon": "^2.0.16",
4545
"supertest": "^6.2.4",

0 commit comments

Comments
 (0)