47 lines
1.3 KiB
Go
47 lines
1.3 KiB
Go
package postgres
|
|
|
|
import (
|
|
"context"
|
|
|
|
"telesrv/internal/readmodelcache"
|
|
"telesrv/internal/store/postgres/sqlcgen"
|
|
)
|
|
|
|
const communityCatalogPresenceKey = "active"
|
|
|
|
// CommunityCatalogCache is the global, version-invalidated gate in front of
|
|
// owner-specific joined-Community reads. It caches only whether any non-deleted
|
|
// Community exists; it never caches membership, collapsed/pinned state or a
|
|
// Community payload.
|
|
type CommunityCatalogCache struct {
|
|
cache *readmodelcache.Cache[string, bool]
|
|
}
|
|
|
|
func NewCommunityCatalogCache() *CommunityCatalogCache {
|
|
return &CommunityCatalogCache{cache: readmodelcache.New[string, bool](readmodelcache.Config[string, bool]{MaxEntries: 1})}
|
|
}
|
|
|
|
func (c *CommunityCatalogCache) hasActive(ctx context.Context, db sqlcgen.DBTX) (bool, error) {
|
|
if c == nil {
|
|
var active bool
|
|
err := db.QueryRow(ctx, `SELECT EXISTS (SELECT 1 FROM communities WHERE NOT deleted)`).Scan(&active)
|
|
return active, err
|
|
}
|
|
return c.cache.GetOrLoad(ctx, communityCatalogPresenceKey, func() (bool, error) {
|
|
var active bool
|
|
err := db.QueryRow(ctx, `SELECT EXISTS (SELECT 1 FROM communities WHERE NOT deleted)`).Scan(&active)
|
|
return active, err
|
|
})
|
|
}
|
|
|
|
func (c *CommunityCatalogCache) invalidate() {
|
|
if c != nil {
|
|
c.cache.Invalidate(communityCatalogPresenceKey)
|
|
}
|
|
}
|
|
|
|
func (c *CommunityCatalogCache) flush() {
|
|
if c != nil {
|
|
c.cache.Flush()
|
|
}
|
|
}
|