package controller import ( "context" "fmt" "log" "strings" "sync" "ticket-pimp/internal/domain" "ticket-pimp/internal/services" db "ticket-pimp/internal/storage/db/tickets" "time" "github.com/jackc/pgx/v5/pgtype" ) type WorkflowController struct { iGit services.IGit iCloud services.ICloud iCoda services.ICoda db *db.Queries } func NewWorkflowController( git services.IGit, cloud services.ICloud, coda services.ICoda, db *db.Queries, ) *WorkflowController { return &WorkflowController{ iGit: git, iCloud: cloud, iCoda: coda, db: db, } } type IWorkflowController interface { Workflow(name, key, id string) (string, error) } func (wc *WorkflowController) Workflow(name, key, id string) (string, error) { appKey := fmt.Sprintf("%s-%s", key, id) var ( git, gitBuild *domain.Git cloud *domain.Folder ) var wg sync.WaitGroup wg.Add(3) go func(ref **domain.Git) { defer wg.Done() *ref, _ = wc.iGit.CreateRepo(appKey) }(&git) go func(ref **domain.Git) { defer wg.Done() *ref, _ = wc.iGit.CreateRepo(appKey + "-build") }(&gitBuild) go func(ref **domain.Folder) { defer wg.Done() *ref, _ = wc.iCloud.CreateFolder(appKey) }(&cloud) wg.Wait() var gitResult, gitBuildResult, cloudResult string if git == nil { gitResult = "cannot create git" } else { gitResult = git.HtmlUrl } if gitBuild == nil { gitBuildResult = "cannot create git" } else { gitBuildResult = fmt.Sprintf("ssh://%s/%s.git", gitBuild.SshUrl, gitBuild.FullName) } if cloud == nil { cloudResult = "cannot create folder" } else { cloudResult = cloud.PrivateURL } ctx := context.TODO() insertedTicket, err := wc.db.CreateTicket(ctx, db.CreateTicketParams{ Key: pgtype.Text{String: appKey, Valid: true}, ProjectGit: pgtype.Text{String: gitResult, Valid: true}, BuildGit: pgtype.Text{String: gitBuildResult, Valid: true}, Folder: pgtype.Text{String: cloudResult, Valid: true}, CreatedAt: pgtype.Timestamptz{Time: time.Now(), InfinityModifier: 0, Valid: true}, }) if err != nil { log.Fatal(err) } log.Print(insertedTicket) wc.iCoda.CreateApp(domain.CodaApplication{ ID: appKey, Summary: strings.TrimSpace(name), Git: gitResult, GitBuild: gitBuildResult, Folder: cloudResult, }) return appKey, nil }