2025-03-09 12:06:14 +08:00
|
|
|
package impl
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
|
2025-03-09 14:46:41 +08:00
|
|
|
"github.com/infraboard/mcube/v2/ioc/config/cache"
|
2025-03-09 12:06:14 +08:00
|
|
|
"github.com/infraboard/mcube/v2/types"
|
|
|
|
"gitlab.com/go-course-project/go17/devcloud-mini/cmdb/apps/secret"
|
2025-03-09 14:46:41 +08:00
|
|
|
"go.mongodb.org/mongo-driver/bson"
|
|
|
|
"go.mongodb.org/mongo-driver/mongo/options"
|
2025-03-09 12:06:14 +08:00
|
|
|
)
|
|
|
|
|
|
|
|
// CreateSecret implements secret.Service.
|
2025-03-09 14:46:41 +08:00
|
|
|
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
|
2025-03-09 12:06:14 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// DescribeSecret implements secret.Service.
|
2025-03-09 14:46:41 +08:00
|
|
|
// 缓存怎么做
|
|
|
|
// 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
|
2025-03-09 12:06:14 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// QuerySecret implements secret.Service.
|
2025-03-09 14:46:41 +08:00
|
|
|
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
|
|
|
|
|
2025-03-09 12:06:14 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// SyncResource implements secret.Service.
|
|
|
|
func (s *SecretServiceImpl) SyncResource(context.Context, *secret.SyncResourceRequest, secret.SyncResourceHandleFunc) error {
|
|
|
|
panic("unimplemented")
|
|
|
|
}
|