From 8bf8642703986e7aea9bdeafead016d12c8cccc4 Mon Sep 17 00:00:00 2001 From: Christian Beutel <> Date: Tue, 24 Jun 2025 17:55:59 +0200 Subject: [PATCH] switches username and preferred_username --- db/federation/actor.go | 2 +- db/federation/announce.go | 4 +- db/federation/create.go | 12 ++-- db/federation/follow.go | 2 +- db/federation/like.go | 4 +- .../1750774093_swap_preferred_username.go | 58 +++++++++++++++++++ db/migrations/1750780092_updated_timeline.go | 40 +++++++++++++ db/util/activitypub.go | 10 ++-- db/util/meilisearch.go | 4 +- db/util/notification.go | 2 +- web/src/lib/components/actor_search.svelte | 8 +-- web/src/lib/components/base/editor.svelte | 6 +- .../components/comment/comment_card.svelte | 2 +- web/src/lib/components/list/list_card.svelte | 2 +- web/src/lib/components/list/list_panel.svelte | 2 +- .../components/list/list_share_modal.svelte | 4 +- .../notification/notification_card.svelte | 2 +- .../components/profile/activity_card.svelte | 2 +- web/src/lib/components/share_info.svelte | 4 +- .../summit_log/summit_log_card.svelte | 2 +- .../summit_log/summit_log_table_row.svelte | 6 +- .../lib/components/trail/trail_card.svelte | 4 +- .../components/trail/trail_info_panel.svelte | 2 +- .../components/trail/trail_list_item.svelte | 2 +- .../lib/components/trail/trail_table.svelte | 4 +- web/src/lib/stores/list_store.ts | 2 +- web/src/lib/stores/trail_store.ts | 2 +- web/src/lib/util/activitypub_util.ts | 4 +- web/src/routes/+page.svelte | 8 +-- .../v1/activitypub/user/[handle]/+server.ts | 2 +- web/src/routes/api/v1/comment/+server.ts | 10 +++- .../api/v1/profile/[handle]/lists/+server.ts | 2 +- .../api/v1/profile/[handle]/stats/+server.ts | 2 +- .../v1/profile/[handle]/timeline/+server.ts | 2 +- .../api/v1/profile/[handle]/trails/+server.ts | 2 +- web/src/routes/api/v1/trail/[id]/+server.ts | 3 +- .../routes/profile/[handle]/+layout.svelte | 6 +- web/src/routes/profile/[handle]/+page.svelte | 2 +- .../[handle]/users/[type]/+page.svelte | 8 +-- 39 files changed, 175 insertions(+), 70 deletions(-) create mode 100644 db/migrations/1750774093_swap_preferred_username.go create mode 100644 db/migrations/1750780092_updated_timeline.go diff --git a/db/federation/actor.go b/db/federation/actor.go index c048f849..d678e31a 100644 --- a/db/federation/actor.go +++ b/db/federation/actor.go @@ -43,7 +43,7 @@ func SplitHandle(handle string) (string, string) { func GetActorByHandle(app core.App, handle string, includeFollows bool) (*core.Record, error) { username, domain := SplitHandle(handle) - filter := "username={:username}&&" + filter := "preferred_username={:username}&&" if domain != "" { filter += "domain={:domain}" } else { diff --git a/db/federation/announce.go b/db/federation/announce.go index e757b61d..8a921c09 100644 --- a/db/federation/announce.go +++ b/db/federation/announce.go @@ -196,7 +196,7 @@ func processTrailAnnounceActivity(app core.App, actor *core.Record, activity pub Metadata: map[string]string{ "id": trail.Id, "trail": trail.GetString("name"), - "author": fmt.Sprintf("@%s@%s", actor.GetString("username"), actor.GetString("domain")), + "author": fmt.Sprintf("@%s@%s", actor.GetString("preferred_username"), actor.GetString("domain")), }, Seen: false, Author: actor.Id, @@ -261,7 +261,7 @@ func processListAnnounceActivity(app core.App, actor *core.Record, activity pub. Metadata: map[string]string{ "id": list.Id, "list": list.GetString("name"), - "author": fmt.Sprintf("@%s@%s", actor.GetString("username"), actor.GetString("domain")), + "author": fmt.Sprintf("@%s@%s", actor.GetString("preferred_username"), actor.GetString("domain")), }, Seen: false, Author: actor.Id, diff --git a/db/federation/create.go b/db/federation/create.go index b8a5b382..55626669 100644 --- a/db/federation/create.go +++ b/db/federation/create.go @@ -322,7 +322,7 @@ func CreateSummitLogActivity(app core.App, summitLog *core.Record, typ pub.Activ logObject.AttributedTo = pub.IRI(summitLogAuthor.GetString("iri")) logObject.Published = summitLog.GetDateTime("created").Time() logObject.ID = pub.IRI(fmt.Sprintf("%s/api/v1/summit-log/%s", origin, summitLog.Id)) - logObject.URL = pub.IRI(fmt.Sprintf("%s/trail/view/@%s/%s", origin, summitLogTrailAuthor.GetString("username"), summitLog.GetString("trail"))) + logObject.URL = pub.IRI(fmt.Sprintf("%s/trail/view/@%s/%s", origin, summitLogTrailAuthor.GetString("preferred_username"), summitLog.GetString("trail"))) logObject.InReplyTo = trailIRI logObject.Tag = tags @@ -487,7 +487,7 @@ func processCreateOrUpdateTrailActivity(activity pub.Activity, app core.App, act Type: util.TrailMention, Metadata: map[string]string{ "id": trail.Id, - "author": fmt.Sprintf("@%s@%s", actor.GetString("username"), actor.GetString("domain")), + "author": fmt.Sprintf("@%s@%s", actor.GetString("preferred_username"), actor.GetString("domain")), }, Seen: false, Author: actor.Id, @@ -584,7 +584,7 @@ func processCreateOrUpdateCommentActivity(activity pub.Activity, app core.App, a "comment": commentObject.Content.First().Value.String(), "trail_id": trail.Id, "trail_name": trail.GetString("name"), - "trail_author": fmt.Sprintf("@%s@%s", trailAuthor.GetString("username"), trailAuthor.GetString("domain")), + "trail_author": fmt.Sprintf("@%s@%s", trailAuthor.GetString("preferred_username"), trailAuthor.GetString("domain")), }, Seen: false, Author: actor.Id, @@ -600,7 +600,7 @@ func processCreateOrUpdateCommentActivity(activity pub.Activity, app core.App, a "comment": commentObject.Content.First().Value.String(), "trail_id": trail.Id, "trail_name": trail.GetString("name"), - "trail_author": fmt.Sprintf("@%s@%s", trailAuthor.GetString("username"), trailAuthor.GetString("domain")), + "trail_author": fmt.Sprintf("@%s@%s", trailAuthor.GetString("preferred_username"), trailAuthor.GetString("domain")), }, Seen: false, Author: actor.Id, @@ -764,7 +764,7 @@ func processCreateOrUpdateSummitLogActivity(activity pub.Activity, app core.App, Metadata: map[string]string{ "trail_id": trail.Id, "trail_name": trail.GetString("name"), - "trail_author": fmt.Sprintf("@%s@%s", trailAuthor.GetString("username"), trailAuthor.GetString("domain")), + "trail_author": fmt.Sprintf("@%s@%s", trailAuthor.GetString("preferred_username"), trailAuthor.GetString("domain")), }, Seen: false, Author: actor.Id, @@ -780,7 +780,7 @@ func processCreateOrUpdateSummitLogActivity(activity pub.Activity, app core.App, Metadata: map[string]string{ "trail_id": trail.Id, "trail_name": trail.GetString("name"), - "trail_author": fmt.Sprintf("@%s@%s", trailAuthor.GetString("username"), trailAuthor.GetString("domain")), + "trail_author": fmt.Sprintf("@%s@%s", trailAuthor.GetString("preferred_username"), trailAuthor.GetString("domain")), }, Seen: false, Author: actor.Id, diff --git a/db/federation/follow.go b/db/federation/follow.go index 33b4c6c6..620bd6f9 100644 --- a/db/federation/follow.go +++ b/db/federation/follow.go @@ -124,7 +124,7 @@ func ProcessFollowActivity(app core.App, actor *core.Record, activity pub.Activi notification := util.Notification{ Type: util.NewFollower, Metadata: map[string]string{ - "follower": fmt.Sprintf("@%s@%s", actor.GetString("username"), actor.GetString("domain")), + "follower": fmt.Sprintf("@%s@%s", actor.GetString("preferred_username"), actor.GetString("domain")), }, Seen: false, Author: actor.Id, diff --git a/db/federation/like.go b/db/federation/like.go index 107e940d..cadd2409 100644 --- a/db/federation/like.go +++ b/db/federation/like.go @@ -107,8 +107,8 @@ func ProcessLikeActivity(app core.App, actor *core.Record, activity pub.Activity Metadata: map[string]string{ "trail_id": trail.Id, "trail_name": trail.GetString("name"), - "trail_author": fmt.Sprintf("@%s", trailAuthor.GetString("username")), - "liker": fmt.Sprintf("@%s@%s", actor.GetString("username"), actor.GetString("domain")), + "trail_author": fmt.Sprintf("@%s", trailAuthor.GetString("preferred_username")), + "liker": fmt.Sprintf("@%s@%s", actor.GetString("preferred_username"), actor.GetString("domain")), }, Seen: false, Author: actor.Id, diff --git a/db/migrations/1750774093_swap_preferred_username.go b/db/migrations/1750774093_swap_preferred_username.go new file mode 100644 index 00000000..963cd904 --- /dev/null +++ b/db/migrations/1750774093_swap_preferred_username.go @@ -0,0 +1,58 @@ +package migrations + +import ( + "github.com/pocketbase/pocketbase/core" + m "github.com/pocketbase/pocketbase/migrations" +) + +func init() { + m.Register(func(app core.App) error { + actors, err := app.FindAllRecords("activitypub_actors") + if err != nil { + return err + } + + for _, a := range actors { + if !a.GetBool("isLocal") { + continue + } + + username := a.GetString("username") + preferredUsername := a.GetString("preferred_username") + + a.Set("username", preferredUsername) + a.Set("preferred_username", username) + + err = app.Save(a) + if err != nil { + return err + } + } + + return nil + }, func(app core.App) error { + actors, err := app.FindAllRecords("activitypub_actors") + if err != nil { + return err + } + + for _, a := range actors { + if !a.GetBool("isLocal") { + continue + } + + username := a.GetString("username") + preferredUsername := a.GetString("preferred_username") + + a.Set("username", preferredUsername) + a.Set("preferred_username", username) + + err = app.Save(a) + if err != nil { + return err + } + } + + return nil + }) +} diff --git a/db/migrations/1750780092_updated_timeline.go b/db/migrations/1750780092_updated_timeline.go new file mode 100644 index 00000000..e25b371c --- /dev/null +++ b/db/migrations/1750780092_updated_timeline.go @@ -0,0 +1,40 @@ +package migrations + +import ( + "encoding/json" + + "github.com/pocketbase/pocketbase/core" + m "github.com/pocketbase/pocketbase/migrations" +) + +func init() { + m.Register(func(app core.App) error { + collection, err := app.FindCollectionByNameOrId("pbc_468398817") + if err != nil { + return err + } + + // update collection data + if err := json.Unmarshal([]byte(`{ + "viewQuery": "SELECT\n id,\n trail_id,\n trail_author_username,\n trail_author_domain,\n trail_iri,\n date,\n name,\n description,\n gpx,\n author,\n photos,\n distance,\n duration,\n elevation_gain,\n elevation_loss,\n created,\n type\nFROM\n (\n SELECT\n summit_logs.id,\n summit_logs.trail as trail_id,\n tapa.preferred_username as trail_author_username,\n tapa.domain as trail_author_domain,\n trails.iri as trail_iri,\n summit_logs.date,\n trails.name,\n text as description,\n summit_logs.gpx,\n sapa.iri as author,\n summit_logs.photos,\n summit_logs.distance,\n summit_logs.duration,\n summit_logs.elevation_gain,\n summit_logs.elevation_loss,\n summit_logs.created,\n \"summit_log\" as type\n FROM\n summit_logs\n JOIN trails ON summit_logs.trail = trails.id\n JOIN activitypub_actors sapa ON sapa.id = summit_logs.author\n JOIN activitypub_actors tapa ON tapa.id = trails.author\n UNION\n SELECT\n trails.id,\n trails.id as trail_id,\n activitypub_actors.preferred_username as trail_author_username,\n activitypub_actors.domain as trail_author_domain,\n trails.iri as trail_iri,\n date,\n trails.name,\n description,\n gpx,\n activitypub_actors.iri as author,\n photos,\n distance,\n duration,\n elevation_gain,\n elevation_loss,\n trails.created,\n \"trail\" as type\n FROM\n trails\n JOIN activitypub_actors ON activitypub_actors.id = trails.author\n )\nORDER BY\n created DESC;\n" + }`), &collection); err != nil { + return err + } + + return app.Save(collection) + }, func(app core.App) error { + collection, err := app.FindCollectionByNameOrId("pbc_468398817") + if err != nil { + return err + } + + // update collection data + if err := json.Unmarshal([]byte(`{ + "viewQuery": "SELECT\n id,\n trail_id,\n trail_author_username,\n trail_author_domain,\n trail_iri,\n date,\n name,\n description,\n gpx,\n author,\n photos,\n distance,\n duration,\n elevation_gain,\n elevation_loss,\n created,\n type\nFROM\n (\n SELECT\n summit_logs.id,\n summit_logs.trail as trail_id,\n tapa.username as trail_author_username,\n tapa.domain as trail_author_domain,\n trails.iri as trail_iri,\n summit_logs.date,\n trails.name,\n text as description,\n summit_logs.gpx,\n sapa.iri as author,\n summit_logs.photos,\n summit_logs.distance,\n summit_logs.duration,\n summit_logs.elevation_gain,\n summit_logs.elevation_loss,\n summit_logs.created,\n \"summit_log\" as type\n FROM\n summit_logs\n JOIN trails ON summit_logs.trail = trails.id\n JOIN activitypub_actors sapa ON sapa.id = summit_logs.author\n JOIN activitypub_actors tapa ON tapa.id = trails.author\n UNION\n SELECT\n trails.id,\n trails.id as trail_id,\n activitypub_actors.username as trail_author_username,\n activitypub_actors.domain as trail_author_domain,\n trails.iri as trail_iri,\n date,\n trails.name,\n description,\n gpx,\n activitypub_actors.iri as author,\n photos,\n distance,\n duration,\n elevation_gain,\n elevation_loss,\n trails.created,\n \"trail\" as type\n FROM\n trails\n JOIN activitypub_actors ON activitypub_actors.id = trails.author\n )\nORDER BY\n created DESC;\n" + }`), &collection); err != nil { + return err + } + + return app.Save(collection) + }) +} diff --git a/db/util/activitypub.go b/db/util/activitypub.go index ba424e2a..29d1eb3c 100644 --- a/db/util/activitypub.go +++ b/db/util/activitypub.go @@ -64,7 +64,7 @@ func ActorFromUser(app core.App, u *core.Record) (*core.Record, error) { if origin == "" { return nil, fmt.Errorf("ORIGIN environment variable not set") } - id := fmt.Sprintf("%s/api/v1/activitypub/user/%s", origin, strings.ToLower(u.GetString("username"))) + id := fmt.Sprintf("%s/api/v1/activitypub/user/%s", origin, strings.ToLower(u.GetString("preferred_username"))) url, err := url.Parse(origin) if err != nil { @@ -72,8 +72,8 @@ func ActorFromUser(app core.App, u *core.Record) (*core.Record, error) { } domain := strings.TrimPrefix(url.Hostname(), "www.") - record.Set("username", strings.ToLower(u.GetString("username"))) - record.Set("preferred_username", u.GetString("username")) + record.Set("username", u.GetString("username")) + record.Set("preferred_username", strings.ToLower(u.GetString("username"))) record.Set("domain", domain) record.Set("summary", settings.GetString("bio")) record.Set("published", u.GetDateTime("created")) @@ -398,7 +398,7 @@ func ObjectFromTrail(app core.App, trail *core.Record, mentions *pub.ItemCollect }) } - activityURL := fmt.Sprintf("%s/trail/view/@%s/%s", origin, trailAuthor.GetString("username"), trail.Id) + activityURL := fmt.Sprintf("%s/trail/view/@%s/%s", origin, trailAuthor.GetString("preferred_username"), trail.Id) activityContent := fmt.Sprintf("
- {`@${share.expand.actor.username}${share.expand.actor.isLocal ? "" : "@" + share.expand.actor.domain}`} + {`@${share.expand.actor.preferred_username}${share.expand.actor.isLocal ? "" : "@" + share.expand.actor.domain}`}
@@ -82,7 +82,7 @@
diff --git a/web/src/lib/components/summit_log/summit_log_card.svelte b/web/src/lib/components/summit_log/summit_log_card.svelte
index 5cb19569..a490292d 100644
--- a/web/src/lib/components/summit_log/summit_log_card.svelte
+++ b/web/src/lib/components/summit_log/summit_log_card.svelte
@@ -103,7 +103,7 @@
{handleFromRecordWithIRI(log)}
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 b44eb589..41bf2da6 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
@@ -189,13 +189,13 @@
diff --git a/web/src/lib/components/trail/trail_card.svelte b/web/src/lib/components/trail/trail_card.svelte
index 87260a9b..1fd714cc 100644
--- a/web/src/lib/components/trail/trail_card.svelte
+++ b/web/src/lib/components/trail/trail_card.svelte
@@ -130,10 +130,10 @@
- {trail.expand.author.username}{trail.expand.author.isLocal
+ {trail.expand.author.preferred_username}{trail.expand.author.isLocal
? ""
: "@" + trail.expand.author.domain}
{data.profile.acct} diff --git a/web/src/routes/profile/[handle]/+page.svelte b/web/src/routes/profile/[handle]/+page.svelte index dcf077f8..1a9f7130 100644 --- a/web/src/routes/profile/[handle]/+page.svelte +++ b/web/src/routes/profile/[handle]/+page.svelte @@ -69,7 +69,7 @@
- {follow.preferred_username} + {follow.username}
- @{follow.username}@{follow.domain} + @{follow.preferred_username}@{follow.domain}