1// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
2// See LICENSE.txt for license information.
3
4package localcachelayer
5
6import (
7	"bytes"
8
9	"github.com/mattermost/mattermost-server/v6/model"
10	"github.com/mattermost/mattermost-server/v6/store"
11)
12
13type LocalCacheSchemeStore struct {
14	store.SchemeStore
15	rootStore *LocalCacheStore
16}
17
18func (s *LocalCacheSchemeStore) handleClusterInvalidateScheme(msg *model.ClusterMessage) {
19	if bytes.Equal(msg.Data, clearCacheMessageData) {
20		s.rootStore.schemeCache.Purge()
21	} else {
22		s.rootStore.schemeCache.Remove(string(msg.Data))
23	}
24}
25
26func (s LocalCacheSchemeStore) Save(scheme *model.Scheme) (*model.Scheme, error) {
27	if scheme.Id != "" {
28		defer s.rootStore.doInvalidateCacheCluster(s.rootStore.schemeCache, scheme.Id)
29	}
30	return s.SchemeStore.Save(scheme)
31}
32
33func (s LocalCacheSchemeStore) Get(schemeId string) (*model.Scheme, error) {
34	var scheme *model.Scheme
35	if err := s.rootStore.doStandardReadCache(s.rootStore.schemeCache, schemeId, &scheme); err == nil {
36		return scheme, nil
37	}
38
39	scheme, err := s.SchemeStore.Get(schemeId)
40	if err != nil {
41		return nil, err
42	}
43
44	s.rootStore.doStandardAddToCache(s.rootStore.schemeCache, schemeId, scheme)
45
46	return scheme, nil
47}
48
49func (s LocalCacheSchemeStore) Delete(schemeId string) (*model.Scheme, error) {
50	defer s.rootStore.doInvalidateCacheCluster(s.rootStore.schemeCache, schemeId)
51	defer s.rootStore.doClearCacheCluster(s.rootStore.roleCache)
52	defer s.rootStore.doClearCacheCluster(s.rootStore.rolePermissionsCache)
53	return s.SchemeStore.Delete(schemeId)
54}
55
56func (s LocalCacheSchemeStore) PermanentDeleteAll() error {
57	defer s.rootStore.doClearCacheCluster(s.rootStore.schemeCache)
58	defer s.rootStore.doClearCacheCluster(s.rootStore.roleCache)
59	defer s.rootStore.doClearCacheCluster(s.rootStore.rolePermissionsCache)
60	return s.SchemeStore.PermanentDeleteAll()
61}
62