diff --git a/src/backend/src/prisma/migrations/20240910005616_add_logo_image_featured_project/migration.sql b/src/backend/src/prisma/migrations/20240910005616_add_logo_image_featured_project/migration.sql new file mode 100644 index 000000000..fe5771a6b --- /dev/null +++ b/src/backend/src/prisma/migrations/20240910005616_add_logo_image_featured_project/migration.sql @@ -0,0 +1,8 @@ +-- AlterTable +ALTER TABLE "Organization" ADD COLUMN "logoImage" TEXT; + +-- AlterTable +ALTER TABLE "Project" ADD COLUMN "organizationId" TEXT; + +-- AddForeignKey +ALTER TABLE "Project" ADD CONSTRAINT "Project_organizationId_fkey" FOREIGN KEY ("organizationId") REFERENCES "Organization"("organizationId") ON DELETE SET NULL ON UPDATE CASCADE; diff --git a/src/backend/src/prisma/migrations/20240911164338_changed_logo_image_name_to_logo_image_id/migration.sql b/src/backend/src/prisma/migrations/20240911164338_changed_logo_image_name_to_logo_image_id/migration.sql new file mode 100644 index 000000000..2ddd9fa7b --- /dev/null +++ b/src/backend/src/prisma/migrations/20240911164338_changed_logo_image_name_to_logo_image_id/migration.sql @@ -0,0 +1,9 @@ +/* + Warnings: + + - You are about to drop the column `logoImage` on the `Organization` table. All the data in the column will be lost. + +*/ +-- AlterTable +ALTER TABLE "Organization" DROP COLUMN "logoImage", +ADD COLUMN "logoImageId" TEXT; diff --git a/src/backend/src/prisma/schema.prisma b/src/backend/src/prisma/schema.prisma index 2c7863e01..6903ac1bf 100644 --- a/src/backend/src/prisma/schema.prisma +++ b/src/backend/src/prisma/schema.prisma @@ -382,16 +382,18 @@ model WBS_Element { } model Project { - projectId String @id @default(uuid()) - wbsElementId String @unique - wbsElement WBS_Element @relation(fields: [wbsElementId], references: [wbsElementId]) - budget Int @default(0) - summary String - workPackages Work_Package[] - carId String - car Car @relation(fields: [carId], references: [carId]) - teams Team[] @relation(name: "assignedBy") - favoritedBy User[] @relation(name: "favoritedBy") + projectId String @id @default(uuid()) + wbsElementId String @unique + wbsElement WBS_Element @relation(fields: [wbsElementId], references: [wbsElementId]) + budget Int @default(0) + summary String + workPackages Work_Package[] + carId String + car Car @relation(fields: [carId], references: [carId]) + teams Team[] @relation(name: "assignedBy") + favoritedBy User[] @relation(name: "favoritedBy") + organizationId String? + organization Organization? @relation(fields: [organizationId], references: [organizationId]) } model Work_Package { @@ -872,6 +874,7 @@ model Organization { description String applyInterestImageId String? @unique exploreAsGuestImageId String? @unique + logoImageId String? // Relation references wbsElements WBS_Element[] @@ -893,20 +896,21 @@ model Organization { usefulLinks Link[] FrequentlyAskedQuestions FrequentlyAskedQuestion[] Milestone Milestone[] + featuredProjects Project[] } model FrequentlyAskedQuestion { - faqId String @id @default(uuid()) - question String - answer String - userCreated User @relation(fields: [userCreatedId], references: [userId], name: "frequentlyAskedQuestionCreator") - userCreatedId String - userDeleted User? @relation(fields: [userDeletedId], references: [userId], name: "frequentlyAskedQuestionDeleter") - userDeletedId String? - dateCreated DateTime @default(now()) - dateDeleted DateTime? - organizationId String - organization Organization @relation(fields: [organizationId], references: [organizationId]) + faqId String @id @default(uuid()) + question String + answer String + userCreated User @relation(fields: [userCreatedId], references: [userId], name: "frequentlyAskedQuestionCreator") + userCreatedId String + userDeleted User? @relation(fields: [userDeletedId], references: [userId], name: "frequentlyAskedQuestionDeleter") + userDeletedId String? + dateCreated DateTime @default(now()) + dateDeleted DateTime? + organizationId String + organization Organization @relation(fields: [organizationId], references: [organizationId]) } model Milestone { diff --git a/src/backend/src/utils/teams.utils.ts b/src/backend/src/utils/teams.utils.ts index 087ebc37a..8fb7c7ce2 100644 --- a/src/backend/src/utils/teams.utils.ts +++ b/src/backend/src/utils/teams.utils.ts @@ -1,5 +1,7 @@ -import { Prisma, User, Team } from '@prisma/client'; +import { Prisma, User, Team, Project } from '@prisma/client'; +import prisma from '../prisma/prisma'; import { UserWithSettings } from './auth.utils'; +import { NotFoundException } from './errors.utils'; const teamQueryArgsMembersOnly = Prisma.validator()({ include: { @@ -88,3 +90,23 @@ export const removeUsersFromList = (currentUsers: UserWithId[], usersToRemove: U const userIdsToRemove = usersToRemove.map((user) => user.userId); return currentUsers.filter((user) => !userIdsToRemove.includes(user.userId)); }; + +/** + * Given a team id, produces all of the projects assigned to that team + * @param teamId the id of the team + * @returns array of projects currently assigned to the given team (errors if no team is found) + */ +export const getTeamProjects = async (teamId: string): Promise => { + const team = await prisma.team.findUnique({ + where: { + teamId + }, + include: { + projects: true + } + }); + if (!team) { + throw new NotFoundException('Team', teamId); + } + return team.projects; +}; diff --git a/src/frontend/src/pages/AdminToolsPage/AdminToolsPage.tsx b/src/frontend/src/pages/AdminToolsPage/AdminToolsPage.tsx index 9cdf7d1ad..4a68e3cfe 100644 --- a/src/frontend/src/pages/AdminToolsPage/AdminToolsPage.tsx +++ b/src/frontend/src/pages/AdminToolsPage/AdminToolsPage.tsx @@ -40,6 +40,7 @@ const AdminToolsPage: React.FC = () => { } if (isUserAdmin) { tabs.push({ tabUrlValue: 'recruitment', tabName: 'Recruitment' }); + tabs.push({ tabUrlValue: 'guest-view', tabName: 'Guest View' }); tabs.push({ tabUrlValue: 'miscellaneous', tabName: 'Miscellaneous' }); } @@ -91,6 +92,8 @@ const AdminToolsPage: React.FC = () => { ) : tabIndex === 3 ? ( + ) : tabIndex === 4 ? ( + ) : (