Drop feeds/merge them into user

This commit is contained in:
Melody Becker 2025-07-11 10:12:52 +02:00
parent 59373c6380
commit f12059c760
13 changed files with 78 additions and 920 deletions

View file

@ -25,6 +25,7 @@ import (
"git.mstar.dev/mstar/linstrom/activitypub/translators"
"git.mstar.dev/mstar/linstrom/config"
"git.mstar.dev/mstar/linstrom/shared"
"git.mstar.dev/mstar/linstrom/storage-new"
"git.mstar.dev/mstar/linstrom/storage-new/dbgen"
"git.mstar.dev/mstar/linstrom/storage-new/models"
webshared "git.mstar.dev/mstar/linstrom/web/shared"
@ -893,7 +894,7 @@ func handleCreate(w http.ResponseWriter, r *http.Request, object map[string]any)
// Includes only creator follower list -> Follower only -> only feeds that explicitly follow creator
u2u := dbgen.UserToUserRelation
targetFeeds := []models.Feed{}
targetUserIds := []string{}
if sliceutils.Contains(totalNoteTargets, "https://www.w3.org/ns/activitystreams#Public") {
// Public post, add to global and following feeds
dbNote.AccessLevel = models.NOTE_TARGET_PUBLIC
@ -905,27 +906,15 @@ func handleCreate(w http.ResponseWriter, r *http.Request, object map[string]any)
Msg("Failed to get ids for followers")
return false
}
userFeeds, err := dbgen.Feed.Where(dbgen.Feed.OwnerId.In(followerIds...)).Find()
if err != nil {
log.Error().
Err(err).
Str("follow-target", actingUser.ID).
Strs("follower-ids", followerIds).
Msg("Failed to get feeds for followers")
return false
}
globalFeed, err := dbgen.Feed.Where(dbgen.Feed.Name.Eq(models.GlobalFeedName)).First()
if err != nil {
log.Error().
Err(err).
Msg("Failed to get global feed")
return false
}
targetFeeds = slices.Concat(
targetFeeds,
sliceutils.Map(userFeeds, func(t *models.Feed) models.Feed { return *t }),
)
targetFeeds = append(targetFeeds, *globalFeed)
// globalFeed, err := dbgen.Feed.Where(dbgen.Feed.Name.Eq(models.GlobalFeedName)).First()
// if err != nil {
// log.Error().
// Err(err).
// Msg("Failed to get global feed")
// return false
// }
targetUserIds = append(followerIds, storage.ServerActorId)
} else {
if sliceutils.ContainsFunc(totalNoteTargets, func(x string) bool {
return strings.HasPrefix(x, actingUser.ID)
@ -940,35 +929,22 @@ func handleCreate(w http.ResponseWriter, r *http.Request, object map[string]any)
Msg("Failed to get ids for followers")
return false
}
userFeeds, err := dbgen.Feed.Where(dbgen.Feed.OwnerId.In(followerIds...)).Find()
if err != nil {
log.Error().
Err(err).
Str("follow-target", actingUser.ID).
Strs("follower-ids", followerIds).
Msg("Failed to get feeds for followers")
return false
}
targetFeeds = sliceutils.Map(userFeeds, func(t *models.Feed) models.Feed { return *t })
targetUserIds = followerIds
} else {
// Neither followers collection url nor public marker, private message
dbNote.AccessLevel = models.NOTE_TARGET_DM
userFeeds, err := dbgen.Feed.
LeftJoin(dbgen.User, dbgen.User.ID.EqCol(dbgen.Feed.OwnerId)).
LeftJoin(dbgen.RemoteServer, dbgen.RemoteServer.ID.EqCol(dbgen.User.ServerId)).
LeftJoin(dbgen.UserRemoteLinks, dbgen.UserRemoteLinks.ID.EqCol(dbgen.User.RemoteInfoId)).
Where(dbgen.RemoteServer.IsSelf.Is(true)).Where(
dbgen.User.ID.In(totalNoteTargets...),
).Or(dbgen.UserRemoteLinks.ApLink.In(totalNoteTargets...)).Find()
urm := dbgen.UserRemoteLinks
remoteLinks, err := urm.
Join(dbgen.User, dbgen.User.ID.EqCol(urm.UserId)).
Join(dbgen.RemoteServer, dbgen.RemoteServer.ID.EqCol(dbgen.User.ServerId)).
Where(urm.ApLink.In(totalNoteTargets...), dbgen.RemoteServer.IsSelf.Is(true)).Find()
if err != nil {
log.Error().
Err(err).
Str("follow-target", actingUser.ID).
Strs("targeted-ids", totalNoteTargets).
Msg("Failed to get feeds for directly messaged users")
log.Error().Err(err).Strs("target-ids", totalNoteTargets).Msg("Failed to get local targets for dm")
return false
}
targetFeeds = sliceutils.Map(userFeeds, func(t *models.Feed) models.Feed { return *t })
targetUserIds = sliceutils.Map(remoteLinks, func(t *models.UserRemoteLinks) string {
return t.UserId
})
}
}
@ -995,11 +971,11 @@ func handleCreate(w http.ResponseWriter, r *http.Request, object map[string]any)
return false
}
feedRels := sliceutils.Map(targetFeeds, func(f models.Feed) *models.NoteToFeed {
feedRels := sliceutils.Map(targetUserIds, func(f string) *models.NoteToFeed {
return &models.NoteToFeed{
Reason: string(models.FeedAppearanceReasonFollowUser),
NoteId: dbNote.ID,
FeedId: uint64(f.ID),
Reason: string(models.FeedAppearanceReasonFollowUser),
NoteId: dbNote.ID,
ForUserId: f,
}
})
err = tx.NoteToFeed.Create(feedRels...)