From aca2a8424a5400889c85c41fe861d517502e2221 Mon Sep 17 00:00:00 2001 From: Dalton Burkhart Date: Wed, 3 Dec 2025 20:45:33 -0500 Subject: [PATCH 01/11] Final commit --- apps/backend/src/auth/auth.controller.ts | 2 +- apps/backend/src/auth/auth.service.ts | 2 +- apps/backend/src/config/typeorm.ts | 2 + ...4811878152-RemoveMultipleVolunteerTypes.ts | 43 +++++++ apps/backend/src/users/types.ts | 10 +- apps/backend/src/users/user.entity.ts | 2 +- .../src/users/users.controller.spec.ts | 9 +- apps/backend/src/users/users.controller.ts | 3 +- apps/backend/src/users/users.service.spec.ts | 4 +- .../src/containers/volunteerManagement.tsx | 106 ------------------ apps/frontend/src/types/types.ts | 8 +- 11 files changed, 57 insertions(+), 134 deletions(-) create mode 100644 apps/backend/src/migrations/1764811878152-RemoveMultipleVolunteerTypes.ts diff --git a/apps/backend/src/auth/auth.controller.ts b/apps/backend/src/auth/auth.controller.ts index 7f603f00..ec741008 100644 --- a/apps/backend/src/auth/auth.controller.ts +++ b/apps/backend/src/auth/auth.controller.ts @@ -34,7 +34,7 @@ export class AuthController { signUpDto.firstName, signUpDto.lastName, signUpDto.phone, - Role.STANDARD_VOLUNTEER, + Role.VOLUNTEER, ); return user; diff --git a/apps/backend/src/auth/auth.service.ts b/apps/backend/src/auth/auth.service.ts index 2d56324c..a0bae3ad 100644 --- a/apps/backend/src/auth/auth.service.ts +++ b/apps/backend/src/auth/auth.service.ts @@ -60,7 +60,7 @@ export class AuthService { async signup( { firstName, lastName, email, password }: SignUpDto, - role: Role = Role.STANDARD_VOLUNTEER, + role: Role = Role.VOLUNTEER, ): Promise { // Needs error handling const signUpCommand = new SignUpCommand({ diff --git a/apps/backend/src/config/typeorm.ts b/apps/backend/src/config/typeorm.ts index b356b698..a10391d2 100644 --- a/apps/backend/src/config/typeorm.ts +++ b/apps/backend/src/config/typeorm.ts @@ -22,6 +22,7 @@ import { UpdatePantriesTable1742739750279 } from '../migrations/1742739750279-up import { RemoveOrdersDonationId1761500262238 } from '../migrations/1761500262238-RemoveOrdersDonationId'; import { AllergyFriendlyToBoolType1763963056712 } from '../migrations/1763963056712-AllergyFriendlyToBoolType'; import { UpdatePantryUserFieldsFixed1764350314832 } from '../migrations/1764350314832-UpdatePantryUserFieldsFixed'; +import { RemoveMultipleVolunteerTypes1764811878152 } from '../migrations/1764811878152-RemoveMultipleVolunteerTypes'; const config = { type: 'postgres', @@ -57,6 +58,7 @@ const config = { RemoveOrdersDonationId1761500262238, AllergyFriendlyToBoolType1763963056712, UpdatePantryUserFieldsFixed1764350314832, + RemoveMultipleVolunteerTypes1764811878152, ], }; diff --git a/apps/backend/src/migrations/1764811878152-RemoveMultipleVolunteerTypes.ts b/apps/backend/src/migrations/1764811878152-RemoveMultipleVolunteerTypes.ts new file mode 100644 index 00000000..79f16ea4 --- /dev/null +++ b/apps/backend/src/migrations/1764811878152-RemoveMultipleVolunteerTypes.ts @@ -0,0 +1,43 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class RemoveMultipleVolunteerTypes1764811878152 implements MigrationInterface { + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(` + ALTER TABLE users + DROP COLUMN role; + DROP TYPE IF EXISTS users_role_enum; + + CREATE TYPE "users_role_enum" AS ENUM ( + 'admin', + 'volunteer', + 'pantry', + 'food_manufacturer' + ); + + ALTER TABLE users + ADD COLUMN role users_role_enum NOT NULL DEFAULT 'volunteer'; + `); + + + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(` + ALTER TABLE users + DROP COLUMN role; + DROP TYPE IF EXISTS users_role_enum; + + CREATE TYPE "users_role_enum" AS ENUM ( + 'admin', + 'lead_volunteer', + 'standard_volunteer', + 'pantry', + 'food_manufacturer' + ); + + ALTER TABLE users + ADD COLUMN role users_role_enum NOT NULL DEFAULT 'standard_volunteer'; + `); + } + +} diff --git a/apps/backend/src/users/types.ts b/apps/backend/src/users/types.ts index 4eb7f295..695cbc44 100644 --- a/apps/backend/src/users/types.ts +++ b/apps/backend/src/users/types.ts @@ -1,14 +1,6 @@ export enum Role { ADMIN = 'admin', - LEAD_VOLUNTEER = 'lead_volunteer', - STANDARD_VOLUNTEER = 'standard_volunteer', + VOLUNTEER = 'volunteer', PANTRY = 'pantry', FOODMANUFACTURER = 'food_manufacturer', } - -export const VOLUNTEER_ROLES: Role[] = [ - Role.LEAD_VOLUNTEER, - Role.STANDARD_VOLUNTEER, -]; - -export type VolunteerType = (typeof VOLUNTEER_ROLES)[number]; diff --git a/apps/backend/src/users/user.entity.ts b/apps/backend/src/users/user.entity.ts index b0d95316..1679e986 100644 --- a/apps/backend/src/users/user.entity.ts +++ b/apps/backend/src/users/user.entity.ts @@ -12,7 +12,7 @@ export class User { name: 'role', enum: Role, enumName: 'users_role_enum', - default: Role.STANDARD_VOLUNTEER, + default: Role.VOLUNTEER, }) role: Role; diff --git a/apps/backend/src/users/users.controller.spec.ts b/apps/backend/src/users/users.controller.spec.ts index 78d116a3..48d0f14d 100644 --- a/apps/backend/src/users/users.controller.spec.ts +++ b/apps/backend/src/users/users.controller.spec.ts @@ -16,7 +16,7 @@ const mockUser1: User = { firstName: 'John', lastName: 'Doe', phone: '1234567890', - role: Role.STANDARD_VOLUNTEER, + role: Role.VOLUNTEER, }; const mockUser2: User = { @@ -25,7 +25,7 @@ const mockUser2: User = { firstName: 'Bob', lastName: 'Smith', phone: '9876', - role: Role.LEAD_VOLUNTEER, + role: Role.VOLUNTEER, }; describe('UsersController', () => { @@ -67,8 +67,7 @@ describe('UsersController', () => { expect(result).toEqual(volunteers); expect(mockUserService.findUsersByRoles).toHaveBeenCalledWith([ - Role.LEAD_VOLUNTEER, - Role.STANDARD_VOLUNTEER, + Role.VOLUNTEER ]); }); }); @@ -147,7 +146,7 @@ describe('UsersController', () => { firstName: 'Jane', lastName: 'Smith', phone: '9876543210', - role: Role.STANDARD_VOLUNTEER, + role: Role.VOLUNTEER, }; const error = new Error('Database error'); diff --git a/apps/backend/src/users/users.controller.ts b/apps/backend/src/users/users.controller.ts index 93a4dc01..9df01afc 100644 --- a/apps/backend/src/users/users.controller.ts +++ b/apps/backend/src/users/users.controller.ts @@ -15,7 +15,6 @@ import { UsersService } from './users.service'; //import { AuthGuard } from '@nestjs/passport'; import { User } from './user.entity'; import { Role } from './types'; -import { VOLUNTEER_ROLES } from './types'; import { userSchemaDto } from './dtos/userSchema.dto'; //import { CurrentUserInterceptor } from '../interceptors/current-user.interceptor'; @@ -26,7 +25,7 @@ export class UsersController { @Get('/volunteers') async getAllVolunteers(): Promise { - return this.usersService.findUsersByRoles(VOLUNTEER_ROLES); + return this.usersService.findUsersByRoles([Role.VOLUNTEER]); } // @UseGuards(AuthGuard('jwt')) diff --git a/apps/backend/src/users/users.service.spec.ts b/apps/backend/src/users/users.service.spec.ts index 8388a79a..c30b8628 100644 --- a/apps/backend/src/users/users.service.spec.ts +++ b/apps/backend/src/users/users.service.spec.ts @@ -17,7 +17,7 @@ const mockUser: User = { firstName: 'John', lastName: 'Doe', phone: '1234567890', - role: Role.STANDARD_VOLUNTEER, + role: Role.VOLUNTEER, }; describe('UsersService', () => { @@ -189,7 +189,7 @@ describe('UsersService', () => { describe('findUsersByRoles', () => { it('should return users by roles', async () => { - const roles = [Role.ADMIN, Role.LEAD_VOLUNTEER]; + const roles = [Role.ADMIN, Role.VOLUNTEER]; const users = [mockUser]; mockUserRepository.find.mockResolvedValue(users); diff --git a/apps/frontend/src/containers/volunteerManagement.tsx b/apps/frontend/src/containers/volunteerManagement.tsx index b2c9a43f..b241d316 100644 --- a/apps/frontend/src/containers/volunteerManagement.tsx +++ b/apps/frontend/src/containers/volunteerManagement.tsx @@ -7,17 +7,10 @@ import { Button, Flex, Input, - Menu, - Checkbox, VStack, Box, - Portal, - NativeSelect, - NativeSelectIndicator, } from '@chakra-ui/react'; -import { VolunteerType } from '../types/types'; import { Link } from 'react-router-dom'; -import { ChevronDownIcon } from 'lucide-react'; import { User } from '../types/types'; import ApiClient from '@api/apiClient'; @@ -50,53 +43,12 @@ const VolunteerManagement: React.FC = () => { ); }); - const volunteerTypeDropdown = ({ - volunteerType, - volunteerId, - }: { - volunteerType: VolunteerType; - volunteerId: number; - }) => { - return ( - - - handleVolunteerTypeChange( - e.target.value as VolunteerType, - volunteerId, - ) - } - > - {Object.entries(DISPLAY_VOLUNTEER_TYPES).map(([key, label]) => ( - - ))} - - - - ); - }; - const handleSearchNameChange = ( event: React.ChangeEvent, ) => { setSearchName(event.target.value); }; - const handleVolunteerFilterChange = (type: string, checked: boolean) => { - if (checked) { - setCheckedTypes([...checkedTypes, type.toUpperCase()]); - } else { - setCheckedTypes( - checkedTypes.filter( - (checkedType) => checkedType !== type.toUpperCase(), - ), - ); - } - }; - const handleReset = () => { setSearchName(''); setCheckedTypes([]); @@ -121,20 +73,6 @@ const VolunteerManagement: React.FC = () => { } }; - const handleVolunteerTypeChange = ( - type: VolunteerType, - volunteerId: number, - ) => { - setChangedVolunteers((prev) => - prev.map((a) => (a.id === volunteerId ? { ...a, role: type } : a)), - ); - }; - - const DISPLAY_VOLUNTEER_TYPES: Record = { - LEAD_VOLUNTEER: 'Lead Volunteer', - STANDARD_VOLUNTEER: 'Standard Volunteer', - }; - return (
Pantry Volunteer Management @@ -152,40 +90,6 @@ const VolunteerManagement: React.FC = () => { value={searchName} onChange={handleSearchNameChange} /> - - - - - - - - {Object.values(VolunteerType).map((volunteerType) => ( - - - handleVolunteerFilterChange(volunteerType, e.checked) - } - > - - - - {DISPLAY_VOLUNTEER_TYPES[ - volunteerType.toUpperCase() - ] || volunteerType} - - - - ))} - - - - @@ -202,7 +106,6 @@ const VolunteerManagement: React.FC = () => { Volunteer Name Email Phone - Type Assigned Pantries @@ -214,15 +117,6 @@ const VolunteerManagement: React.FC = () => { {volunteer.email} {volunteer.phone} - - {volunteerTypeDropdown({ - volunteerType: - VolunteerType[ - volunteer.role.toUpperCase() as keyof typeof VolunteerType - ], - volunteerId: volunteer.id, - })} -