diff --git a/app/auth/api/auth.api b/app/auth/api/auth.api index 084b327..655f259 100644 --- a/app/auth/api/auth.api +++ b/app/auth/api/auth.api @@ -797,6 +797,14 @@ type ( ImageBedUploadListResponse { Records []ImageBedUploadMeta `json:"records"` } + BackupImageRequest { + OriginProvider string `json:"origin_provider"` + OriginBucket string `json:"origin_bucket"` + OriginRegion string `json:"origin_region"` + TargetProvider string `json:"target_provider"` + TargetBucket string `json:"target_bucket"` + TargetRegion string `json:"target_region"` + } ) // 文件上传 @@ -959,6 +967,10 @@ service auth { // 获取图床上传的图片列表 @handler getImageBedUploadList post /image/bed/upload/list (ImageBedUploadListRequest) returns (ImageBedUploadListResponse) + + // 备份图像数据 + @handler backupImage + post /image/backup (BackupImageRequest) returns (string) } type ( @@ -1085,6 +1097,16 @@ type ( bindGitee bool `json:"bind_gitee,default=false"` setPassword bool `json:"set_password,default=false"` } + ModifyPersonalInfoRequest { + Nickname string `json:"nickname,optional"` + Avatar string `json:"avatar,optional"` + Email string `json:"email,optional"` + Gender int64 `json:"gender,optional"` + Introduce string `json:"introduce,optional"` + Blog string `json:"blog,optional"` + Location string `json:"location,optional"` + Company string `json:"company,optional"` + } ) // 用户服务 @@ -1107,6 +1129,14 @@ service auth { // 退出登录 @handler logout post /logout returns (string) + + // 获取个人信息 + @handler getPersonalInfo + post /personal/info returns (UserMeta) + + // 修改个人信息 + @handler modifyPersonalInfo + post /personal/modify (ModifyPersonalInfoRequest) returns (string) } type ( diff --git a/app/auth/api/internal/handler/auth/get_personal_info_handler.go b/app/auth/api/internal/handler/auth/get_personal_info_handler.go new file mode 100644 index 0000000..fe23d43 --- /dev/null +++ b/app/auth/api/internal/handler/auth/get_personal_info_handler.go @@ -0,0 +1,21 @@ +package auth + +import ( + "net/http" + + "schisandra-album-cloud-microservices/app/auth/api/internal/logic/auth" + "schisandra-album-cloud-microservices/app/auth/api/internal/svc" + "schisandra-album-cloud-microservices/common/xhttp" +) + +func GetPersonalInfoHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + l := auth.NewGetPersonalInfoLogic(r.Context(), svcCtx) + resp, err := l.GetPersonalInfo() + if err != nil { + xhttp.JsonBaseResponseCtx(r.Context(), w, err) + } else { + xhttp.JsonBaseResponseCtx(r.Context(), w, resp) + } + } +} diff --git a/app/auth/api/internal/handler/auth/modify_personal_info_handler.go b/app/auth/api/internal/handler/auth/modify_personal_info_handler.go new file mode 100644 index 0000000..3d40e78 --- /dev/null +++ b/app/auth/api/internal/handler/auth/modify_personal_info_handler.go @@ -0,0 +1,29 @@ +package auth + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "schisandra-album-cloud-microservices/app/auth/api/internal/logic/auth" + "schisandra-album-cloud-microservices/app/auth/api/internal/svc" + "schisandra-album-cloud-microservices/app/auth/api/internal/types" + "schisandra-album-cloud-microservices/common/xhttp" +) + +func ModifyPersonalInfoHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.ModifyPersonalInfoRequest + if err := httpx.Parse(r, &req); err != nil { + xhttp.JsonBaseResponseCtx(r.Context(), w, err) + return + } + + l := auth.NewModifyPersonalInfoLogic(r.Context(), svcCtx) + resp, err := l.ModifyPersonalInfo(&req) + if err != nil { + xhttp.JsonBaseResponseCtx(r.Context(), w, err) + } else { + xhttp.JsonBaseResponseCtx(r.Context(), w, resp) + } + } +} diff --git a/app/auth/api/internal/handler/routes.go b/app/auth/api/internal/handler/routes.go index c8221c7..3fef0b8 100644 --- a/app/auth/api/internal/handler/routes.go +++ b/app/auth/api/internal/handler/routes.go @@ -40,6 +40,16 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) { Path: "/logout", Handler: auth.LogoutHandler(serverCtx), }, + { + Method: http.MethodPost, + Path: "/personal/info", + Handler: auth.GetPersonalInfoHandler(serverCtx), + }, + { + Method: http.MethodPost, + Path: "/personal/modify", + Handler: auth.ModifyPersonalInfoHandler(serverCtx), + }, }..., ), rest.WithJwt(serverCtx.Config.Auth.AccessSecret), @@ -381,6 +391,11 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) { Path: "/image/all/list", Handler: storage.QueryAllImageListHandler(serverCtx), }, + { + Method: http.MethodPost, + Path: "/image/backup", + Handler: storage.BackupImageHandler(serverCtx), + }, { Method: http.MethodPost, Path: "/image/bed/upload", diff --git a/app/auth/api/internal/handler/storage/backup_image_handler.go b/app/auth/api/internal/handler/storage/backup_image_handler.go new file mode 100644 index 0000000..8a36d3e --- /dev/null +++ b/app/auth/api/internal/handler/storage/backup_image_handler.go @@ -0,0 +1,29 @@ +package storage + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "schisandra-album-cloud-microservices/app/auth/api/internal/logic/storage" + "schisandra-album-cloud-microservices/app/auth/api/internal/svc" + "schisandra-album-cloud-microservices/app/auth/api/internal/types" + "schisandra-album-cloud-microservices/common/xhttp" +) + +func BackupImageHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.BackupImageRequest + if err := httpx.Parse(r, &req); err != nil { + xhttp.JsonBaseResponseCtx(r.Context(), w, err) + return + } + + l := storage.NewBackupImageLogic(r.Context(), svcCtx) + resp, err := l.BackupImage(&req) + if err != nil { + xhttp.JsonBaseResponseCtx(r.Context(), w, err) + } else { + xhttp.JsonBaseResponseCtx(r.Context(), w, resp) + } + } +} diff --git a/app/auth/api/internal/logic/auth/get_personal_info_logic.go b/app/auth/api/internal/logic/auth/get_personal_info_logic.go new file mode 100644 index 0000000..6d5ac72 --- /dev/null +++ b/app/auth/api/internal/logic/auth/get_personal_info_logic.go @@ -0,0 +1,39 @@ +package auth + +import ( + "context" + "errors" + + "schisandra-album-cloud-microservices/app/auth/api/internal/svc" + "schisandra-album-cloud-microservices/app/auth/api/internal/types" + + "github.com/zeromicro/go-zero/core/logx" +) + +type GetPersonalInfoLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewGetPersonalInfoLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetPersonalInfoLogic { + return &GetPersonalInfoLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *GetPersonalInfoLogic) GetPersonalInfo() (resp *types.UserMeta, err error) { + uid, ok := l.ctx.Value("user_id").(string) + if !ok { + return nil, errors.New("user_id not found") + } + authUser := l.svcCtx.DB.ScaAuthUser + + err = authUser.Where(authUser.UID.Eq(uid)).Scan(&resp) + if err != nil { + return nil, err + } + return resp, nil +} diff --git a/app/auth/api/internal/logic/auth/modify_personal_info_logic.go b/app/auth/api/internal/logic/auth/modify_personal_info_logic.go new file mode 100644 index 0000000..4e69ae9 --- /dev/null +++ b/app/auth/api/internal/logic/auth/modify_personal_info_logic.go @@ -0,0 +1,42 @@ +package auth + +import ( + "context" + "errors" + "schisandra-album-cloud-microservices/app/auth/api/internal/svc" + "schisandra-album-cloud-microservices/app/auth/api/internal/types" + "schisandra-album-cloud-microservices/app/auth/model/mysql/model" + + "github.com/zeromicro/go-zero/core/logx" +) + +type ModifyPersonalInfoLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewModifyPersonalInfoLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ModifyPersonalInfoLogic { + return &ModifyPersonalInfoLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *ModifyPersonalInfoLogic) ModifyPersonalInfo(req *types.ModifyPersonalInfoRequest) (resp string, err error) { + uid, ok := l.ctx.Value("user_id").(string) + if !ok { + return "", errors.New("user_id not found") + } + + authUser := l.svcCtx.DB.ScaAuthUser + info, err := authUser.Where(authUser.UID.Eq(uid)).Updates(model.ScaAuthUser{Nickname: req.Nickname, Avatar: req.Avatar, Email: req.Email, Gender: req.Gender, Introduce: req.Introduce, Blog: req.Blog, Location: req.Location, Company: req.Company}) + if err != nil { + return "", err + } + if info.RowsAffected == 0 { + return "", errors.New("user not found") + } + return "success", nil +} diff --git a/app/auth/api/internal/logic/storage/backup_image_logic.go b/app/auth/api/internal/logic/storage/backup_image_logic.go new file mode 100644 index 0000000..5d02a70 --- /dev/null +++ b/app/auth/api/internal/logic/storage/backup_image_logic.go @@ -0,0 +1,128 @@ +package storage + +import ( + "context" + "encoding/json" + "errors" + "github.com/redis/go-redis/v9" + "schisandra-album-cloud-microservices/app/auth/model/mysql/model" + "schisandra-album-cloud-microservices/common/constant" + "schisandra-album-cloud-microservices/common/encrypt" + storageConfig "schisandra-album-cloud-microservices/common/storage/config" + + "schisandra-album-cloud-microservices/app/auth/api/internal/svc" + "schisandra-album-cloud-microservices/app/auth/api/internal/types" + + "github.com/zeromicro/go-zero/core/logx" +) + +type BackupImageLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewBackupImageLogic(ctx context.Context, svcCtx *svc.ServiceContext) *BackupImageLogic { + return &BackupImageLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *BackupImageLogic) BackupImage(req *types.BackupImageRequest) (resp string, err error) { + uid, ok := l.ctx.Value("user_id").(string) + if !ok { + return "", errors.New("user_id not found") + } + if req.TargetBucket == "" || req.OriginBucket == "" { + return "", errors.New("origin bucket or target bucket required") + } + if req.TargetBucket == req.OriginBucket { + return "", errors.New("origin bucket and target bucket cannot be the same") + } + + if req.OriginProvider == req.TargetProvider { + // 加载用户oss配置信息 + originOssConfigKey := constant.UserOssConfigPrefix + uid + ":" + req.OriginProvider + ":" + req.OriginBucket + originOssConfig, err := l.getOssConfigFromCacheOrDb(originOssConfigKey, uid, req.OriginProvider, req.OriginBucket) + if err != nil { + return "", err + } + + service, err := l.svcCtx.StorageManager.GetStorage(uid, originOssConfig) + if err != nil { + return "", errors.New("get storage failed") + } + // 同一供应商,直接复制 + _, err = service.PutBucketReplication(l.ctx, req.OriginBucket, req.TargetBucket, req.TargetRegion) + if err != nil { + return "", errors.New("put bucket replication failed") + } + } else { + // 不同供应商,先复制到本地,再上传到目标OSS + return "", errors.New("different provider not supported yet") + } + + return "success", nil +} + +// 提取解密操作为函数 +func (l *BackupImageLogic) decryptConfig(config *model.ScaStorageConfig) (*storageConfig.StorageConfig, error) { + accessKey, err := encrypt.Decrypt(config.AccessKey, l.svcCtx.Config.Encrypt.Key) + if err != nil { + return nil, errors.New("decrypt access key failed") + } + secretKey, err := encrypt.Decrypt(config.SecretKey, l.svcCtx.Config.Encrypt.Key) + if err != nil { + return nil, errors.New("decrypt secret key failed") + } + return &storageConfig.StorageConfig{ + Provider: config.Provider, + Endpoint: config.Endpoint, + AccessKey: accessKey, + SecretKey: secretKey, + BucketName: config.Bucket, + Region: config.Region, + }, nil +} + +// 从缓存或数据库中获取 OSS 配置 +func (l *BackupImageLogic) getOssConfigFromCacheOrDb(cacheKey, uid, provider string, bucket string) (*storageConfig.StorageConfig, error) { + result, err := l.svcCtx.RedisClient.Get(l.ctx, cacheKey).Result() + if err != nil && !errors.Is(err, redis.Nil) { + return nil, errors.New("get oss config failed") + } + + var ossConfig *storageConfig.StorageConfig + if result != "" { + var redisOssConfig model.ScaStorageConfig + if err = json.Unmarshal([]byte(result), &redisOssConfig); err != nil { + return nil, errors.New("unmarshal oss config failed") + } + return l.decryptConfig(&redisOssConfig) + } + + // 缓存未命中,从数据库中加载 + scaOssConfig := l.svcCtx.DB.ScaStorageConfig + dbOssConfig, err := scaOssConfig.Where(scaOssConfig.UserID.Eq(uid), scaOssConfig.Provider.Eq(provider), scaOssConfig.Bucket.Eq(bucket)).First() + if err != nil { + return nil, err + } + + // 缓存数据库配置 + ossConfig, err = l.decryptConfig(dbOssConfig) + if err != nil { + return nil, err + } + marshalData, err := json.Marshal(dbOssConfig) + if err != nil { + return nil, errors.New("marshal oss config failed") + } + err = l.svcCtx.RedisClient.Set(l.ctx, cacheKey, marshalData, 0).Err() + if err != nil { + return nil, errors.New("set oss config failed") + } + + return ossConfig, nil +} diff --git a/app/auth/api/internal/logic/storage/delete_storage_config_logic.go b/app/auth/api/internal/logic/storage/delete_storage_config_logic.go index b6eace5..87104fa 100644 --- a/app/auth/api/internal/logic/storage/delete_storage_config_logic.go +++ b/app/auth/api/internal/logic/storage/delete_storage_config_logic.go @@ -39,7 +39,7 @@ func (l *DeleteStorageConfigLogic) DeleteStorageConfig(req *types.DeleteStorageC if info.RowsAffected == 0 { return "", errors.New("storage config not found") } - cacheOssConfigKey := constant.UserOssConfigPrefix + uid + ":" + req.Provider + cacheOssConfigKey := constant.UserOssConfigPrefix + uid + ":" + req.Provider + ":" + req.Bucket err = l.svcCtx.RedisClient.Del(l.ctx, cacheOssConfigKey).Err() if err != nil { return "", err diff --git a/app/auth/api/internal/logic/storage/download_album_logic.go b/app/auth/api/internal/logic/storage/download_album_logic.go index 31491b7..1152e72 100644 --- a/app/auth/api/internal/logic/storage/download_album_logic.go +++ b/app/auth/api/internal/logic/storage/download_album_logic.go @@ -46,8 +46,8 @@ func (l *DownloadAlbumLogic) DownloadAlbum(req *types.DownloadAlbumRequest) (res } // 加载用户oss配置信息 - cacheOssConfigKey := constant.UserOssConfigPrefix + uid + ":" + req.Provider - ossConfig, err := l.getOssConfigFromCacheOrDb(cacheOssConfigKey, uid, req.Provider) + cacheOssConfigKey := constant.UserOssConfigPrefix + uid + ":" + req.Provider + ":" + req.Bucket + ossConfig, err := l.getOssConfigFromCacheOrDb(cacheOssConfigKey, uid, req.Provider, req.Bucket) if err != nil { return nil, err } @@ -107,7 +107,7 @@ func (l *DownloadAlbumLogic) decryptConfig(config *model.ScaStorageConfig) (*sto } // 从缓存或数据库中获取 OSS 配置 -func (l *DownloadAlbumLogic) getOssConfigFromCacheOrDb(cacheKey, uid, provider string) (*storageConfig.StorageConfig, error) { +func (l *DownloadAlbumLogic) getOssConfigFromCacheOrDb(cacheKey, uid, provider string, bucket string) (*storageConfig.StorageConfig, error) { result, err := l.svcCtx.RedisClient.Get(l.ctx, cacheKey).Result() if err != nil && !errors.Is(err, redis.Nil) { return nil, errors.New("get oss config failed") @@ -124,7 +124,7 @@ func (l *DownloadAlbumLogic) getOssConfigFromCacheOrDb(cacheKey, uid, provider s // 缓存未命中,从数据库中加载 scaOssConfig := l.svcCtx.DB.ScaStorageConfig - dbOssConfig, err := scaOssConfig.Where(scaOssConfig.UserID.Eq(uid), scaOssConfig.Provider.Eq(provider)).First() + dbOssConfig, err := scaOssConfig.Where(scaOssConfig.UserID.Eq(uid), scaOssConfig.Provider.Eq(provider), scaOssConfig.Bucket.Eq(bucket)).First() if err != nil { return nil, err } diff --git a/app/auth/api/internal/logic/storage/get_album_detail_logic.go b/app/auth/api/internal/logic/storage/get_album_detail_logic.go index 95b3afd..0411267 100644 --- a/app/auth/api/internal/logic/storage/get_album_detail_logic.go +++ b/app/auth/api/internal/logic/storage/get_album_detail_logic.go @@ -95,8 +95,8 @@ func (l *GetAlbumDetailLogic) GetAlbumDetail(req *types.AlbumDetailListRequest) } // 加载用户oss配置信息 - cacheOssConfigKey := constant.UserOssConfigPrefix + uid + ":" + req.Provider - ossConfig, err := l.getOssConfigFromCacheOrDb(cacheOssConfigKey, uid, req.Provider) + cacheOssConfigKey := constant.UserOssConfigPrefix + uid + ":" + req.Provider + ":" + req.Bucket + ossConfig, err := l.getOssConfigFromCacheOrDb(cacheOssConfigKey, uid, req.Provider, req.Bucket) if err != nil { return nil, err } @@ -215,7 +215,7 @@ func (l *GetAlbumDetailLogic) decryptConfig(config *model.ScaStorageConfig) (*st } // 从缓存或数据库中获取 OSS 配置 -func (l *GetAlbumDetailLogic) getOssConfigFromCacheOrDb(cacheKey, uid, provider string) (*storageConfig.StorageConfig, error) { +func (l *GetAlbumDetailLogic) getOssConfigFromCacheOrDb(cacheKey, uid, provider string, bucket string) (*storageConfig.StorageConfig, error) { result, err := l.svcCtx.RedisClient.Get(l.ctx, cacheKey).Result() if err != nil && !errors.Is(err, redis.Nil) { return nil, errors.New("get oss config failed") @@ -232,7 +232,7 @@ func (l *GetAlbumDetailLogic) getOssConfigFromCacheOrDb(cacheKey, uid, provider // 缓存未命中,从数据库中加载 scaOssConfig := l.svcCtx.DB.ScaStorageConfig - dbOssConfig, err := scaOssConfig.Where(scaOssConfig.UserID.Eq(uid), scaOssConfig.Provider.Eq(provider)).First() + dbOssConfig, err := scaOssConfig.Where(scaOssConfig.UserID.Eq(uid), scaOssConfig.Provider.Eq(provider), scaOssConfig.Bucket.Eq(bucket)).First() if err != nil { return nil, err } diff --git a/app/auth/api/internal/logic/storage/get_bucket_capacity_logic.go b/app/auth/api/internal/logic/storage/get_bucket_capacity_logic.go index 52eb4fd..9d47806 100644 --- a/app/auth/api/internal/logic/storage/get_bucket_capacity_logic.go +++ b/app/auth/api/internal/logic/storage/get_bucket_capacity_logic.go @@ -61,8 +61,8 @@ func (l *GetBucketCapacityLogic) GetBucketCapacity(req *types.BucketCapacityRequ return resp, nil } // 加载用户oss配置信息 - cacheOssConfigKey := constant.UserOssConfigPrefix + uid + ":" + req.Provider - ossConfig, err := l.getOssConfigFromCacheOrDb(cacheOssConfigKey, uid, req.Provider) + cacheOssConfigKey := constant.UserOssConfigPrefix + uid + ":" + req.Provider + ":" + req.Bucket + ossConfig, err := l.getOssConfigFromCacheOrDb(cacheOssConfigKey, uid, req.Provider, req.Bucket) if err != nil { return nil, err } @@ -142,7 +142,7 @@ func (l *GetBucketCapacityLogic) decryptConfig(config *model.ScaStorageConfig) ( } // 从缓存或数据库中获取 OSS 配置 -func (l *GetBucketCapacityLogic) getOssConfigFromCacheOrDb(cacheKey, uid, provider string) (*storageConfig.StorageConfig, error) { +func (l *GetBucketCapacityLogic) getOssConfigFromCacheOrDb(cacheKey, uid, provider string, bucket string) (*storageConfig.StorageConfig, error) { result, err := l.svcCtx.RedisClient.Get(l.ctx, cacheKey).Result() if err != nil && !errors.Is(err, redis.Nil) { return nil, errors.New("get oss config failed") @@ -159,7 +159,7 @@ func (l *GetBucketCapacityLogic) getOssConfigFromCacheOrDb(cacheKey, uid, provid // 缓存未命中,从数据库中加载 scaOssConfig := l.svcCtx.DB.ScaStorageConfig - dbOssConfig, err := scaOssConfig.Where(scaOssConfig.UserID.Eq(uid), scaOssConfig.Provider.Eq(provider)).First() + dbOssConfig, err := scaOssConfig.Where(scaOssConfig.UserID.Eq(uid), scaOssConfig.Provider.Eq(provider), scaOssConfig.Bucket.Eq(bucket)).First() if err != nil { return nil, err } diff --git a/app/auth/api/internal/logic/storage/get_delete_record_logic.go b/app/auth/api/internal/logic/storage/get_delete_record_logic.go index 5661af7..2b4a03a 100644 --- a/app/auth/api/internal/logic/storage/get_delete_record_logic.go +++ b/app/auth/api/internal/logic/storage/get_delete_record_logic.go @@ -86,8 +86,8 @@ func (l *GetDeleteRecordLogic) GetDeleteRecord(req *types.QueryDeleteRecordReque } // 加载用户oss配置信息 - cacheOssConfigKey := constant.UserOssConfigPrefix + uid + ":" + req.Provider - ossConfig, err := l.getOssConfigFromCacheOrDb(cacheOssConfigKey, uid, req.Provider) + cacheOssConfigKey := constant.UserOssConfigPrefix + uid + ":" + req.Provider + ":" + req.Bucket + ossConfig, err := l.getOssConfigFromCacheOrDb(cacheOssConfigKey, uid, req.Provider, req.Bucket) if err != nil { return nil, err } @@ -189,7 +189,7 @@ func (l *GetDeleteRecordLogic) decryptConfig(config *model.ScaStorageConfig) (*s } // 从缓存或数据库中获取 OSS 配置 -func (l *GetDeleteRecordLogic) getOssConfigFromCacheOrDb(cacheKey, uid, provider string) (*storageConfig.StorageConfig, error) { +func (l *GetDeleteRecordLogic) getOssConfigFromCacheOrDb(cacheKey, uid, provider string, bucket string) (*storageConfig.StorageConfig, error) { result, err := l.svcCtx.RedisClient.Get(l.ctx, cacheKey).Result() if err != nil && !errors.Is(err, redis.Nil) { return nil, errors.New("get oss config failed") @@ -206,7 +206,7 @@ func (l *GetDeleteRecordLogic) getOssConfigFromCacheOrDb(cacheKey, uid, provider // 缓存未命中,从数据库中加载 scaOssConfig := l.svcCtx.DB.ScaStorageConfig - dbOssConfig, err := scaOssConfig.Where(scaOssConfig.UserID.Eq(uid), scaOssConfig.Provider.Eq(provider)).First() + dbOssConfig, err := scaOssConfig.Where(scaOssConfig.UserID.Eq(uid), scaOssConfig.Provider.Eq(provider), scaOssConfig.Bucket.Eq(bucket)).First() if err != nil { return nil, err } diff --git a/app/auth/api/internal/logic/storage/get_face_detail_list_logic.go b/app/auth/api/internal/logic/storage/get_face_detail_list_logic.go index 805b5e0..0d2aa85 100644 --- a/app/auth/api/internal/logic/storage/get_face_detail_list_logic.go +++ b/app/auth/api/internal/logic/storage/get_face_detail_list_logic.go @@ -85,8 +85,8 @@ func (l *GetFaceDetailListLogic) GetFaceDetailList(req *types.FaceDetailListRequ } // 加载用户oss配置信息 - cacheOssConfigKey := constant.UserOssConfigPrefix + uid + ":" + req.Provider - ossConfig, err := l.getOssConfigFromCacheOrDb(cacheOssConfigKey, uid, req.Provider) + cacheOssConfigKey := constant.UserOssConfigPrefix + uid + ":" + req.Provider + ":" + req.Bucket + ossConfig, err := l.getOssConfigFromCacheOrDb(cacheOssConfigKey, uid, req.Provider, req.Bucket) if err != nil { return nil, err } @@ -189,7 +189,7 @@ func (l *GetFaceDetailListLogic) decryptConfig(config *model.ScaStorageConfig) ( } // 从缓存或数据库中获取 OSS 配置 -func (l *GetFaceDetailListLogic) getOssConfigFromCacheOrDb(cacheKey, uid, provider string) (*storageConfig.StorageConfig, error) { +func (l *GetFaceDetailListLogic) getOssConfigFromCacheOrDb(cacheKey, uid, provider string, bucket string) (*storageConfig.StorageConfig, error) { result, err := l.svcCtx.RedisClient.Get(l.ctx, cacheKey).Result() if err != nil && !errors.Is(err, redis.Nil) { return nil, errors.New("get oss config failed") @@ -206,7 +206,7 @@ func (l *GetFaceDetailListLogic) getOssConfigFromCacheOrDb(cacheKey, uid, provid // 缓存未命中,从数据库中加载 scaOssConfig := l.svcCtx.DB.ScaStorageConfig - dbOssConfig, err := scaOssConfig.Where(scaOssConfig.UserID.Eq(uid), scaOssConfig.Provider.Eq(provider)).First() + dbOssConfig, err := scaOssConfig.Where(scaOssConfig.UserID.Eq(uid), scaOssConfig.Provider.Eq(provider), scaOssConfig.Bucket.Eq(bucket)).First() if err != nil { return nil, err } diff --git a/app/auth/api/internal/logic/storage/get_image_bed_upload_list_logic.go b/app/auth/api/internal/logic/storage/get_image_bed_upload_list_logic.go index 27794b1..d32c0cc 100644 --- a/app/auth/api/internal/logic/storage/get_image_bed_upload_list_logic.go +++ b/app/auth/api/internal/logic/storage/get_image_bed_upload_list_logic.go @@ -44,8 +44,8 @@ func (l *GetImageBedUploadListLogic) GetImageBedUploadList(req *types.ImageBedUp return nil, err } - cacheKey := constant.UserOssConfigPrefix + uid + ":" + req.Provider - ossConfig, err := l.getOssConfigFromCacheOrDb(cacheKey, uid, req.Provider) + cacheKey := constant.UserOssConfigPrefix + uid + ":" + req.Provider + ":" + req.Bucket + ossConfig, err := l.getOssConfigFromCacheOrDb(cacheKey, uid, req.Provider, req.Bucket) if err != nil { return nil, errors.New("get oss config failed") } @@ -94,7 +94,7 @@ func (l *GetImageBedUploadListLogic) decryptConfig(dbConfig *model.ScaStorageCon } // 从缓存或数据库中获取 OSS 配置 -func (l *GetImageBedUploadListLogic) getOssConfigFromCacheOrDb(cacheKey, uid, provider string) (*config.StorageConfig, error) { +func (l *GetImageBedUploadListLogic) getOssConfigFromCacheOrDb(cacheKey, uid, provider string, bucket string) (*config.StorageConfig, error) { result, err := l.svcCtx.RedisClient.Get(l.ctx, cacheKey).Result() if err != nil && !errors.Is(err, redis.Nil) { return nil, errors.New("get oss config failed") @@ -111,7 +111,7 @@ func (l *GetImageBedUploadListLogic) getOssConfigFromCacheOrDb(cacheKey, uid, pr // 缓存未命中,从数据库中加载 scaOssConfig := l.svcCtx.DB.ScaStorageConfig - dbOssConfig, err := scaOssConfig.Where(scaOssConfig.UserID.Eq(uid), scaOssConfig.Provider.Eq(provider)).First() + dbOssConfig, err := scaOssConfig.Where(scaOssConfig.UserID.Eq(uid), scaOssConfig.Provider.Eq(provider), scaOssConfig.Bucket.Eq(bucket)).First() if err != nil { return nil, err } diff --git a/app/auth/api/internal/logic/storage/get_image_url_logic.go b/app/auth/api/internal/logic/storage/get_image_url_logic.go index d032ade..9396f75 100644 --- a/app/auth/api/internal/logic/storage/get_image_url_logic.go +++ b/app/auth/api/internal/logic/storage/get_image_url_logic.go @@ -65,8 +65,8 @@ func (l *GetImageUrlLogic) GetImageUrl(req *types.SingleImageRequest) (resp stri return "", errors.New("get storage info failed") } // 加载用户oss配置信息 - cacheOssConfigKey := constant.UserOssConfigPrefix + uid + ":" + result.Provider - ossConfig, err := l.getOssConfigFromCacheOrDb(cacheOssConfigKey, uid, result.Provider) + cacheOssConfigKey := constant.UserOssConfigPrefix + uid + ":" + result.Provider + ":" + result.Bucket + ossConfig, err := l.getOssConfigFromCacheOrDb(cacheOssConfigKey, uid, result.Provider, result.Bucket) if err != nil { return "", err } @@ -108,7 +108,7 @@ func (l *GetImageUrlLogic) decryptConfig(config *model.ScaStorageConfig) (*stora } // 从缓存或数据库中获取 OSS 配置 -func (l *GetImageUrlLogic) getOssConfigFromCacheOrDb(cacheKey, uid, provider string) (*storageConfig.StorageConfig, error) { +func (l *GetImageUrlLogic) getOssConfigFromCacheOrDb(cacheKey, uid, provider string, bucket string) (*storageConfig.StorageConfig, error) { result, err := l.svcCtx.RedisClient.Get(l.ctx, cacheKey).Result() if err != nil && !errors.Is(err, redis.Nil) { return nil, errors.New("get oss config failed") @@ -125,7 +125,7 @@ func (l *GetImageUrlLogic) getOssConfigFromCacheOrDb(cacheKey, uid, provider str // 缓存未命中,从数据库中加载 scaOssConfig := l.svcCtx.DB.ScaStorageConfig - dbOssConfig, err := scaOssConfig.Where(scaOssConfig.UserID.Eq(uid), scaOssConfig.Provider.Eq(provider)).First() + dbOssConfig, err := scaOssConfig.Where(scaOssConfig.UserID.Eq(uid), scaOssConfig.Provider.Eq(provider), scaOssConfig.Bucket.Eq(bucket)).First() if err != nil { return nil, err } diff --git a/app/auth/api/internal/logic/storage/get_private_image_list_logic.go b/app/auth/api/internal/logic/storage/get_private_image_list_logic.go index 4de1bcc..af514f4 100644 --- a/app/auth/api/internal/logic/storage/get_private_image_list_logic.go +++ b/app/auth/api/internal/logic/storage/get_private_image_list_logic.go @@ -97,8 +97,8 @@ func (l *GetPrivateImageListLogic) GetPrivateImageList(req *types.PrivateImageLi } // 加载用户oss配置信息 - cacheOssConfigKey := constant.UserOssConfigPrefix + uid + ":" + req.Provider - ossConfig, err := l.getOssConfigFromCacheOrDb(cacheOssConfigKey, uid, req.Provider) + cacheOssConfigKey := constant.UserOssConfigPrefix + uid + ":" + req.Provider + ":" + req.Bucket + ossConfig, err := l.getOssConfigFromCacheOrDb(cacheOssConfigKey, uid, req.Provider, req.Bucket) if err != nil { return nil, err } @@ -196,7 +196,7 @@ func (l *GetPrivateImageListLogic) decryptConfig(config *model.ScaStorageConfig) } // 从缓存或数据库中获取 OSS 配置 -func (l *GetPrivateImageListLogic) getOssConfigFromCacheOrDb(cacheKey, uid, provider string) (*storageConfig.StorageConfig, error) { +func (l *GetPrivateImageListLogic) getOssConfigFromCacheOrDb(cacheKey, uid, provider string, bucket string) (*storageConfig.StorageConfig, error) { result, err := l.svcCtx.RedisClient.Get(l.ctx, cacheKey).Result() if err != nil && !errors.Is(err, redis.Nil) { return nil, errors.New("get oss config failed") @@ -213,7 +213,7 @@ func (l *GetPrivateImageListLogic) getOssConfigFromCacheOrDb(cacheKey, uid, prov // 缓存未命中,从数据库中加载 scaOssConfig := l.svcCtx.DB.ScaStorageConfig - dbOssConfig, err := scaOssConfig.Where(scaOssConfig.UserID.Eq(uid), scaOssConfig.Provider.Eq(provider)).First() + dbOssConfig, err := scaOssConfig.Where(scaOssConfig.UserID.Eq(uid), scaOssConfig.Provider.Eq(provider), scaOssConfig.Bucket.Eq(bucket)).First() if err != nil { return nil, err } diff --git a/app/auth/api/internal/logic/storage/get_private_image_url_logic.go b/app/auth/api/internal/logic/storage/get_private_image_url_logic.go index 0689b42..012152f 100644 --- a/app/auth/api/internal/logic/storage/get_private_image_url_logic.go +++ b/app/auth/api/internal/logic/storage/get_private_image_url_logic.go @@ -98,8 +98,8 @@ func (l *GetPrivateImageUrlLogic) GetPrivateImageUrl(req *types.SinglePrivateIma } // 加载用户oss配置信息 - cacheOssConfigKey := constant.UserOssConfigPrefix + uid + ":" + req.Provider - ossConfig, err := l.getOssConfigFromCacheOrDb(cacheOssConfigKey, uid, req.Provider) + cacheOssConfigKey := constant.UserOssConfigPrefix + uid + ":" + req.Provider + ":" + req.Bucket + ossConfig, err := l.getOssConfigFromCacheOrDb(cacheOssConfigKey, uid, req.Provider, req.Bucket) if err != nil { return "", err } @@ -178,7 +178,7 @@ func (l *GetPrivateImageUrlLogic) decryptConfig(config *model.ScaStorageConfig) } // 从缓存或数据库中获取 OSS 配置 -func (l *GetPrivateImageUrlLogic) getOssConfigFromCacheOrDb(cacheKey, uid, provider string) (*storageConfig.StorageConfig, error) { +func (l *GetPrivateImageUrlLogic) getOssConfigFromCacheOrDb(cacheKey, uid, provider string, bucket string) (*storageConfig.StorageConfig, error) { result, err := l.svcCtx.RedisClient.Get(l.ctx, cacheKey).Result() if err != nil && !errors.Is(err, redis.Nil) { return nil, errors.New("get oss config failed") @@ -195,7 +195,7 @@ func (l *GetPrivateImageUrlLogic) getOssConfigFromCacheOrDb(cacheKey, uid, provi // 缓存未命中,从数据库中加载 scaOssConfig := l.svcCtx.DB.ScaStorageConfig - dbOssConfig, err := scaOssConfig.Where(scaOssConfig.UserID.Eq(uid), scaOssConfig.Provider.Eq(provider)).First() + dbOssConfig, err := scaOssConfig.Where(scaOssConfig.UserID.Eq(uid), scaOssConfig.Provider.Eq(provider), scaOssConfig.Bucket.Eq(bucket)).First() if err != nil { return nil, err } diff --git a/app/auth/api/internal/logic/storage/image_bed_upload_logic.go b/app/auth/api/internal/logic/storage/image_bed_upload_logic.go index 5d45c98..e6dc132 100644 --- a/app/auth/api/internal/logic/storage/image_bed_upload_logic.go +++ b/app/auth/api/internal/logic/storage/image_bed_upload_logic.go @@ -61,8 +61,8 @@ func (l *ImageBedUploadLogic) ImageBedUpload(r *http.Request) (resp *types.Image // 上传文件到OSS - cacheKey := constant.UserOssConfigPrefix + uid + ":" + result.Provider - ossConfig, err := l.getOssConfigFromCacheOrDb(cacheKey, uid, result.Provider) + cacheKey := constant.UserOssConfigPrefix + uid + ":" + result.Provider + ":" + result.Bucket + ossConfig, err := l.getOssConfigFromCacheOrDb(cacheKey, uid, result.Provider, result.Bucket) if err != nil { return nil, errors.New("get oss config failed") } @@ -137,7 +137,7 @@ func (l *ImageBedUploadLogic) decryptConfig(dbConfig *model.ScaStorageConfig) (* } // 从缓存或数据库中获取 OSS 配置 -func (l *ImageBedUploadLogic) getOssConfigFromCacheOrDb(cacheKey, uid, provider string) (*config.StorageConfig, error) { +func (l *ImageBedUploadLogic) getOssConfigFromCacheOrDb(cacheKey, uid, provider string, bucket string) (*config.StorageConfig, error) { result, err := l.svcCtx.RedisClient.Get(l.ctx, cacheKey).Result() if err != nil && !errors.Is(err, redis.Nil) { return nil, errors.New("get oss config failed") @@ -154,7 +154,7 @@ func (l *ImageBedUploadLogic) getOssConfigFromCacheOrDb(cacheKey, uid, provider // 缓存未命中,从数据库中加载 scaOssConfig := l.svcCtx.DB.ScaStorageConfig - dbOssConfig, err := scaOssConfig.Where(scaOssConfig.UserID.Eq(uid), scaOssConfig.Provider.Eq(provider)).First() + dbOssConfig, err := scaOssConfig.Where(scaOssConfig.UserID.Eq(uid), scaOssConfig.Provider.Eq(provider), scaOssConfig.Bucket.Eq(bucket)).First() if err != nil { return nil, err } diff --git a/app/auth/api/internal/logic/storage/query_all_image_list_logic.go b/app/auth/api/internal/logic/storage/query_all_image_list_logic.go index 45e5b51..6befc25 100644 --- a/app/auth/api/internal/logic/storage/query_all_image_list_logic.go +++ b/app/auth/api/internal/logic/storage/query_all_image_list_logic.go @@ -109,8 +109,8 @@ func (l *QueryAllImageListLogic) QueryAllImageList(req *types.AllImageListReques } // 加载用户oss配置信息 - cacheOssConfigKey := constant.UserOssConfigPrefix + uid + ":" + req.Provider - ossConfig, err := l.getOssConfigFromCacheOrDb(cacheOssConfigKey, uid, req.Provider) + cacheOssConfigKey := constant.UserOssConfigPrefix + uid + ":" + req.Provider + ":" + req.Bucket + ossConfig, err := l.getOssConfigFromCacheOrDb(cacheOssConfigKey, uid, req.Provider, req.Bucket) if err != nil { return nil, err } @@ -222,7 +222,7 @@ func (l *QueryAllImageListLogic) decryptConfig(config *model.ScaStorageConfig) ( } // 从缓存或数据库中获取 OSS 配置 -func (l *QueryAllImageListLogic) getOssConfigFromCacheOrDb(cacheKey, uid, provider string) (*storageConfig.StorageConfig, error) { +func (l *QueryAllImageListLogic) getOssConfigFromCacheOrDb(cacheKey, uid, provider string, bucket string) (*storageConfig.StorageConfig, error) { result, err := l.svcCtx.RedisClient.Get(l.ctx, cacheKey).Result() if err != nil && !errors.Is(err, redis.Nil) { return nil, errors.New("get oss config failed") @@ -239,7 +239,7 @@ func (l *QueryAllImageListLogic) getOssConfigFromCacheOrDb(cacheKey, uid, provid // 缓存未命中,从数据库中加载 scaOssConfig := l.svcCtx.DB.ScaStorageConfig - dbOssConfig, err := scaOssConfig.Where(scaOssConfig.UserID.Eq(uid), scaOssConfig.Provider.Eq(provider)).First() + dbOssConfig, err := scaOssConfig.Where(scaOssConfig.UserID.Eq(uid), scaOssConfig.Provider.Eq(provider), scaOssConfig.Bucket.Eq(bucket)).First() if err != nil { return nil, err } diff --git a/app/auth/api/internal/logic/storage/query_location_detail_list_logic.go b/app/auth/api/internal/logic/storage/query_location_detail_list_logic.go index 91fb155..fc35d6c 100644 --- a/app/auth/api/internal/logic/storage/query_location_detail_list_logic.go +++ b/app/auth/api/internal/logic/storage/query_location_detail_list_logic.go @@ -91,8 +91,8 @@ func (l *QueryLocationDetailListLogic) QueryLocationDetailList(req *types.Locati } // 加载用户oss配置信息 - cacheOssConfigKey := constant.UserOssConfigPrefix + uid + ":" + req.Provider - ossConfig, err := l.getOssConfigFromCacheOrDb(cacheOssConfigKey, uid, req.Provider) + cacheOssConfigKey := constant.UserOssConfigPrefix + uid + ":" + req.Provider + ":" + req.Bucket + ossConfig, err := l.getOssConfigFromCacheOrDb(cacheOssConfigKey, uid, req.Provider, req.Bucket) if err != nil { return nil, err } @@ -193,7 +193,7 @@ func (l *QueryLocationDetailListLogic) decryptConfig(config *model.ScaStorageCon } // 从缓存或数据库中获取 OSS 配置 -func (l *QueryLocationDetailListLogic) getOssConfigFromCacheOrDb(cacheKey, uid, provider string) (*storageConfig.StorageConfig, error) { +func (l *QueryLocationDetailListLogic) getOssConfigFromCacheOrDb(cacheKey, uid, provider string, bucket string) (*storageConfig.StorageConfig, error) { result, err := l.svcCtx.RedisClient.Get(l.ctx, cacheKey).Result() if err != nil && !errors.Is(err, redis.Nil) { return nil, errors.New("get oss config failed") @@ -210,7 +210,7 @@ func (l *QueryLocationDetailListLogic) getOssConfigFromCacheOrDb(cacheKey, uid, // 缓存未命中,从数据库中加载 scaOssConfig := l.svcCtx.DB.ScaStorageConfig - dbOssConfig, err := scaOssConfig.Where(scaOssConfig.UserID.Eq(uid), scaOssConfig.Provider.Eq(provider)).First() + dbOssConfig, err := scaOssConfig.Where(scaOssConfig.UserID.Eq(uid), scaOssConfig.Provider.Eq(provider), scaOssConfig.Bucket.Eq(bucket)).First() if err != nil { return nil, err } diff --git a/app/auth/api/internal/logic/storage/query_location_image_list_logic.go b/app/auth/api/internal/logic/storage/query_location_image_list_logic.go index 485d870..68557af 100644 --- a/app/auth/api/internal/logic/storage/query_location_image_list_logic.go +++ b/app/auth/api/internal/logic/storage/query_location_image_list_logic.go @@ -60,8 +60,8 @@ func (l *QueryLocationImageListLogic) QueryLocationImageList(req *types.Location } // 加载用户oss配置信息 - cacheOssConfigKey := constant.UserOssConfigPrefix + uid + ":" + req.Provider - ossConfig, err := l.getOssConfigFromCacheOrDb(cacheOssConfigKey, uid, req.Provider) + cacheOssConfigKey := constant.UserOssConfigPrefix + uid + ":" + req.Provider + ":" + req.Bucket + ossConfig, err := l.getOssConfigFromCacheOrDb(cacheOssConfigKey, uid, req.Provider, req.Bucket) if err != nil { return nil, err } @@ -132,7 +132,7 @@ func (l *QueryLocationImageListLogic) decryptConfig(config *model.ScaStorageConf } // 从缓存或数据库中获取 OSS 配置 -func (l *QueryLocationImageListLogic) getOssConfigFromCacheOrDb(cacheKey, uid, provider string) (*storageConfig.StorageConfig, error) { +func (l *QueryLocationImageListLogic) getOssConfigFromCacheOrDb(cacheKey, uid, provider string, bucket string) (*storageConfig.StorageConfig, error) { result, err := l.svcCtx.RedisClient.Get(l.ctx, cacheKey).Result() if err != nil && !errors.Is(err, redis.Nil) { return nil, errors.New("get oss config failed") @@ -149,7 +149,7 @@ func (l *QueryLocationImageListLogic) getOssConfigFromCacheOrDb(cacheKey, uid, p // 缓存未命中,从数据库中加载 scaOssConfig := l.svcCtx.DB.ScaStorageConfig - dbOssConfig, err := scaOssConfig.Where(scaOssConfig.UserID.Eq(uid), scaOssConfig.Provider.Eq(provider)).First() + dbOssConfig, err := scaOssConfig.Where(scaOssConfig.UserID.Eq(uid), scaOssConfig.Provider.Eq(provider), scaOssConfig.Bucket.Eq(bucket)).First() if err != nil { return nil, err } diff --git a/app/auth/api/internal/logic/storage/query_recent_image_list_logic.go b/app/auth/api/internal/logic/storage/query_recent_image_list_logic.go index 4f738f9..ca69573 100644 --- a/app/auth/api/internal/logic/storage/query_recent_image_list_logic.go +++ b/app/auth/api/internal/logic/storage/query_recent_image_list_logic.go @@ -93,8 +93,8 @@ func (l *QueryRecentImageListLogic) QueryRecentImageList(req *types.RecentListRe } // 加载用户oss配置信息 - cacheOssConfigKey := constant.UserOssConfigPrefix + uid + ":" + req.Provider - ossConfig, err := l.getOssConfigFromCacheOrDb(cacheOssConfigKey, uid, req.Provider) + cacheOssConfigKey := constant.UserOssConfigPrefix + uid + ":" + req.Provider + ":" + req.Bucket + ossConfig, err := l.getOssConfigFromCacheOrDb(cacheOssConfigKey, uid, req.Provider, req.Bucket) if err != nil { return nil, err } @@ -206,7 +206,7 @@ func (l *QueryRecentImageListLogic) decryptConfig(config *model.ScaStorageConfig } // 从缓存或数据库中获取 OSS 配置 -func (l *QueryRecentImageListLogic) getOssConfigFromCacheOrDb(cacheKey, uid, provider string) (*storageConfig.StorageConfig, error) { +func (l *QueryRecentImageListLogic) getOssConfigFromCacheOrDb(cacheKey, uid, provider string, bucket string) (*storageConfig.StorageConfig, error) { result, err := l.svcCtx.RedisClient.Get(l.ctx, cacheKey).Result() if err != nil && !errors.Is(err, redis.Nil) { return nil, errors.New("get oss config failed") @@ -223,7 +223,7 @@ func (l *QueryRecentImageListLogic) getOssConfigFromCacheOrDb(cacheKey, uid, pro // 缓存未命中,从数据库中加载 scaOssConfig := l.svcCtx.DB.ScaStorageConfig - dbOssConfig, err := scaOssConfig.Where(scaOssConfig.UserID.Eq(uid), scaOssConfig.Provider.Eq(provider)).First() + dbOssConfig, err := scaOssConfig.Where(scaOssConfig.UserID.Eq(uid), scaOssConfig.Provider.Eq(provider), scaOssConfig.Bucket.Eq(bucket)).First() if err != nil { return nil, err } diff --git a/app/auth/api/internal/logic/storage/query_thing_detail_list_logic.go b/app/auth/api/internal/logic/storage/query_thing_detail_list_logic.go index 6f3291d..ba20aa4 100644 --- a/app/auth/api/internal/logic/storage/query_thing_detail_list_logic.go +++ b/app/auth/api/internal/logic/storage/query_thing_detail_list_logic.go @@ -91,8 +91,8 @@ func (l *QueryThingDetailListLogic) QueryThingDetailList(req *types.ThingDetailL } // 加载用户oss配置信息 - cacheOssConfigKey := constant.UserOssConfigPrefix + uid + ":" + req.Provider - ossConfig, err := l.getOssConfigFromCacheOrDb(cacheOssConfigKey, uid, req.Provider) + cacheOssConfigKey := constant.UserOssConfigPrefix + uid + ":" + req.Provider + ":" + req.Bucket + ossConfig, err := l.getOssConfigFromCacheOrDb(cacheOssConfigKey, uid, req.Provider, req.Bucket) if err != nil { return nil, err } @@ -193,7 +193,7 @@ func (l *QueryThingDetailListLogic) decryptConfig(config *model.ScaStorageConfig } // 从缓存或数据库中获取 OSS 配置 -func (l *QueryThingDetailListLogic) getOssConfigFromCacheOrDb(cacheKey, uid, provider string) (*storageConfig.StorageConfig, error) { +func (l *QueryThingDetailListLogic) getOssConfigFromCacheOrDb(cacheKey, uid, provider string, bucket string) (*storageConfig.StorageConfig, error) { result, err := l.svcCtx.RedisClient.Get(l.ctx, cacheKey).Result() if err != nil && !errors.Is(err, redis.Nil) { return nil, errors.New("get oss config failed") @@ -210,7 +210,7 @@ func (l *QueryThingDetailListLogic) getOssConfigFromCacheOrDb(cacheKey, uid, pro // 缓存未命中,从数据库中加载 scaOssConfig := l.svcCtx.DB.ScaStorageConfig - dbOssConfig, err := scaOssConfig.Where(scaOssConfig.UserID.Eq(uid), scaOssConfig.Provider.Eq(provider)).First() + dbOssConfig, err := scaOssConfig.Where(scaOssConfig.UserID.Eq(uid), scaOssConfig.Provider.Eq(provider), scaOssConfig.Bucket.Eq(bucket)).First() if err != nil { return nil, err } diff --git a/app/auth/api/internal/logic/storage/query_thing_image_list_logic.go b/app/auth/api/internal/logic/storage/query_thing_image_list_logic.go index 4b4b534..46c7f22 100644 --- a/app/auth/api/internal/logic/storage/query_thing_image_list_logic.go +++ b/app/auth/api/internal/logic/storage/query_thing_image_list_logic.go @@ -64,8 +64,8 @@ func (l *QueryThingImageListLogic) QueryThingImageList(req *types.ThingListReque } // 加载用户oss配置信息 - cacheOssConfigKey := constant.UserOssConfigPrefix + uid + ":" + req.Provider - ossConfig, err := l.getOssConfigFromCacheOrDb(cacheOssConfigKey, uid, req.Provider) + cacheOssConfigKey := constant.UserOssConfigPrefix + uid + ":" + req.Provider + ":" + req.Bucket + ossConfig, err := l.getOssConfigFromCacheOrDb(cacheOssConfigKey, uid, req.Provider, req.Bucket) if err != nil { return nil, err } @@ -152,7 +152,7 @@ func (l *QueryThingImageListLogic) decryptConfig(config *model.ScaStorageConfig) } // 从缓存或数据库中获取 OSS 配置 -func (l *QueryThingImageListLogic) getOssConfigFromCacheOrDb(cacheKey, uid, provider string) (*storageConfig.StorageConfig, error) { +func (l *QueryThingImageListLogic) getOssConfigFromCacheOrDb(cacheKey, uid, provider string, bucket string) (*storageConfig.StorageConfig, error) { result, err := l.svcCtx.RedisClient.Get(l.ctx, cacheKey).Result() if err != nil && !errors.Is(err, redis.Nil) { return nil, errors.New("get oss config failed") @@ -169,7 +169,7 @@ func (l *QueryThingImageListLogic) getOssConfigFromCacheOrDb(cacheKey, uid, prov // 缓存未命中,从数据库中加载 scaOssConfig := l.svcCtx.DB.ScaStorageConfig - dbOssConfig, err := scaOssConfig.Where(scaOssConfig.UserID.Eq(uid), scaOssConfig.Provider.Eq(provider)).First() + dbOssConfig, err := scaOssConfig.Where(scaOssConfig.UserID.Eq(uid), scaOssConfig.Provider.Eq(provider), scaOssConfig.Bucket.Eq(bucket)).First() if err != nil { return nil, err } diff --git a/app/auth/api/internal/logic/storage/search_image_logic.go b/app/auth/api/internal/logic/storage/search_image_logic.go index 6b2b249..505a305 100644 --- a/app/auth/api/internal/logic/storage/search_image_logic.go +++ b/app/auth/api/internal/logic/storage/search_image_logic.go @@ -85,8 +85,8 @@ func (l *SearchImageLogic) SearchImage(req *types.SearchImageRequest) (resp *typ } // 加载用户oss配置信息 - cacheOssConfigKey := constant.UserOssConfigPrefix + uid + ":" + req.Provider - ossConfig, err := l.getOssConfigFromCacheOrDb(cacheOssConfigKey, uid, req.Provider) + cacheOssConfigKey := constant.UserOssConfigPrefix + uid + ":" + req.Provider + ":" + req.Bucket + ossConfig, err := l.getOssConfigFromCacheOrDb(cacheOssConfigKey, uid, req.Provider, req.Bucket) if err != nil { return nil, err } @@ -325,7 +325,7 @@ func (l *SearchImageLogic) decryptConfig(config *model.ScaStorageConfig) (*stora } // 从缓存或数据库中获取 OSS 配置 -func (l *SearchImageLogic) getOssConfigFromCacheOrDb(cacheKey, uid, provider string) (*storageConfig.StorageConfig, error) { +func (l *SearchImageLogic) getOssConfigFromCacheOrDb(cacheKey, uid, provider string, bucket string) (*storageConfig.StorageConfig, error) { result, err := l.svcCtx.RedisClient.Get(l.ctx, cacheKey).Result() if err != nil && !errors.Is(err, redis.Nil) { return nil, errors.New("get oss config failed") @@ -342,7 +342,7 @@ func (l *SearchImageLogic) getOssConfigFromCacheOrDb(cacheKey, uid, provider str // 缓存未命中,从数据库中加载 scaOssConfig := l.svcCtx.DB.ScaStorageConfig - dbOssConfig, err := scaOssConfig.Where(scaOssConfig.UserID.Eq(uid), scaOssConfig.Provider.Eq(provider)).First() + dbOssConfig, err := scaOssConfig.Where(scaOssConfig.UserID.Eq(uid), scaOssConfig.Provider.Eq(provider), scaOssConfig.Bucket.Eq(bucket)).First() if err != nil { return nil, err } diff --git a/app/auth/api/internal/logic/storage/upload_file_logic.go b/app/auth/api/internal/logic/storage/upload_file_logic.go index e180de5..a5bedc9 100644 --- a/app/auth/api/internal/logic/storage/upload_file_logic.go +++ b/app/auth/api/internal/logic/storage/upload_file_logic.go @@ -222,8 +222,8 @@ func (l *UploadFileLogic) parseUploadSettingResult(r *http.Request) (types.Uploa // 上传文件到 OSS func (l *UploadFileLogic) uploadFileToOSS(uid string, header *multipart.FileHeader, file io.Reader, thumbnail io.Reader, result types.File, settingResult types.UploadSetting) (string, string, error) { - cacheKey := constant.UserOssConfigPrefix + uid + ":" + result.Provider - ossConfig, err := l.getOssConfigFromCacheOrDb(cacheKey, uid, result.Provider) + cacheKey := constant.UserOssConfigPrefix + uid + ":" + result.Provider + ":" + result.Bucket + ossConfig, err := l.getOssConfigFromCacheOrDb(cacheKey, uid, result.Provider, result.Bucket) if err != nil { return "", "", errors.New("get oss config failed") } @@ -293,7 +293,7 @@ func (l *UploadFileLogic) decryptConfig(dbConfig *model.ScaStorageConfig) (*conf } // 从缓存或数据库中获取 OSS 配置 -func (l *UploadFileLogic) getOssConfigFromCacheOrDb(cacheKey, uid, provider string) (*config.StorageConfig, error) { +func (l *UploadFileLogic) getOssConfigFromCacheOrDb(cacheKey, uid, provider string, bucket string) (*config.StorageConfig, error) { result, err := l.svcCtx.RedisClient.Get(l.ctx, cacheKey).Result() if err != nil && !errors.Is(err, redis.Nil) { return nil, errors.New("get oss config failed") @@ -310,7 +310,7 @@ func (l *UploadFileLogic) getOssConfigFromCacheOrDb(cacheKey, uid, provider stri // 缓存未命中,从数据库中加载 scaOssConfig := l.svcCtx.DB.ScaStorageConfig - dbOssConfig, err := scaOssConfig.Where(scaOssConfig.UserID.Eq(uid), scaOssConfig.Provider.Eq(provider)).First() + dbOssConfig, err := scaOssConfig.Where(scaOssConfig.UserID.Eq(uid), scaOssConfig.Provider.Eq(provider), scaOssConfig.Bucket.Eq(bucket)).First() if err != nil { return nil, err } diff --git a/app/auth/api/internal/mq/image_process_consumer.go b/app/auth/api/internal/mq/image_process_consumer.go index 0d1ee1a..23dfb0c 100644 --- a/app/auth/api/internal/mq/image_process_consumer.go +++ b/app/auth/api/internal/mq/image_process_consumer.go @@ -129,7 +129,7 @@ func (c *NsqImageProcessConsumer) getGeoLocation(latitude, longitude float64) (s } // 从缓存或数据库中获取 OSS 配置 -func (c *NsqImageProcessConsumer) getOssConfigFromCacheOrDb(cacheKey, uid, provider string) (*config.StorageConfig, error) { +func (c *NsqImageProcessConsumer) getOssConfigFromCacheOrDb(cacheKey, uid, provider string, bucket string) (*config.StorageConfig, error) { result, err := c.svcCtx.RedisClient.Get(c.ctx, cacheKey).Result() if err != nil && !errors.Is(err, redis.Nil) { return nil, errors.New("get oss config failed") @@ -146,7 +146,7 @@ func (c *NsqImageProcessConsumer) getOssConfigFromCacheOrDb(cacheKey, uid, provi // 缓存未命中,从数据库中加载 scaOssConfig := c.svcCtx.DB.ScaStorageConfig - dbOssConfig, err := scaOssConfig.Where(scaOssConfig.UserID.Eq(uid), scaOssConfig.Provider.Eq(provider)).First() + dbOssConfig, err := scaOssConfig.Where(scaOssConfig.UserID.Eq(uid), scaOssConfig.Provider.Eq(provider), scaOssConfig.Bucket.Eq(bucket)).First() if err != nil { return nil, err } diff --git a/app/auth/api/internal/types/types.go b/app/auth/api/internal/types/types.go index d90e273..6b655c5 100644 --- a/app/auth/api/internal/types/types.go +++ b/app/auth/api/internal/types/types.go @@ -99,6 +99,15 @@ type AllStorageListResponse struct { Records []StorageConfigMeta `json:"records"` } +type BackupImageRequest struct { + OriginProvider string `json:"origin_provider"` + OriginBucket string `json:"origin_bucket"` + OriginRegion string `json:"origin_region"` + TargetProvider string `json:"target_provider"` + TargetBucket string `json:"target_bucket"` + TargetRegion string `json:"target_region"` +} + type BucketCapacityRequest struct { Provider string `json:"provider"` Bucket string `json:"bucket"` @@ -371,6 +380,17 @@ type ModifyFaceTypeResponse struct { Result string `json:"result"` } +type ModifyPersonalInfoRequest struct { + Nickname string `json:"nickname,optional"` + Avatar string `json:"avatar,optional"` + Email string `json:"email,optional"` + Gender int64 `json:"gender,optional"` + Introduce string `json:"introduce,optional"` + Blog string `json:"blog,optional"` + Location string `json:"location,optional"` + Company string `json:"company,optional"` +} + type OAuthCallbackRequest struct { Code string `form:"code"` } diff --git a/common/storage/storage/aliyun_oss.go b/common/storage/storage/aliyun_oss.go index 81bd782..bf6e83d 100644 --- a/common/storage/storage/aliyun_oss.go +++ b/common/storage/storage/aliyun_oss.go @@ -419,3 +419,45 @@ func (a *AliOSS) PresignedURL(ctx context.Context, bucketName, objectKey string, return presignedResult.URL, nil } + +// PutBucketReplication 配置跨区域复制规则 +func (a *AliOSS) PutBucketReplication(ctx context.Context, originBucketName, targetBucketName, targetBucketRegion string) (string, error) { + request := &oss.PutBucketReplicationRequest{ + Bucket: oss.Ptr(originBucketName), // 存储空间名称 + ReplicationConfiguration: &oss.ReplicationConfiguration{ + Rules: []oss.ReplicationRule{ + { + RTC: &oss.ReplicationTimeControl{ + Status: oss.Ptr("enabled"), // 在配置跨区域复制规则时,开启数据复制时间控制(RTC)功能 + }, + Destination: &oss.ReplicationDestination{ + Bucket: oss.Ptr(targetBucketName), // 目标存储空间名称 + Location: oss.Ptr(targetBucketRegion), // 目标存储区域 + TransferType: oss.TransferTypeOssAcc, // 传输类型 + }, + HistoricalObjectReplication: oss.HistoricalObjectReplicationEnabled, // 开启历史数据复制功能 + }, + }, + }, + } + result, err := a.client.PutBucketReplication(ctx, request) + if err != nil { + return "", fmt.Errorf("failed to put bucket replication, error: %v", err) + } + return *result.ReplicationRuleId, nil +} + +// DeleteBucketReplication 删除跨区域复制规则 +func (a *AliOSS) DeleteBucketReplication(ctx context.Context, bucketName string, ruleId string) error { + request := &oss.DeleteBucketReplicationRequest{ + Bucket: oss.Ptr(bucketName), // 存储空间名称 + ReplicationRules: &oss.ReplicationRules{ + IDs: []string{ruleId}, // 复制规则ID列表 + }, + } + _, err := a.client.DeleteBucketReplication(ctx, request) + if err != nil { + return fmt.Errorf("failed to delete bucket replication, error: %v", err) + } + return nil +} diff --git a/common/storage/storage/interface.go b/common/storage/storage/interface.go index 17963f8..64e0379 100644 --- a/common/storage/storage/interface.go +++ b/common/storage/storage/interface.go @@ -77,4 +77,6 @@ type Service interface { DeleteObject(ctx context.Context, bucketName, objectName string) (int, error) RenameObject(ctx context.Context, destBucketName, destObjectName, srcObjectName, srcBucketName string) (int, error) PresignedURL(ctx context.Context, bucketName, objectKey string, expires time.Duration) (string, error) + PutBucketReplication(ctx context.Context, originBucketName, targetBucketName, targetBucketRegion string) (string, error) + DeleteBucketReplication(ctx context.Context, bucketName string, ruleId string) error }