110 lines
2.0 KiB
Go
110 lines
2.0 KiB
Go
package controller
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"log"
|
|
"strings"
|
|
"sync"
|
|
"ticket-pimp/internal/domain"
|
|
"ticket-pimp/internal/services"
|
|
"ticket-pimp/internal/storage/db"
|
|
|
|
"github.com/jackc/pgx/v5/pgtype"
|
|
"github.com/jackc/pgx/v5/pgxpool"
|
|
)
|
|
|
|
type WorkflowController struct {
|
|
IGit services.IGit
|
|
ICloud services.ICloud
|
|
ICoda services.ICoda
|
|
pool *pgxpool.Pool
|
|
q *db.Queries
|
|
}
|
|
|
|
func NewWorkflowController(
|
|
git services.IGit,
|
|
cloud services.ICloud,
|
|
coda services.ICoda,
|
|
pool *pgxpool.Pool,
|
|
) *WorkflowController {
|
|
return &WorkflowController{
|
|
IGit: git,
|
|
ICloud: cloud,
|
|
ICoda: coda,
|
|
pool: pool,
|
|
q: db.New(pool),
|
|
}
|
|
}
|
|
|
|
func (wc *WorkflowController) FullProjectInit(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).Folder
|
|
}(&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.q.CreateTicket(ctx, db.CreateTicketParams{
|
|
Key: pgtype.Text{String: appKey, Valid: true},
|
|
Channelid: pgtype.Text{},
|
|
})
|
|
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
|
|
}
|