49 lines
1.2 KiB
Go
49 lines
1.2 KiB
Go
package service
|
|
|
|
import (
|
|
"context"
|
|
"sort"
|
|
)
|
|
|
|
// AuthCacheInvalidator invalidates auth-related caches after security-sensitive writes.
|
|
type AuthCacheInvalidator interface {
|
|
InvalidateUserState(userID int64)
|
|
InvalidateUserPerms(userID int64)
|
|
}
|
|
|
|
type nopAuthCacheInvalidator struct{}
|
|
|
|
func (nopAuthCacheInvalidator) InvalidateUserState(int64) {}
|
|
func (nopAuthCacheInvalidator) InvalidateUserPerms(int64) {}
|
|
|
|
func normalizeAuthCacheInvalidator(invalidator AuthCacheInvalidator) AuthCacheInvalidator {
|
|
if invalidator == nil {
|
|
return nopAuthCacheInvalidator{}
|
|
}
|
|
return invalidator
|
|
}
|
|
|
|
func collectSortedUniqueUserIDs(ctx context.Context, idsFunc func(context.Context) ([]int64, error), fallback func(context.Context) ([]int64, error)) ([]int64, error) {
|
|
ids, err := idsFunc(ctx)
|
|
if err != nil && fallback != nil {
|
|
ids, err = fallback(ctx)
|
|
}
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if len(ids) == 0 {
|
|
return []int64{}, nil
|
|
}
|
|
seen := make(map[int64]struct{}, len(ids))
|
|
unique := make([]int64, 0, len(ids))
|
|
for _, id := range ids {
|
|
if _, ok := seen[id]; ok {
|
|
continue
|
|
}
|
|
seen[id] = struct{}{}
|
|
unique = append(unique, id)
|
|
}
|
|
sort.Slice(unique, func(i, j int) bool { return unique[i] < unique[j] })
|
|
return unique, nil
|
|
}
|