import { BASE_API_URI } from "$lib/utils/constants"; import { formatError } from "$lib/utils/helpers"; import { fail, redirect } from "@sveltejs/kit"; import { toRFC3339 } from "$lib/utils/utils"; /** @type {import('./$types').PageServerLoad} */ export async function load({ locals, params }) { // redirect user if not logged in if (!locals.user) { throw redirect(302, `/auth/login?next=/auth/about/${params.id}`); } } /** @type {import('./$types').Actions} */ export const actions = { /** * * @param request - The request object * @param fetch - Fetch object from sveltekit * @param cookies - SvelteKit's cookie object * @param locals - The local object, housing current user * @returns Error data or redirects user to the home page or the previous page */ updateUser: async ({ request, fetch, cookies, locals }) => { let formData = await request.formData(); const licenceCategories = formData .getAll("licence_categories[]") .filter((value) => typeof value === "string") .map((value) => { try { return JSON.parse(value); } catch (e) { console.error("Failed to parse licence category:", value); return null; } }) .filter(Boolean); /** @type {Partial} */ const updateData = { id: Number(formData.get("id")), first_name: String(formData.get("first_name")), last_name: String(formData.get("last_name")), email: String(formData.get("email")), phone: String(formData.get("phone")), notes: String(formData.get("notes")), address: String(formData.get("address")), zip_code: String(formData.get("zip_code")), city: String(formData.get("city")), date_of_birth: toRFC3339(formData.get("birth_date")), company: String(formData.get("company")), profile_picture: String(formData.get("profile_picture")), membership: { id: Number(formData.get("membership_id")), start_date: toRFC3339(formData.get("membership_start_date")), end_date: toRFC3339(formData.get("membership_end_date")), status: Number(formData.get("membership_status")), parent_member_id: Number(formData.get("parent_member_id")), subscription_model: { id: Number(formData.get("subscription_model_id")), name: String(formData.get("subscription_model_name")), }, }, bank_account: { id: Number(formData.get("bank_account_id")), mandate_date_signed: toRFC3339( String(formData.get("mandate_date_signed")) ), bank: String(formData.get("bank")), account_holder_name: String(formData.get("account_holder_name")), iban: String(formData.get("iban")), bic: String(formData.get("bic")), mandate_reference: String(formData.get("mandate_reference")), }, drivers_licence: { id: Number(formData.get("drivers_licence_id")), status: Number(formData.get("licence_status")), licence_number: String(formData.get("licence_number")), issued_date: toRFC3339(formData.get("issued_date")), expiration_date: toRFC3339(formData.get("expiration_date")), country: String(formData.get("country")), licence_categories: licenceCategories, }, }; // Remove undefined or null properties const cleanUpdateData = JSON.parse( JSON.stringify(updateData), (key, value) => (value !== null && value !== "" ? value : undefined) ); console.dir(formData); console.dir(cleanUpdateData); const apiURL = `${BASE_API_URI}/backend/users/update/`; /** @type {RequestInit} */ const requestUpdateOptions = { method: "PATCH", credentials: "include", headers: { "Content-Type": "application/json", Cookie: `jwt=${cookies.get("jwt")}`, }, body: JSON.stringify(cleanUpdateData), }; const res = await fetch(apiURL, requestUpdateOptions); if (!res.ok) { const response = await res.json(); const errors = formatError(response.errors); return fail(400, { errors: errors }); } const response = await res.json(); locals.user = response; // Format dates if (locals.user.date_of_birth) { locals.user.date_of_birth = response.date_of_birth.split("T")[0]; } if (locals.user.membership?.start_date) { locals.user.membership.start_date = locals.user.membership.start_date.split("T")[0]; } if (locals.user.membership?.end_date) { locals.user.membership.end_date = locals.user.membership.end_date.split("T")[0]; } if (locals.user.bank_account?.mandate_date_signed) { locals.user.bank_account.mandate_date_signed = locals.user.bank_account.mandate_date_signed.split("T")[0]; } if (locals.user.drivers_licence?.issued_date) { locals.user.drivers_licence.issued_date = locals.user.drivers_licence.issued_date.split("T")[0]; } if (locals.user.drivers_licence?.expiration_date) { locals.user.drivers_licence.expiration_date = locals.user.drivers_licence.expiration_date.split("T")[0]; } throw redirect(303, `/auth/about/${response.id}`); }, /** * * @param request - The request object * @param fetch - Fetch object from sveltekit * @param cookies - SvelteKit's cookie object * @param locals - The local object, housing current user * @returns Error data or redirects user to the home page or the previous page */ uploadImage: async ({ request, fetch, cookies }) => { const formData = await request.formData(); /** @type {RequestInit} */ const requestInitOptions = { method: "POST", headers: { Cookie: `jwt=${cookies.get("jwt")}`, }, body: formData, }; const res = await fetch(`${BASE_API_URI}/file/upload/`, requestInitOptions); if (!res.ok) { const response = await res.json(); const errors = formatError(response.errors); return fail(400, { errors: errors }); } const response = await res.json(); return { success: true, profile_picture: response[""], }; }, /** * * @param request - The request object * @param fetch - Fetch object from sveltekit * @param cookies - SvelteKit's cookie object * @param locals - The local object, housing current user * @returns Error data or redirects user to the home page or the previous page */ deleteImage: async ({ request, fetch, cookies }) => { const formData = await request.formData(); /** @type {RequestInit} */ const requestInitOptions = { method: "DELETE", headers: { Cookie: `jwt=${cookies.get("jwt")}`, }, body: formData, }; const res = await fetch(`${BASE_API_URI}/file/delete/`, requestInitOptions); if (!res.ok) { const response = await res.json(); const errors = formatError(response.errors); return fail(400, { errors: errors }); } return { success: true, profile_picture: "", }; }, };