From cd8ede6a2e3151340b6c2a9dcf5e9baf4a0a50de Mon Sep 17 00:00:00 2001 From: Kalle <38327916+Sendouc@users.noreply.github.com> Date: Sun, 22 Sep 2024 13:54:03 +0300 Subject: [PATCH] Fix updating secondary team avatar/banner not possible Closes #1888 --- .../img-upload/actions/upload.server.ts | 17 ++++++++++++++--- app/features/img-upload/routes/upload.tsx | 10 ++++++++-- app/features/team/TeamRepository.server.ts | 15 --------------- app/features/team/routes/t.$customUrl.edit.tsx | 16 ++++++++++++++-- app/utils/urls.ts | 4 ++-- 5 files changed, 38 insertions(+), 24 deletions(-) diff --git a/app/features/img-upload/actions/upload.server.ts b/app/features/img-upload/actions/upload.server.ts index c56b68b5a..8e2a410c5 100644 --- a/app/features/img-upload/actions/upload.server.ts +++ b/app/features/img-upload/actions/upload.server.ts @@ -34,7 +34,7 @@ export const action = async ({ request }: ActionFunctionArgs) => { const team = validatedType === "team-pfp" || validatedType === "team-banner" - ? await validatedTeam(user) + ? await validatedTeam({ user, request }) : undefined; const organization = validatedType === "org-pfp" @@ -87,10 +87,21 @@ export const action = async ({ request }: ActionFunctionArgs) => { return null; }; -async function validatedTeam(user: { id: number }) { - const team = await TeamRepository.findMainByUserId(user.id); +async function validatedTeam({ + user, + request, +}: { user: { id: number }; request: Request }) { + const { team: teamCustomUrl } = parseSearchParams({ + request, + schema: z.object({ team: z.string() }), + }); + const team = await TeamRepository.findByCustomUrl(teamCustomUrl); validate(team, "You must be on a team to upload images"); + validate( + team.members.some((member) => member.id === user.id && member.isOwner), + "You must be on the team to upload images", + ); const detailedTeam = await TeamRepository.findByCustomUrl(team.customUrl); validate( detailedTeam && isTeamOwner({ team: detailedTeam, user }), diff --git a/app/features/img-upload/routes/upload.tsx b/app/features/img-upload/routes/upload.tsx index 711ad973c..e0a058f04 100644 --- a/app/features/img-upload/routes/upload.tsx +++ b/app/features/img-upload/routes/upload.tsx @@ -27,8 +27,14 @@ export const loader = async ({ request }: LoaderFunctionArgs) => { } if (validatedType === "team-pfp" || validatedType === "team-banner") { - const team = await TeamRepository.findMainByUserId(user.id); - if (!team) throw redirect("/"); + const teamCustomUrl = new URL(request.url).searchParams.get("team") ?? ""; + const team = await TeamRepository.findByCustomUrl(teamCustomUrl); + if ( + !team || + !team.members.some((member) => member.id === user.id && member.isOwner) + ) { + throw redirect("/"); + } const detailedTeam = await TeamRepository.findByCustomUrl(team.customUrl); diff --git a/app/features/team/TeamRepository.server.ts b/app/features/team/TeamRepository.server.ts index c4040befe..87d38fe2a 100644 --- a/app/features/team/TeamRepository.server.ts +++ b/app/features/team/TeamRepository.server.ts @@ -31,21 +31,6 @@ export function findAllUndisbanded() { .execute(); } -export function findMainByUserId(userId: number) { - return db - .selectFrom("TeamMember") - .innerJoin("Team", "Team.id", "TeamMember.teamId") - .leftJoin("UserSubmittedImage", "UserSubmittedImage.id", "Team.avatarImgId") - .select([ - "Team.id", - "Team.customUrl", - "Team.name", - "UserSubmittedImage.url as logoUrl", - ]) - .where("TeamMember.userId", "=", userId) - .executeTakeFirst(); -} - export function findAllMemberOfByUserId(userId: number) { return db .selectFrom("TeamMemberWithSecondary") diff --git a/app/features/team/routes/t.$customUrl.edit.tsx b/app/features/team/routes/t.$customUrl.edit.tsx index 2457efd70..aeaaf937a 100644 --- a/app/features/team/routes/t.$customUrl.edit.tsx +++ b/app/features/team/routes/t.$customUrl.edit.tsx @@ -174,17 +174,29 @@ export default function EditTeamPage() { function ImageUploadLinks() { const { t } = useTranslation(["team"]); + const { team } = useLoaderData(); + return (
  1. - + {t("team:forms.fields.uploadImages.pfp")}
  2. - + {t("team:forms.fields.uploadImages.banner")}
  3. diff --git a/app/utils/urls.ts b/app/utils/urls.ts index 6ff70696b..138d3e5dd 100644 --- a/app/utils/urls.ts +++ b/app/utils/urls.ts @@ -347,12 +347,12 @@ export const objectDamageCalculatorPage = (weaponId?: MainWeaponId) => export const uploadImagePage = ( args: - | { type: "team-pfp" | "team-banner" } + | { type: "team-pfp" | "team-banner"; teamCustomUrl: string } | { type: "org-pfp"; slug: string }, ) => args.type === "org-pfp" ? `/upload?type=${args.type}&slug=${args.slug}` - : `/upload?type=${args.type}`; + : `/upload?type=${args.type}&team=${args.teamCustomUrl}`; export const vodVideoPage = (videoId: number) => `${VODS_PAGE}/${videoId}`;