multiple bug fixes
This commit is contained in:
2
.gitignore
vendored
2
.gitignore
vendored
@@ -8,4 +8,4 @@ search/data.ms
|
|||||||
search/dumps
|
search/dumps
|
||||||
|
|
||||||
run.sh
|
run.sh
|
||||||
build.sh
|
build*.sh
|
||||||
16
CHANGELOG.md
Normal file
16
CHANGELOG.md
Normal file
@@ -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
|
||||||
@@ -4,7 +4,9 @@ WORKDIR /
|
|||||||
|
|
||||||
COPY migrations ./migrations
|
COPY migrations ./migrations
|
||||||
|
|
||||||
COPY ./pocketbase_arm64 /pocketbase
|
ARG TARGETARCH
|
||||||
|
RUN echo ${TARGETARCH}
|
||||||
|
COPY ./pocketbase_${TARGETARCH} /pocketbase
|
||||||
RUN chmod +x /pocketbase
|
RUN chmod +x /pocketbase
|
||||||
|
|
||||||
ENV MEILI_URL=http://localhost:7700
|
ENV MEILI_URL=http://localhost:7700
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ version: '3'
|
|||||||
|
|
||||||
x-common-env: &cenv
|
x-common-env: &cenv
|
||||||
MEILI_URL: http://search:7700
|
MEILI_URL: http://search:7700
|
||||||
MEILI_MASTER_KEY: CHANGE_ME!
|
MEILI_MASTER_KEY: vODkljPcfFANYNepCHyDyGjzAMPcdHnrb6X5KyXQPWo
|
||||||
|
|
||||||
services:
|
services:
|
||||||
search:
|
search:
|
||||||
@@ -50,6 +50,7 @@ services:
|
|||||||
environment:
|
environment:
|
||||||
<<: *cenv
|
<<: *cenv
|
||||||
ORIGIN: http://localhost:3000
|
ORIGIN: http://localhost:3000
|
||||||
|
BODY_SIZE_LIMIT: Infinity
|
||||||
PUBLIC_POCKETBASE_URL: http://db:8090
|
PUBLIC_POCKETBASE_URL: http://db:8090
|
||||||
ports:
|
ports:
|
||||||
- "3000:3000"
|
- "3000:3000"
|
||||||
|
|||||||
@@ -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
|
FROM node:18-alpine
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
COPY --from=build /app/build build/
|
COPY ./build build/
|
||||||
COPY --from=build /app/node_modules node_modules/
|
COPY package*.json .
|
||||||
COPY package.json .
|
RUN npm ci --omit=dev
|
||||||
EXPOSE 3000
|
EXPOSE 3000
|
||||||
ENV NODE_ENV=production
|
ENV NODE_ENV=production
|
||||||
|
|
||||||
|
|||||||
@@ -201,27 +201,27 @@
|
|||||||
<p class="text-sm font-medium pb-4">{$_("distance")}</p>
|
<p class="text-sm font-medium pb-4">{$_("distance")}</p>
|
||||||
<DoubleSlider
|
<DoubleSlider
|
||||||
minValue={filter.distanceMin}
|
minValue={filter.distanceMin}
|
||||||
maxValue={filter.distanceMax}
|
maxValue={filter.distanceLimit}
|
||||||
bind:currentMin={filter.distanceMin}
|
bind:currentMin={filter.distanceMin}
|
||||||
bind:currentMax={filter.distanceMax}
|
bind:currentMax={filter.distanceMax}
|
||||||
on:set={() => update()}
|
on:set={() => update()}
|
||||||
></DoubleSlider>
|
></DoubleSlider>
|
||||||
<div class="flex justify-between">
|
<div class="flex justify-between">
|
||||||
<span>{formatDistance(filter.distanceMin)}</span>
|
<span>{formatDistance(filter.distanceMin)}</span>
|
||||||
<span>{formatDistance(filter.distanceMax)}</span>
|
<span>{formatDistance(filter.distanceMax)}{filter.distanceMax == filter.distanceLimit ? '+' : ''}</span>
|
||||||
</div>
|
</div>
|
||||||
<hr class="my-4 border-separator" />
|
<hr class="my-4 border-separator" />
|
||||||
<p class="text-sm font-medium pb-4">{$_("elevation-gain")}</p>
|
<p class="text-sm font-medium pb-4">{$_("elevation-gain")}</p>
|
||||||
<DoubleSlider
|
<DoubleSlider
|
||||||
minValue={filter.elevationGainMin}
|
minValue={filter.elevationGainMin}
|
||||||
maxValue={filter.elevationGainMax}
|
maxValue={filter.elevationGainLimit}
|
||||||
bind:currentMin={filter.elevationGainMin}
|
bind:currentMin={filter.elevationGainMin}
|
||||||
bind:currentMax={filter.elevationGainMax}
|
bind:currentMax={filter.elevationGainMax}
|
||||||
on:set={() => update()}
|
on:set={() => update()}
|
||||||
></DoubleSlider>
|
></DoubleSlider>
|
||||||
<div class="flex justify-between">
|
<div class="flex justify-between">
|
||||||
<span>{formatElevation(filter.elevationGainMin)}</span>
|
<span>{formatElevation(filter.elevationGainMin)}</span>
|
||||||
<span>{formatElevation(filter.elevationGainMax)}</span>
|
<span>{formatElevation(filter.elevationGainMax)}{filter.elevationGainMax == filter.elevationGainLimit ? '+' : ''}</span>
|
||||||
</div>
|
</div>
|
||||||
<hr class="my-4 border-separator" />
|
<hr class="my-4 border-separator" />
|
||||||
<p class="text-sm font-medium pb-4">{$_("completed")}</p>
|
<p class="text-sm font-medium pb-4">{$_("completed")}</p>
|
||||||
|
|||||||
@@ -90,8 +90,10 @@ interface TrailFilter {
|
|||||||
}
|
}
|
||||||
distanceMin: number,
|
distanceMin: number,
|
||||||
distanceMax: number,
|
distanceMax: number,
|
||||||
|
distanceLimit: number,
|
||||||
elevationGainMin: number;
|
elevationGainMin: number;
|
||||||
elevationGainMax: number;
|
elevationGainMax: number;
|
||||||
|
elevationGainLimit: number;
|
||||||
completed?: boolean;
|
completed?: boolean;
|
||||||
sort: "name" | "distance" | "elevation_gain" | "created";
|
sort: "name" | "distance" | "elevation_gain" | "created";
|
||||||
sortOrder: "+" | "-"
|
sortOrder: "+" | "-"
|
||||||
|
|||||||
@@ -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<Response> = fetch) {
|
export async function trails_search_filter(filter: TrailFilter, page: number = 1, f: (url: RequestInfo | URL, config?: RequestInit) => Promise<Response> = 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(",")}]`
|
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", {
|
let r = await f("/api/v1/search/trails", {
|
||||||
method: "POST",
|
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();
|
const result = await r.json();
|
||||||
@@ -90,7 +98,15 @@ export async function trails_search_bounding_box(northEast: LatLng, southWest: L
|
|||||||
let filterText: string = "";
|
let filterText: string = "";
|
||||||
|
|
||||||
if (filter) {
|
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(",")}]`
|
filterText += ` AND difficulty IN [${filter.difficulty.join(",")}]`
|
||||||
|
|
||||||
@@ -312,12 +328,12 @@ export async function trails_update(oldTrail: Trail, newTrail: Trail, photos: Fi
|
|||||||
export async function trails_delete(trail: Trail) {
|
export async function trails_delete(trail: Trail) {
|
||||||
if (trail.expand.waypoints) {
|
if (trail.expand.waypoints) {
|
||||||
for (const waypoint of trail.expand.waypoints) {
|
for (const waypoint of trail.expand.waypoints) {
|
||||||
waypoints_delete(waypoint);
|
await waypoints_delete(waypoint);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (trail.expand.summit_logs) {
|
if (trail.expand.summit_logs) {
|
||||||
for (const summit_log of trail.expand.summit_logs) {
|
for (const summit_log of trail.expand.summit_logs) {
|
||||||
summit_logs_delete(summit_log);
|
await summit_logs_delete(summit_log);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ export type User = {
|
|||||||
export const currentUser: Writable<User | null> = writable<User | null>()
|
export const currentUser: Writable<User | null> = writable<User | null>()
|
||||||
|
|
||||||
export async function users_create(user: User) {
|
export async function users_create(user: User) {
|
||||||
|
user.unit = "metric";
|
||||||
const r = await fetch('/api/v1/user', {
|
const r = await fetch('/api/v1/user', {
|
||||||
method: 'PUT',
|
method: 'PUT',
|
||||||
body: JSON.stringify({ ...user, passwordConfirm: user.password })
|
body: JSON.stringify({ ...user, passwordConfirm: user.password })
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import { error, json, type RequestEvent } from '@sveltejs/kit';
|
|||||||
|
|
||||||
export async function GET(event: RequestEvent) {
|
export async function GET(event: RequestEvent) {
|
||||||
const page = event.url.searchParams.get("page") ?? "0";
|
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 expand = event.url.searchParams.get("expand") ?? ""
|
||||||
const sort = event.url.searchParams.get("sort") ?? ""
|
const sort = event.url.searchParams.get("sort") ?? ""
|
||||||
const filter = event.url.searchParams.get("filter") ?? "";
|
const filter = event.url.searchParams.get("filter") ?? "";
|
||||||
|
|||||||
@@ -12,8 +12,10 @@ export const load: Load = async ({ params, fetch }) => {
|
|||||||
},
|
},
|
||||||
distanceMin: 0,
|
distanceMin: 0,
|
||||||
distanceMax: 20000,
|
distanceMax: 20000,
|
||||||
|
distanceLimit: 20000,
|
||||||
elevationGainMin: 0,
|
elevationGainMin: 0,
|
||||||
elevationGainMax: 4000,
|
elevationGainMax: 4000,
|
||||||
|
elevationGainLimit: 4000,
|
||||||
sort: "created",
|
sort: "created",
|
||||||
sortOrder: "+",
|
sortOrder: "+",
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -13,8 +13,10 @@ export const load: ServerLoad = async ({ params, locals, fetch }) => {
|
|||||||
},
|
},
|
||||||
distanceMin: 0,
|
distanceMin: 0,
|
||||||
distanceMax: 20000,
|
distanceMax: 20000,
|
||||||
|
distanceLimit: 20000,
|
||||||
elevationGainMin: 0,
|
elevationGainMin: 0,
|
||||||
elevationGainMax: 4000,
|
elevationGainMax: 4000,
|
||||||
|
elevationGainLimit: 4000,
|
||||||
sort: "created",
|
sort: "created",
|
||||||
sortOrder: "+",
|
sortOrder: "+",
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -59,6 +59,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function handleSearchClick(item: SearchItem) {
|
async function handleSearchClick(item: SearchItem) {
|
||||||
|
citySearchQuery = item.text;
|
||||||
await users_update($currentUser!.id, {
|
await users_update($currentUser!.id, {
|
||||||
location: {
|
location: {
|
||||||
name: item.value.name,
|
name: item.value.name,
|
||||||
|
|||||||
@@ -4,17 +4,15 @@
|
|||||||
import TrailList from "$lib/components/trail/trail_list.svelte";
|
import TrailList from "$lib/components/trail/trail_list.svelte";
|
||||||
import type { TrailFilter } from "$lib/models/trail";
|
import type { TrailFilter } from "$lib/models/trail";
|
||||||
import { categories } from "$lib/stores/category_store";
|
import { categories } from "$lib/stores/category_store";
|
||||||
import {
|
import { trails, trails_search_filter } from "$lib/stores/trail_store";
|
||||||
trails,
|
|
||||||
trails_search_filter,
|
|
||||||
} from "$lib/stores/trail_store";
|
|
||||||
import { onMount } from "svelte";
|
import { onMount } from "svelte";
|
||||||
import { _ } from "svelte-i18n";
|
import { _ } from "svelte-i18n";
|
||||||
|
|
||||||
let filterExpanded: boolean = true;
|
let filterExpanded: boolean = true;
|
||||||
|
|
||||||
const filter: TrailFilter = $page.data.filter;
|
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(() => {
|
onMount(() => {
|
||||||
if (window.innerWidth < 768) {
|
if (window.innerWidth < 768) {
|
||||||
@@ -24,7 +22,7 @@
|
|||||||
|
|
||||||
async function handleFilterUpdate() {
|
async function handleFilterUpdate() {
|
||||||
const response = await trails_search_filter(filter, 1);
|
const response = await trails_search_filter(filter, 1);
|
||||||
pagination.page = response.page
|
pagination.page = response.page;
|
||||||
pagination.totalPages = response.totalPages;
|
pagination.totalPages = response.totalPages;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -50,7 +48,7 @@
|
|||||||
<TrailList
|
<TrailList
|
||||||
{filter}
|
{filter}
|
||||||
trails={$trails}
|
trails={$trails}
|
||||||
pagination={pagination}
|
{pagination}
|
||||||
on:update={() => handleFilterUpdate()}
|
on:update={() => handleFilterUpdate()}
|
||||||
on:pagination={(e) => paginate(e.detail)}
|
on:pagination={(e) => paginate(e.detail)}
|
||||||
></TrailList>
|
></TrailList>
|
||||||
|
|||||||
@@ -13,8 +13,10 @@ export const load: ServerLoad = async ({ params, locals, url, fetch }) => {
|
|||||||
},
|
},
|
||||||
distanceMin: 0,
|
distanceMin: 0,
|
||||||
distanceMax: 20000,
|
distanceMax: 20000,
|
||||||
|
distanceLimit: 20000,
|
||||||
elevationGainMin: 0,
|
elevationGainMin: 0,
|
||||||
elevationGainMax: 4000,
|
elevationGainMax: 4000,
|
||||||
|
elevationGainLimit: 4000,
|
||||||
sort: "created",
|
sort: "created",
|
||||||
sortOrder: "+",
|
sortOrder: "+",
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user