diff --git a/storage-new/models/Feed.go b/storage-new/models/Feed.go index 6376d6d..ccb8f36 100644 --- a/storage-new/models/Feed.go +++ b/storage-new/models/Feed.go @@ -31,3 +31,6 @@ type Feed struct { // Otherwise, use its own key PublicKey sql.NullString } + +// Suffix added to feeds created as the default feed for a user +const FeedDefaultSuffix = "-default" diff --git a/storage-new/models/FeedReason.go b/storage-new/models/FeedReason.go new file mode 100644 index 0000000..e78a597 --- /dev/null +++ b/storage-new/models/FeedReason.go @@ -0,0 +1,9 @@ +package models + +type FeedAppearanceReason string + +const ( + FeedAppearanceReasonBoost FeedAppearanceReason = "boost" + FeedAppearanceReasonFollowUser FeedAppearanceReason = "follow user" + FeedAppearanceReasonFollowTag FeedAppearanceReason = "follow tag" +) diff --git a/storage-new/models/NoteToFeed.go b/storage-new/models/NoteToFeed.go index 2b73384..be93365 100644 --- a/storage-new/models/NoteToFeed.go +++ b/storage-new/models/NoteToFeed.go @@ -25,7 +25,7 @@ type NoteToFeed struct { CreatedAt time.Time Note Note // The note being assigned NoteId string - // Feed Feed - // FeedId uint64 - // Reason AppearanceReason + Feed *Feed + FeedId uint64 + Reason string } diff --git a/web/debug/users.go b/web/debug/users.go index 34dea0b..2fc8887 100644 --- a/web/debug/users.go +++ b/web/debug/users.go @@ -183,6 +183,17 @@ func createLocalUser(w http.ResponseWriter, r *http.Request) { log.Error().Err(err).Msg("Failed to add links to new user") _ = webutils.ProblemDetailsStatusOnly(w, http.StatusInternalServerError) } + err = dbgen.Feed.Create(&models.Feed{ + Owner: user, + OwnerId: user.ID, + Name: user.Username + models.FeedDefaultSuffix, + IsDefault: true, + PublicKey: sql.NullString{Valid: false}, + }) + if err != nil { + log.Error().Err(err).Msg("Failed to create default feed for new user") + _ = webutils.ProblemDetailsStatusOnly(w, http.StatusInternalServerError) + } } func deleteUser(w http.ResponseWriter, r *http.Request) { diff --git a/web/public/api/activitypub/inbox.go b/web/public/api/activitypub/inbox.go index 13e3b62..b425ffc 100644 --- a/web/public/api/activitypub/inbox.go +++ b/web/public/api/activitypub/inbox.go @@ -685,6 +685,7 @@ func handleCreate(w http.ResponseWriter, r *http.Request, object map[string]any) log := hlog.FromRequest(r) activity := translators.ActivityCreate{} err := mapstructure.Decode(object, &activity) + targetUserId := r.PathValue("id") if err != nil { log.Error(). Err(err). @@ -704,7 +705,7 @@ func handleCreate(w http.ResponseWriter, r *http.Request, object map[string]any) } switch val := activity.Object.(type) { case string: - actor, err := dbgen.User.GetById(r.PathValue("id")) + actor, err := dbgen.User.GetById(targetUserId) if err != nil { log.Error().Err(err).Msg("Failed to get local actor for importing targeted note") _ = webutils.ProblemDetailsStatusOnly(w, http.StatusInternalServerError) @@ -779,6 +780,13 @@ func handleCreate(w http.ResponseWriter, r *http.Request, object map[string]any) dbNote.RepliesTo = sql.NullString{Valid: true, String: replyUrl} } } + feed, err := dbgen.Feed.Where(dbgen.Feed.OwnerId.Eq(targetUserId), dbgen.Feed.IsDefault.Is(true)). + First() + if err != nil { + log.Error().Err(err).Msg("Failed to get feed for targeted user inbox") + _ = webutils.ProblemDetailsStatusOnly(w, http.StatusInternalServerError) + return false + } tx := dbgen.Q.Begin() err = tx.Note.Create(&dbNote) if err != nil { @@ -800,6 +808,17 @@ func handleCreate(w http.ResponseWriter, r *http.Request, object map[string]any) _ = webutils.ProblemDetailsStatusOnly(w, http.StatusInternalServerError) return false } + err = tx.NoteToFeed.Create(&models.NoteToFeed{ + Reason: string(models.FeedAppearanceReasonFollowUser), + NoteId: dbNote.ID, + FeedId: uint64(feed.ID), + }) + if err != nil { + _ = tx.Rollback() + log.Error().Err(err).Any("note", dbNote).Msg("Failed to create note to feed relation in db") + _ = webutils.ProblemDetailsStatusOnly(w, http.StatusInternalServerError) + return false + } err = tx.Commit() if err != nil { log.Error().Err(err).Any("note", dbNote).Msg("Failed to submit note creation in db") diff --git a/web/shared/clientRfc9421.go b/web/shared/clientRfc9421.go index fd6b526..c306611 100644 --- a/web/shared/clientRfc9421.go +++ b/web/shared/clientRfc9421.go @@ -175,7 +175,7 @@ func applyBodyHash(headers http.Header, body []byte) error { // If the request is POST, stores it in the db as not processed yet. // This is to ensure data consistency func prePostRequest( - method, target string, + target string, body []byte, actor *models.User, ) (*uint64, error) {