package cache import ( "fmt" "git.sr.ht/~evanj/cms/internal/m/space" "git.sr.ht/~evanj/cms/internal/m/user" "git.sr.ht/~evanj/cms/internal/s/db" ) func (c *Cache) space(breakCache bool, key string, getter func() (space.Space, error)) (space.Space, error) { var v *db.Space if err := c.cache(breakCache, key, &v, func() (interface{}, error) { return getter() }); err != nil { return nil, err } return v, nil } func (c *Cache) SpaceNew(user user.User, name, desc string) (space.Space, error) { thing, err := c.db.SpaceNew(user, name, desc) if err != nil { return nil, err } return c.space( true, fmt.Sprintf("space::%s::%s::%s", c.baseKey, user.ID(), thing.ID()), func() (space.Space, error) { return thing, err }, ) } func (c *Cache) SpaceGet(user user.User, thingID string) (space.Space, error) { return c.space( false, fmt.Sprintf("space::%s::%s::%s", c.baseKey, user.ID(), thingID), func() (space.Space, error) { return c.db.SpaceGet(user, thingID) }, ) } func (c *Cache) SpaceUpdate(user user.User, prev space.Space, name, desc string) (space.Space, error) { next, err := c.db.SpaceUpdate(user, prev, name, desc) if err != nil { return nil, err } return c.space( true, fmt.Sprintf("space::%s::%s::%s", c.baseKey, user.ID(), next.ID()), func() (space.Space, error) { return next, err }, ) } func (c *Cache) SpaceDelete(u user.User, s space.Space) error { key := fmt.Sprintf("space::%s::%s::%s", c.baseKey, u.ID(), s.ID()) var deleteErr error _, _ = c.space( true, key, func() (space.Space, error) { deleteErr = c.db.SpaceDelete(u, s) return nil, deleteErr }, ) if deleteErr != nil { return deleteErr } return c.mc.Delete(key) } // TODO: SpacesPerUser