You've already forked agentic-coding-workflow
118 lines
3.6 KiB
Go
118 lines
3.6 KiB
Go
// dto.go 定义 workspace 模块 HTTP 层的请求 / 响应结构以及与领域模型的映射函数。
|
|
// 设计取舍:
|
|
// - 请求 DTO 用 JSON tag 与前端约定的 snake_case 对齐;可选 patch 字段用 *T 区分"不传"和"显式置空"。
|
|
// - 响应 DTO 不暴露 secret/main_path 等敏感或内部字段,避免泄漏。
|
|
package workspace
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/google/uuid"
|
|
|
|
"github.com/yan1h/agent-coding-workflow/internal/infra/git"
|
|
)
|
|
|
|
// ===== Request DTO =====
|
|
|
|
type createWorkspaceReq struct {
|
|
Slug string `json:"slug"`
|
|
Name string `json:"name"`
|
|
Description string `json:"description"`
|
|
GitRemoteURL string `json:"git_remote_url"`
|
|
DefaultBranch string `json:"default_branch"`
|
|
Credential credentialBody `json:"credential"`
|
|
}
|
|
|
|
type updateWorkspaceReq struct {
|
|
Name *string `json:"name"`
|
|
Description *string `json:"description"`
|
|
DefaultBranch *string `json:"default_branch"`
|
|
}
|
|
|
|
type credentialBody struct {
|
|
Kind string `json:"kind"`
|
|
Username string `json:"username"`
|
|
Secret string `json:"secret"`
|
|
}
|
|
|
|
type createWorktreeReq struct {
|
|
Branch string `json:"branch"`
|
|
BaseBranch string `json:"base_branch"`
|
|
}
|
|
|
|
type commitReq struct {
|
|
Message string `json:"message"`
|
|
Push *bool `json:"push"`
|
|
AddAll *bool `json:"add_all"`
|
|
}
|
|
|
|
// ===== Response DTO =====
|
|
|
|
type workspaceResp struct {
|
|
ID uuid.UUID `json:"id"`
|
|
ProjectID uuid.UUID `json:"project_id"`
|
|
Slug string `json:"slug"`
|
|
Name string `json:"name"`
|
|
Description string `json:"description"`
|
|
GitRemoteURL string `json:"git_remote_url"`
|
|
DefaultBranch string `json:"default_branch"`
|
|
SyncStatus string `json:"sync_status"`
|
|
LastSyncedAt *time.Time `json:"last_synced_at"`
|
|
LastSyncError string `json:"last_sync_error"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
}
|
|
|
|
func toWorkspaceResp(w *Workspace) workspaceResp {
|
|
return workspaceResp{
|
|
ID: w.ID, ProjectID: w.ProjectID, Slug: w.Slug, Name: w.Name,
|
|
Description: w.Description, GitRemoteURL: w.GitRemoteURL, DefaultBranch: w.DefaultBranch,
|
|
SyncStatus: string(w.SyncStatus), LastSyncedAt: w.LastSyncedAt, LastSyncError: w.LastSyncError,
|
|
CreatedAt: w.CreatedAt, UpdatedAt: w.UpdatedAt,
|
|
}
|
|
}
|
|
|
|
type worktreeResp struct {
|
|
ID uuid.UUID `json:"id"`
|
|
WorkspaceID uuid.UUID `json:"workspace_id"`
|
|
Branch string `json:"branch"`
|
|
Path string `json:"path"`
|
|
Status string `json:"status"`
|
|
ActiveHolder string `json:"active_holder"`
|
|
AcquiredAt *time.Time `json:"acquired_at"`
|
|
LastUsedAt time.Time `json:"last_used_at"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
}
|
|
|
|
func toWorktreeResp(w *Worktree) worktreeResp {
|
|
return worktreeResp{
|
|
ID: w.ID, WorkspaceID: w.WorkspaceID, Branch: w.Branch, Path: w.Path,
|
|
Status: string(w.Status), ActiveHolder: w.ActiveHolder, AcquiredAt: w.AcquiredAt,
|
|
LastUsedAt: w.LastUsedAt, CreatedAt: w.CreatedAt,
|
|
}
|
|
}
|
|
|
|
type credentialResp struct {
|
|
Kind string `json:"kind"`
|
|
Username string `json:"username"`
|
|
Fingerprint string `json:"fingerprint"`
|
|
}
|
|
|
|
func toCredentialResp(c *Credential) credentialResp {
|
|
return credentialResp{Kind: string(c.Kind), Username: c.Username, Fingerprint: c.Fingerprint}
|
|
}
|
|
|
|
type fileStatusResp struct {
|
|
Path string `json:"path"`
|
|
IndexX string `json:"index_x"`
|
|
WorktreeY string `json:"worktree_y"`
|
|
}
|
|
|
|
func toFileStatusResp(f git.FileStatus) fileStatusResp {
|
|
return fileStatusResp{Path: f.Path, IndexX: string(f.IndexX), WorktreeY: string(f.WorktreeY)}
|
|
}
|
|
|
|
type commitResp struct {
|
|
SHA string `json:"sha"`
|
|
}
|