From abecaa4497584796c9f6698909fb23d91fa09231 Mon Sep 17 00:00:00 2001 From: Christian Beutel <> Date: Sun, 17 Mar 2024 23:25:01 +0100 Subject: [PATCH] multiple bug fixes --- .gitignore | 2 +- CHANGELOG.md | 16 +++++++++++ db/Dockerfile | 4 ++- docker-compose.yml | 3 +- web/Dockerfile | 14 ++-------- .../trail/trail_filter_panel.svelte | 8 +++--- web/src/lib/models/trail.ts | 2 ++ web/src/lib/stores/trail_store.ts | 28 +++++++++++++++---- web/src/lib/stores/user_store.ts | 1 + .../routes/api/v1/search/[index]/+server.ts | 2 +- web/src/routes/api/v1/trail/+server.ts | 2 +- web/src/routes/lists/+page.ts | 2 ++ web/src/routes/map/+page.ts | 2 ++ web/src/routes/profile/+page.svelte | 1 + web/src/routes/trails/+page.svelte | 14 ++++------ web/src/routes/trails/+page.ts | 2 ++ 16 files changed, 69 insertions(+), 34 deletions(-) create mode 100644 CHANGELOG.md diff --git a/.gitignore b/.gitignore index 0f4bf525..f7a7b680 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,4 @@ search/data.ms search/dumps run.sh -build.sh \ No newline at end of file +build*.sh \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..3136b8c8 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,16 @@ +# v0.1.1 +## Bug fixes + +- fixed a bug that would prevent trails longer than 20km from being displayed +- added BODY_SIZE_LIMIT env variable to docker compose to allow for bigger file uploads +- fixed a bug that caused only 5 trails to be shown at a time +- fixed a bug that would cause waypoints not to be deleted from the backend +- updated the default docker-compose.yml to include a secure MEILI_MASTER_KEY +- the default location field now sets the value correctly after clicking on a search result + +## Docs + +- updated the docs to include BODY_SIZE_LIMIT + +# v0.1.0 +- Initial release \ No newline at end of file diff --git a/db/Dockerfile b/db/Dockerfile index f879e434..f37eba24 100644 --- a/db/Dockerfile +++ b/db/Dockerfile @@ -4,7 +4,9 @@ WORKDIR / COPY migrations ./migrations -COPY ./pocketbase_arm64 /pocketbase +ARG TARGETARCH +RUN echo ${TARGETARCH} +COPY ./pocketbase_${TARGETARCH} /pocketbase RUN chmod +x /pocketbase ENV MEILI_URL=http://localhost:7700 diff --git a/docker-compose.yml b/docker-compose.yml index 7fb0d254..a650739d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,7 +2,7 @@ version: '3' x-common-env: &cenv MEILI_URL: http://search:7700 - MEILI_MASTER_KEY: CHANGE_ME! + MEILI_MASTER_KEY: vODkljPcfFANYNepCHyDyGjzAMPcdHnrb6X5KyXQPWo services: search: @@ -50,6 +50,7 @@ services: environment: <<: *cenv ORIGIN: http://localhost:3000 + BODY_SIZE_LIMIT: Infinity PUBLIC_POCKETBASE_URL: http://db:8090 ports: - "3000:3000" diff --git a/web/Dockerfile b/web/Dockerfile index d58fd2f1..2d2d29c0 100644 --- a/web/Dockerfile +++ b/web/Dockerfile @@ -1,16 +1,8 @@ -FROM node:18-alpine AS build -WORKDIR /app -COPY package*.json . -RUN npm ci -COPY . . -RUN npm run build -RUN npm prune --production - FROM node:18-alpine WORKDIR /app -COPY --from=build /app/build build/ -COPY --from=build /app/node_modules node_modules/ -COPY package.json . +COPY ./build build/ +COPY package*.json . +RUN npm ci --omit=dev EXPOSE 3000 ENV NODE_ENV=production diff --git a/web/src/lib/components/trail/trail_filter_panel.svelte b/web/src/lib/components/trail/trail_filter_panel.svelte index c8716e7f..f1e0c9d5 100644 --- a/web/src/lib/components/trail/trail_filter_panel.svelte +++ b/web/src/lib/components/trail/trail_filter_panel.svelte @@ -201,27 +201,27 @@

{$_("distance")}

update()} >
{formatDistance(filter.distanceMin)} - {formatDistance(filter.distanceMax)} + {formatDistance(filter.distanceMax)}{filter.distanceMax == filter.distanceLimit ? '+' : ''}

{$_("elevation-gain")}

update()} >
{formatElevation(filter.elevationGainMin)} - {formatElevation(filter.elevationGainMax)} + {formatElevation(filter.elevationGainMax)}{filter.elevationGainMax == filter.elevationGainLimit ? '+' : ''}

{$_("completed")}

diff --git a/web/src/lib/models/trail.ts b/web/src/lib/models/trail.ts index 771e9781..090f3d86 100644 --- a/web/src/lib/models/trail.ts +++ b/web/src/lib/models/trail.ts @@ -90,8 +90,10 @@ interface TrailFilter { } distanceMin: number, distanceMax: number, + distanceLimit: number, elevationGainMin: number; elevationGainMax: number; + elevationGainLimit: number; completed?: boolean; sort: "name" | "distance" | "elevation_gain" | "created"; sortOrder: "+" | "-" diff --git a/web/src/lib/stores/trail_store.ts b/web/src/lib/stores/trail_store.ts index 6a257e81..7e884d43 100644 --- a/web/src/lib/stores/trail_store.ts +++ b/web/src/lib/stores/trail_store.ts @@ -34,7 +34,15 @@ export async function trails_index(data: { perPage: number, random?: boolean, f: } export async function trails_search_filter(filter: TrailFilter, page: number = 1, f: (url: RequestInfo | URL, config?: RequestInit) => Promise = fetch) { - let filterText: string = `distance >= ${filter.distanceMin} AND distance <= ${filter.distanceMax} AND elevation_gain >= ${filter.elevationGainMin} AND elevation_gain <= ${filter.elevationGainMax}`; + let filterText: string = `distance >= ${filter.distanceMin} AND elevation_gain >= ${filter.elevationGainMin}` + + if (filter.distanceMax < filter.distanceLimit) { + filterText += ` AND distance <= ${filter.distanceMax}` + } + + if (filter.elevationGainMax < filter.elevationGainLimit) { + filterText += ` AND elevation_gain <= ${filter.elevationGainMax}` + } filterText += ` AND difficulty IN [${filter.difficulty.join(",")}]` @@ -52,7 +60,7 @@ export async function trails_search_filter(filter: TrailFilter, page: number = 1 } let r = await f("/api/v1/search/trails", { method: "POST", - body: JSON.stringify({ q: filter.q, options: { filter: filterText, hitsPerPage: 20, page: page } }), + body: JSON.stringify({ q: filter.q, options: { filter: filterText, hitsPerPage: 21, page: page } }), }); const result = await r.json(); @@ -90,7 +98,15 @@ export async function trails_search_bounding_box(northEast: LatLng, southWest: L let filterText: string = ""; if (filter) { - filterText += `distance >= ${filter.distanceMin} AND distance <= ${filter.distanceMax} AND elevation_gain >= ${filter.elevationGainMin} AND elevation_gain <= ${filter.elevationGainMax}`; + filterText += `distance >= ${filter.distanceMin} AND elevation_gain >= ${filter.elevationGainMin}`; + + if (filter.distanceMax < filter.distanceLimit) { + filterText += ` AND distance <= ${filter.distanceMax}` + } + + if (filter.elevationGainMax < filter.elevationGainLimit) { + filterText += ` AND elevation_gain <= ${filter.elevationGainMax}` + } filterText += ` AND difficulty IN [${filter.difficulty.join(",")}]` @@ -162,7 +178,7 @@ export async function trails_show(id: string, loadGPX?: boolean, f: (url: Reques } if (loadGPX) { - if(!response.expand) { + if (!response.expand) { response.expand = {} } const gpxData: string = await fetchGPX(response, f); @@ -312,12 +328,12 @@ export async function trails_update(oldTrail: Trail, newTrail: Trail, photos: Fi export async function trails_delete(trail: Trail) { if (trail.expand.waypoints) { for (const waypoint of trail.expand.waypoints) { - waypoints_delete(waypoint); + await waypoints_delete(waypoint); } } if (trail.expand.summit_logs) { for (const summit_log of trail.expand.summit_logs) { - summit_logs_delete(summit_log); + await summit_logs_delete(summit_log); } } diff --git a/web/src/lib/stores/user_store.ts b/web/src/lib/stores/user_store.ts index 2fc333dd..ecd48abd 100644 --- a/web/src/lib/stores/user_store.ts +++ b/web/src/lib/stores/user_store.ts @@ -16,6 +16,7 @@ export type User = { export const currentUser: Writable = writable() export async function users_create(user: User) { + user.unit = "metric"; const r = await fetch('/api/v1/user', { method: 'PUT', body: JSON.stringify({ ...user, passwordConfirm: user.password }) diff --git a/web/src/routes/api/v1/search/[index]/+server.ts b/web/src/routes/api/v1/search/[index]/+server.ts index 48e845c5..9116ef12 100644 --- a/web/src/routes/api/v1/search/[index]/+server.ts +++ b/web/src/routes/api/v1/search/[index]/+server.ts @@ -4,7 +4,7 @@ export async function POST(event: RequestEvent) { const data = await event.request.json() try { - const r = await event.locals.ms.index(event.params.index as string).search(data.q, data.options); + const r = await event.locals.ms.index(event.params.index as string).search(data.q, data.options); return json(r); } catch (e: any) { console.log(e); diff --git a/web/src/routes/api/v1/trail/+server.ts b/web/src/routes/api/v1/trail/+server.ts index 4b94808c..727bdd5a 100644 --- a/web/src/routes/api/v1/trail/+server.ts +++ b/web/src/routes/api/v1/trail/+server.ts @@ -4,7 +4,7 @@ import { error, json, type RequestEvent } from '@sveltejs/kit'; export async function GET(event: RequestEvent) { const page = event.url.searchParams.get("page") ?? "0"; - const perPage = event.url.searchParams.get("per-page") ?? "5"; + const perPage = event.url.searchParams.get("per-page") ?? "21"; const expand = event.url.searchParams.get("expand") ?? "" const sort = event.url.searchParams.get("sort") ?? "" const filter = event.url.searchParams.get("filter") ?? ""; diff --git a/web/src/routes/lists/+page.ts b/web/src/routes/lists/+page.ts index 76cd4c30..ad0c53a8 100644 --- a/web/src/routes/lists/+page.ts +++ b/web/src/routes/lists/+page.ts @@ -12,8 +12,10 @@ export const load: Load = async ({ params, fetch }) => { }, distanceMin: 0, distanceMax: 20000, + distanceLimit: 20000, elevationGainMin: 0, elevationGainMax: 4000, + elevationGainLimit: 4000, sort: "created", sortOrder: "+", }; diff --git a/web/src/routes/map/+page.ts b/web/src/routes/map/+page.ts index 84fa063b..5374c0f3 100644 --- a/web/src/routes/map/+page.ts +++ b/web/src/routes/map/+page.ts @@ -13,8 +13,10 @@ export const load: ServerLoad = async ({ params, locals, fetch }) => { }, distanceMin: 0, distanceMax: 20000, + distanceLimit: 20000, elevationGainMin: 0, elevationGainMax: 4000, + elevationGainLimit: 4000, sort: "created", sortOrder: "+", }; diff --git a/web/src/routes/profile/+page.svelte b/web/src/routes/profile/+page.svelte index 05db2051..6e8e1d8b 100644 --- a/web/src/routes/profile/+page.svelte +++ b/web/src/routes/profile/+page.svelte @@ -59,6 +59,7 @@ } async function handleSearchClick(item: SearchItem) { + citySearchQuery = item.text; await users_update($currentUser!.id, { location: { name: item.value.name, diff --git a/web/src/routes/trails/+page.svelte b/web/src/routes/trails/+page.svelte index 4f50b5fc..4c088df2 100644 --- a/web/src/routes/trails/+page.svelte +++ b/web/src/routes/trails/+page.svelte @@ -4,17 +4,15 @@ import TrailList from "$lib/components/trail/trail_list.svelte"; import type { TrailFilter } from "$lib/models/trail"; import { categories } from "$lib/stores/category_store"; - import { - trails, - trails_search_filter, - } from "$lib/stores/trail_store"; + import { trails, trails_search_filter } from "$lib/stores/trail_store"; import { onMount } from "svelte"; import { _ } from "svelte-i18n"; let filterExpanded: boolean = true; const filter: TrailFilter = $page.data.filter; - const pagination: {page: number, totalPages: number} = $page.data.pagination + const pagination: { page: number; totalPages: number } = + $page.data.pagination; onMount(() => { if (window.innerWidth < 768) { @@ -23,8 +21,8 @@ }); async function handleFilterUpdate() { - const response= await trails_search_filter(filter, 1); - pagination.page = response.page + const response = await trails_search_filter(filter, 1); + pagination.page = response.page; pagination.totalPages = response.totalPages; } @@ -50,7 +48,7 @@ handleFilterUpdate()} on:pagination={(e) => paginate(e.detail)} > diff --git a/web/src/routes/trails/+page.ts b/web/src/routes/trails/+page.ts index 28b99fcd..26d980ed 100644 --- a/web/src/routes/trails/+page.ts +++ b/web/src/routes/trails/+page.ts @@ -13,8 +13,10 @@ export const load: ServerLoad = async ({ params, locals, url, fetch }) => { }, distanceMin: 0, distanceMax: 20000, + distanceLimit: 20000, elevationGainMin: 0, elevationGainMax: 4000, + elevationGainLimit: 4000, sort: "created", sortOrder: "+", };