From f8bccf013527794cf3f25e3a578fc2365a19cc29 Mon Sep 17 00:00:00 2001 From: naudachu Date: Mon, 6 Nov 2023 16:46:56 +0500 Subject: [PATCH] - positive cases with create repo for a project; --- cmd/main.go | 51 +++------- discord/discord.go | 13 +-- discord/handler/handler.go | 95 +++++++++++-------- internal/controller/controller.go | 47 ++++----- internal/controller/project.go | 84 ++++++++++++++++ internal/controller/tickets_config.go | 18 +--- internal/domain/models.go | 1 + internal/storage/db/config/config.sql.go | 35 ------- internal/storage/db/config/models.go | 14 --- internal/storage/db/{config => }/db.go | 0 internal/storage/db/{tickets => }/models.go | 6 ++ .../tickets.sql.go => queries.sql.go} | 79 +++++++++++---- internal/storage/db/tickets/db.go | 32 ------- .../storage/migrate/0001_init_tickets.sql | 1 + internal/storage/migrate/0002_init_config.sql | 3 + internal/storage/sqlc.yaml | 14 +-- internal/storage/sqlc/config.sql | 8 -- .../storage/sqlc/{tickets.sql => queries.sql} | 16 +++- telegram/handler/handle_application.go | 68 ++++++------- telegram/handler/handler.go | 23 ++--- telegram/telegram.go | 5 +- 21 files changed, 307 insertions(+), 306 deletions(-) create mode 100644 internal/controller/project.go delete mode 100644 internal/storage/db/config/config.sql.go delete mode 100644 internal/storage/db/config/models.go rename internal/storage/db/{config => }/db.go (100%) rename internal/storage/db/{tickets => }/models.go (78%) rename internal/storage/db/{tickets/tickets.sql.go => queries.sql.go} (62%) delete mode 100644 internal/storage/db/tickets/db.go delete mode 100644 internal/storage/sqlc/config.sql rename internal/storage/sqlc/{tickets.sql => queries.sql} (68%) diff --git a/cmd/main.go b/cmd/main.go index 2f99e76..bd1dbd8 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -8,15 +8,14 @@ import ( "os/signal" "syscall" + "ticket-pimp/internal/controller" "ticket-pimp/internal/domain" "ticket-pimp/internal/services" "ticket-pimp/discord" "ticket-pimp/telegram" - ticketDB "ticket-pimp/internal/storage/db/tickets" - - "github.com/jackc/pgx/v5" + "github.com/jackc/pgx/v5/pgxpool" ) func main() { @@ -26,37 +25,12 @@ func main() { // test(config) } -// func test(conf domain.Config) { -// ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt, os.Kill, syscall.SIGTERM) -// defer cancel() - -// conn, err := pgxpool.New(ctx, fmt.Sprintf( -// "postgresql://%s:%s@%s:%s/%s", -// conf.DB.User, -// conf.DB.Pass, -// conf.DB.Host, -// conf.DB.Port, -// conf.DB.Name, -// )) - -// if err != nil { -// log.Fatalf("DB connection failed: %v", err) -// } - -// q := configDB.New(conn) - -// appController := controller.NewAppConfig(q) -// ticketConfig, err := appController.NewKey(ctx) -// _ = ticketConfig - -// } - func run(conf domain.Config) { ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt, os.Kill, syscall.SIGTERM) defer cancel() // -- DB connection init -- START - conn, err := pgx.Connect( + conn, err := pgxpool.New( ctx, fmt.Sprintf( "postgresql://%s:%s@%s:%s/%s", @@ -65,21 +39,24 @@ func run(conf domain.Config) { if err != nil { log.Fatalf("DB connection failed: %v", err) } - defer conn.Close(ctx) // -- DB connection init -- END - ticketsRepo := ticketDB.New(conn) gitService := services.NewGit(conf.Git) cloudService := services.NewCloud(conf.Cloud) codeService := services.NewCodaClient(conf.Coda) + // Инициализация контроллера: + controller := controller.NewWorkflowController( + gitService, + cloudService, + codeService, + conn, + ) + go func() { opts := discord.DiscordOptions{ - TicketsRepo: ticketsRepo, - GitService: gitService, - CloudService: cloudService, - Coda: codeService, - AppConfig: &conf, + Controller: controller, + AppConfig: &conf, } if err := discord.Run(conf, opts); err != nil { log.Fatalf("discord bot cannot be runned: %v", err) @@ -88,7 +65,7 @@ func run(conf domain.Config) { // go func() { opts := telegram.TelegramOptions{ - TicketsRepo: ticketsRepo, + // TicketsRepo: db, GitService: gitService, CloudService: cloudService, Coda: codeService, diff --git a/discord/discord.go b/discord/discord.go index ea96d48..459aa6a 100644 --- a/discord/discord.go +++ b/discord/discord.go @@ -6,10 +6,8 @@ import ( "os" "os/signal" "ticket-pimp/discord/handler" + "ticket-pimp/internal/controller" "ticket-pimp/internal/domain" - "ticket-pimp/internal/services" - - tickets "ticket-pimp/internal/storage/db/tickets" "github.com/bwmarrin/discordgo" ) @@ -23,11 +21,8 @@ func initBotWith(token string) (*discordgo.Session, error) { } type DiscordOptions struct { - TicketsRepo *tickets.Queries - GitService *services.Git - CloudService *services.Cloud - Coda *services.Coda - AppConfig *domain.Config + AppConfig *domain.Config + Controller *controller.WorkflowController } func Run(conf domain.Config, opts DiscordOptions) error { @@ -38,7 +33,7 @@ func Run(conf domain.Config, opts DiscordOptions) error { return err } - router := handler.InitRouter(opts.GitService) + router := handler.InitRouter(*opts.Controller) commandHandlers := map[string]func(s *discordgo.Session, i *discordgo.InteractionCreate){} for _, handler := range router.Routes { diff --git a/discord/handler/handler.go b/discord/handler/handler.go index 132e5c9..16bc927 100644 --- a/discord/handler/handler.go +++ b/discord/handler/handler.go @@ -1,29 +1,30 @@ package handler import ( + "context" "fmt" "log" + "ticket-pimp/internal/controller" "ticket-pimp/internal/domain" - "ticket-pimp/internal/services" "github.com/bwmarrin/discordgo" ) type router struct { - Routes []route - - git services.IGit + Routes []route + controller controller.WorkflowController } // Подключение роутов к Discord боту -func InitRouter(gitService services.IGit) *router { +func InitRouter(wc controller.WorkflowController) *router { + var r router r.Routes = append( r.Routes, r.CreateRepoHandler(3), r.CreateTicketHandler(3), ) - r.git = gitService + r.controller = wc return &r } @@ -64,12 +65,13 @@ func (h *router) CreateRepoHandler(repoNameMinLength int) route { Type: discordgo.ApplicationCommandOptionString, Name: "repo_name", Description: "Type the repository's name", - Required: true, + Required: false, MinLength: &repoNameMinLength, }, }, }, Handler: func(s *discordgo.Session, i *discordgo.InteractionCreate) { + var result string // Access options in the order provided by the user. options := i.ApplicationCommandData().Options @@ -81,26 +83,37 @@ func (h *router) CreateRepoHandler(repoNameMinLength int) route { var str string = "" - if option, ok := optionMap["repo_name"]; ok { - str = option.StringValue() + project, err := h.controller.GetProjectByChannelID(context.TODO(), i.ChannelID) + if err != nil { + result = fmt.Sprintf("unable to retrieve project from db, error: %v", err) + } else { + var suffix string if option, ok := optionMap["repo_type"]; ok { switch option.Value { case projectRepo: - + suffix = "" case buildRepo: - str += "-build" + suffix = "-build" } } - } - var g *domain.Git - var result string + if option, ok := optionMap["repo_name"]; ok { + str = option.StringValue() + } else { + str = project.ShortName + } - g, err := h.git.CreateRepo(str) - if err != nil { - result = fmt.Sprintf("error while repo creation: %v", err) - } else { - result = "🚀 " + g.HtmlUrl + " was created" + str = str + suffix + + var g *domain.Git + + g, err := h.controller.IGit.CreateRepo(str) + // g, err := h.git.CreateRepo(str) + if err != nil { + result = fmt.Sprintf("error while repo creation: %v", err) + } else { + result = "🚀 " + g.HtmlUrl + " was created" + } } discerr := s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ @@ -144,28 +157,32 @@ func (h *router) CreateTicketHandler(repoNameMinLength int) route { if option, ok := optionMap["project_name"]; ok { dchan, err := s.GuildChannelCreate(i.GuildID, option.StringValue(), discordgo.ChannelTypeGuildText) if err != nil { - log.Printf("chan creation problem: %v\n", err) - } + result = fmt.Sprintf("chan creation problem: %v\n", err) + } else { + p, err := h.controller.ProjectCreate(context.TODO(), domain.Project{ + ChannelID: dchan.ID, + }) + if err != nil { + result = fmt.Sprintf("unable to create project: %v\n", err) + } else { + edit := discordgo.ChannelEdit{ + Name: p.ShortName, + ParentID: "1150719794853716028", + } - // permissions := discordgo.PermissionOverwrite{ - // ID: i.User.ID, - // Type: 1, - // //Deny: 0, - // Allow: 1, - // } - edit := discordgo.ChannelEdit{ - // PermissionOverwrites: []*discordgo.PermissionOverwrite{&permissions}, // [ ] Как сделать приватный канал то??? - ParentID: "1150719794853716028", + dchan, err = s.ChannelEdit(dchan.ID, &edit) + if err != nil { + result = fmt.Sprintf("channel created, but unable to edit: %v\n", err) + + } else { + _, err = s.ChannelMessageSend(dchan.ID, "Hello!") + if err != nil { + log.Printf("message send problem: %v\n", err) + } + result = dchan.ID + } + } } - dchan, err = s.ChannelEdit(dchan.ID, &edit) - if err != nil { - log.Printf("chan editing problem: %v\n", err) - } - _, err = s.ChannelMessageSend(dchan.ID, "Hello!") - if err != nil { - log.Printf("message send problem: %v\n", err) - } - result = dchan.ID } s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ diff --git a/internal/controller/controller.go b/internal/controller/controller.go index 12c7dbb..93a86d1 100644 --- a/internal/controller/controller.go +++ b/internal/controller/controller.go @@ -8,38 +8,36 @@ import ( "sync" "ticket-pimp/internal/domain" "ticket-pimp/internal/services" - db "ticket-pimp/internal/storage/db/tickets" - "time" + "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 - db *db.Queries + 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, - db *db.Queries, + pool *pgxpool.Pool, ) *WorkflowController { return &WorkflowController{ - iGit: git, - iCloud: cloud, - iCoda: coda, - db: db, + IGit: git, + ICloud: cloud, + ICoda: coda, + pool: pool, + q: db.New(pool), } } -type IWorkflowController interface { - Workflow(name, key, id string) (string, error) -} - -func (wc *WorkflowController) Workflow(name, key, id string) (string, error) { +func (wc *WorkflowController) FullProjectInit(name, key, id string) (string, error) { appKey := fmt.Sprintf("%s-%s", key, id) @@ -53,17 +51,17 @@ func (wc *WorkflowController) Workflow(name, key, id string) (string, error) { go func(ref **domain.Git) { defer wg.Done() - *ref, _ = wc.iGit.CreateRepo(appKey) + *ref, _ = wc.IGit.CreateRepo(appKey) }(&git) go func(ref **domain.Git) { defer wg.Done() - *ref, _ = wc.iGit.CreateRepo(appKey + "-build") + *ref, _ = wc.IGit.CreateRepo(appKey + "-build") }(&gitBuild) go func(ref **domain.Folder) { defer wg.Done() - *ref, _ = wc.iCloud.CreateFolder(appKey) + *ref, _ = wc.ICloud.CreateFolder(appKey) }(&cloud) wg.Wait() @@ -89,19 +87,16 @@ func (wc *WorkflowController) Workflow(name, key, id string) (string, error) { } 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}, + 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{ + wc.ICoda.CreateApp(domain.CodaApplication{ ID: appKey, Summary: strings.TrimSpace(name), Git: gitResult, diff --git a/internal/controller/project.go b/internal/controller/project.go new file mode 100644 index 0000000..ee68bfe --- /dev/null +++ b/internal/controller/project.go @@ -0,0 +1,84 @@ +package controller + +import ( + "context" + "fmt" + "ticket-pimp/internal/domain" + "ticket-pimp/internal/storage/db" + + "github.com/jackc/pgx/v5" + "github.com/jackc/pgx/v5/pgtype" +) + +func (wc *WorkflowController) Get(ctx context.Context) (*domain.ApplicationConfig, error) { + c, err := wc.q.GetConfig(ctx) + return &domain.ApplicationConfig{ + Key: c.TicketKey.String, + ID: int(c.TicketID.Int32), + }, err +} + +func (wc *WorkflowController) NewKey(ctx context.Context) (*domain.ApplicationConfig, error) { + c, err := wc.q.SetNewConfig(ctx) + return &domain.ApplicationConfig{ + Key: c.TicketKey.String, + ID: int(c.TicketID.Int32), + }, err +} + +func (wc *WorkflowController) ProjectCreate(ctx context.Context, project domain.Project) (*domain.Project, error) { + + tx, err := wc.pool.Begin(ctx) + if err != nil { + return nil, err + } + defer tx.Rollback(ctx) + + qtx := wc.q.WithTx(tx) + + appconfig, err := qtx.SetNewConfig(ctx) + if err != nil { + return nil, err + } + + project.ShortName = fmt.Sprintf( + "%s-%d", + appconfig.TicketKey.String, + appconfig.TicketID.Int32, + ) + + project.ID = string(appconfig.TicketID.Int32) + + projectRow, err := qtx.CreateTicket(ctx, db.CreateTicketParams{ + Key: pgtype.Text{String: project.ShortName, Valid: true}, + Channelid: pgtype.Text{String: project.ChannelID, Valid: true}, + }) + if err != nil { + tx.Rollback(ctx) + return nil, err + } else { + tx.Commit(ctx) + fmt.Println(projectRow) + } + + return &project, nil +} + +func (wc *WorkflowController) GetProjectByChannelID(ctx context.Context, id string) (*domain.Project, error) { + var proj domain.Project + dbTicket, err := wc.q.GetTicketByChannelID(ctx, pgtype.Text{String: id, Valid: true}) + if err != nil { + if err == pgx.ErrNoRows { + return nil, nil + } + return nil, err + } else { + proj = domain.Project{ + ID: string(dbTicket.ID), + ShortName: dbTicket.Key.String, + Name: dbTicket.Key.String, + ChannelID: dbTicket.Channelid.String, + } + } + return &proj, nil +} diff --git a/internal/controller/tickets_config.go b/internal/controller/tickets_config.go index c37da9a..b4a5392 100644 --- a/internal/controller/tickets_config.go +++ b/internal/controller/tickets_config.go @@ -3,7 +3,7 @@ package controller import ( "context" "ticket-pimp/internal/domain" - db "ticket-pimp/internal/storage/db/config" + db "ticket-pimp/internal/storage/db" ) type IConfigController interface { @@ -20,19 +20,3 @@ func NewAppConfig(db *db.Queries) AppConfig { db: db, } } - -func (ac *AppConfig) Get(ctx context.Context) (*domain.ApplicationConfig, error) { - c, err := ac.db.GetConfig(ctx) - return &domain.ApplicationConfig{ - Key: c.TicketKey.String, - ID: int(c.TicketID.Int32), - }, err -} - -func (ac *AppConfig) NewKey(ctx context.Context) (*domain.ApplicationConfig, error) { - c, err := ac.db.SetNewConfig(ctx) - return &domain.ApplicationConfig{ - Key: c.TicketKey.String, - ID: int(c.TicketID.Int32), - }, err -} diff --git a/internal/domain/models.go b/internal/domain/models.go index 2d4aeff..96f5a99 100644 --- a/internal/domain/models.go +++ b/internal/domain/models.go @@ -86,6 +86,7 @@ type Project struct { ID string `json:"id"` ShortName string `json:"shortName"` Name string `json:"name"` + ChannelID string `json:"channel_id"` } type ProjectID struct { diff --git a/internal/storage/db/config/config.sql.go b/internal/storage/db/config/config.sql.go deleted file mode 100644 index 8a8d6b2..0000000 --- a/internal/storage/db/config/config.sql.go +++ /dev/null @@ -1,35 +0,0 @@ -// Code generated by sqlc. DO NOT EDIT. -// versions: -// sqlc v1.23.0 -// source: config.sql - -package db - -import ( - "context" -) - -const getConfig = `-- name: GetConfig :one -SELECT ticket_key, ticket_id -FROM appconfig -` - -func (q *Queries) GetConfig(ctx context.Context) (Appconfig, error) { - row := q.db.QueryRow(ctx, getConfig) - var i Appconfig - err := row.Scan(&i.TicketKey, &i.TicketID) - return i, err -} - -const setNewConfig = `-- name: SetNewConfig :one -UPDATE appconfig -SET ticket_id = ticket_id + 1 -RETURNING ticket_key, ticket_id -` - -func (q *Queries) SetNewConfig(ctx context.Context) (Appconfig, error) { - row := q.db.QueryRow(ctx, setNewConfig) - var i Appconfig - err := row.Scan(&i.TicketKey, &i.TicketID) - return i, err -} diff --git a/internal/storage/db/config/models.go b/internal/storage/db/config/models.go deleted file mode 100644 index 91729b1..0000000 --- a/internal/storage/db/config/models.go +++ /dev/null @@ -1,14 +0,0 @@ -// Code generated by sqlc. DO NOT EDIT. -// versions: -// sqlc v1.23.0 - -package db - -import ( - "github.com/jackc/pgx/v5/pgtype" -) - -type Appconfig struct { - TicketKey pgtype.Text - TicketID pgtype.Int4 -} diff --git a/internal/storage/db/config/db.go b/internal/storage/db/db.go similarity index 100% rename from internal/storage/db/config/db.go rename to internal/storage/db/db.go diff --git a/internal/storage/db/tickets/models.go b/internal/storage/db/models.go similarity index 78% rename from internal/storage/db/tickets/models.go rename to internal/storage/db/models.go index 3a16316..a8f702f 100644 --- a/internal/storage/db/tickets/models.go +++ b/internal/storage/db/models.go @@ -8,9 +8,15 @@ import ( "github.com/jackc/pgx/v5/pgtype" ) +type Appconfig struct { + TicketKey pgtype.Text + TicketID pgtype.Int4 +} + type Ticket struct { ID int32 Key pgtype.Text + Channelid pgtype.Text ProjectGit pgtype.Text BuildGit pgtype.Text Folder pgtype.Text diff --git a/internal/storage/db/tickets/tickets.sql.go b/internal/storage/db/queries.sql.go similarity index 62% rename from internal/storage/db/tickets/tickets.sql.go rename to internal/storage/db/queries.sql.go index 1776bd2..505ed37 100644 --- a/internal/storage/db/tickets/tickets.sql.go +++ b/internal/storage/db/queries.sql.go @@ -1,7 +1,7 @@ // Code generated by sqlc. DO NOT EDIT. // versions: // sqlc v1.23.0 -// source: tickets.sql +// source: queries.sql package db @@ -13,33 +13,25 @@ import ( const createTicket = `-- name: CreateTicket :one INSERT INTO tickets ( - key, project_git, build_git, folder, created_at + key, channelID ) VALUES ( - $1, $2, $3, $4, $5 + $1, $2 ) - RETURNING id, key, project_git, build_git, folder, created_at, deleted_at, updated_at + RETURNING id, key, channelid, project_git, build_git, folder, created_at, deleted_at, updated_at ` type CreateTicketParams struct { - Key pgtype.Text - ProjectGit pgtype.Text - BuildGit pgtype.Text - Folder pgtype.Text - CreatedAt pgtype.Timestamptz + Key pgtype.Text + Channelid pgtype.Text } func (q *Queries) CreateTicket(ctx context.Context, arg CreateTicketParams) (Ticket, error) { - row := q.db.QueryRow(ctx, createTicket, - arg.Key, - arg.ProjectGit, - arg.BuildGit, - arg.Folder, - arg.CreatedAt, - ) + row := q.db.QueryRow(ctx, createTicket, arg.Key, arg.Channelid) var i Ticket err := row.Scan( &i.ID, &i.Key, + &i.Channelid, &i.ProjectGit, &i.BuildGit, &i.Folder, @@ -68,8 +60,41 @@ func (q *Queries) DeleteTicketByKey(ctx context.Context, key pgtype.Text) error return err } +const getConfig = `-- name: GetConfig :one +SELECT ticket_key, ticket_id +FROM appconfig +` + +func (q *Queries) GetConfig(ctx context.Context) (Appconfig, error) { + row := q.db.QueryRow(ctx, getConfig) + var i Appconfig + err := row.Scan(&i.TicketKey, &i.TicketID) + return i, err +} + +const getTicketByChannelID = `-- name: GetTicketByChannelID :one +SELECT id, key, channelid, project_git, build_git, folder, created_at, deleted_at, updated_at FROM tickets WHERE channelID = $1 +` + +func (q *Queries) GetTicketByChannelID(ctx context.Context, channelid pgtype.Text) (Ticket, error) { + row := q.db.QueryRow(ctx, getTicketByChannelID, channelid) + var i Ticket + err := row.Scan( + &i.ID, + &i.Key, + &i.Channelid, + &i.ProjectGit, + &i.BuildGit, + &i.Folder, + &i.CreatedAt, + &i.DeletedAt, + &i.UpdatedAt, + ) + return i, err +} + const getTicketByID = `-- name: GetTicketByID :one -SELECT id, key, project_git, build_git, folder, created_at, deleted_at, updated_at FROM tickets WHERE id = $1 +SELECT id, key, channelid, project_git, build_git, folder, created_at, deleted_at, updated_at FROM tickets WHERE id = $1 ` func (q *Queries) GetTicketByID(ctx context.Context, id int32) (Ticket, error) { @@ -78,6 +103,7 @@ func (q *Queries) GetTicketByID(ctx context.Context, id int32) (Ticket, error) { err := row.Scan( &i.ID, &i.Key, + &i.Channelid, &i.ProjectGit, &i.BuildGit, &i.Folder, @@ -89,7 +115,7 @@ func (q *Queries) GetTicketByID(ctx context.Context, id int32) (Ticket, error) { } const listTickets = `-- name: ListTickets :many -SELECT id, key, project_git, build_git, folder, created_at, deleted_at, updated_at FROM tickets WHERE deleted_at IS NULL +SELECT id, key, channelid, project_git, build_git, folder, created_at, deleted_at, updated_at FROM tickets WHERE deleted_at IS NULL ` func (q *Queries) ListTickets(ctx context.Context) ([]Ticket, error) { @@ -104,6 +130,7 @@ func (q *Queries) ListTickets(ctx context.Context) ([]Ticket, error) { if err := rows.Scan( &i.ID, &i.Key, + &i.Channelid, &i.ProjectGit, &i.BuildGit, &i.Folder, @@ -122,7 +149,7 @@ func (q *Queries) ListTickets(ctx context.Context) ([]Ticket, error) { } const listTicketsWithDeleted = `-- name: ListTicketsWithDeleted :many -SELECT id, key, project_git, build_git, folder, created_at, deleted_at, updated_at FROM tickets +SELECT id, key, channelid, project_git, build_git, folder, created_at, deleted_at, updated_at FROM tickets ` func (q *Queries) ListTicketsWithDeleted(ctx context.Context) ([]Ticket, error) { @@ -137,6 +164,7 @@ func (q *Queries) ListTicketsWithDeleted(ctx context.Context) ([]Ticket, error) if err := rows.Scan( &i.ID, &i.Key, + &i.Channelid, &i.ProjectGit, &i.BuildGit, &i.Folder, @@ -154,6 +182,19 @@ func (q *Queries) ListTicketsWithDeleted(ctx context.Context) ([]Ticket, error) return items, nil } +const setNewConfig = `-- name: SetNewConfig :one +UPDATE appconfig +SET ticket_id = ticket_id + 1 +RETURNING ticket_key, ticket_id +` + +func (q *Queries) SetNewConfig(ctx context.Context) (Appconfig, error) { + row := q.db.QueryRow(ctx, setNewConfig) + var i Appconfig + err := row.Scan(&i.TicketKey, &i.TicketID) + return i, err +} + const updateTicketByID = `-- name: UpdateTicketByID :exec UPDATE tickets SET project_git = $1, build_git = $2, folder = $3 WHERE id = $4 ` diff --git a/internal/storage/db/tickets/db.go b/internal/storage/db/tickets/db.go deleted file mode 100644 index 7d918df..0000000 --- a/internal/storage/db/tickets/db.go +++ /dev/null @@ -1,32 +0,0 @@ -// Code generated by sqlc. DO NOT EDIT. -// versions: -// sqlc v1.23.0 - -package db - -import ( - "context" - - "github.com/jackc/pgx/v5" - "github.com/jackc/pgx/v5/pgconn" -) - -type DBTX interface { - Exec(context.Context, string, ...interface{}) (pgconn.CommandTag, error) - Query(context.Context, string, ...interface{}) (pgx.Rows, error) - QueryRow(context.Context, string, ...interface{}) pgx.Row -} - -func New(db DBTX) *Queries { - return &Queries{db: db} -} - -type Queries struct { - db DBTX -} - -func (q *Queries) WithTx(tx pgx.Tx) *Queries { - return &Queries{ - db: tx, - } -} diff --git a/internal/storage/migrate/0001_init_tickets.sql b/internal/storage/migrate/0001_init_tickets.sql index a44a8c8..5a67451 100644 --- a/internal/storage/migrate/0001_init_tickets.sql +++ b/internal/storage/migrate/0001_init_tickets.sql @@ -2,6 +2,7 @@ CREATE TABLE tickets ( id SERIAL PRIMARY KEY, key VARCHAR(10), + channelID VARCHAR(255), project_git VARCHAR(255), build_git VARCHAR(255), folder VARCHAR(255), diff --git a/internal/storage/migrate/0002_init_config.sql b/internal/storage/migrate/0002_init_config.sql index a4e78cc..f8dc281 100644 --- a/internal/storage/migrate/0002_init_config.sql +++ b/internal/storage/migrate/0002_init_config.sql @@ -4,5 +4,8 @@ CREATE TABLE appconfig ( ticket_id INT ); +-- +migrate Up +INSERT INTO appconfig (ticket_key, ticket_id) VALUES ('DAP', 100); + -- +migrate Down DROP TABLE appconfig; \ No newline at end of file diff --git a/internal/storage/sqlc.yaml b/internal/storage/sqlc.yaml index 74dae84..41f4594 100644 --- a/internal/storage/sqlc.yaml +++ b/internal/storage/sqlc.yaml @@ -1,18 +1,10 @@ version: "2" sql: - engine: "postgresql" - queries: "sqlc/tickets.sql" - schema: "migrate/0001_init_tickets.sql" + queries: "sqlc/queries.sql" + schema: "migrate" gen: go: package: "db" sql_package: "pgx/v5" - out: "db/tickets" - - engine: "postgresql" - queries: "sqlc/config.sql" - schema: "migrate/0002_init_config.sql" - gen: - go: - package: "db" - sql_package: "pgx/v5" - out: "db/config" \ No newline at end of file + out: "db" \ No newline at end of file diff --git a/internal/storage/sqlc/config.sql b/internal/storage/sqlc/config.sql deleted file mode 100644 index 391c651..0000000 --- a/internal/storage/sqlc/config.sql +++ /dev/null @@ -1,8 +0,0 @@ --- name: GetConfig :one -SELECT ticket_key, ticket_id -FROM appconfig; - --- name: SetNewConfig :one -UPDATE appconfig -SET ticket_id = ticket_id + 1 -RETURNING *; \ No newline at end of file diff --git a/internal/storage/sqlc/tickets.sql b/internal/storage/sqlc/queries.sql similarity index 68% rename from internal/storage/sqlc/tickets.sql rename to internal/storage/sqlc/queries.sql index dafe59d..b9911aa 100644 --- a/internal/storage/sqlc/tickets.sql +++ b/internal/storage/sqlc/queries.sql @@ -1,8 +1,17 @@ +-- name: GetConfig :one +SELECT ticket_key, ticket_id +FROM appconfig; + +-- name: SetNewConfig :one +UPDATE appconfig +SET ticket_id = ticket_id + 1 +RETURNING *; + -- name: CreateTicket :one INSERT INTO tickets ( - key, project_git, build_git, folder, created_at + key, channelID ) VALUES ( - $1, $2, $3, $4, $5 + $1, $2 ) RETURNING *; @@ -15,6 +24,9 @@ SELECT * FROM tickets; -- name: GetTicketByID :one SELECT * FROM tickets WHERE id = $1; +-- name: GetTicketByChannelID :one +SELECT * FROM tickets WHERE channelID = $1; + -- name: UpdateTicketByID :exec UPDATE tickets SET project_git = $1, build_git = $2, folder = $3 WHERE id = $4; diff --git a/telegram/handler/handle_application.go b/telegram/handler/handle_application.go index e9fb9ab..a24f673 100644 --- a/telegram/handler/handle_application.go +++ b/telegram/handler/handle_application.go @@ -1,48 +1,38 @@ package handler -import ( - "context" - "errors" - "strconv" - "strings" +// func (h *Handler) DevelopmentTaskHandler(ctx context.Context, mu *tgb.MessageUpdate) error { - "github.com/mr-linch/go-tg" - "github.com/mr-linch/go-tg/tgb" -) +// str := strings.Replace(mu.Text, "/new", "", 1) -func (h *Handler) DevelopmentTaskHandler(ctx context.Context, mu *tgb.MessageUpdate) error { +// if str == "" { +// return errors.New("empty command provided") +// } - str := strings.Replace(mu.Text, "/new", "", 1) +// issueKeyStr, err := h.workflow.Workflow(str, h.key, h.id) - if str == "" { - return errors.New("empty command provided") - } +// if err != nil { +// answer := errorAnswer(err.Error()) +// h.LogMessage(ctx, mu, answer) +// return mu.Answer(answer).ParseMode(tg.HTML).DoVoid(ctx) +// } - issueKeyStr, err := h.workflow.Workflow(str, h.key, h.id) +// i, err := strconv.Atoi(h.id) +// if err != nil { +// return errors.New("problem with conversion id to int") +// } +// h.id = strconv.Itoa(i + 1) - if err != nil { - answer := errorAnswer(err.Error()) - h.LogMessage(ctx, mu, answer) - return mu.Answer(answer).ParseMode(tg.HTML).DoVoid(ctx) - } +// answer := newTicketAnswer(issueKeyStr) +// h.LogMessage(ctx, mu, answer) +// return mu.Answer(answer).ParseMode(tg.HTML).DoVoid(ctx) +// } - i, err := strconv.Atoi(h.id) - if err != nil { - return errors.New("problem with conversion id to int") - } - h.id = strconv.Itoa(i + 1) - - answer := newTicketAnswer(issueKeyStr) - h.LogMessage(ctx, mu, answer) - return mu.Answer(answer).ParseMode(tg.HTML).DoVoid(ctx) -} - -func newTicketAnswer(name string) string { - return tg.HTML.Text( - tg.HTML.Line( - "🤘 Ticket ", - name, - " has been created!", - ), - ) -} +// func newTicketAnswer(name string) string { +// return tg.HTML.Text( +// tg.HTML.Line( +// "🤘 Ticket ", +// name, +// " has been created!", +// ), +// ) +// } diff --git a/telegram/handler/handler.go b/telegram/handler/handler.go index ab26e26..7aa7f0e 100644 --- a/telegram/handler/handler.go +++ b/telegram/handler/handler.go @@ -1,33 +1,26 @@ package handler import ( - "ticket-pimp/internal/controller" "ticket-pimp/internal/services" - tickets "ticket-pimp/internal/storage/db/tickets" ) type Handler struct { - workflow controller.IWorkflowController - git services.IGit - cloud services.ICloud - coda services.ICoda - key string - id string - db *tickets.Queries + git services.IGit + cloud services.ICloud + coda services.ICoda + key string + id string } func NewHandler( git services.IGit, cloud services.ICloud, coda services.ICoda, - db *tickets.Queries, ) *Handler { return &Handler{ - workflow: controller.NewWorkflowController(git, cloud, coda, db), - git: git, - cloud: cloud, - coda: coda, - db: db, + git: git, + cloud: cloud, + coda: coda, } } diff --git a/telegram/telegram.go b/telegram/telegram.go index 140acf8..ebc1128 100644 --- a/telegram/telegram.go +++ b/telegram/telegram.go @@ -10,7 +10,7 @@ import ( "github.com/mr-linch/go-tg" "github.com/mr-linch/go-tg/tgb" - tickets "ticket-pimp/internal/storage/db/tickets" + tickets "ticket-pimp/internal/storage/db" ) type TelegramOptions struct { @@ -35,13 +35,12 @@ func Run(ctx context.Context, opts TelegramOptions) error { opts.GitService, opts.CloudService, opts.Coda, - opts.TicketsRepo, ) router := tgb.NewRouter(). Message(h.Init, tgb.Command("init")). Message(h.PingHandler, tgb.Command("ping")). - Message(h.DevelopmentTaskHandler, tgb.TextHasPrefix("/new")). + // Message(h.DevelopmentTaskHandler, tgb.TextHasPrefix("/new")). Message(h.NewRepoHandler, tgb.TextHasPrefix("/repo")). Message(h.NewFolderHandler, tgb.TextHasPrefix("/folder")). Message(h.FarmTaskHandler, tgb.TextHasPrefix("/task"))