accounts: invalidate user cache in more/all places

using app.userSummary as a source of relevant storage places and things
to look for.
This commit is contained in:
Harvey Tindall
2025-09-01 21:28:56 +01:00
parent 6ebc7d18bf
commit d88194b9bd
6 changed files with 19 additions and 0 deletions

View File

@@ -104,6 +104,7 @@ func (app *appContext) deleteExpiredInvite(data Invite) {
if ok { if ok {
user.ReferralTemplateKey = "" user.ReferralTemplateKey = ""
app.storage.SetEmailsKey(data.ReferrerJellyfinID, user) app.storage.SetEmailsKey(data.ReferrerJellyfinID, user)
app.InvalidateWebUserCache()
} }
} }
wait := app.sendAdminExpiryNotification(data) wait := app.sendAdminExpiryNotification(data)

View File

@@ -271,6 +271,7 @@ func (app *appContext) TelegramAddUser(gc *gin.Context) {
} }
linkExistingOmbiDiscordTelegram(app) linkExistingOmbiDiscordTelegram(app)
app.InvalidateWebUserCache()
respondBool(200, true, gc) respondBool(200, true, gc)
} }
@@ -336,6 +337,7 @@ func (app *appContext) setContactMethods(req SetContactMethodsDTO, gc *gin.Conte
app.err.Printf(lm.FailedSyncContactMethods, lm.Jellyseerr, err) app.err.Printf(lm.FailedSyncContactMethods, lm.Jellyseerr, err)
} }
} }
app.InvalidateWebUserCache()
respondBool(200, true, gc) respondBool(200, true, gc)
} }
@@ -564,6 +566,7 @@ func (app *appContext) MatrixConnect(gc *gin.Context) {
Lang: "en-us", Lang: "en-us",
Contact: true, Contact: true,
}) })
app.InvalidateWebUserCache()
respondBool(200, true, gc) respondBool(200, true, gc)
} }
@@ -635,6 +638,7 @@ func (app *appContext) DiscordConnect(gc *gin.Context) {
}, gc, false) }, gc, false)
linkExistingOmbiDiscordTelegram(app) linkExistingOmbiDiscordTelegram(app)
app.InvalidateWebUserCache()
respondBool(200, true, gc) respondBool(200, true, gc)
} }
@@ -672,6 +676,7 @@ func (app *appContext) UnlinkDiscord(gc *gin.Context) {
Time: time.Now(), Time: time.Now(),
}, gc, false) }, gc, false)
app.InvalidateWebUserCache()
respondBool(200, true, gc) respondBool(200, true, gc)
} }
@@ -708,6 +713,7 @@ func (app *appContext) UnlinkTelegram(gc *gin.Context) {
Time: time.Now(), Time: time.Now(),
}, gc, false) }, gc, false)
app.InvalidateWebUserCache()
respondBool(200, true, gc) respondBool(200, true, gc)
} }
@@ -737,5 +743,6 @@ func (app *appContext) UnlinkMatrix(gc *gin.Context) {
Time: time.Now(), Time: time.Now(),
}, gc, false) }, gc, false)
app.InvalidateWebUserCache()
respondBool(200, true, gc) respondBool(200, true, gc)
} }

View File

@@ -796,6 +796,7 @@ func (app *appContext) GetMyReferral(gc *gin.Context) {
inv.ValidTill = inv.Created.Add(REFERRAL_EXPIRY_DAYS * 24 * time.Hour) inv.ValidTill = inv.Created.Add(REFERRAL_EXPIRY_DAYS * 24 * time.Hour)
app.storage.SetInvitesKey(inv.Code, inv) app.storage.SetInvitesKey(inv.Code, inv)
} }
app.InvalidateWebUserCache()
gc.JSON(200, GetMyReferralRespDTO{ gc.JSON(200, GetMyReferralRespDTO{
Code: inv.Code, Code: inv.Code,
RemainingUses: inv.RemainingUses, RemainingUses: inv.RemainingUses,

View File

@@ -625,6 +625,7 @@ func (app *appContext) EnableReferralForUsers(gc *gin.Context) {
inv.UseReferralExpiry = useExpiry inv.UseReferralExpiry = useExpiry
app.storage.SetInvitesKey(inv.Code, inv) app.storage.SetInvitesKey(inv.Code, inv)
} }
app.InvalidateWebUserCache()
} }
// @Summary Disable referrals for the given user(s). // @Summary Disable referrals for the given user(s).
@@ -648,6 +649,7 @@ func (app *appContext) DisableReferralForUsers(gc *gin.Context) {
user.ReferralTemplateKey = "" user.ReferralTemplateKey = ""
app.storage.SetEmailsKey(u, user) app.storage.SetEmailsKey(u, user)
} }
app.InvalidateWebUserCache()
respondBool(200, true, gc) respondBool(200, true, gc)
} }
@@ -848,6 +850,8 @@ func (app *appContext) AdminPasswordReset(gc *gin.Context) {
respondBool(204, true, gc) respondBool(204, true, gc)
} }
// userSummary generates a respUser for to be displayed to the user, or sorted/filtered.
// also, consider it a source of which data fields/struct modifications need to trigger a cache invalidation.
func (app *appContext) userSummary(jfUser mediabrowser.User) respUser { func (app *appContext) userSummary(jfUser mediabrowser.User) respUser {
adminOnly := app.config.Section("ui").Key("admin_only").MustBool(true) adminOnly := app.config.Section("ui").Key("admin_only").MustBool(true)
allowAll := app.config.Section("ui").Key("allow_all").MustBool(false) allowAll := app.config.Section("ui").Key("allow_all").MustBool(false)
@@ -1016,6 +1020,7 @@ func (app *appContext) SetAccountsAdmin(gc *gin.Context) {
app.info.Printf(lm.UserAdminAdjusted, id, admin) app.info.Printf(lm.UserAdminAdjusted, id, admin)
} }
} }
app.InvalidateWebUserCache()
respondBool(204, true, gc) respondBool(204, true, gc)
} }
@@ -1048,6 +1053,7 @@ func (app *appContext) ModifyLabels(gc *gin.Context) {
app.storage.SetEmailsKey(id, emailStore) app.storage.SetEmailsKey(id, emailStore)
} }
} }
app.InvalidateWebUserCache()
respondBool(204, true, gc) respondBool(204, true, gc)
} }
@@ -1087,6 +1093,7 @@ func (app *appContext) modifyEmail(jfID string, addr string) {
} }
} }
} }
app.InvalidateWebUserCache()
} }
// @Summary Modify user's email addresses. // @Summary Modify user's email addresses.

View File

@@ -131,6 +131,7 @@ func (app *appContext) checkUsers(remindBeforeExpiry *DayTimerSet) {
activity.Type = ActivityDeletion activity.Type = ActivityDeletion
// Store the user name, since there's no longer a user ID to reference back to // Store the user name, since there's no longer a user ID to reference back to
activity.Value = user.Name activity.Value = user.Name
app.InvalidateUserCaches()
} else { } else {
app.info.Printf(lm.DisableExpiredUser, user.Name) app.info.Printf(lm.DisableExpiredUser, user.Name)
// Admins can't be disabled // Admins can't be disabled
@@ -138,6 +139,7 @@ func (app *appContext) checkUsers(remindBeforeExpiry *DayTimerSet) {
user.Policy.IsAdministrator = false user.Policy.IsAdministrator = false
err, _, _ = app.SetUserDisabled(user, true) err, _, _ = app.SetUserDisabled(user, true)
activity.Type = ActivityDisabled activity.Type = ActivityDisabled
app.InvalidateUserCaches()
} }
if err != nil { if err != nil {
app.err.Printf(lm.FailedDeleteOrDisableExpiredUser, user.ID, err) app.err.Printf(lm.FailedDeleteOrDisableExpiredUser, user.ID, err)

View File

@@ -155,6 +155,7 @@ func (app *appContext) NewUserPostVerification(p NewUserParams) (out NewUserData
out.Status = 200 out.Status = 200
out.Success = true out.Success = true
app.InvalidateWebUserCache()
return return
} }