211 lines
7.0 KiB
JavaScript
211 lines
7.0 KiB
JavaScript
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<App.Locals['user']>} */
|
|
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: "",
|
|
};
|
|
},
|
|
};
|