mirror of
https://github.com/Sendouc/sendou.ink.git
synced 2026-03-21 18:04:39 -05:00
* Initial * Handle owner leaving * Remove old team queries * Progress * Retire old toggle * e2e tests * Divide loaders/actions of team pages
64 lines
1.6 KiB
TypeScript
64 lines
1.6 KiB
TypeScript
import type { ActionFunction } from "@remix-run/node";
|
|
import { requireUserId } from "~/features/auth/core/user.server";
|
|
import {
|
|
notFoundIfFalsy,
|
|
parseRequestPayload,
|
|
validate,
|
|
} from "~/utils/remix.server";
|
|
import { assertUnreachable } from "~/utils/types";
|
|
import * as TeamRepository from "../TeamRepository.server";
|
|
import {
|
|
teamParamsSchema,
|
|
teamProfilePageActionSchema,
|
|
} from "../team-schemas.server";
|
|
import { isTeamMember, isTeamOwner, resolveNewOwner } from "../team-utils";
|
|
|
|
export const action: ActionFunction = async ({ request, params }) => {
|
|
const user = await requireUserId(request);
|
|
const data = await parseRequestPayload({
|
|
request,
|
|
schema: teamProfilePageActionSchema,
|
|
});
|
|
|
|
const { customUrl } = teamParamsSchema.parse(params);
|
|
const team = notFoundIfFalsy(await TeamRepository.findByCustomUrl(customUrl));
|
|
|
|
switch (data._action) {
|
|
case "LEAVE_TEAM": {
|
|
validate(
|
|
isTeamMember({ user, team }),
|
|
"You are not a member of this team",
|
|
);
|
|
|
|
const newOwner = isTeamOwner({ user, team })
|
|
? resolveNewOwner(team.members)
|
|
: null;
|
|
validate(
|
|
!isTeamOwner({ user, team }) || newOwner,
|
|
"You can't leave the team if you are the owner and there is no other member to become the owner",
|
|
);
|
|
|
|
await TeamRepository.handleMemberLeaving({
|
|
teamId: team.id,
|
|
userId: user.id,
|
|
newOwnerUserId: newOwner?.id,
|
|
});
|
|
|
|
break;
|
|
}
|
|
case "MAKE_MAIN_TEAM": {
|
|
await TeamRepository.switchMainTeam({
|
|
userId: user.id,
|
|
teamId: team.id,
|
|
});
|
|
|
|
break;
|
|
}
|
|
default: {
|
|
assertUnreachable(data);
|
|
}
|
|
}
|
|
|
|
return null;
|
|
};
|