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: "+",
};