From 9d8a8e2ebb1b03191db98deada7df393675029d6 Mon Sep 17 00:00:00 2001 From: Christian Beutel <> Date: Mon, 20 Jan 2025 16:58:43 +0100 Subject: [PATCH] moves bio to settings --- .../1715276572_updated_users_anonymous.go | 4 +- .../1737205652_move_bio_to_settings.go | 185 ++++++++++++++++++ db/migrations/1737387062_updated_settings.go | 55 ++++++ web/src/lib/models/api/settings_schema.ts | 1 + web/src/lib/models/api/user_schema.ts | 1 - web/src/lib/models/settings.ts | 1 + web/src/lib/models/user.ts | 1 - web/src/routes/profile/[id]/+page.svelte | 6 +- web/src/routes/settings/profile/+page.svelte | 10 +- 9 files changed, 252 insertions(+), 12 deletions(-) create mode 100644 db/migrations/1737205652_move_bio_to_settings.go create mode 100644 db/migrations/1737387062_updated_settings.go diff --git a/db/migrations/1715276572_updated_users_anonymous.go b/db/migrations/1715276572_updated_users_anonymous.go index c20a7a53..f86f3575 100644 --- a/db/migrations/1715276572_updated_users_anonymous.go +++ b/db/migrations/1715276572_updated_users_anonymous.go @@ -12,7 +12,7 @@ import ( func init() { m.Register(func(db dbx.Builder) error { - dao := daos.New(db); + dao := daos.New(db) collection, err := dao.FindCollectionByNameOrId("xku110v5a5xbufa") if err != nil { @@ -48,7 +48,7 @@ func init() { return dao.SaveCollection(collection) }, func(db dbx.Builder) error { - dao := daos.New(db); + dao := daos.New(db) collection, err := dao.FindCollectionByNameOrId("xku110v5a5xbufa") if err != nil { diff --git a/db/migrations/1737205652_move_bio_to_settings.go b/db/migrations/1737205652_move_bio_to_settings.go new file mode 100644 index 00000000..3bc2d900 --- /dev/null +++ b/db/migrations/1737205652_move_bio_to_settings.go @@ -0,0 +1,185 @@ +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/schema" +) + +func init() { + m.Register(func(db dbx.Builder) error { + dao := daos.New(db) + + // remove bio from users_anonymous to prevent ambiguity + uaCollection, err := dao.FindCollectionByNameOrId("xku110v5a5xbufa") + if err != nil { + return err + } + + options := map[string]any{} + if err := json.Unmarshal([]byte(`{ + "query": "SELECT users.id, username, avatar, users.created, CAST(COALESCE(json_extract(privacy, '$.account') = 'private', false) as BOOL) as private FROM users LEFT JOIN settings ON settings.user = users.id" + }`), &options); err != nil { + return err + } + uaCollection.SetOptions(options) + + err = dao.SaveCollection(uaCollection) + if err != nil { + return err + } + + // add bio field to settings + collection, err := dao.FindCollectionByNameOrId("settings") + if err != nil { + return err + } + + new_bio := &schema.SchemaField{} + if err := json.Unmarshal([]byte(`{ + "system": false, + "id": "pd2cq8sq", + "name": "bio", + "type": "text", + "required": false, + "presentable": false, + "unique": false, + "options": { + "min": null, + "max": 10000, + "pattern": "" + } + }`), new_bio); err != nil { + return err + } + collection.Schema.AddField(new_bio) + + err = dao.SaveCollection(collection) + if err != nil { + return err + } + + // migrate existing bios + users, err := dao.FindRecordsByFilter("_pb_users_auth_", "bio != null", "", -1, 0) + if err != nil { + return nil + } + + for _, user := range users { + bio := user.GetString(("bio")) + userSettings, err := dao.FindRecordsByFilter("settings", "user = {:userId}", "", 1, 0, dbx.Params{"userId": user.Id}) + if err != nil { + return err + } + + userSettings[0].Set("bio", bio) + + if err := dao.SaveRecord(userSettings[0]); err != nil { + return err + } + } + + // remove bio from users + uCollection, err := dao.FindCollectionByNameOrId("_pb_users_auth_") + if err != nil { + return err + } + + uCollection.Schema.RemoveField("pd2cq8sq") + err = dao.SaveCollection(uCollection) + if err != nil { + return err + } + + // add bio back to users_anaonymous + if err := json.Unmarshal([]byte(`{ + "query": "SELECT users.id, username, avatar, bio, users.created, CAST(COALESCE(json_extract(privacy, '$.account') = 'private', false) as BOOL) as private FROM users LEFT JOIN settings ON settings.user = users.id" + }`), &options); err != nil { + return err + } + uaCollection.SetOptions(options) + + err = dao.SaveCollection(uaCollection) + if err != nil { + return err + } + + return nil + }, func(db dbx.Builder) error { + dao := daos.New(db) + + uaCollection, err := dao.FindCollectionByNameOrId("xku110v5a5xbufa") + if err != nil { + return err + } + + options := map[string]any{} + if err := json.Unmarshal([]byte(`{ + "query": "SELECT users.id, username, avatar, users.created, CAST(COALESCE(json_extract(privacy, '$.account') = 'private', false) as BOOL) as private FROM users LEFT JOIN settings ON settings.user = users.id" + }`), &options); err != nil { + return err + } + uaCollection.SetOptions(options) + + err = dao.SaveCollection(uaCollection) + if err != nil { + return err + } + + collection, err := dao.FindCollectionByNameOrId("settings") + if err != nil { + return err + } + + // remove + collection.Schema.RemoveField("pd2cq8sq") + + err = dao.SaveCollection(collection) + if err != nil { + return err + } + + uCollection, err := dao.FindCollectionByNameOrId("_pb_users_auth_") + if err != nil { + return err + } + + // add + new_bio := &schema.SchemaField{} + if err := json.Unmarshal([]byte(`{ + "system": false, + "id": "pd2cq8sq", + "name": "bio", + "type": "text", + "required": false, + "presentable": false, + "unique": false, + "options": { + "min": null, + "max": 10000, + "pattern": "" + } + }`), new_bio); err != nil { + return err + } + uCollection.Schema.AddField(new_bio) + + err = dao.SaveCollection(uCollection) + if err != nil { + return err + } + + if err := json.Unmarshal([]byte(`{ + "query": "SELECT users.id, username, avatar, bio, users.created, CAST(COALESCE(json_extract(privacy, '$.account') = 'private', false) as BOOL) as private FROM users LEFT JOIN settings ON settings.user = users.id" + }`), &options); err != nil { + return err + } + uaCollection.SetOptions(options) + + return dao.SaveCollection(uaCollection) + + }) +} diff --git a/db/migrations/1737387062_updated_settings.go b/db/migrations/1737387062_updated_settings.go new file mode 100644 index 00000000..4e482d3e --- /dev/null +++ b/db/migrations/1737387062_updated_settings.go @@ -0,0 +1,55 @@ +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/schema" +) + +func init() { + m.Register(func(db dbx.Builder) error { + dao := daos.New(db); + + collection, err := dao.FindCollectionByNameOrId("uavt73rsqcn1n13") + if err != nil { + return err + } + + // add + new_bio := &schema.SchemaField{} + if err := json.Unmarshal([]byte(`{ + "system": false, + "id": "pd2cq8sq", + "name": "bio", + "type": "text", + "required": false, + "presentable": false, + "unique": false, + "options": { + "min": null, + "max": 10000, + "pattern": "" + } + }`), new_bio); err != nil { + return err + } + collection.Schema.AddField(new_bio) + + return dao.SaveCollection(collection) + }, func(db dbx.Builder) error { + dao := daos.New(db); + + collection, err := dao.FindCollectionByNameOrId("uavt73rsqcn1n13") + if err != nil { + return err + } + + // remove + collection.Schema.RemoveField("pd2cq8sq") + + return dao.SaveCollection(collection) + }) +} diff --git a/web/src/lib/models/api/settings_schema.ts b/web/src/lib/models/api/settings_schema.ts index 98591ec9..f37d51a9 100644 --- a/web/src/lib/models/api/settings_schema.ts +++ b/web/src/lib/models/api/settings_schema.ts @@ -5,6 +5,7 @@ import type { Settings } from "../settings"; const SettingsCreateSchema = z.object({ unit: z.enum(["metric", "imperial"]).optional(), language: z.enum(["en", "de", "es", "fr", "hu", "it", "nl", "pl", "pt", "zh"]).optional(), + bio: z.string().optional(), mapFocus: z.enum(["trails", "location"]).optional(), location: z.object({ name: z.string(), diff --git a/web/src/lib/models/api/user_schema.ts b/web/src/lib/models/api/user_schema.ts index 27bbeec0..0fded236 100644 --- a/web/src/lib/models/api/user_schema.ts +++ b/web/src/lib/models/api/user_schema.ts @@ -18,7 +18,6 @@ const UserUpdateSchema = (z.object({ password: z.string().min(8, "must-be-at-least-n-characters-long").optional(), oldPassword: z.string().min(8, "must-be-at-least-n-characters-long").optional(), passwordConfirm: z.string().min(8, "must-be-at-least-n-characters-long").optional(), - bio: z.string().optional() }) satisfies ZodType>).refine((data) => data.password === data.passwordConfirm, { message: "passwords-must-match", path: ["passwordConfirm"], diff --git a/web/src/lib/models/settings.ts b/web/src/lib/models/settings.ts index f57041af..d0061a12 100644 --- a/web/src/lib/models/settings.ts +++ b/web/src/lib/models/settings.ts @@ -4,6 +4,7 @@ class Settings { id?: string; unit?: "metric" | "imperial"; language?: "en" | "de" | "es" | "fr" | "hu" | "it" | "nl" | "pl" | "pt" | "zh"; + bio?: string; mapFocus?: "trails" | "location"; location?: { name: string, lat: number, lon: number }; category?: string; diff --git a/web/src/lib/models/user.ts b/web/src/lib/models/user.ts index 4c00be48..a0b95732 100644 --- a/web/src/lib/models/user.ts +++ b/web/src/lib/models/user.ts @@ -14,7 +14,6 @@ export type UserAnonymous = { id: string, username?: string, avatar?: string; - bio?: string; created?: string; private: boolean; } \ No newline at end of file diff --git a/web/src/routes/profile/[id]/+page.svelte b/web/src/routes/profile/[id]/+page.svelte index 10894bd9..1006b402 100644 --- a/web/src/routes/profile/[id]/+page.svelte +++ b/web/src/routes/profile/[id]/+page.svelte @@ -46,14 +46,14 @@

{$_("about")} {data.user.username} - {#if data.isOwnProfile && data.user.bio?.length} + {#if data.isOwnProfile && data.settings.bio?.length} {/if}

- {#if data.user.bio?.length} -

{data.user.bio}

+ {#if data.settings.bio?.length} +

{data.settings.bio}

{:else if data.isOwnProfile} + {$_("add-bio")} ({ text: $_(c.name), @@ -43,12 +43,12 @@ } async function handleBioSave() { - if (!$currentUser) { + if (!data.settings) { return; } try { - $currentUser.bio = bio; - await users_update($currentUser); + data.settings.bio = bio; + await settings_update(data.settings); } catch (e) { show_toast({ type: "error", @@ -111,7 +111,7 @@ {$_("save")}