From 56b8b55b84b66f1271c88cdc8ead69d82b62b0cb Mon Sep 17 00:00:00 2001 From: Sean Morley Date: Tue, 27 May 2025 12:39:38 -0400 Subject: [PATCH] Refactor deleteCollection function to use DELETE method for API call; update endpoint to match new API structure. --- .../0030_set_end_date_equal_start.py | 19 ++ .../src/lib/components/CollectionCard.svelte | 7 +- .../src/routes/collections/+page.server.ts | 287 ------------------ 3 files changed, 21 insertions(+), 292 deletions(-) create mode 100644 backend/server/adventures/migrations/0030_set_end_date_equal_start.py diff --git a/backend/server/adventures/migrations/0030_set_end_date_equal_start.py b/backend/server/adventures/migrations/0030_set_end_date_equal_start.py new file mode 100644 index 0000000..531f83c --- /dev/null +++ b/backend/server/adventures/migrations/0030_set_end_date_equal_start.py @@ -0,0 +1,19 @@ +# Generated by Django 5.2.1 on 2025-05-27 16:38 + +from django.db import migrations + +def set_end_date_equal_to_start(apps, schema_editor): + Visit = apps.get_model('adventures', 'Visit') + for visit in Visit.objects.filter(end_date__isnull=True): + visit.end_date = visit.start_date + visit.save() + +class Migration(migrations.Migration): + + dependencies = [ + ('adventures', '0029_adventure_city_adventure_country_adventure_region'), + ] + + operations = [ + migrations.RunPython(set_end_date_equal_to_start), + ] diff --git a/frontend/src/lib/components/CollectionCard.svelte b/frontend/src/lib/components/CollectionCard.svelte index c897a54..33e1d29 100644 --- a/frontend/src/lib/components/CollectionCard.svelte +++ b/frontend/src/lib/components/CollectionCard.svelte @@ -54,11 +54,8 @@ export let collection: Collection; async function deleteCollection() { - let res = await fetch(`/collections/${collection.id}?/delete`, { - method: 'POST', - headers: { - 'Content-Type': 'application/x-www-form-urlencoded' - } + let res = await fetch(`/api/collections/${collection.id}`, { + method: 'DELETE' }); if (res.ok) { addToast('info', $t('adventures.delete_collection_success')); diff --git a/frontend/src/routes/collections/+page.server.ts b/frontend/src/routes/collections/+page.server.ts index 0c9a24b..7c5812a 100644 --- a/frontend/src/routes/collections/+page.server.ts +++ b/frontend/src/routes/collections/+page.server.ts @@ -46,290 +46,3 @@ export const load = (async (event) => { }; } }) satisfies PageServerLoad; - -export const actions: Actions = { - create: async (event) => { - const formData = await event.request.formData(); - - const name = formData.get('name') as string; - const description = formData.get('description') as string | null; - const start_date = formData.get('start_date') as string | null; - const end_date = formData.get('end_date') as string | null; - let link = formData.get('link') as string | null; - - if (link) { - link = checkLink(link); - } - - if (!name) { - return { - status: 400, - body: { error: 'Missing required fields' } - }; - } - - const formDataToSend = new FormData(); - formDataToSend.append('name', name); - formDataToSend.append('description', description || ''); - formDataToSend.append('start_date', start_date || ''); - formDataToSend.append('end_date', end_date || ''); - formDataToSend.append('link', link || ''); - let sessionid = event.cookies.get('sessionid'); - - if (!sessionid) { - return { - status: 401, - body: { message: 'Unauthorized' } - }; - } - - const csrfToken = await fetchCSRFToken(); - - if (!csrfToken) { - return { - status: 500, - body: { message: 'Failed to fetch CSRF token' } - }; - } - - const res = await fetch(`${serverEndpoint}/api/collections/`, { - method: 'POST', - headers: { - 'X-CSRFToken': csrfToken, - Referer: event.url.origin, // Include Referer header - Cookie: `sessionid=${sessionid}; csrftoken=${csrfToken}` - }, - body: formDataToSend - }); - - let new_id = await res.json(); - - if (!res.ok) { - const errorBody = await res.json(); - return { - status: res.status, - body: { error: errorBody } - }; - } - - let id = new_id.id; - let user_id = new_id.user_id; - - return { id, user_id }; - }, - edit: async (event) => { - const formData = await event.request.formData(); - - const collectionId = formData.get('adventureId') as string; - const name = formData.get('name') as string; - const description = formData.get('description') as string | null; - let is_public = formData.get('is_public') as string | null | boolean; - const start_date = formData.get('start_date') as string | null; - const end_date = formData.get('end_date') as string | null; - let link = formData.get('link') as string | null; - - if (is_public) { - is_public = true; - } else { - is_public = false; - } - - if (link) { - link = checkLink(link); - } - - if (!name) { - return { - status: 400, - body: { error: 'Missing name.' } - }; - } - - const formDataToSend = new FormData(); - formDataToSend.append('name', name); - formDataToSend.append('description', description || ''); - formDataToSend.append('is_public', is_public.toString()); - formDataToSend.append('start_date', start_date || ''); - formDataToSend.append('end_date', end_date || ''); - formDataToSend.append('link', link || ''); - - let sessionId = event.cookies.get('sessionid'); - - if (!sessionId) { - return { - status: 401, - body: { message: 'Unauthorized' } - }; - } - - const csrfToken = await fetchCSRFToken(); - - if (!csrfToken) { - return { - status: 500, - body: { message: 'Failed to fetch CSRF token' } - }; - } - - const res = await fetch(`${serverEndpoint}/api/collections/${collectionId}/`, { - method: 'PATCH', - headers: { - 'X-CSRFToken': csrfToken, - Cookie: `sessionid=${sessionId}; csrftoken=${csrfToken}`, - Referer: event.url.origin // Include Referer header - }, - body: formDataToSend, - - credentials: 'include' - }); - - if (!res.ok) { - const errorBody = await res.json(); - return { - status: res.status, - body: { error: errorBody } - }; - } - - return { - status: 200 - }; - }, - get: async (event) => { - if (!event.locals.user) { - return { - status: 401, - body: { message: 'Unauthorized' } - }; - } - - const formData = await event.request.formData(); - - const order_direction = formData.get('order_direction') as string; - const order_by = formData.get('order_by') as string; - - // console.log(order_direction, order_by); - - let adventures: Adventure[] = []; - - if (!event.locals.user) { - return { - status: 401, - body: { message: 'Unauthorized' } - }; - } - - let next = null; - let previous = null; - let count = 0; - - let collectionsFetch = await fetch( - `${serverEndpoint}/api/collections/?order_by=${order_by}&order_direction=${order_direction}`, - { - headers: { - Cookie: `sessionid=${event.cookies.get('sessionid')}` - }, - credentials: 'include' - } - ); - if (!collectionsFetch.ok) { - console.error('Failed to fetch visited adventures'); - return redirect(302, '/login'); - } else { - let res = await collectionsFetch.json(); - let visited = res.results as Adventure[]; - next = res.next; - previous = res.previous; - count = res.count; - adventures = [...adventures, ...visited]; - // console.log(next, previous, count); - } - - return { - adventures, - next, - previous, - count - }; - }, - changePage: async (event) => { - const formData = await event.request.formData(); - const next = formData.get('next') as string; - const previous = formData.get('previous') as string; - const page = formData.get('page') as string; - - if (!event.locals.user) { - return { - status: 401, - body: { message: 'Unauthorized' } - }; - } - - if (!page) { - return { - status: 400, - body: { error: 'Missing required fields' } - }; - } - - // Start with the provided URL or default to the filtered adventures endpoint - let url: string = next || previous || '/api/collections/'; - - // Extract the path starting from '/api/adventures' - const apiIndex = url.indexOf('/api/collections'); - if (apiIndex !== -1) { - url = url.slice(apiIndex); - } else { - url = '/api/collections/'; - } - - // Replace or add the page number in the URL - if (url.includes('page=')) { - url = url.replace(/page=\d+/, `page=${page}`); - } else { - // If 'page=' is not in the URL, add it - url += url.includes('?') ? '&' : '?'; - url += `page=${page}`; - } - - const fullUrl = `${serverEndpoint}${url}`; - - let sessionId = event.cookies.get('sessionid'); - - try { - const response = await fetch(fullUrl, { - headers: { - 'Content-Type': 'application/json', - Cookie: `sessionid=${sessionId}` - }, - credentials: 'include' - }); - - if (!response.ok) { - throw new Error(`HTTP error! status: ${response.status}`); - } - const data = await response.json(); - let adventures = data.results as Adventure[]; - let next = data.next; - let previous = data.previous; - let count = data.count; - - return { - status: 200, - body: { - adventures, - next, - previous, - count, - page - } - }; - } catch (error) { - console.error('Error fetching data:', error); - return { - status: 500, - body: { error: 'Failed to fetch data' } - }; - } - } -};