Skip to content

Commit

Permalink
wip endorsement
Browse files Browse the repository at this point in the history
  • Loading branch information
paulhollmann committed May 19, 2024
1 parent cc35d78 commit 15dfa76
Show file tree
Hide file tree
Showing 3 changed files with 151 additions and 3 deletions.
44 changes: 43 additions & 1 deletion backend/src/controllers/user/UserEndorsementAdminController.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import _UserAdminValidator from "./_UserAdmin.validator";
import { EndorsementGroupsBelongsToUsers } from "../../models/through/EndorsementGroupsBelongsToUsers";
import { HttpStatusCode } from "axios";
import { EndorsementGroup } from "../../models/EndorsementGroup";
import { createEndorsement } from "../../libraries/vateud/VateudCoreLibrary";
import { createEndorsement, removeEndorsement } from "../../libraries/vateud/VateudCoreLibrary";

async function addEndorsement(request: Request, response: Response, next: NextFunction) {
try {
Expand Down Expand Up @@ -50,6 +50,48 @@ async function addEndorsement(request: Request, response: Response, next: NextFu
}
}

async function deleteEndorsement(request: Request, response: Response, next: NextFunction) {
try {
const requestingUser: User = response.locals.user;
const body = request.body as { user_endorsement_id: string };
_UserAdminValidator.validateCreateRequest(body);


const userEndorsement = await EndorsementGroupsBelongsToUsers.findOne({where: {
id: Number(body.user_endorsement_id),
},})


const user = await User.findOne({
where: {
id: userEndorsement?.user_id ?? -1,
},
include: [User.associations.endorsement_groups],
});


const endorsementGroup = await EndorsementGroup.findOne({where: {
id: userEndorsement?.endorsement_group_id ?? -1,
},})



const success = await removeEndorsement(userEndorsement, endorsementGroup);

if(success){
throw new Error("Could not delete endorsement in VATEUD CORE.");
}

await userEndorsement?.destroy();


response.status(HttpStatusCode.Ok).send(user?.endorsement_groups ?? []);
} catch (e) {
next(e);
}
}

export default {
addEndorsement,
deleteEndorsement,
};
31 changes: 29 additions & 2 deletions backend/src/libraries/vateud/VateudCoreLibrary.ts
Original file line number Diff line number Diff line change
Expand Up @@ -132,8 +132,6 @@ export async function removeSolo(userSolo: UserSolo) {
/**
* Creates a Tier 1 or 2 endorsement.
* On success, it updates the corresponding endorsement with the returned VATEUD ID
* On failure, it schedules a job which repeats the same request n times until it succeeds
* - If it fails more than n times, then it really isn't our problem anymore tbh...
*/
export async function createEndorsement(userEndorsement: EndorsementGroupsBelongsToUsers, endorsementGroup: EndorsementGroup | null) {
if (!endorsementGroup) return false;
Expand Down Expand Up @@ -169,3 +167,32 @@ export async function createEndorsement(userEndorsement: EndorsementGroupsBelong

return true;
}

/**
* Removes a Tier 1 or 2 endorsement.
* On success, it updates the corresponding endorsement
*/
export async function removeEndorsement(userEndorsement: EndorsementGroupsBelongsToUsers|null, endorsementGroup: EndorsementGroup | null) {
if(!endorsementGroup || !userEndorsement) return false;
if(!userEndorsement.vateud_id) return true;

const res = await _send<VateudCoreSoloRemoveResponseT>({
endpoint: `facility/endorsements/tier-${endorsementGroup.tier}/${userEndorsement.vateud_id}`,
method: "delete",
});

if (!res) return false;

await EndorsementGroupsBelongsToUsers.update(
{
vateud_id: null,
},
{
where: {
id: userEndorsement.id,
},
}
);

return true;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
import { Modal } from "@/components/ui/Modal/Modal";
import { UserModel, UserSoloModel } from "@/models/UserModel";
import { Input } from "@/components/ui/Input/Input";
import { getAtcRatingCombined } from "@/utils/helper/vatsim/AtcRatingHelper";
import { Separator } from "@/components/ui/Separator/Separator";
import { Select } from "@/components/ui/Select/Select";
import dayjs from "dayjs";
import React, { Dispatch, FormEvent, useState } from "react";
import { Button } from "@/components/ui/Button/Button";
import { TbPlaylistAdd, TbTrack, TbTrash } from "react-icons/tb";
import { COLOR_OPTS } from "@/assets/theme.config";
import FormHelper from "@/utils/helper/FormHelper";
import { axiosInstance } from "@/utils/network/AxiosInstance";
import ToastHelper from "@/utils/helper/ToastHelper";
import { AxiosResponse } from "axios";
import { EndorsementGroupModel } from "@/models/EndorsementGroupModel";
import useApi from "@/utils/hooks/useApi";
import { MapArray } from "@/components/conditionals/MapArray";

export function UVDeleteSoloModal({ show, onClose, user, setUser }: { show: boolean; onClose: () => any; user?: UserModel; setUser: Dispatch<UserModel> }) {
const [deletingSolo, setDeletingSolo] = useState<boolean>(false);

function deleteSolo(e: FormEvent<HTMLFormElement>) {
e.preventDefault();

if (user == null || user.user_solo == null) {
return;
}
setDeletingSolo(true);

axiosInstance
.delete("/administration/solo", {
data: {
solo_id: user.user_solo.id,
trainee_id: user.id,
},
})
.then(res => {
const data: UserModel = res.data as UserModel;

setUser({
...user,
user_solo: undefined,
endorsement_groups: data.endorsement_groups,
});
ToastHelper.success("Freigabe erfolgreich gelöscht");
onClose();
})
.catch(() => {
ToastHelper.error("Fehler beim Löschen der Freigabe");
})
.finally(() => setDeletingSolo(false));
}

return (
<form onSubmit={deleteSolo}>
<Modal
show={show}
onClose={onClose}
title={"Freigabe Löschen"}
footer={
<Button type={"submit"} loading={deletingSolo} icon={<TbTrash size={20} />} color={COLOR_OPTS.DANGER} variant={"twoTone"}>
Löschen
</Button>
}>

<Separator />

<p>
Bist du sicher, dass du die Freigabe von{" "}
<strong>
{user?.first_name} {user?.last_name}
</strong>{" "}
löschen möchtest? Diese Aktion kann nicht rückgängig gemacht werden.
</p>
</Modal>
</form>
);
}

0 comments on commit 15dfa76

Please sign in to comment.