From 7431d4512476f7dd0a97628d600c0f5fc55e9b06 Mon Sep 17 00:00:00 2001 From: Sean Morley Date: Wed, 17 Jul 2024 17:36:05 -0400 Subject: [PATCH] search api --- backend/server/adventures/views.py | 11 ++++++ docker-compose.yml | 8 ++--- frontend/src/routes/adventures/+page.svelte | 38 ++++++++++++++++++++ frontend/src/routes/search/+page.server.ts | 39 +++++++++++++++++++++ frontend/src/routes/search/+page.svelte | 22 ++++++++++++ 5 files changed, 114 insertions(+), 4 deletions(-) create mode 100644 frontend/src/routes/search/+page.server.ts create mode 100644 frontend/src/routes/search/+page.svelte diff --git a/backend/server/adventures/views.py b/backend/server/adventures/views.py index cd64725..156138a 100644 --- a/backend/server/adventures/views.py +++ b/backend/server/adventures/views.py @@ -139,6 +139,17 @@ class AdventureViewSet(viewsets.ModelViewSet): serializer = self.get_serializer(queryset, many=True) return Response(serializer.data) + + @action(detail=False, methods=['get']) + def search(self, request): + query = self.request.query_params.get('query', '') + queryset = Adventure.objects.filter( + (Q(name__icontains=query) | Q(description__icontains=query) | Q(location__icontains=query) | Q(activity_types__icontains=query)) & + (Q(user_id=request.user.id) | Q(is_public=True)) +) + queryset = self.apply_sorting(queryset) + adventures = self.paginate_and_respond(queryset, request) + return adventures def paginate_and_respond(self, queryset, request): paginator = self.pagination_class() diff --git a/docker-compose.yml b/docker-compose.yml index 7ffadeb..90e3194 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,8 +2,8 @@ version: "3.9" services: web: - #build: ./frontend/ - image: ghcr.io/seanmorley15/adventurelog-frontend:latest + build: ./frontend/ + #image: ghcr.io/seanmorley15/adventurelog-frontend:latest environment: - PUBLIC_SERVER_URL=http://server:8000 - ORIGIN=http://localhost:8080 @@ -23,8 +23,8 @@ services: - postgres_data:/var/lib/postgresql/data/ server: - #build: ./backend/ - image: ghcr.io/seanmorley15/adventurelog-backend:latest + build: ./backend/ + #image: ghcr.io/seanmorley15/adventurelog-backend:latest environment: - PGHOST=db - PGDATABASE=database diff --git a/frontend/src/routes/adventures/+page.svelte b/frontend/src/routes/adventures/+page.svelte index cc819ab..39c333d 100644 --- a/frontend/src/routes/adventures/+page.svelte +++ b/frontend/src/routes/adventures/+page.svelte @@ -193,6 +193,44 @@ {/each} {/if} + {#if currentView == 'table'} + + + + + + + + + + + + {#each adventures as adventure} + + + + + + + + {/each} + +
NameDateRatingTypeActions
{adventure.name}{adventure.date}{adventure.rating}{adventure.type} + + +
+ {/if}
{#if next || previous}
diff --git a/frontend/src/routes/search/+page.server.ts b/frontend/src/routes/search/+page.server.ts new file mode 100644 index 0000000..cfd6636 --- /dev/null +++ b/frontend/src/routes/search/+page.server.ts @@ -0,0 +1,39 @@ +import type { Adventure } from '$lib/types'; +import type { PageServerLoad } from './$types'; + +const PUBLIC_SERVER_URL = process.env['PUBLIC_SERVER_URL']; +const serverEndpoint = PUBLIC_SERVER_URL || 'http://localhost:8000'; + +export const load = (async (event) => { + // get url param query + const query = event.url.searchParams.get('query'); + + if (!query) { + return { data: [] }; + } + + let res = await fetch(`${serverEndpoint}/api/adventures/search/?query=${query}`, { + headers: { + 'Content-Type': 'application/json', + Cookie: `${event.cookies.get('auth')}` + } + }); + + if (res.ok) { + let data = await res.json(); + console.log('Search data:', data); + + return { + props: { + adventures: data.results as Adventure[], + nextPage: data.next, + prevPage: data.previous, + total: data.count, + query + } + }; + } else { + console.error('Failed to fetch search data'); + return { data: [] }; + } +}) satisfies PageServerLoad; diff --git a/frontend/src/routes/search/+page.svelte b/frontend/src/routes/search/+page.svelte new file mode 100644 index 0000000..e3d3f24 --- /dev/null +++ b/frontend/src/routes/search/+page.svelte @@ -0,0 +1,22 @@ + + +{#if adventures.length === 0} + +{:else} + {#each adventures as adventure} + + {/each} +{/if}