From adcb47a5e12332c1db54ecea307c855c097edc97 Mon Sep 17 00:00:00 2001 From: LinkinStars Date: Wed, 8 Mar 2023 17:14:55 +0800 Subject: [PATCH] fix(plugin): Add cache plugin interface --- go.mod | 6 +++--- go.sum | 10 ++++++---- internal/base/data/data.go | 10 ++++++++++ plugin/cache.go | 23 +++++++++++++++++++++++ plugin/plugin.go | 4 ++++ plugin/storage.go | 18 ++++++++++++++++++ 6 files changed, 64 insertions(+), 7 deletions(-) create mode 100644 plugin/cache.go diff --git a/go.mod b/go.mod index cd9a0ee6..c96c8b09 100644 --- a/go.mod +++ b/go.mod @@ -42,7 +42,7 @@ require ( github.com/tidwall/gjson v1.14.4 github.com/yuin/goldmark v1.4.13 golang.org/x/crypto v0.1.0 - golang.org/x/net v0.2.0 + golang.org/x/net v0.5.0 gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df gopkg.in/yaml.v3 v3.0.1 modernc.org/sqlite v1.14.2 @@ -123,8 +123,8 @@ require ( go.uber.org/zap v1.23.0 // indirect golang.org/x/image v0.1.0 // indirect golang.org/x/mod v0.6.0 // indirect - golang.org/x/sys v0.2.0 // indirect - golang.org/x/text v0.5.0 // indirect + golang.org/x/sys v0.4.0 // indirect + golang.org/x/text v0.6.0 // indirect golang.org/x/tools v0.2.0 // indirect google.golang.org/protobuf v1.28.1 // indirect gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect diff --git a/go.sum b/go.sum index 54cec9cb..ab583d13 100644 --- a/go.sum +++ b/go.sum @@ -853,8 +853,9 @@ golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.2.0 h1:sZfSu1wtKLGlWI4ZZayP0ck9Y73K1ynO6gqzTdBVdPU= golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= +golang.org/x/net v0.5.0 h1:GyT4nK/YDHSqa1c4753ouYCDajOYKTja9Xb/OHtgvSw= +golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -947,8 +948,9 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0 h1:ljd4t30dBnAvMZaQCevtY0xLLD0A+bRZXbgLMLU1F/A= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.4.0 h1:Zr2JFtRQNX3BCZ8YtxRE9hNJYC8J6I1MVbMg6owUp18= +golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -962,8 +964,8 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.5.0 h1:OLmvp0KP+FVG99Ct/qFiL/Fhk4zp4QQnZ7b2U+5piUM= -golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.6.0 h1:3XmdazWV+ubf7QgHSTWeykHOci5oeekaGJBLkrkaw4k= +golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= diff --git a/internal/base/data/data.go b/internal/base/data/data.go index 0a16659e..113d8d48 100644 --- a/internal/base/data/data.go +++ b/internal/base/data/data.go @@ -5,6 +5,7 @@ import ( "time" "github.com/answerdev/answer/pkg/dir" + "github.com/answerdev/answer/plugin" _ "github.com/go-sql-driver/mysql" _ "github.com/lib/pq" "github.com/segmentfault/pacman/cache" @@ -76,6 +77,15 @@ func NewDB(debug bool, dataConf *Database) (*xorm.Engine, error) { // NewCache new cache instance func NewCache(c *CacheConf) (cache.Cache, func(), error) { + var pluginCache plugin.Cache + _ = plugin.CallCache(func(fn plugin.Cache) error { + pluginCache = fn + return nil + }) + if pluginCache != nil { + return pluginCache, func() {}, nil + } + // TODO What cache type should be initialized according to the configuration file memCache := memory.NewCache() diff --git a/plugin/cache.go b/plugin/cache.go new file mode 100644 index 00000000..993f3fe0 --- /dev/null +++ b/plugin/cache.go @@ -0,0 +1,23 @@ +package plugin + +import ( + "context" + "time" +) + +type Cache interface { + Base + + GetString(ctx context.Context, key string) (string, error) + SetString(ctx context.Context, key, value string, ttl time.Duration) error + GetInt64(ctx context.Context, key string) (int64, error) + SetInt64(ctx context.Context, key string, value int64, ttl time.Duration) error + Del(ctx context.Context, key string) error + Flush(ctx context.Context) error +} + +var ( + // CallCache is a function that calls all registered cache + CallCache, + registerCache = MakePlugin[Cache](false) +) diff --git a/plugin/plugin.go b/plugin/plugin.go index 04fd8e4d..704f90e4 100644 --- a/plugin/plugin.go +++ b/plugin/plugin.go @@ -44,6 +44,10 @@ func Register(p Base) { if _, ok := p.(Storage); ok { registerStorage(p.(Storage)) } + + if _, ok := p.(Cache); ok { + registerCache(p.(Cache)) + } } type Stack[T Base] struct { diff --git a/plugin/storage.go b/plugin/storage.go index be0ebcd6..82dd59d6 100644 --- a/plugin/storage.go +++ b/plugin/storage.go @@ -8,6 +8,24 @@ const ( AdminBranding UploadSource = "admin_branding" ) +var ( + DefaultFileTypeCheckMapping = map[UploadSource]map[string]bool{ + UserAvatar: { + ".jpg": true, + ".jpeg": true, + ".png": true, + }, + UserPost: { + ".jpg": true, + ".jpeg": true, + ".png": true, + }, + AdminBranding: { + ".ico": true, + }, + } +) + type UploadFileResponse struct { // FullURL is the URL that can be used to access the file FullURL string