From 550e3daa43a933c1b34b965648e0cbd111339a61 Mon Sep 17 00:00:00 2001 From: Christian Beutel <> Date: Mon, 10 Feb 2025 18:10:14 +0100 Subject: [PATCH] map speed improvements --- db/main.go | 27 +++- db/util/meilisearch.go | 20 ++- .../lib/components/trail/trail_card.svelte | 6 +- .../components/trail/trail_info_panel.svelte | 6 +- .../components/trail/trail_timeline.svelte | 2 +- web/src/lib/models/trail.ts | 37 ++++- web/src/lib/stores/trail_store.ts | 146 ++++++++++-------- web/src/lib/util/maplibre_util.ts | 2 +- web/src/routes/api/v1/trail/+server.ts | 3 +- web/src/routes/map/+page.svelte | 52 ++++++- 10 files changed, 207 insertions(+), 94 deletions(-) diff --git a/db/main.go b/db/main.go index 2b42f05c..fb4eaa4b 100644 --- a/db/main.go +++ b/db/main.go @@ -59,10 +59,10 @@ func registerMigrations(app *pocketbase.PocketBase) { func setupEventHandlers(app *pocketbase.PocketBase, client meilisearch.ServiceManager) { app.OnModelAfterCreate("users").Add(createUserHandler(app, client)) - app.OnModelAfterCreate("trails").Add(createTrailIndexHandler(client)) + app.OnModelAfterCreate("trails").Add(createTrailIndexHandler(app, client)) app.OnRecordAfterCreateRequest("trails").Add(createTrailHandler(app)) - app.OnRecordAfterUpdateRequest("trails").Add(updateTrailHandler(client)) + app.OnRecordAfterUpdateRequest("trails").Add(updateTrailHandler(app, client)) app.OnRecordAfterDeleteRequest("trails").Add(deleteTrailHandler(client)) app.OnRecordAfterCreateRequest("trail_share").Add(createTrailShareHandler(app, client)) @@ -128,10 +128,14 @@ func createDefaultUserSettings(app *pocketbase.PocketBase, userId string) error return app.Dao().SaveRecord(settings) } -func createTrailIndexHandler(client meilisearch.ServiceManager) func(e *core.ModelEvent) error { +func createTrailIndexHandler(app *pocketbase.PocketBase, client meilisearch.ServiceManager) func(e *core.ModelEvent) error { return func(e *core.ModelEvent) error { record := e.Model.(*models.Record) - if err := util.IndexTrail(record, client); err != nil { + author, err := app.Dao().FindRecordById("users", record.GetString(("author"))) + if err != nil { + return err + } + if err := util.IndexTrail(record, author, client); err != nil { return err } return nil @@ -156,9 +160,13 @@ func createTrailHandler(app *pocketbase.PocketBase) func(e *core.RecordCreateEve } } -func updateTrailHandler(client meilisearch.ServiceManager) func(e *core.RecordUpdateEvent) error { +func updateTrailHandler(app *pocketbase.PocketBase, client meilisearch.ServiceManager) func(e *core.RecordUpdateEvent) error { return func(e *core.RecordUpdateEvent) error { - return util.UpdateTrail(e.Record, client) + author, err := app.Dao().FindRecordById("users", e.Record.GetString(("author"))) + if err != nil { + return err + } + return util.UpdateTrail(e.Record, author, client) } } @@ -727,8 +735,13 @@ func bootstrapMeilisearchTrails(app *pocketbase.PocketBase, client meilisearch.S return err } + client.Index("trails").DeleteAllDocuments() for _, trail := range trails { - if err := util.UpdateTrail(trail, client); err != nil { + author, err := app.Dao().FindRecordById("users", trail.GetString(("author"))) + if err != nil { + return err + } + if err := util.IndexTrail(trail, author, client); err != nil { return err } } diff --git a/db/util/meilisearch.go b/db/util/meilisearch.go index 0b38ad87..678d2c6a 100644 --- a/db/util/meilisearch.go +++ b/db/util/meilisearch.go @@ -8,10 +8,18 @@ import ( "github.com/pocketbase/pocketbase/models" ) -func documentFromTrailRecord(r *models.Record, includeShares bool) map[string]interface{} { +func documentFromTrailRecord(r *models.Record, author *models.Record, includeShares bool) map[string]interface{} { + photos := r.GetStringSlice("photos") + thumbnail := "" + if len(photos) > 0 { + thumbnail = r.GetStringSlice("photos")[r.GetInt("thumbnail")] + } + document := map[string]interface{}{ "id": r.Id, "author": r.GetString("author"), + "author_name": author.GetString("username"), + "author_avatar": author.GetString("avatar"), "name": r.GetString("name"), "description": r.GetString("description"), "location": r.GetString("location"), @@ -25,6 +33,8 @@ func documentFromTrailRecord(r *models.Record, includeShares bool) map[string]in "date": r.GetDateTime("date").Time().Unix(), "created": r.GetDateTime("created").Time().Unix(), "public": r.GetBool("public"), + "thumbnail": thumbnail, + "gpx": r.GetString("gpx"), "_geo": map[string]float64{ "lat": r.GetFloat("lat"), "lng": r.GetFloat("lon"), @@ -56,8 +66,8 @@ func documentFromListRecord(r *models.Record, includeShares bool) map[string]int return document } -func IndexTrail(r *models.Record, client meilisearch.ServiceManager) error { - documents := []map[string]interface{}{documentFromTrailRecord(r, true)} +func IndexTrail(r *models.Record, author *models.Record, client meilisearch.ServiceManager) error { + documents := []map[string]interface{}{documentFromTrailRecord(r, author, true)} if _, err := client.Index("trails").AddDocuments(documents); err != nil { return err @@ -66,8 +76,8 @@ func IndexTrail(r *models.Record, client meilisearch.ServiceManager) error { return nil } -func UpdateTrail(r *models.Record, client meilisearch.ServiceManager) error { - documents := documentFromTrailRecord(r, false) +func UpdateTrail(r *models.Record, author *models.Record, client meilisearch.ServiceManager) error { + documents := documentFromTrailRecord(r, author, false) if _, err := client.Index("trails").UpdateDocuments(documents); err != nil { return err diff --git a/web/src/lib/components/trail/trail_card.svelte b/web/src/lib/components/trail/trail_card.svelte index 8dde82c6..ca98a4a3 100644 --- a/web/src/lib/components/trail/trail_card.svelte +++ b/web/src/lib/components/trail/trail_card.svelte @@ -55,7 +55,7 @@
{wp.description}
diff --git a/web/src/lib/models/trail.ts b/web/src/lib/models/trail.ts
index d4046fd0..3d2f5c76 100644
--- a/web/src/lib/models/trail.ts
+++ b/web/src/lib/models/trail.ts
@@ -27,10 +27,10 @@ class Trail {
summit_logs: string[];
expand?: {
category?: Category;
- waypoints: Waypoint[]
- summit_logs: SummitLog[]
+ waypoints?: Waypoint[]
+ summit_logs?: SummitLog[]
author?: UserAnonymous
- comments_via_trail: Comment[]
+ comments_via_trail?: Comment[]
gpx_data?: string
trail_share_via_trail?: TrailShare[]
}
@@ -142,6 +142,35 @@ interface TrailBoundingBox {
min_lon: number,
}
+
+interface TrailSearchResult {
+ id: string;
+ author: string;
+ author_name: string;
+ author_avatar: string;
+ name: string;
+ description: string;
+ location: string;
+ distance: number;
+ elevation_gain: number;
+ elevation_loss: number;
+ duration: number;
+ difficulty: "easy" | "moderate" | "difficult";
+ category: string;
+ completed: boolean;
+ date: number;
+ created: number;
+ public: boolean;
+ thumbnail: string;
+ shares?: string[];
+ gpx: string;
+ _geo: {
+ lat: number,
+ lng: number
+ };
+}
+
+
export { Trail };
- export type { TrailBoundingBox, TrailFilter, TrailFilterValues };
+export type { TrailBoundingBox, TrailFilter, TrailFilterValues, TrailSearchResult };
diff --git a/web/src/lib/stores/trail_store.ts b/web/src/lib/stores/trail_store.ts
index d53fa30b..f12de419 100644
--- a/web/src/lib/stores/trail_store.ts
+++ b/web/src/lib/stores/trail_store.ts
@@ -1,12 +1,12 @@
import type { SummitLog } from "$lib/models/summit_log";
-import { Trail, type TrailFilter, type TrailFilterValues } from "$lib/models/trail";
+import { Trail, type TrailFilter, type TrailFilterValues, type TrailSearchResult } from "$lib/models/trail";
import type { Waypoint } from "$lib/models/waypoint";
import { pb } from "$lib/pocketbase";
import { deepEqual } from "$lib/util/deep_util";
import { getFileURL } from "$lib/util/file_util";
import * as M from "maplibre-gl";
import type { Hits } from "meilisearch";
-import { type ListResult } from "pocketbase";
+import { type ListResult, type RecordModel } from "pocketbase";
import { writable, type Writable } from "svelte/store";
import { summit_logs_create, summit_logs_delete, summit_logs_update } from "./summit_log_store";
import { waypoints_create, waypoints_delete, waypoints_update } from "./waypoint_store";
@@ -59,7 +59,15 @@ 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, sort: [`${filter.sort}:${filter.sortOrder == "+" ? "asc" : "desc"}`], hitsPerPage: 12, page: page } }),
+ body: JSON.stringify({
+ q: filter.q,
+ options: {
+ filter: filterText,
+ sort: [`${filter.sort}:${filter.sortOrder == "+" ? "asc" : "desc"}`],
+ hitsPerPage: 12,
+ page: page
+ }
+ }),
});
if (!r.ok) {
@@ -67,35 +75,19 @@ export async function trails_search_filter(filter: TrailFilter, page: number = 1
throw new APIError(r.status, response.message, response.detail)
}
- const result: { page: number, totalPages: number, hits: Hits