From c394dfe825b245602de1f9cdd9a3a234c9bf8e40 Mon Sep 17 00:00:00 2001 From: yumaojun03 <719118794@qq.com> Date: Sun, 9 Mar 2025 14:46:41 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E5=85=85=E8=B5=84=E6=BA=90API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- devcloud-mini/cmdb/apps/secret/impl/secret.go | 83 +++++++++++++++++-- devcloud-mini/cmdb/apps/secret/interface.go | 4 +- go.mod | 6 ++ go.sum | 20 +++++ 4 files changed, 103 insertions(+), 10 deletions(-) diff --git a/devcloud-mini/cmdb/apps/secret/impl/secret.go b/devcloud-mini/cmdb/apps/secret/impl/secret.go index 471d824..8026cdc 100644 --- a/devcloud-mini/cmdb/apps/secret/impl/secret.go +++ b/devcloud-mini/cmdb/apps/secret/impl/secret.go @@ -2,27 +2,92 @@ package impl import ( "context" - "fmt" + "github.com/infraboard/mcube/v2/ioc/config/cache" "github.com/infraboard/mcube/v2/types" "gitlab.com/go-course-project/go17/devcloud-mini/cmdb/apps/secret" + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo/options" ) // CreateSecret implements secret.Service. -func (s *SecretServiceImpl) CreateSecret(context.Context, *secret.CreateSecretRequest) (*secret.Secret, error) { - panic("unimplemented") +func (s *SecretServiceImpl) CreateSecret(ctx context.Context, in *secret.CreateSecretRequest) (*secret.Secret, error) { + ins := secret.NewSecret(in) + + // 需要加密 + if err := ins.EncryptedApiSecret(); err != nil { + return nil, err + } + + // upsert, gorm save + _, err := s.col.UpdateOne(ctx, bson.M{"_id": ins.Id}, bson.M{"$set": ins}, options.Update().SetUpsert(true)) + if err != nil { + return nil, err + } + + return ins, nil } // DescribeSecret implements secret.Service. -func (s *SecretServiceImpl) DescribeSecret(context.Context, *secret.DescribeSecretRequeset) (*secret.Secret, error) { - panic("unimplemented") +// 缓存怎么做 +// 1. 从缓存中去(内存, 公共的内存服务 Redis) +// 2. 能获取到,直接返回 +// 3. 不能获取, 选好从本地获取,返回,再把他设置到缓存中去 +// 4. 怎么实现: redis redis get(key)/set(key), obj -> JSON +// 5. https://github.com/redis/go-redis get, set +// CacheGetter --> go-redis --> ObjectFinder +func (s *SecretServiceImpl) DescribeSecret(ctx context.Context, in *secret.DescribeSecretRequeset) (*secret.Secret, error) { + // 封装过后的改良版 + ins := secret.NewSecret(secret.NewCreateSecretRequest()) + err := cache.NewGetter(ctx, func(ctx context.Context, objectId string) (any, error) { + return s.describeSecret(ctx, in) + }).Get(in.Id, ins) + if err != nil { + return nil, err + } + return ins, nil + +} + +// @cached(ttl=30s) +// h = cached(ttl=30s) -> h +func (s *SecretServiceImpl) describeSecret(ctx context.Context, in *secret.DescribeSecretRequeset) (*secret.Secret, error) { + // 取出后,需要解密 + e := secret.NewSecret(&secret.CreateSecretRequest{}) + // gorm take + if err := s.col.FindOne(ctx, bson.M{"_id": in.Id}).Decode(e); err != nil { + return nil, err + } + + e.SetIsEncrypted(true) + if err := e.DecryptedApiSecret(); err != nil { + return nil, err + } + + // 解密过后的数据 + return e, nil } // QuerySecret implements secret.Service. -func (s *SecretServiceImpl) QuerySecret(context.Context, *secret.QuerySecretRequest) (*types.Set[*secret.Secret], error) { - set := types.New[*secret.Secret]() - fmt.Println(set) - panic("unimplemented") +func (s *SecretServiceImpl) QuerySecret(ctx context.Context, in *secret.QuerySecretRequest) (*types.Set[*secret.Secret], error) { + set := secret.NewSecretSet() + + filter := bson.M{} + cursor, err := s.col.Find(ctx, filter, options.Find().SetLimit(int64(in.PageSize)).SetSkip(in.ComputeOffset())) + if err != nil { + return nil, err + } + + for cursor.Next(ctx) { + e := secret.NewSecret(&secret.CreateSecretRequest{}) + if err := cursor.Decode(e); err != nil { + return nil, err + } + set.Add(e) + } + + return set, nil + } // SyncResource implements secret.Service. diff --git a/devcloud-mini/cmdb/apps/secret/interface.go b/devcloud-mini/cmdb/apps/secret/interface.go index 8238a9b..8fef835 100644 --- a/devcloud-mini/cmdb/apps/secret/interface.go +++ b/devcloud-mini/cmdb/apps/secret/interface.go @@ -24,13 +24,15 @@ type Service interface { CreateSecret(context.Context, *CreateSecretRequest) (*Secret, error) // 查询secret QuerySecret(context.Context, *QuerySecretRequest) (*types.Set[*Secret], error) - // 查询详情, 已解密,API层需要脱敏 + // 查询详情, 已解密, API层需要脱敏 DescribeSecret(context.Context, *DescribeSecretRequeset) (*Secret, error) + // 基于云商凭证来同步资源 // 怎么API怎么设计 // 同步阿里云所有资源, 10分钟,30分钟 ... // 这个接口调用持续30分钟... // Req ---> <---- Resp: 能快速响应的同步调用 + // SyncResource(Req) Resp // Stream API SyncResource(context.Context, *SyncResourceRequest, SyncResourceHandleFunc) error diff --git a/go.mod b/go.mod index 4c87c05..5c9acec 100644 --- a/go.mod +++ b/go.mod @@ -22,12 +22,15 @@ require ( require ( github.com/BurntSushi/toml v1.3.2 // indirect + github.com/bluele/gcache v0.0.2 // indirect github.com/bytedance/sonic v1.11.6 // indirect github.com/bytedance/sonic/loader v0.1.1 // indirect github.com/caarlos0/env/v6 v6.10.1 // indirect github.com/cenkalti/backoff/v4 v4.2.1 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/cloudwego/base64x v0.1.4 // indirect github.com/cloudwego/iasm v0.2.0 // indirect + github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect github.com/dustin/go-humanize v1.0.1 // indirect github.com/gabriel-vasile/mimetype v1.4.3 // indirect github.com/gin-contrib/sse v0.1.0 // indirect @@ -65,6 +68,9 @@ require ( github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe // indirect github.com/pelletier/go-toml/v2 v2.2.2 // indirect github.com/pkg/errors v0.9.1 // indirect + github.com/redis/go-redis/extra/rediscmd/v9 v9.0.5 // indirect + github.com/redis/go-redis/extra/redisotel/v9 v9.0.5 // indirect + github.com/redis/go-redis/v9 v9.5.1 // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/spf13/cobra v1.8.0 // indirect github.com/spf13/pflag v1.0.5 // indirect diff --git a/go.sum b/go.sum index fd6f2a4..b6d145d 100644 --- a/go.sum +++ b/go.sum @@ -2,6 +2,14 @@ github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8 github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/bluele/gcache v0.0.2 h1:WcbfdXICg7G/DGBh1PFfcirkWOQV+v077yF1pSy3DGw= +github.com/bluele/gcache v0.0.2/go.mod h1:m15KV+ECjptwSPxKhOhQoAFQVtUFjTVkc3H8o0t/fp0= +github.com/bsm/ginkgo/v2 v2.7.0/go.mod h1:AiKlXPm7ItEHNc/2+OkrNG4E0ITzojb9/xWzvQ9XZ9w= +github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs= +github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c= +github.com/bsm/gomega v1.26.0/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0= +github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA= +github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0= github.com/bytedance/sonic v1.11.6 h1:oUp34TzMlL+OY1OUWxHqsdkgC/Zfc85zGqw9siXjrc0= github.com/bytedance/sonic v1.11.6/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4= github.com/bytedance/sonic/loader v0.1.1 h1:c+e5Pt1k/cy5wMveRDyk2X4B9hF4g7an8N3zCYjJFNM= @@ -10,6 +18,9 @@ github.com/caarlos0/env/v6 v6.10.1 h1:t1mPSxNpei6M5yAeu1qtRdPAK29Nbcf/n3G7x+b3/I github.com/caarlos0/env/v6 v6.10.1/go.mod h1:hvp/ryKXKipEkcuYjs9mI4bBCg+UI0Yhgm5Zu0ddvwc= github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y= github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg= @@ -20,6 +31,8 @@ github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ3 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/emicklei/go-restful-openapi/v2 v2.9.1 h1:Of8B1rXdG81il5TTiSY+9Qrh7pYOr8aLdynHIpvo7fM= @@ -143,6 +156,13 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/redis/go-redis/extra/rediscmd/v9 v9.0.5 h1:EaDatTxkdHG+U3Bk4EUr+DZ7fOGwTfezUiUJMaIcaho= +github.com/redis/go-redis/extra/rediscmd/v9 v9.0.5/go.mod h1:fyalQWdtzDBECAQFBJuQe5bzQ02jGd5Qcbgb97Flm7U= +github.com/redis/go-redis/extra/redisotel/v9 v9.0.5 h1:EfpWLLCyXw8PSM2/XNJLjI3Pb27yVE+gIAfeqp8LUCc= +github.com/redis/go-redis/extra/redisotel/v9 v9.0.5/go.mod h1:WZjPDy7VNzn77AAfnAfVjZNvfJTYfPetfZk5yoSTLaQ= +github.com/redis/go-redis/v9 v9.0.5/go.mod h1:WqMKv5vnQbRuZstUwxQI195wHy+t4PuXDOjzMvcuQHk= +github.com/redis/go-redis/v9 v9.5.1 h1:H1X4D3yHPaYrkL5X06Wh6xNVM/pX0Ft4RV0vMGvLBh8= +github.com/redis/go-redis/v9 v9.5.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M=