Sort of implement personal feeds

This commit is contained in:
Melody Becker 2025-06-13 16:45:13 +02:00
parent 1c216e415d
commit 8d2e008125
Signed by: mstar
SSH key fingerprint: SHA256:9VAo09aaVNTWKzPW7Hq2LW+ox9OdwmTSHRoD4mlz1yI
6 changed files with 47 additions and 5 deletions

View file

@ -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"

View file

@ -0,0 +1,9 @@
package models
type FeedAppearanceReason string
const (
FeedAppearanceReasonBoost FeedAppearanceReason = "boost"
FeedAppearanceReasonFollowUser FeedAppearanceReason = "follow user"
FeedAppearanceReasonFollowTag FeedAppearanceReason = "follow tag"
)

View file

@ -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
}

View file

@ -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) {

View file

@ -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")

View file

@ -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) {