231 lines
8.0 KiB
Go
231 lines
8.0 KiB
Go
package controller
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
|
|
"github.com/kandev/kandev/internal/task/dto"
|
|
"github.com/kandev/kandev/internal/task/service"
|
|
)
|
|
|
|
type RepositoryController struct {
|
|
service *service.Service
|
|
}
|
|
|
|
func NewRepositoryController(svc *service.Service) *RepositoryController {
|
|
return &RepositoryController{service: svc}
|
|
}
|
|
|
|
func (c *RepositoryController) ListRepositories(ctx context.Context, req dto.ListRepositoriesRequest) (dto.ListRepositoriesResponse, error) {
|
|
repositories, err := c.service.ListRepositories(ctx, req.WorkspaceID)
|
|
if err != nil {
|
|
return dto.ListRepositoriesResponse{}, err
|
|
}
|
|
resp := dto.ListRepositoriesResponse{
|
|
Repositories: make([]dto.RepositoryDTO, 0, len(repositories)),
|
|
Total: len(repositories),
|
|
}
|
|
for _, repository := range repositories {
|
|
repoDTO := dto.FromRepository(repository)
|
|
if req.IncludeScripts {
|
|
scripts, err := c.service.ListRepositoryScripts(ctx, repository.ID)
|
|
if err == nil {
|
|
repoDTO.Scripts = make([]dto.RepositoryScriptDTO, 0, len(scripts))
|
|
for _, script := range scripts {
|
|
repoDTO.Scripts = append(repoDTO.Scripts, dto.FromRepositoryScript(script))
|
|
}
|
|
}
|
|
}
|
|
resp.Repositories = append(resp.Repositories, repoDTO)
|
|
}
|
|
return resp, nil
|
|
}
|
|
|
|
func (c *RepositoryController) GetRepository(ctx context.Context, req dto.GetRepositoryRequest) (dto.RepositoryDTO, error) {
|
|
repository, err := c.service.GetRepository(ctx, req.ID)
|
|
if err != nil {
|
|
return dto.RepositoryDTO{}, err
|
|
}
|
|
return dto.FromRepository(repository), nil
|
|
}
|
|
|
|
func (c *RepositoryController) CreateRepository(ctx context.Context, req dto.CreateRepositoryRequest) (dto.RepositoryDTO, error) {
|
|
repository, err := c.service.CreateRepository(ctx, &service.CreateRepositoryRequest{
|
|
WorkspaceID: req.WorkspaceID,
|
|
Name: req.Name,
|
|
SourceType: req.SourceType,
|
|
LocalPath: req.LocalPath,
|
|
Provider: req.Provider,
|
|
ProviderRepoID: req.ProviderRepoID,
|
|
ProviderOwner: req.ProviderOwner,
|
|
ProviderName: req.ProviderName,
|
|
DefaultBranch: req.DefaultBranch,
|
|
WorktreeBranchPrefix: req.WorktreeBranchPrefix,
|
|
PullBeforeWorktree: req.PullBeforeWorktree,
|
|
SetupScript: req.SetupScript,
|
|
CleanupScript: req.CleanupScript,
|
|
DevScript: req.DevScript,
|
|
})
|
|
if err != nil {
|
|
return dto.RepositoryDTO{}, err
|
|
}
|
|
return dto.FromRepository(repository), nil
|
|
}
|
|
|
|
func (c *RepositoryController) UpdateRepository(ctx context.Context, req dto.UpdateRepositoryRequest) (dto.RepositoryDTO, error) {
|
|
repository, err := c.service.UpdateRepository(ctx, req.ID, &service.UpdateRepositoryRequest{
|
|
Name: req.Name,
|
|
SourceType: req.SourceType,
|
|
LocalPath: req.LocalPath,
|
|
Provider: req.Provider,
|
|
ProviderRepoID: req.ProviderRepoID,
|
|
ProviderOwner: req.ProviderOwner,
|
|
ProviderName: req.ProviderName,
|
|
DefaultBranch: req.DefaultBranch,
|
|
WorktreeBranchPrefix: req.WorktreeBranchPrefix,
|
|
PullBeforeWorktree: req.PullBeforeWorktree,
|
|
SetupScript: req.SetupScript,
|
|
CleanupScript: req.CleanupScript,
|
|
DevScript: req.DevScript,
|
|
})
|
|
if err != nil {
|
|
return dto.RepositoryDTO{}, err
|
|
}
|
|
return dto.FromRepository(repository), nil
|
|
}
|
|
|
|
func (c *RepositoryController) DeleteRepository(ctx context.Context, req dto.DeleteRepositoryRequest) (dto.SuccessResponse, error) {
|
|
if err := c.service.DeleteRepository(ctx, req.ID); err != nil {
|
|
if errors.Is(err, service.ErrActiveTaskSessions) {
|
|
return dto.SuccessResponse{}, ErrActiveTaskSessions
|
|
}
|
|
return dto.SuccessResponse{}, err
|
|
}
|
|
return dto.SuccessResponse{Success: true}, nil
|
|
}
|
|
|
|
func (c *RepositoryController) ListRepositoryScripts(ctx context.Context, req dto.ListRepositoryScriptsRequest) (dto.ListRepositoryScriptsResponse, error) {
|
|
scripts, err := c.service.ListRepositoryScripts(ctx, req.RepositoryID)
|
|
if err != nil {
|
|
return dto.ListRepositoryScriptsResponse{}, err
|
|
}
|
|
resp := dto.ListRepositoryScriptsResponse{
|
|
Scripts: make([]dto.RepositoryScriptDTO, 0, len(scripts)),
|
|
Total: len(scripts),
|
|
}
|
|
for _, script := range scripts {
|
|
resp.Scripts = append(resp.Scripts, dto.FromRepositoryScript(script))
|
|
}
|
|
return resp, nil
|
|
}
|
|
|
|
func (c *RepositoryController) GetRepositoryScript(ctx context.Context, req dto.GetRepositoryScriptRequest) (dto.RepositoryScriptDTO, error) {
|
|
script, err := c.service.GetRepositoryScript(ctx, req.ID)
|
|
if err != nil {
|
|
return dto.RepositoryScriptDTO{}, err
|
|
}
|
|
return dto.FromRepositoryScript(script), nil
|
|
}
|
|
|
|
func (c *RepositoryController) CreateRepositoryScript(ctx context.Context, req dto.CreateRepositoryScriptRequest) (dto.RepositoryScriptDTO, error) {
|
|
script, err := c.service.CreateRepositoryScript(ctx, &service.CreateRepositoryScriptRequest{
|
|
RepositoryID: req.RepositoryID,
|
|
Name: req.Name,
|
|
Command: req.Command,
|
|
Position: req.Position,
|
|
})
|
|
if err != nil {
|
|
return dto.RepositoryScriptDTO{}, err
|
|
}
|
|
return dto.FromRepositoryScript(script), nil
|
|
}
|
|
|
|
func (c *RepositoryController) UpdateRepositoryScript(ctx context.Context, req dto.UpdateRepositoryScriptRequest) (dto.RepositoryScriptDTO, error) {
|
|
script, err := c.service.UpdateRepositoryScript(ctx, req.ID, &service.UpdateRepositoryScriptRequest{
|
|
Name: req.Name,
|
|
Command: req.Command,
|
|
Position: req.Position,
|
|
})
|
|
if err != nil {
|
|
return dto.RepositoryScriptDTO{}, err
|
|
}
|
|
return dto.FromRepositoryScript(script), nil
|
|
}
|
|
|
|
func (c *RepositoryController) DeleteRepositoryScript(ctx context.Context, req dto.DeleteRepositoryScriptRequest) (dto.SuccessResponse, error) {
|
|
if err := c.service.DeleteRepositoryScript(ctx, req.ID); err != nil {
|
|
return dto.SuccessResponse{}, err
|
|
}
|
|
return dto.SuccessResponse{Success: true}, nil
|
|
}
|
|
|
|
func (c *RepositoryController) ListRepositoryBranches(ctx context.Context, req dto.ListRepositoryBranchesRequest) (dto.RepositoryBranchesResponse, error) {
|
|
branches, err := c.service.ListRepositoryBranches(ctx, req.ID)
|
|
if err != nil {
|
|
return dto.RepositoryBranchesResponse{}, err
|
|
}
|
|
// Convert service.Branch to dto.BranchDTO
|
|
dtoBranches := make([]dto.BranchDTO, len(branches))
|
|
for i, branch := range branches {
|
|
dtoBranches[i] = dto.BranchDTO{
|
|
Name: branch.Name,
|
|
Type: branch.Type,
|
|
Remote: branch.Remote,
|
|
}
|
|
}
|
|
return dto.RepositoryBranchesResponse{
|
|
Branches: dtoBranches,
|
|
Total: len(dtoBranches),
|
|
}, nil
|
|
}
|
|
|
|
func (c *RepositoryController) ListLocalRepositoryBranches(ctx context.Context, req dto.ListLocalRepositoryBranchesRequest) (dto.RepositoryBranchesResponse, error) {
|
|
branches, err := c.service.ListLocalRepositoryBranches(ctx, req.Path)
|
|
if err != nil {
|
|
return dto.RepositoryBranchesResponse{}, err
|
|
}
|
|
dtoBranches := make([]dto.BranchDTO, len(branches))
|
|
for i, branch := range branches {
|
|
dtoBranches[i] = dto.BranchDTO{
|
|
Name: branch.Name,
|
|
Type: branch.Type,
|
|
Remote: branch.Remote,
|
|
}
|
|
}
|
|
return dto.RepositoryBranchesResponse{
|
|
Branches: dtoBranches,
|
|
Total: len(dtoBranches),
|
|
}, nil
|
|
}
|
|
|
|
func (c *RepositoryController) DiscoverRepositories(ctx context.Context, req dto.DiscoverRepositoriesRequest) (dto.RepositoryDiscoveryResponse, error) {
|
|
result, err := c.service.DiscoverLocalRepositories(ctx, req.Root)
|
|
if err != nil {
|
|
return dto.RepositoryDiscoveryResponse{}, err
|
|
}
|
|
resp := dto.RepositoryDiscoveryResponse{
|
|
Roots: result.Roots,
|
|
Repositories: make([]dto.LocalRepositoryDTO, 0, len(result.Repositories)),
|
|
Total: len(result.Repositories),
|
|
}
|
|
for _, repo := range result.Repositories {
|
|
resp.Repositories = append(resp.Repositories, dto.FromLocalRepository(repo))
|
|
}
|
|
return resp, nil
|
|
}
|
|
|
|
func (c *RepositoryController) ValidateRepositoryPath(ctx context.Context, req dto.ValidateRepositoryPathRequest) (dto.RepositoryPathValidationResponse, error) {
|
|
result, err := c.service.ValidateLocalRepositoryPath(ctx, req.Path)
|
|
if err != nil {
|
|
return dto.RepositoryPathValidationResponse{}, err
|
|
}
|
|
return dto.RepositoryPathValidationResponse{
|
|
Path: result.Path,
|
|
Exists: result.Exists,
|
|
IsGitRepo: result.IsGitRepo,
|
|
Allowed: result.Allowed,
|
|
DefaultBranch: result.DefaultBranch,
|
|
Message: result.Message,
|
|
}, nil
|
|
}
|