forget to commit main.go
This commit is contained in:
parent
fd1c8fc894
commit
1f39c283c5
149
cmd/main.go
149
cmd/main.go
|
|
@ -2,16 +2,12 @@ package main
|
|||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"log"
|
||||
"os"
|
||||
"os/signal"
|
||||
"strings"
|
||||
"sync"
|
||||
"syscall"
|
||||
|
||||
"ticket-creator/ext"
|
||||
"ticket-creator/handler"
|
||||
|
||||
"github.com/joho/godotenv"
|
||||
"github.com/mr-linch/go-tg"
|
||||
|
|
@ -39,153 +35,16 @@ func env(envFilePath string) {
|
|||
}
|
||||
}
|
||||
|
||||
func errorAnswer(errorMsg string) string {
|
||||
return tg.HTML.Text(
|
||||
tg.HTML.Line(
|
||||
tg.HTML.Italic(errorMsg),
|
||||
),
|
||||
)
|
||||
}
|
||||
|
||||
func run(ctx context.Context) error {
|
||||
client := tg.New(os.Getenv("TG_API"))
|
||||
|
||||
router := tgb.NewRouter().
|
||||
Message(newTicketHandler, tgb.TextHasPrefix("/new")).
|
||||
Message(pingHandler, tgb.Command("ping")).
|
||||
Message(newRepoHandler, tgb.TextHasPrefix("/repo"))
|
||||
Message(handler.NewTicketHandler, tgb.TextHasPrefix("/new")).
|
||||
Message(handler.PingHandler, tgb.Command("ping")).
|
||||
Message(handler.NewRepoHandler, tgb.TextHasPrefix("/repo"))
|
||||
|
||||
return tgb.NewPoller(
|
||||
router,
|
||||
client,
|
||||
).Run(ctx)
|
||||
}
|
||||
|
||||
func newTicketHandler(ctx context.Context, mu *tgb.MessageUpdate) error {
|
||||
|
||||
str := strings.Replace(mu.Text, "/new", "", 1)
|
||||
if str == "" {
|
||||
return errors.New("empty command provided")
|
||||
}
|
||||
issueKeyStr, err := workflow(str)
|
||||
if err != nil {
|
||||
return mu.Answer(errorAnswer(err.Error())).ParseMode(tg.HTML).DoVoid(ctx)
|
||||
}
|
||||
|
||||
return mu.Answer(newTicketAnswer(issueKeyStr)).ParseMode(tg.HTML).DoVoid(ctx)
|
||||
}
|
||||
|
||||
func newTicketAnswer(name string) string {
|
||||
return tg.HTML.Text(
|
||||
tg.HTML.Line(
|
||||
"🤘 Ticket ",
|
||||
tg.HTML.Link(name, fmt.Sprintf("https://marlerino.youtrack.cloud/issue/%s", name)),
|
||||
"has been created!",
|
||||
),
|
||||
)
|
||||
}
|
||||
|
||||
func newRepoHandler(ctx context.Context, mu *tgb.MessageUpdate) error {
|
||||
|
||||
str := strings.Replace(mu.Text, "/repo", "", 1)
|
||||
str = strings.TrimSpace(str)
|
||||
str = strings.Replace(str, " ", "-", -1)
|
||||
|
||||
if str == "" {
|
||||
return errors.New("empty command provided")
|
||||
}
|
||||
|
||||
repoStr, err := createRepo(str, 0)
|
||||
|
||||
if err != nil {
|
||||
return mu.Answer(errorAnswer(err.Error())).ParseMode(tg.HTML).DoVoid(ctx)
|
||||
}
|
||||
|
||||
return mu.Answer(newRepoAnswer(repoStr)).ParseMode(tg.HTML).DoVoid(ctx)
|
||||
}
|
||||
|
||||
func newRepoAnswer(name string) string {
|
||||
return tg.HTML.Text(
|
||||
tg.HTML.Line(
|
||||
"Repo ",
|
||||
name,
|
||||
"has been created!",
|
||||
),
|
||||
)
|
||||
}
|
||||
|
||||
func pingHandler(ctx context.Context, mu *tgb.MessageUpdate) error {
|
||||
return mu.Answer("pong").DoVoid(ctx)
|
||||
}
|
||||
|
||||
func workflow(name string) (string, error) {
|
||||
yt := ext.NewYT(os.Getenv("YT_URL"), os.Getenv("YT_TOKEN"))
|
||||
|
||||
projects, err := yt.GetProjects()
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
issue, err := yt.CreateIssue(projects[1].ID, name)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
if issue != nil {
|
||||
var (
|
||||
wg sync.WaitGroup
|
||||
git, gitBuild, folder string
|
||||
)
|
||||
|
||||
wg.Add(3)
|
||||
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
git, _ = createRepo(issue.Key, 0)
|
||||
}()
|
||||
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
gitBuild, _ = createRepo(issue.Key+"-build", 1)
|
||||
}()
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
folder = createFolder(issue.Key + " - " + issue.Summary)
|
||||
}()
|
||||
|
||||
wg.Wait()
|
||||
|
||||
yt.UpdateIssue(issue, folder, git, gitBuild)
|
||||
}
|
||||
return issue.Key, nil
|
||||
}
|
||||
|
||||
func createRepo(name string, param uint) (string, error) {
|
||||
gb := ext.NewGitBucket(os.Getenv("GIT_BASE_URL"), os.Getenv("GIT_TOKEN"))
|
||||
repo, err := gb.NewRepo(name)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
// Result string formatting:
|
||||
if repo != nil {
|
||||
switch param {
|
||||
case 0:
|
||||
return repo.HtmlUrl, nil
|
||||
case 1:
|
||||
return fmt.Sprintf("ssh://%s/%s.git", repo.SshUrl, repo.FullName), nil
|
||||
default:
|
||||
return repo.CloneUrl, nil
|
||||
}
|
||||
}
|
||||
|
||||
return "", err
|
||||
}
|
||||
|
||||
func createFolder(name string) string {
|
||||
oc := ext.NewCloud(os.Getenv("CLOUD_BASE_URL"), os.Getenv("CLOUD_USER"), os.Getenv("CLOUD_PASS"))
|
||||
cloud, _ := oc.CreateFolder(name)
|
||||
if cloud != nil {
|
||||
return cloud.FolderPath
|
||||
}
|
||||
return "no-folder"
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue