- Instance deployment: charts browser, deploy modal, instances list - Values Template version management (create/history/rollback) - Storage layered config (cluster > workspace > shared priority) - Cluster credential decryptIfNeeded for mixed encrypted/plaintext kubeconfig - YAML syntax validation (client-side + server-side warning) - Frontend: charts, instances, storage, templates, admin pages - Backend: storage service, instance service, cluster service, helm client - Multi-Tenant Kubeconfig.md: added by user
154 lines
4.5 KiB
Go
154 lines
4.5 KiB
Go
package dto
|
||
|
||
import (
|
||
"time"
|
||
|
||
"github.com/ocdp/cluster-service/internal/domain/entity"
|
||
"github.com/ocdp/cluster-service/internal/pkg/crypto"
|
||
)
|
||
|
||
// ToRegistryResponse 转换 Registry 实体为响应 DTO(脱敏)
|
||
func ToRegistryResponse(registry *entity.Registry) *RegistryResponse {
|
||
response := &RegistryResponse{
|
||
ID: registry.ID,
|
||
WorkspaceID: registry.WorkspaceID,
|
||
OwnerID: registry.OwnerID,
|
||
Name: registry.Name,
|
||
URL: registry.URL,
|
||
Description: registry.Description,
|
||
Username: registry.Username,
|
||
Insecure: registry.Insecure,
|
||
IsShared: registry.IsShared,
|
||
CreatedAt: registry.CreatedAt.Format("2006-01-02T15:04:05Z07:00"),
|
||
UpdatedAt: registry.UpdatedAt.Format("2006-01-02T15:04:05Z07:00"),
|
||
}
|
||
|
||
// 脱敏处理密码
|
||
if registry.Password != "" {
|
||
response.HasPassword = true
|
||
response.Password = crypto.MaskSensitiveData(registry.Password)
|
||
}
|
||
|
||
return response
|
||
}
|
||
|
||
// ToClusterResponse 转换 Cluster 实体为响应 DTO(脱敏)
|
||
func ToClusterResponse(cluster *entity.Cluster) *ClusterResponse {
|
||
response := &ClusterResponse{
|
||
ID: cluster.ID,
|
||
WorkspaceID: cluster.WorkspaceID,
|
||
OwnerID: cluster.OwnerID,
|
||
Name: cluster.Name,
|
||
Host: cluster.Host,
|
||
Description: cluster.Description,
|
||
IsolationMode: string(cluster.IsolationMode),
|
||
DefaultNamespace: cluster.DefaultNamespace,
|
||
IsShared: cluster.IsShared,
|
||
CreatedAt: cluster.CreatedAt.Format("2006-01-02T15:04:05Z07:00"),
|
||
UpdatedAt: cluster.UpdatedAt.Format("2006-01-02T15:04:05Z07:00"),
|
||
}
|
||
|
||
// 设置认证配置状态标志
|
||
response.HasCAData = cluster.CAData != ""
|
||
response.HasCertData = cluster.CertData != ""
|
||
response.HasKeyData = cluster.KeyData != ""
|
||
response.HasToken = cluster.Token != ""
|
||
|
||
// 脱敏处理敏感数据(仅显示掩码)
|
||
if cluster.CAData != "" {
|
||
response.CAData = crypto.MaskSensitiveData(cluster.CAData)
|
||
}
|
||
if cluster.CertData != "" {
|
||
response.CertData = crypto.MaskSensitiveData(cluster.CertData)
|
||
}
|
||
if cluster.KeyData != "" {
|
||
response.KeyData = crypto.MaskSensitiveData(cluster.KeyData)
|
||
}
|
||
if cluster.Token != "" {
|
||
response.Token = crypto.MaskSensitiveData(cluster.Token)
|
||
}
|
||
|
||
return response
|
||
}
|
||
|
||
// WorkspaceDTOFromEntity 转换 Workspace 实体为 DTO
|
||
func WorkspaceDTOFromEntity(workspace *entity.Workspace) *WorkspaceDTO {
|
||
return &WorkspaceDTO{
|
||
ID: workspace.ID,
|
||
Name: workspace.Name,
|
||
ClusterIDs: workspace.ClusterIDs,
|
||
Description: workspace.Description,
|
||
CreatedBy: workspace.CreatedBy,
|
||
CreatedAt: workspace.CreatedAt,
|
||
UpdatedAt: workspace.UpdatedAt,
|
||
}
|
||
}
|
||
|
||
// WorkspaceDTOsFromEntities 批量转换
|
||
func WorkspaceDTOsFromEntities(workspaces []*entity.Workspace) []*WorkspaceDTO {
|
||
result := make([]*WorkspaceDTO, len(workspaces))
|
||
for i, w := range workspaces {
|
||
result[i] = WorkspaceDTOFromEntity(w)
|
||
}
|
||
return result
|
||
}
|
||
|
||
// QuotaDTOFromEntity 转换 Quota 实体为 DTO
|
||
func QuotaDTOFromEntity(quota *entity.WorkspaceQuota) *QuotaDTO {
|
||
return &QuotaDTO{
|
||
ID: quota.ID,
|
||
WorkspaceID: quota.WorkspaceID,
|
||
ResourceType: string(quota.ResourceType),
|
||
HardLimit: quota.HardLimit,
|
||
SoftLimit: quota.SoftLimit,
|
||
Used: quota.Used,
|
||
}
|
||
}
|
||
|
||
// QuotaDTOsFromEntities 批量转换
|
||
func QuotaDTOsFromEntities(quotas []*entity.WorkspaceQuota) []*QuotaDTO {
|
||
result := make([]*QuotaDTO, len(quotas))
|
||
for i, q := range quotas {
|
||
result[i] = QuotaDTOFromEntity(q)
|
||
}
|
||
return result
|
||
}
|
||
|
||
// UserDTOFromEntity 转换 User 实体为 DTO
|
||
func UserDTOFromEntity(user *entity.User, workspaceName string) *UserDTO {
|
||
return &UserDTO{
|
||
ID: user.ID,
|
||
Username: user.Username,
|
||
Email: user.Email,
|
||
Role: string(user.Role),
|
||
WorkspaceID: user.WorkspaceID,
|
||
WorkspaceName: workspaceName,
|
||
IsActive: user.IsActive,
|
||
MustChangePassword: user.MustChangePassword,
|
||
CreatedAt: user.CreatedAt,
|
||
UpdatedAt: user.UpdatedAt,
|
||
}
|
||
}
|
||
|
||
// UserDTOsFromEntities 批量转换
|
||
func UserDTOsFromEntities(users []*entity.User, workspaceNames map[string]string) []*UserDTO {
|
||
result := make([]*UserDTO, len(users))
|
||
for i, u := range users {
|
||
workspaceName := ""
|
||
if u.WorkspaceID != "" {
|
||
workspaceName = workspaceNames[u.WorkspaceID]
|
||
}
|
||
result[i] = UserDTOFromEntity(u, workspaceName)
|
||
}
|
||
return result
|
||
}
|
||
|
||
// TimeToString 转换时间
|
||
func TimeToString(t time.Time) string {
|
||
if t.IsZero() {
|
||
return ""
|
||
}
|
||
return t.Format("2006-01-02T15:04:05Z07:00")
|
||
}
|
||
|