From 7e0276aecb9aa35b692089777703aab5a9149b7e Mon Sep 17 00:00:00 2001 From: Christian Beutel <> Date: Fri, 3 Jan 2025 14:13:06 +0100 Subject: [PATCH] touchups after refactor --- .../17347160210_created_notifications.go | 120 ------------------ .../1735901837_updated_notifications.go | 34 +++++ .../summit_log/summit_log_table_row.svelte | 4 +- web/src/lib/models/api/summit_log_schema.ts | 4 +- web/src/lib/models/api/trail_schema.ts | 20 +-- web/src/lib/models/api/user_schema.ts | 2 +- web/src/lib/models/api/waypoint_schema.ts | 16 +-- web/src/routes/api/v1/summit-log/+server.ts | 7 +- 8 files changed, 60 insertions(+), 147 deletions(-) delete mode 100644 db/migrations/17347160210_created_notifications.go create mode 100644 db/migrations/1735901837_updated_notifications.go diff --git a/db/migrations/17347160210_created_notifications.go b/db/migrations/17347160210_created_notifications.go deleted file mode 100644 index 73925333..00000000 --- a/db/migrations/17347160210_created_notifications.go +++ /dev/null @@ -1,120 +0,0 @@ -package migrations - -import ( - "encoding/json" - - "github.com/pocketbase/dbx" - "github.com/pocketbase/pocketbase/daos" - m "github.com/pocketbase/pocketbase/migrations" - "github.com/pocketbase/pocketbase/models" -) - -func init() { - m.Register(func(db dbx.Builder) error { - jsonData := `{ - "id": "khrcci2uqknny8h", - "created": "2024-12-20 17:33:49.887Z", - "updated": "2024-12-20 17:33:49.887Z", - "name": "notifications", - "type": "base", - "system": false, - "schema": [ - { - "system": false, - "id": "b57prsbu", - "name": "type", - "type": "select", - "required": true, - "presentable": false, - "unique": false, - "options": { - "maxSelect": 1, - "values": [ - "trail_create", - "list_create", - "new_follower", - "trail_comment" - ] - } - }, - { - "system": false, - "id": "1i2ycgle", - "name": "metadata", - "type": "json", - "required": false, - "presentable": false, - "unique": false, - "options": { - "maxSize": 2000000 - } - }, - { - "system": false, - "id": "pyimxu85", - "name": "seen", - "type": "bool", - "required": false, - "presentable": false, - "unique": false, - "options": {} - }, - { - "system": false, - "id": "tmghd4vo", - "name": "recipient", - "type": "relation", - "required": true, - "presentable": false, - "unique": false, - "options": { - "collectionId": "_pb_users_auth_", - "cascadeDelete": false, - "minSelect": null, - "maxSelect": 1, - "displayFields": null - } - }, - { - "system": false, - "id": "exqo1whj", - "name": "author", - "type": "relation", - "required": true, - "presentable": false, - "unique": false, - "options": { - "collectionId": "_pb_users_auth_", - "cascadeDelete": false, - "minSelect": null, - "maxSelect": 1, - "displayFields": null - } - } - ], - "indexes": [], - "listRule": null, - "viewRule": null, - "createRule": null, - "updateRule": null, - "deleteRule": null, - "options": {} - }` - - collection := &models.Collection{} - if err := json.Unmarshal([]byte(jsonData), &collection); err != nil { - return err - } - - return daos.New(db).SaveCollection(collection) - }, func(db dbx.Builder) error { - dao := daos.New(db); - - collection, err := dao.FindCollectionByNameOrId("khrcci2uqknny8h") - if err != nil { - return err - } - - return dao.DeleteCollection(collection) - }) -} diff --git a/db/migrations/1735901837_updated_notifications.go b/db/migrations/1735901837_updated_notifications.go new file mode 100644 index 00000000..90f9ac82 --- /dev/null +++ b/db/migrations/1735901837_updated_notifications.go @@ -0,0 +1,34 @@ +package migrations + +import ( + "github.com/pocketbase/dbx" + "github.com/pocketbase/pocketbase/daos" + m "github.com/pocketbase/pocketbase/migrations" + "github.com/pocketbase/pocketbase/tools/types" +) + +func init() { + m.Register(func(db dbx.Builder) error { + dao := daos.New(db); + + collection, err := dao.FindCollectionByNameOrId("khrcci2uqknny8h") + if err != nil { + return err + } + + collection.UpdateRule = types.Pointer("@request.auth.id = recipient && (@request.data.type = null||@request.data.type = type) && (@request.data.metadata = null||@request.data.metadata = metadata) && (@request.data.recipient = null||@request.data.recipient = recipient) && (@request.data.author = null||@request.data.author = author) && @request.data.seen = true") + + return dao.SaveCollection(collection) + }, func(db dbx.Builder) error { + dao := daos.New(db); + + collection, err := dao.FindCollectionByNameOrId("khrcci2uqknny8h") + if err != nil { + return err + } + + collection.UpdateRule = types.Pointer("@request.auth.id = recipient && @request.data.type = type && @request.data.metadata = metadata && @request.data.recipient = recipient && @request.data.author = author && @request.data.seen = true") + + return dao.SaveCollection(collection) + }) +} diff --git a/web/src/lib/components/summit_log/summit_log_table_row.svelte b/web/src/lib/components/summit_log/summit_log_table_row.svelte index 2843ace0..4e7f5f55 100644 --- a/web/src/lib/components/summit_log/summit_log_table_row.svelte +++ b/web/src/lib/components/summit_log/summit_log_table_row.svelte @@ -130,7 +130,7 @@ {/if} {/if} - {#if showAuthor && log.expand.author} + {#if showAuthor && log.expand?.author}

{/if} - {#if showRoute && log.expand.gpx_data} + {#if showRoute && log.expand?.gpx_data} + photos: z.array(z.string()).default([]) +}) satisfies ZodType> const SummitLogUpdateSchema = z.object({ date: z.string().date().refine((val) => !val || !isNaN(Date.parse(val)), "invalid-date").optional(), diff --git a/web/src/lib/models/api/trail_schema.ts b/web/src/lib/models/api/trail_schema.ts index bc8af214..ee76886e 100644 --- a/web/src/lib/models/api/trail_schema.ts +++ b/web/src/lib/models/api/trail_schema.ts @@ -10,21 +10,21 @@ const TrailCreateSchema = z.object({ date: z.string().optional().refine((val) => !val || !isNaN(Date.parse(val)), "invalid-date"), public: z.boolean(), difficulty: z.enum(["easy", "moderate", "difficult"]).optional(), - lat: z.number().optional(), - lon: z.number().optional(), + lat: z.number().min(-90).max(90).optional(), + lon: z.number().min(-180).max(180).optional(), distance: z.number({coerce: true}).nonnegative().optional(), elevation_gain: z.number({coerce: true}).nonnegative().optional(), elevation_loss: z.number({coerce: true}).nonnegative().optional(), duration: z.number({coerce: true}).nonnegative().optional(), - photos: z.array(z.string()), + photos: z.array(z.string()).default([]), thumbnail: z.number().int().nonnegative().optional(), - waypoints: z.array(z.string()), - summit_logs: z.array(z.string()), - category: z.string().optional(), + waypoints: z.array(z.string()).default([]), + summit_logs: z.array(z.string()).default([]), + category: z.string().length(15).optional(), gpx: z.string().optional(), author: z.string().length(15), -}) satisfies ZodType +}) satisfies ZodType> const TrailUpdateSchema = z.object({ name: z.string(), @@ -33,13 +33,15 @@ const TrailUpdateSchema = z.object({ date: z.string().optional().refine((val) => !val || !isNaN(Date.parse(val)), "invalid-date"), public: z.boolean().optional(), difficulty: z.enum(["easy", "moderate", "difficult"]).optional(), - lat: z.number().optional(), - lon: z.number().optional(), + lat: z.number().min(-90).max(90).optional(), + lon: z.number().min(-180).max(180).optional(), distance: z.number({coerce: true}).nonnegative().optional(), elevation_gain: z.number({coerce: true}).nonnegative().optional(), elevation_loss: z.number({coerce: true}).nonnegative().optional(), duration: z.number({coerce: true}).nonnegative().optional(), photos: z.array(z.string()).optional(), + "photos-": z.string().optional(), + "photos+": z.string().optional(), thumbnail: z.number().int().nonnegative().optional(), waypoints: z.array(z.string()).optional(), summit_logs: z.array(z.string()).optional(), diff --git a/web/src/lib/models/api/user_schema.ts b/web/src/lib/models/api/user_schema.ts index 485f5521..27bbeec0 100644 --- a/web/src/lib/models/api/user_schema.ts +++ b/web/src/lib/models/api/user_schema.ts @@ -7,7 +7,7 @@ const UserCreateSchema = (z.object({ password: z.string().min(8, "must-be-at-least-n-characters-long"), passwordConfirm: z.string().optional() -}) satisfies ZodType).refine((data) => data.password === data.passwordConfirm, { +}) satisfies ZodType>).refine((data) => data.password === data.passwordConfirm, { message: "passwords-must-match", path: ["passwordConfirm"], }) diff --git a/web/src/lib/models/api/waypoint_schema.ts b/web/src/lib/models/api/waypoint_schema.ts index 5581aefa..91d1e1c8 100644 --- a/web/src/lib/models/api/waypoint_schema.ts +++ b/web/src/lib/models/api/waypoint_schema.ts @@ -5,22 +5,20 @@ const WaypointCreateSchema = z.object({ id: z.string().length(15).optional(), name: z.string().optional(), description: z.string().optional(), - text: z.string().optional(), - lat: z.number(), - lon: z.number(), + lat: z.number({coerce: true}).min(-90).max(90), + lon: z.number({coerce: true}).min(-180).max(180), icon: z.string().optional(), author: z.string().length(15), - photos: z.array(z.string()), -}) satisfies ZodType + photos: z.array(z.string()).default([]), +}) satisfies ZodType> const WaypointUpdateSchema = z.object({ name: z.string().optional(), description: z.string().optional(), - text: z.string().optional(), - lat: z.number({coerce: true}).optional(), - lon: z.number({coerce: true}).optional(), + lat: z.number({coerce: true}).min(-90).max(90).optional(), + lon: z.number({coerce: true}).min(-180).max(180).optional(), icon: z.string().optional(), - photos: z.array(z.string()), + photos: z.array(z.string()).optional(), "photos-": z.string().optional(), "photos+": z.string().optional(), }) satisfies ZodType> diff --git a/web/src/routes/api/v1/summit-log/+server.ts b/web/src/routes/api/v1/summit-log/+server.ts index c590f6f2..55507ccc 100644 --- a/web/src/routes/api/v1/summit-log/+server.ts +++ b/web/src/routes/api/v1/summit-log/+server.ts @@ -1,9 +1,8 @@ import { SummitLogCreateSchema } from '$lib/models/api/summit_log_schema'; import type { SummitLog } from '$lib/models/summit_log'; import { pb } from '$lib/pocketbase'; -import { create, handleError } from '$lib/util/api_util'; -import { Collection, list } from '$lib/util/api_util'; -import { error, json, type RequestEvent } from '@sveltejs/kit'; +import { Collection, create, handleError, list } from '$lib/util/api_util'; +import { json, type RequestEvent } from '@sveltejs/kit'; export async function GET(event: RequestEvent) { try { @@ -29,6 +28,6 @@ export async function PUT(event: RequestEvent) { const r = await create(event, SummitLogCreateSchema, Collection.summit_logs) return json(r); } catch (e: any) { - throw error(e.status, e) + throw handleError(e) } }