diff --git a/.gitignore b/.gitignore index 2f8389e2..276d58d5 100644 --- a/.gitignore +++ b/.gitignore @@ -11,4 +11,7 @@ run.sh build*.sh start*.* -data*/ \ No newline at end of file +data*/ +.planning/ +.claude +CLAUDE.md \ No newline at end of file diff --git a/db/federation/announce.go b/db/federation/announce.go index 8a921c09..5188c518 100644 --- a/db/federation/announce.go +++ b/db/federation/announce.go @@ -3,9 +3,7 @@ package federation import ( "database/sql" "fmt" - "net/url" "os" - "path" "pocketbase/util" "strings" "time" @@ -180,12 +178,7 @@ func processTrailAnnounceActivity(app core.App, actor *core.Record, activity pub return err } } else { - trailUrl, err := url.Parse(activity.Object.GetID().String()) - if err != nil { - return err - } - trailId := path.Base(trailUrl.Path) - trail, err = app.FindRecordById("trails", trailId) + trail, err = app.FindFirstRecordByData("trails", "iri", activity.Object.GetID().String()) if err != nil { return err } @@ -245,12 +238,7 @@ func processListAnnounceActivity(app core.App, actor *core.Record, activity pub. return err } } else { - listUrl, err := url.Parse(activity.Object.GetID().String()) - if err != nil { - return err - } - listId := path.Base(listUrl.Path) - list, err = app.FindRecordById("trails", listId) + list, err = app.FindFirstRecordByData("lists", "iri", activity.Object.GetID().String()) if err != nil { return err } diff --git a/db/federation/create.go b/db/federation/create.go index 126349db..3751bec7 100644 --- a/db/federation/create.go +++ b/db/federation/create.go @@ -4,9 +4,7 @@ import ( "context" "database/sql" "fmt" - "net/url" "os" - "path" "strconv" "strings" "time" @@ -228,12 +226,7 @@ func CreateSummitLogActivity(app core.App, ctx context.Context, summitLog *core. } var trailIRI pub.IRI - if summitLogTrailAuthor.GetBool("isLocal") { - trailId := summitLog.GetString("trail") - trailIRI = pub.IRI(fmt.Sprintf("%s/api/v1/trail/%s", origin, trailId)) - } else { - trailIRI = pub.IRI(summitLogTrail.GetString("iri")) - } + trailIRI = pub.IRI(summitLogTrail.GetString("iri")) recordId := security.RandomStringWithAlphabet(core.DefaultIdLength, core.DefaultIdAlphabet) @@ -321,7 +314,7 @@ func CreateSummitLogActivity(app core.App, ctx context.Context, summitLog *core. logObject.Content = pub.NaturalLanguageValuesNew(pub.LangRefValueNew(pub.NilLangRef, summitLog.GetString("text"))) 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.ID = pub.IRI(summitLog.GetString("iri")) 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 @@ -512,14 +505,8 @@ func processCreateOrUpdateCommentActivity(activity pub.Activity, app core.App, a return fmt.Errorf("error processing comment: InReplyTo empty") } - trailUrl, err := url.Parse(commentObject.InReplyTo.GetLink().String()) - if err != nil { - return err - } - trailId := path.Base(trailUrl.Path) - var trail *core.Record - trail, err = app.FindFirstRecordByFilter("trails", "iri={:iri} || id={:id}", dbx.Params{"id": trailId, "iri": commentObject.InReplyTo.GetID().String()}) + trail, err = app.FindFirstRecordByData("trails", "iri", commentObject.InReplyTo.GetLink().String()) // if the trail is not present on this instance fetch it if err != nil { @@ -619,13 +606,7 @@ func processCreateOrUpdateSummitLogActivity(activity pub.Activity, app core.App, return err } - trailIRI, err := url.Parse(logObject.InReplyTo.GetID().String()) - if err != nil { - return err - } - trailId := path.Base(trailIRI.Path) - - trail, err := app.FindFirstRecordByFilter("trails", "iri={:iri} || id={:id}", dbx.Params{"id": trailId, "iri": logObject.InReplyTo.GetID().String()}) + trail, err := app.FindFirstRecordByData("trails", "iri", logObject.InReplyTo.GetID().String()) // if the trail is not present on this instance fetch it if err != nil { if err == sql.ErrNoRows { diff --git a/db/federation/delete.go b/db/federation/delete.go index 0c2283ae..f5d78f9c 100644 --- a/db/federation/delete.go +++ b/db/federation/delete.go @@ -39,7 +39,7 @@ func CreateTrailDeleteActivity(app core.App, r *core.Record) error { id := fmt.Sprintf("%s/api/v1/activitypub/activity/%s", origin, recordId) to := "https://www.w3.org/ns/activitystreams#Public" cc := author.GetString("iri") + "/followers" - object := fmt.Sprintf("%s/api/v1/trail/%s", origin, r.Id) + object := r.GetString("iri") record := core.NewRecord(collection) record.Set("id", recordId) @@ -118,7 +118,7 @@ func CreateCommentDeleteActivity(app core.App, client meilisearch.ServiceManager id := fmt.Sprintf("%s/api/v1/activitypub/activity/%s", origin, recordId) to := commentTrailAuthor.GetString("iri") - object := fmt.Sprintf("%s/api/v1/comment/%s", origin, r.Id) + object := r.GetString("iri") activity := pub.DeleteNew(pub.IRI(id), pub.IRI(object)) activity.Actor = pub.IRI(author.GetString("iri")) @@ -176,7 +176,7 @@ func CreateSummitLogDeleteActivity(app core.App, r *core.Record) error { id := fmt.Sprintf("%s/api/v1/activitypub/activity/%s", origin, recordId) to := summitLogTrailAuthor.GetString("iri") - object := fmt.Sprintf("%s/api/v1/summit-log/%s", origin, r.Id) + object := r.GetString("iri") cc := pub.ItemCollection{pub.IRI(author.GetString("iri") + "/followers")} activity := pub.DeleteNew(pub.IRI(id), pub.IRI(object)) @@ -248,7 +248,7 @@ func CreateListDeleteActivity(app core.App, r *core.Record) error { id := fmt.Sprintf("%s/api/v1/activitypub/activity/%s", origin, recordId) to := "https://www.w3.org/ns/activitystreams#Public" cc := author.GetString("iri") + "/followers" - object := fmt.Sprintf("%s/api/v1/list/%s", origin, r.Id) + object := r.GetString("iri") activity := pub.DeleteNew(pub.IRI(id), pub.IRI(object)) activity.Actor = pub.IRI(author.GetString("iri")) diff --git a/db/federation/like.go b/db/federation/like.go index cadd2409..2ae55fd0 100644 --- a/db/federation/like.go +++ b/db/federation/like.go @@ -3,7 +3,6 @@ package federation import ( "fmt" "os" - "path" "pocketbase/util" "time" @@ -36,11 +35,6 @@ func CreateLikeActivity(app core.App, like *core.Record) error { object := trail.GetString("iri") - if object == "" { - // trail is local - object = fmt.Sprintf("%s/api/v1/trail/%s", origin, trail.Id) - } - collection, err := app.FindCollectionByNameOrId("activitypub_activities") if err != nil { return err @@ -76,8 +70,7 @@ func ProcessLikeActivity(app core.App, actor *core.Record, activity pub.Activity return fmt.Errorf("ORIGIN not set") } - trailId := path.Base(activity.Object.GetID().String()) - trail, err := app.FindRecordById("trails", trailId) + trail, err := app.FindFirstRecordByData("trails", "iri", activity.Object.GetID().String()) if err != nil { return err } diff --git a/db/federation/undo.go b/db/federation/undo.go index d9d6f386..d7c3d35f 100644 --- a/db/federation/undo.go +++ b/db/federation/undo.go @@ -3,7 +3,6 @@ package federation import ( "fmt" "os" - "path" "time" pub "github.com/go-ap/activitypub" @@ -91,10 +90,6 @@ func CreateUnlikeActivity(app core.App, like *core.Record) error { } object := trail.GetString("iri") - if object == "" { - // trail is local - object = fmt.Sprintf("%s/api/v1/trail/%s", origin, trail.Id) - } // find the original follow activity likeActivityRecord, err := app.FindFirstRecordByFilter("activitypub_activities", "actor={:actor}&&object={:object}&&type={:type}", dbx.Params{"actor": actor.GetString("iri"), "object": object, "type": string(pub.LikeType)}) @@ -175,8 +170,7 @@ func processUnlikeActivity(app core.App, actor *core.Record, activity pub.Activi likeActivity := activity.Object.(*pub.Activity) - trailId := path.Base(likeActivity.Object.GetID().String()) - trail, err := app.FindRecordById("trails", trailId) + trail, err := app.FindFirstRecordByData("trails", "iri", likeActivity.Object.GetID().String()) if err != nil { return err } diff --git a/db/hooks/comments.go b/db/hooks/comments.go index ebd77353..8e544ae2 100644 --- a/db/hooks/comments.go +++ b/db/hooks/comments.go @@ -1,6 +1,8 @@ package hooks import ( + "fmt" + "os" "pocketbase/federation" "pocketbase/util" @@ -12,7 +14,23 @@ import ( func CreateCommentHandler() func(e *core.RecordRequestEvent) error { return func(e *core.RecordRequestEvent) error { - e.Next() + err := e.Next() + if err != nil { + return err + } + + // add local iri + origin := os.Getenv("ORIGIN") + if origin == "" { + return fmt.Errorf("ORIGIN not set") + } + if e.Record.GetString("iri") == "" { + e.Record.Set("iri", fmt.Sprintf("%s/api/v1/comment/%s", origin, e.Record.Id)) + } + err = e.App.UnsafeWithoutHooks().Save(e.Record) + if err != nil { + return err + } userActor, err := e.App.FindFirstRecordByData("activitypub_actors", "user", e.Auth.Id) if err != nil { diff --git a/db/hooks/list.go b/db/hooks/list.go index 91eabd0c..b2651871 100644 --- a/db/hooks/list.go +++ b/db/hooks/list.go @@ -1,6 +1,8 @@ package hooks import ( + "fmt" + "os" "pocketbase/federation" "pocketbase/util" @@ -18,20 +20,32 @@ func CreateListHandler(client meilisearch.ServiceManager) func(e *core.RecordEve return err } + // add local iri + origin := os.Getenv("ORIGIN") + if origin == "" { + return fmt.Errorf("ORIGIN not set") + } + if e.Record.GetString("iri") == "" { + e.Record.Set("iri", fmt.Sprintf("%s/api/v1/list/%s", origin, e.Record.Id)) + if err = e.App.UnsafeWithoutHooks().Save(e.Record); err != nil { + return err + } + } + if err := util.IndexLists(e.App, []*core.Record{record}, client); err != nil { return err } + err = e.Next() + if err != nil { + return err + } + if !author.GetBool("isLocal") { // this happens if someone fetches a remote list // we create a stub list record for later reference // no need to create an activity for that - return e.Next() - } - - err = e.Next() - if err != nil { - return err + return nil } err = federation.CreateListActivity(e.App, e.Record, pub.CreateType) diff --git a/db/hooks/summit_logs.go b/db/hooks/summit_logs.go index a703f150..f830cc24 100644 --- a/db/hooks/summit_logs.go +++ b/db/hooks/summit_logs.go @@ -1,6 +1,8 @@ package hooks import ( + "fmt" + "os" "pocketbase/federation" "pocketbase/util" @@ -11,12 +13,24 @@ import ( func CreateSummitLogHandler(client meilisearch.ServiceManager) func(e *core.RecordRequestEvent) error { return func(e *core.RecordRequestEvent) error { - err := e.Next() if err != nil { return err } + // add local iri + origin := os.Getenv("ORIGIN") + if origin == "" { + return fmt.Errorf("ORIGIN not set") + } + if e.Record.GetString("iri") == "" { + e.Record.Set("iri", fmt.Sprintf("%s/api/v1/summit-log/%s", origin, e.Record.Id)) + } + err = e.App.UnsafeWithoutHooks().Save(e.Record) + if err != nil { + return err + } + userActor, err := e.App.FindFirstRecordByData("activitypub_actors", "user", e.Auth.Id) if err != nil { return err diff --git a/db/hooks/trails.go b/db/hooks/trails.go index 40bcf4ce..2e6eb956 100644 --- a/db/hooks/trails.go +++ b/db/hooks/trails.go @@ -1,7 +1,9 @@ package hooks import ( + "fmt" "log" + "os" "pocketbase/federation" "pocketbase/util" "time" @@ -23,21 +25,35 @@ func CreateTrailHandler(client meilisearch.ServiceManager) func(e *core.RecordEv if err := util.SavePolyline(e.App, record); err != nil { log.Printf("failed to save polyline for trail %s: %v", record.Id, err) } + + // add local iri + origin := os.Getenv("ORIGIN") + if origin == "" { + return fmt.Errorf("ORIGIN not set") + } + if e.Record.GetString("iri") == "" { + e.Record.Set("iri", fmt.Sprintf("%s/api/v1/trail/%s", origin, e.Record.Id)) + if err = e.App.UnsafeWithoutHooks().Save(e.Record); err != nil { + return err + } + } + if err := util.IndexTrails(e.App, []*core.Record{record}, client); err != nil { return err } - if !userActor.GetBool("isLocal") { - // this happens if someone fetches a remote trail - // we create a stub trail record for later reference - // no need to create an activity for that - return e.Next() - } err = e.Next() if err != nil { return err } + if !userActor.GetBool("isLocal") { + // this happens if someone fetches a remote list + // we create a stub list record for later reference + // no need to create an activity for that + return nil + } + ctx, err := util.GetSafeActorContext(nil, userActor) if err != nil { diff --git a/db/hooks/waypoint.go b/db/hooks/waypoint.go new file mode 100644 index 00000000..8c2a7539 --- /dev/null +++ b/db/hooks/waypoint.go @@ -0,0 +1,28 @@ +package hooks + +import ( + "fmt" + "os" + + "github.com/pocketbase/pocketbase/core" +) + +func CreateWaypointHandler() func(e *core.RecordRequestEvent) error { + return func(e *core.RecordRequestEvent) error { + err := e.Next() + if err != nil { + return err + } + + // add local iri + origin := os.Getenv("ORIGIN") + if origin == "" { + return fmt.Errorf("ORIGIN not set") + } + if e.Record.GetString("iri") == "" { + e.Record.Set("iri", fmt.Sprintf("%s/api/v1/waypoint/%s", origin, e.Record.Id)) + } + + return e.App.UnsafeWithoutHooks().Save(e.Record) + } +} diff --git a/db/main.go b/db/main.go index 046455e7..0e201851 100644 --- a/db/main.go +++ b/db/main.go @@ -98,6 +98,8 @@ func setupEventHandlers(app *pocketbase.PocketBase, client meilisearch.ServiceMa app.OnRecordUpdateRequest("summit_logs").BindFunc(hooks.UpdateSummitLogHandler()) app.OnRecordDeleteRequest("summit_logs").BindFunc(hooks.DeleteSummitLogHandler(client)) + app.OnRecordCreateRequest("waypoints").BindFunc(hooks.CreateWaypointHandler()) + app.OnRecordCreateRequest("comments").BindFunc(hooks.CreateCommentHandler()) app.OnRecordUpdateRequest("comments").BindFunc(hooks.UpdateCommentHandler()) app.OnRecordDeleteRequest("comments").BindFunc(hooks.DeleteCommentHandler(client)) diff --git a/db/migrations/1780566579_add_iri_to_local_resources.go b/db/migrations/1780566579_add_iri_to_local_resources.go new file mode 100644 index 00000000..3711a6e0 --- /dev/null +++ b/db/migrations/1780566579_add_iri_to_local_resources.go @@ -0,0 +1,126 @@ +package migrations + +import ( + "fmt" + "os" + + "github.com/pocketbase/pocketbase/core" + m "github.com/pocketbase/pocketbase/migrations" +) + +func init() { + m.Register(func(app core.App) error { + origin := os.Getenv("ORIGIN") + if origin == "" { + return fmt.Errorf("ORIGIN not set") + } + + // Comments + comments, err := app.FindAllRecords("comments") + if err != nil { + return err + } + + for _, c := range comments { + iri := c.GetString("iri") + if iri != "" { + continue + } + iri = fmt.Sprintf("%s/api/v1/comment/%s", origin, c.Id) + c.Set("iri", iri) + + if err := app.Save(c); err != nil { + return err + } + } + // --- + + // Lists + lists, err := app.FindAllRecords("lists") + if err != nil { + return err + } + + for _, l := range lists { + iri := l.GetString("iri") + if iri != "" { + continue + } + + iri = fmt.Sprintf("%s/api/v1/list/%s", origin, l.Id) + l.Set("iri", iri) + + if err := app.UnsafeWithoutHooks().Save(l); err != nil { + return err + } + } + // --- + + // Summit Logs + summitLogs, err := app.FindAllRecords("summit_logs") + if err != nil { + return err + } + + for _, sl := range summitLogs { + iri := sl.GetString("iri") + if iri != "" { + continue + } + iri = fmt.Sprintf("%s/api/v1/summit-log/%s", origin, sl.Id) + sl.Set("iri", iri) + + if err := app.Save(sl); err != nil { + return err + } + } + // --- + + // Trails + trails, err := app.FindAllRecords("trails") + if err != nil { + return err + } + + for _, t := range trails { + iri := t.GetString("iri") + if iri != "" { + continue + } + + iri = fmt.Sprintf("%s/api/v1/trail/%s", origin, t.Id) + t.Set("iri", iri) + + if err := app.UnsafeWithoutHooks().Save(t); err != nil { + return err + } + } + // --- + + // Waypoints + + wps, err := app.FindAllRecords("waypoints") + if err != nil { + return err + } + + for _, wp := range wps { + iri := wp.GetString("iri") + if iri != "" { + continue + } + + iri = fmt.Sprintf("%s/api/v1/waypoint/%s", origin, wp.Id) + wp.Set("iri", iri) + + if err := app.Save(wp); err != nil { + return err + } + } + + return nil + }, func(app core.App) error { + + return nil + }) +} diff --git a/db/routes/remote_trail.go b/db/routes/remote_trail.go index 07dc63a4..3f9eeb84 100644 --- a/db/routes/remote_trail.go +++ b/db/routes/remote_trail.go @@ -9,7 +9,6 @@ import ( "net/http" "net/url" "os" - "path" "pocketbase/federation" "pocketbase/util" "strconv" @@ -350,13 +349,10 @@ func syncSummitLogs(txApp core.App, ctx context.Context, trail *core.Record, ori slID, _ := raw["id"].(string) iri, _ := raw["iri"].(string) if iri == "" { - iri = fmt.Sprintf("%s/api/v1/summit_logs/%s", origin, slID) + iri = fmt.Sprintf("%s/api/v1/summit-log/%s", origin, slID) } - remoteSummitLogUrl, _ := url.Parse(iri) - possibleLocalId := path.Base(remoteSummitLogUrl.Path) - - sl, _ := txApp.FindFirstRecordByFilter("summit_logs", "iri={:iri} || id={:id}", dbx.Params{"id": possibleLocalId, "iri": iri}) + sl, _ := txApp.FindFirstRecordByData("summit_logs", "iri", iri) if sl == nil { sl = core.NewRecord(col) } diff --git a/db/routes/remote_trail_comment.go b/db/routes/remote_trail_comment.go index f49c5cd6..1df4c468 100644 --- a/db/routes/remote_trail_comment.go +++ b/db/routes/remote_trail_comment.go @@ -39,8 +39,13 @@ func RemoteTrailCommentsList(e *core.RequestEvent) error { return err } + trailAuthor, err := e.App.FindRecordById("activitypub_actors", trail.GetString("author")) + if err != nil { + return err + } + // Sync remote data first (Fetch + Save) - if trail.GetString("iri") != "" { + if trail.GetString("iri") != "" && !trailAuthor.GetBool("isLocal") { _ = syncRemoteComments(e, trail) } @@ -149,11 +154,8 @@ func syncRemoteComments(e *core.RequestEvent, trail *core.Record) error { remoteIRI = fmt.Sprintf("%s://%s/api/v1/comment/%s", u.Scheme, u.Host, remoteID) } - remoteCommentUrl, _ := url.Parse(remoteIRI) - possibleLocalId := path.Base(remoteCommentUrl.Path) - // Find existing record by IRI or ID to avoid duplicates - commentRecord, _ := txApp.FindFirstRecordByFilter("comments", "iri={:iri} || id={:id}", dbx.Params{"id": possibleLocalId, "iri": remoteIRI}) + commentRecord, _ := txApp.FindFirstRecordByData("comments", "iri", remoteIRI) if commentRecord == nil { commentRecord = core.NewRecord(collection) commentRecord.Set("iri", remoteIRI) diff --git a/db/util/activitypub.go b/db/util/activitypub.go index 7a44466f..2f1387ed 100644 --- a/db/util/activitypub.go +++ b/db/util/activitypub.go @@ -13,7 +13,6 @@ import ( "net/http" "net/url" "os" - "path" "strconv" "strings" "time" @@ -151,24 +150,13 @@ func TrailFromActivity(activity pub.Activity, app core.App, actor *core.Record) if !actor.GetBool("isLocal") { return nil, fmt.Errorf("refusing remote activity referencing local trail %q", iri) } - trailUrl, parseErr := url.Parse(iri) - if parseErr != nil { - return nil, parseErr - } - return app.FindRecordById("trails", path.Base(trailUrl.Path)) + + return app.FindFirstRecordByData("trails", "iri", iri) } var record *core.Record - if actor.GetBool(("isLocal")) { - trailUrl, parseErr := url.Parse(iri) - if parseErr != nil { - return nil, parseErr - } - trailId := path.Base(trailUrl.Path) - record, err = app.FindRecordById("trails", trailId) - } else { - record, err = app.FindFirstRecordByData("trails", "iri", iri) - } + + record, err = app.FindFirstRecordByData("trails", "iri", iri) if err != nil { if err == sql.ErrNoRows { @@ -432,7 +420,7 @@ func ObjectFromTrail(app core.App, trail *core.Record, mentions *pub.ItemCollect } trailObject.AttributedTo = pub.IRI(trailAuthor.GetString("iri")) trailObject.Published = trail.GetDateTime("created").Time() - trailObject.ID = pub.IRI(fmt.Sprintf("%s/api/v1/trail/%s", origin, trail.Id)) + trailObject.ID = pub.IRI(trail.GetString("iri")) trailObject.URL = pub.IRI(activityURL) trailObject.StartTime = trail.GetDateTime("date").Time() @@ -455,24 +443,14 @@ func ListFromActivity(activity pub.Activity, app core.App, actor *core.Record) ( if !actor.GetBool("isLocal") { return nil, fmt.Errorf("refusing remote activity referencing local list %q", iri) } - listURL, parseErr := url.Parse(iri) - if parseErr != nil { - return nil, parseErr - } - return app.FindRecordById("lists", path.Base(listURL.Path)) + + return app.FindFirstRecordByData("lists", "iri", iri) } var record *core.Record - if actor.GetBool(("isLocal")) { - listURL, parseErr := url.Parse(iri) - if parseErr != nil { - return nil, parseErr - } - listId := path.Base(listURL.Path) - record, err = app.FindRecordById("lists", listId) - } else { - record, err = app.FindFirstRecordByData("lists", "iri", iri) - } + + record, err = app.FindFirstRecordByData("lists", "iri", iri) + if err != nil { if err == sql.ErrNoRows { collection, err := app.FindCollectionByNameOrId("lists") @@ -568,7 +546,7 @@ func ObjectFromList(app core.App, list *core.Record) (*pub.Object, error) { listObject.AttributedTo = pub.IRI(listAuthor.GetString("iri")) listObject.Published = list.GetDateTime("created").Time() - listObject.ID = pub.IRI(fmt.Sprintf("%s/api/v1/list/%s", origin, list.Id)) + listObject.ID = pub.IRI(list.GetString("iri")) listObject.URL = pub.IRI(activityURL) listObject.Attachment = attachments return listObject, nil @@ -589,24 +567,13 @@ func ObjectFromComment(app core.App, comment *core.Record, mentions *pub.ItemCol if err != nil { return nil, err } - commentTrailAuthor, err := app.FindRecordById("activitypub_actors", commentTrail.GetString("author")) - if err != nil { - return nil, err - } - - trailURL := "" - if commentTrailAuthor.GetBool("isLocal") { - trailURL = fmt.Sprintf("https://%s/api/v1/trail/%s", commentTrailAuthor.GetString("domain"), comment.GetString("trail")) - } else { - trailURL = commentTrail.GetString("iri") - } commentObject := pub.ObjectNew(pub.NoteType) - commentObject.ID = pub.IRI(fmt.Sprintf("%s/api/v1/comment/%s", origin, comment.Id)) + commentObject.ID = pub.IRI(comment.GetString("iri")) commentObject.Content = pub.NaturalLanguageValuesNew(pub.LangRefValueNew(pub.NilLangRef, comment.GetString("text"))) commentObject.Published = comment.GetDateTime("created").Time() commentObject.AttributedTo = pub.IRI(commentAuthor.GetString("iri")) - commentObject.InReplyTo = pub.IRI(trailURL) + commentObject.InReplyTo = pub.IRI(commentTrail.GetString("iri")) if mentions != nil { commentObject.Tag = *mentions diff --git a/db/util/meilisearch.go b/db/util/meilisearch.go index 92e2a86e..5ae1f916 100644 --- a/db/util/meilisearch.go +++ b/db/util/meilisearch.go @@ -129,7 +129,7 @@ func documentFromListRecord(r *core.Record, author *core.Record, includeShares b totalDuration := 0.0 trails := len(r.GetStringSlice("trails")) - if r.GetString("iri") != "" { + if r.GetString("iri") != "" && !author.GetBool("isLocal") { doc, err := documentFromRemoteRecord(r, "lists") if err == nil { totalElevationGain = doc["elevation_gain"].(float64) diff --git a/web/src/lib/components/list/list_card.svelte b/web/src/lib/components/list/list_card.svelte index ff7fc6bd..0b8a2a37 100644 --- a/web/src/lib/components/list/list_card.svelte +++ b/web/src/lib/components/list/list_card.svelte @@ -43,7 +43,7 @@