diff --git a/client/discord/discord.go b/client/discord/discord.go index c009d6e..1109b3e 100644 --- a/client/discord/discord.go +++ b/client/discord/discord.go @@ -59,6 +59,22 @@ func Run(conf domain.Config, opts DiscordOptions) error { return fmt.Errorf("cannot open the session: %v", err) } + // UPDATE FORUM IF NEEDED: + + forum, err := session.Channel(os.Getenv("TASKS_CHANNEL")) + if err != nil { + log.Print(err) + } + + forum, err = session.ChannelEditComplex(forum.ID, &discordgo.ChannelEdit{ + AvailableTags: &router.Tags, + }) + if err != nil { + log.Fatal(err) + } else { + + } + log.Println("Adding commands...") var cmds []*discordgo.ApplicationCommand var logString []string @@ -73,6 +89,7 @@ func Run(conf domain.Config, opts DiscordOptions) error { log.Println("Following commands added:") log.Println(logString) + defer session.Close() stop := make(chan os.Signal, 1) signal.Notify(stop, os.Interrupt) @@ -86,6 +103,5 @@ func Run(conf domain.Config, opts DiscordOptions) error { log.Panicf("Cannot delete '%v' command: %v", h.Name, err) } } - return nil } diff --git a/client/discord/handler/handle_external_task.go b/client/discord/handler/handle_external_task.go index 6210143..61a1c99 100644 --- a/client/discord/handler/handle_external_task.go +++ b/client/discord/handler/handle_external_task.go @@ -6,6 +6,34 @@ import ( "github.com/bwmarrin/discordgo" ) +func (h *router) setFlag(s *discordgo.Session, i *discordgo.InteractionCreate, tag *discordgo.ForumTag) error { + + th, err := s.Channel(i.ChannelID) + if err != nil { + return err + } + + forum, err := s.Channel(th.ParentID) + if err != nil { + return err + } + + // Проверка на существование тега в списке тегов: + if len(forum.AvailableTags) != 0 { + for _, some := range forum.AvailableTags { + if some.Name == tag.Name { + log.Print(tag.Name) + thE, err := s.ChannelEditComplex(i.ChannelID, &discordgo.ChannelEdit{ + AppliedTags: &[]string{some.ID}, + }) + _, _ = thE, err + } + } + } + + return nil +} + func (h *router) CreateExternalTask() CommandRoute { return CommandRoute{ @@ -38,9 +66,20 @@ func (h *router) StartTask() ComponentRoute { return ComponentRoute{ Handler: func(s *discordgo.Session, i *discordgo.InteractionCreate) { - h.controller.UpdateTask(i.Message.ID, 0) + user := i.Member.User.Mention() + + convertable, err := h.controller.UpdateTask(i.Message.ID, 0, user) + if err != nil { + + } + + newContent := convertable.ExtractDomain().StartedMessage() + if err != nil { + newContent += "\n `In progress` action produced with error:" + err.Error() + } newMsg := discordgo.MessageEdit{ + Content: &newContent, Channel: i.ChannelID, ID: i.Message.ID, Components: []discordgo.MessageComponent{ @@ -57,13 +96,12 @@ func (h *router) StartTask() ComponentRoute { }, } - editedM, err := s.ChannelMessageEditComplex(&newMsg) + h.setFlag(s, i, &h.Tags[0]) + + _, err = s.ChannelMessageEditComplex(&newMsg) if err != nil { log.Println("edition NOT complete, ", err) } - - log.Print(editedM) - }, } } @@ -72,20 +110,28 @@ func (h *router) CloseTask() ComponentRoute { return ComponentRoute{ Handler: func(s *discordgo.Session, i *discordgo.InteractionCreate) { - h.controller.UpdateTask(i.Message.ID, 1) + user := i.Member.User.Mention() + convertable, err := h.controller.UpdateTask(i.Message.ID, 1, user) + + newContent := convertable.ExtractDomain().ClosedMessage() + if err != nil { + newContent += "\n `Close` action produced with error:" + err.Error() + } newMsg := discordgo.MessageEdit{ + Content: &newContent, Channel: i.ChannelID, ID: i.Message.ID, Components: []discordgo.MessageComponent{}, } - editedM, err := s.ChannelMessageEditComplex(&newMsg) + msgE, err := s.ChannelMessageEditComplex(&newMsg) if err != nil { log.Println("edition NOT complete, ", err) } - log.Print(editedM) + _ = msgE + h.setFlag(s, i, &h.Tags[1]) }, } diff --git a/client/discord/handler/handle_ping.go b/client/discord/handler/handle_ping.go index 833d11c..1faa7d4 100644 --- a/client/discord/handler/handle_ping.go +++ b/client/discord/handler/handle_ping.go @@ -13,13 +13,19 @@ func (h *router) Ping() CommandRoute { Description: "pongs in a reply", }, Handler: func(s *discordgo.Session, i *discordgo.InteractionCreate) { - log.Println("ok, I'm here..") err := s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ Type: discordgo.InteractionResponseChannelMessageWithSource, Data: &discordgo.InteractionResponseData{ - Content: "`pong`", - Title: "Pong reply", + TTS: false, + Content: "Pong to: " + i.Member.User.Mention(), + Components: []discordgo.MessageComponent{}, + Embeds: []*discordgo.MessageEmbed{}, + Files: []*discordgo.File{}, + Flags: 0, + Choices: []*discordgo.ApplicationCommandOptionChoice{}, + CustomID: "", + Title: "", }, }) if err != nil { diff --git a/client/discord/handler/handler.go b/client/discord/handler/handler.go index d6ddaf9..d6b2266 100644 --- a/client/discord/handler/handler.go +++ b/client/discord/handler/handler.go @@ -11,6 +11,8 @@ import ( type router struct { Commands []CommandRoute Components []ComponentRoute + Tags []discordgo.ForumTag + controller controller.WorkflowController conf *domain.DiscordConfig } @@ -22,7 +24,7 @@ func InitRouter(wc controller.WorkflowController, conf *domain.DiscordConfig) *r r.Commands = append(r.Commands, // r.CreateRepoHandler(3), // r.CreateFolderHandler(3), - // r.Ping(), + r.Ping(), // r.CreateTicketHandler(3), // r.InitProjectFromChannel(3), // r.GetInfo(), @@ -34,6 +36,19 @@ func InitRouter(wc controller.WorkflowController, conf *domain.DiscordConfig) *r ) r.controller = wc r.conf = conf + r.Tags = append( + r.Tags, + discordgo.ForumTag{ + Name: "В работе", + Moderated: true, + EmojiName: "👩‍🍳", + }, + + discordgo.ForumTag{ + Name: "Готово", + Moderated: true, + EmojiName: "✅", + }) return &r } diff --git a/client/telegram/handler/handle_farmtask.go b/client/telegram/handler/handle_farmtask.go index 1c55a21..8274ec9 100644 --- a/client/telegram/handler/handle_farmtask.go +++ b/client/telegram/handler/handle_farmtask.go @@ -2,6 +2,7 @@ package handler import ( "context" + "strconv" "strings" "ticket-pimp/internal/domain" @@ -11,9 +12,17 @@ import ( func (h *Handler) FarmTaskHandler(ctx context.Context, mu *tgb.MessageUpdate) error { - msgID := mu.Message.ID + var ( + taskText string = "" + answer string = "" + ) - taskText := strings.TrimSpace(strings.Replace(mu.Text, "/task", "", 1)) + msgID := mu.Message.ID + if mu.Caption != "" { + taskText = strings.TrimSpace(strings.Replace(mu.Caption, "/task", "", 1)) + } else { + taskText = strings.TrimSpace(strings.Replace(mu.Text, "/task", "", 1)) + } var summaryTail string @@ -36,42 +45,35 @@ func (h *Handler) FarmTaskHandler(ctx context.Context, mu *tgb.MessageUpdate) er mu.Chat.ID.PeerID(), ) - err := h.controller.InitTask(t) + conv, err := h.controller.InitTask(t) - // Coda.io was deprecated! - - // id, err := h.coda.CreateTask(t.Summary, t.Description, t.Creator, t.CreatorLink) - // if err != nil { - // answer := errorAnswer(err.Error()) - // h.LogMessage(ctx, mu, answer) - // return mu.Answer(answer).ParseMode(tg.HTML).DoVoid(ctx) - // } - // if id == "" { - // answer := errorAnswer("task wasn't created") - // h.LogMessage(ctx, mu, answer) - // return mu.Answer(answer).ParseMode(tg.HTML).DoVoid(ctx) - // } - - // err = mu.Answer(fmt.Sprintf("Задача с id: %s была создана, жду ссылку", id)).DoVoid(ctx) - // if err != nil { - // log.Println("бот не смог ответить про создание задачи") - // } - - // url, err := h.coda.GetRowLink(id) if err != nil { answer := err.Error() h.LogMessage(ctx, mu, answer) return err } - // t.URL = url - // answer := tg.HTML.Text( - // tg.HTML.Line(tg.HTML.Link("🤘 Задача", t.URL), "была создана!")) - // h.LogMessage(ctx, mu, answer) - // return mu.Answer(answer). - // ReplyToMessageID(msgID).ParseMode(tg.HTML).DisableWebPagePreview(true).DoVoid(ctx) - answer := tg.HTML.Text( - tg.HTML.Line("🤘 Задача была создана!")) + i := strconv.Itoa(int(conv.ID)) + answer = tg.HTML.Text( + tg.HTML.Line( + tg.HTML.Bold("Task ID: "), + tg.HTML.Code(i), + tg.HTML.Text(" was created"), + ), + ) + if mu.Caption != "" { + answer = tg.HTML.Text( + tg.HTML.Line( + tg.HTML.Bold("I'm unable to work with files, but"), + ), + tg.HTML.Line( + tg.HTML.Bold("Task ID: "), + tg.HTML.Code(i), + tg.HTML.Text(" was created"), + ), + ) + } + h.LogMessage(ctx, mu, answer) return mu.Answer(answer). ReplyToMessageID(msgID).ParseMode(tg.HTML).DisableWebPagePreview(true).DoVoid(ctx) diff --git a/internal/controller/control_task.go b/internal/controller/control_task.go index 305bc2b..032537d 100644 --- a/internal/controller/control_task.go +++ b/internal/controller/control_task.go @@ -3,8 +3,8 @@ package controller import ( "context" "fmt" - "log" "os" + "strconv" "ticket-pimp/internal/domain" "ticket-pimp/internal/storage/db" "time" @@ -13,23 +13,9 @@ import ( "github.com/jackc/pgx/v5/pgtype" ) -func (wc *WorkflowController) InitTask(t *domain.Task) error { - var ( - token = os.Getenv("DISCORD_TOKEN") - channel = os.Getenv("TASKS_CHANNEL") - ) - discord, err := discordgo.New("Bot " + token) - if err != nil { - log.Fatalf("unable to create discord session: %v", err) - // [ ] Что делать, если не получилось создать задачу? - } +func (wc *WorkflowController) InitTask(t *domain.Task) (*domain.Task, error) { - if err := discord.Open(); err != nil { - // [ ] Что делать, если не получилось создать задачу? - log.Printf("cannot open the session: %v", err) - } - - // dbtask, err := wc.q.InsertTask(context.TODO(), pgtype.Text{String: st.ID, Valid: true}) + // Записываем в базу созданную задачу ------------------------------------------ dbtask, err := wc.q.InsertTask(context.TODO(), db.InsertTaskParams{ Creator: pgtype.Text{String: t.Creator, Valid: true}, CreatorLink: pgtype.Text{ @@ -42,18 +28,32 @@ func (wc *WorkflowController) InitTask(t *domain.Task) error { }, }) if err != nil { - log.Println("unable to insert task") + return nil, fmt.Errorf("unable to create task at the db: %v", err) } + // ------------------------------------------------------------------------------------ - content := fmt.Sprintf( - "## TaskID: %d\nCreated by: %s\n\n%s", - dbtask.ID, - t.Creator, - t.Description, + task := newConvertable(&dbtask).ExtractDomain() + + // Инициализируем новый клиент дискорда + // [ ] Нездоровое получение параметров клиента из os.. + var ( + token = os.Getenv("DISCORD_TOKEN") + forumChannelID = os.Getenv("TASKS_CHANNEL") ) + s, err := discordgo.New("Bot " + token) + if err != nil { + return task, fmt.Errorf("unable to create discord session: %v", err) + // [ ] Что делать, если не получилось создать задачу? + } + + if err := s.Open(); err != nil { + return task, fmt.Errorf("cannot open the session: %v", err) + // [ ] Что делать, если не получилось создать задачу? + } + msg := discordgo.MessageSend{ - Content: content, + Content: task.NotStartedMessage(), Components: []discordgo.MessageComponent{ discordgo.ActionsRow{ Components: []discordgo.MessageComponent{ @@ -74,28 +74,50 @@ func (wc *WorkflowController) InitTask(t *domain.Task) error { }, } - st, err := discord.ChannelMessageSendComplex(channel, &msg) + th, err := s.ForumThreadStartComplex( + forumChannelID, + &discordgo.ThreadStart{ + Name: "Task ID:" + strconv.Itoa(int(task.ID)), + }, + &msg, + ) if err != nil { - log.Println("unable to send task message") + return task, fmt.Errorf("unable to update channel: %v", err) } - _ = dbtask - _ = st - return err + err = wc.q.UpdateTaskWithMessageID(context.TODO(), db.UpdateTaskWithMessageIDParams{ + Messageid: pgtype.Text{String: th.ID, Valid: true}, + ID: dbtask.ID, + }) + if err != nil { + return task, fmt.Errorf("unable to set discord message to task: %v", err) + } + return task, nil } -func (wc *WorkflowController) UpdateTask(id string, opt int) { +func (wc *WorkflowController) UpdateTask(id string, opt int, user string) (*TaskConvertable, error) { + var ( + err error + dbtask db.Task + ) switch opt { case 0: - wc.q.StartTask(context.TODO(), db.StartTaskParams{ - StartedAt: pgtype.Timestamptz{Time: time.Now(), InfinityModifier: 0, Valid: true}, + dbtask, err = wc.q.StartTask(context.TODO(), db.StartTaskParams{ + UpdatedAt: pgtype.Timestamptz{Time: time.Now(), InfinityModifier: 0, Valid: true}, + Assignee: pgtype.Text{String: user, Valid: true}, Messageid: pgtype.Text{String: id, Valid: true}, }) + return &TaskConvertable{&dbtask}, err + case 1: - wc.q.CloseTask(context.TODO(), db.CloseTaskParams{ - ClosedAt: pgtype.Timestamptz{Time: time.Now(), InfinityModifier: 0, Valid: true}, + dbtask, err = wc.q.CloseTask(context.TODO(), db.CloseTaskParams{ + DeletedAt: pgtype.Timestamptz{Time: time.Now(), InfinityModifier: 0, Valid: true}, + Assignee: pgtype.Text{String: user, Valid: true}, Messageid: pgtype.Text{String: id, Valid: true}, }) + return &TaskConvertable{&dbtask}, err } + + return &TaskConvertable{&dbtask}, nil } diff --git a/internal/controller/controller.go b/internal/controller/controller.go index c65d97d..ecea95d 100644 --- a/internal/controller/controller.go +++ b/internal/controller/controller.go @@ -5,6 +5,7 @@ import ( "ticket-pimp/internal/services" "ticket-pimp/internal/storage/db" + "github.com/bwmarrin/discordgo" "github.com/jackc/pgx/v5/pgxpool" ) @@ -14,6 +15,7 @@ type WorkflowController struct { ICoda services.ICoda pool *pgxpool.Pool q *db.Queries + ATags []discordgo.ForumTag } func NewWorkflowController( @@ -35,3 +37,28 @@ type ProjectResponse struct { Project *domain.Project Message error } + +type TaskConvertable struct { + *db.Task +} + +func newConvertable(db *db.Task) *TaskConvertable { + return &TaskConvertable{ + Task: db, + } +} + +func (t *TaskConvertable) ExtractDomain() *domain.Task { + return &domain.Task{ + ID: t.ID, + // Summary: "", + Description: t.Description.String, + Creator: t.Creator.String, + CreatorLink: t.CreatorLink.String, + Assignee: t.Assignee.String, + CreatedAt: t.CreatedAt.Time, + DeletedAt: t.DeletedAt.Time, + UpdatedAt: t.UpdatedAt.Time, + // URL: "", + } +} diff --git a/internal/domain/models.go b/internal/domain/models.go index fa222a8..5cc59e1 100644 --- a/internal/domain/models.go +++ b/internal/domain/models.go @@ -1,6 +1,9 @@ package domain -import "fmt" +import ( + "fmt" + "time" +) type Folder struct { Title string // k @@ -51,14 +54,55 @@ func (r *Row) NewCell(col string, value string) *Row { } type Task struct { + ID int32 Summary string Description string Creator string CreatorLink string + Assignee string + + CreatedAt time.Time + DeletedAt time.Time + UpdatedAt time.Time + URL string } +func (t *Task) NotStartedMessage() string { + + return fmt.Sprintf( + "## TaskID: %d\nCreated by: %s\n>>> %s\n", + t.ID, + t.Creator, + t.Description, + ) +} + +func (t *Task) StartedMessage() string { + + return fmt.Sprintf( + "## TaskID: %d\nCreated by: %s\n Assignee: %s\n🚀 Started at: %s\n>>> %s\n", + t.ID, + t.Creator, + t.Assignee, + t.UpdatedAt, + t.Description, + ) +} + +func (t *Task) ClosedMessage() string { + + return fmt.Sprintf( + "## TaskID: %d\nCreated by: %s\n Assignee: %s\n✅ Closed at: %s\n>>> %s\n", + t.ID, + t.Creator, + t.Assignee, + t.DeletedAt, + t.Description, + ) +} + func NewTask(summ, desc, c, cLink string) *Task { return &Task{ Summary: summ, diff --git a/internal/storage/db/models.go b/internal/storage/db/models.go index 290ff56..6af8f66 100644 --- a/internal/storage/db/models.go +++ b/internal/storage/db/models.go @@ -19,8 +19,7 @@ type Task struct { CreatorLink pgtype.Text Messageid pgtype.Text Description pgtype.Text - StartedAt pgtype.Timestamptz - ClosedAt pgtype.Timestamptz + Assignee pgtype.Text CreatedAt pgtype.Timestamptz DeletedAt pgtype.Timestamptz UpdatedAt pgtype.Timestamptz diff --git a/internal/storage/db/queries.sql.go b/internal/storage/db/queries.sql.go index eaabec2..13685a7 100644 --- a/internal/storage/db/queries.sql.go +++ b/internal/storage/db/queries.sql.go @@ -13,18 +13,19 @@ import ( const closeTask = `-- name: CloseTask :one UPDATE tasks -SET closed_at = $1 -WHERE messageID = $2 -RETURNING id, creator, creator_link, messageid, description, started_at, closed_at, created_at, deleted_at, updated_at +SET deleted_at = $1, assignee = $2 +WHERE messageID = $3 +RETURNING id, creator, creator_link, messageid, description, assignee, created_at, deleted_at, updated_at ` type CloseTaskParams struct { - ClosedAt pgtype.Timestamptz + DeletedAt pgtype.Timestamptz + Assignee pgtype.Text Messageid pgtype.Text } func (q *Queries) CloseTask(ctx context.Context, arg CloseTaskParams) (Task, error) { - row := q.db.QueryRow(ctx, closeTask, arg.ClosedAt, arg.Messageid) + row := q.db.QueryRow(ctx, closeTask, arg.DeletedAt, arg.Assignee, arg.Messageid) var i Task err := row.Scan( &i.ID, @@ -32,8 +33,7 @@ func (q *Queries) CloseTask(ctx context.Context, arg CloseTaskParams) (Task, err &i.CreatorLink, &i.Messageid, &i.Description, - &i.StartedAt, - &i.ClosedAt, + &i.Assignee, &i.CreatedAt, &i.DeletedAt, &i.UpdatedAt, @@ -102,6 +102,48 @@ func (q *Queries) GetConfig(ctx context.Context) (Appconfig, error) { return i, err } +const getTaskByID = `-- name: GetTaskByID :one +SELECT id, creator, creator_link, messageid, description, assignee, created_at, deleted_at, updated_at FROM tasks WHERE id = $1 +` + +func (q *Queries) GetTaskByID(ctx context.Context, id int32) (Task, error) { + row := q.db.QueryRow(ctx, getTaskByID, id) + var i Task + err := row.Scan( + &i.ID, + &i.Creator, + &i.CreatorLink, + &i.Messageid, + &i.Description, + &i.Assignee, + &i.CreatedAt, + &i.DeletedAt, + &i.UpdatedAt, + ) + return i, err +} + +const getTaskByMessage = `-- name: GetTaskByMessage :one +SELECT id, creator, creator_link, messageid, description, assignee, created_at, deleted_at, updated_at FROM tasks WHERE messageID = $1 +` + +func (q *Queries) GetTaskByMessage(ctx context.Context, messageid pgtype.Text) (Task, error) { + row := q.db.QueryRow(ctx, getTaskByMessage, messageid) + var i Task + err := row.Scan( + &i.ID, + &i.Creator, + &i.CreatorLink, + &i.Messageid, + &i.Description, + &i.Assignee, + &i.CreatedAt, + &i.DeletedAt, + &i.UpdatedAt, + ) + 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 ` @@ -150,7 +192,7 @@ INSERT INTO tasks ( ) VALUES ( $1, $2, $3 ) - RETURNING id, creator, creator_link, messageid, description, started_at, closed_at, created_at, deleted_at, updated_at + RETURNING id, creator, creator_link, messageid, description, assignee, created_at, deleted_at, updated_at ` type InsertTaskParams struct { @@ -168,8 +210,7 @@ func (q *Queries) InsertTask(ctx context.Context, arg InsertTaskParams) (Task, e &i.CreatorLink, &i.Messageid, &i.Description, - &i.StartedAt, - &i.ClosedAt, + &i.Assignee, &i.CreatedAt, &i.DeletedAt, &i.UpdatedAt, @@ -177,6 +218,40 @@ func (q *Queries) InsertTask(ctx context.Context, arg InsertTaskParams) (Task, e return i, err } +const listTasksByCreator = `-- name: ListTasksByCreator :many +SELECT id, creator, creator_link, messageid, description, assignee, created_at, deleted_at, updated_at FROM tasks WHERE creator_link = $1 AND deleted_at is NULL +` + +func (q *Queries) ListTasksByCreator(ctx context.Context, creatorLink pgtype.Text) ([]Task, error) { + rows, err := q.db.Query(ctx, listTasksByCreator, creatorLink) + if err != nil { + return nil, err + } + defer rows.Close() + var items []Task + for rows.Next() { + var i Task + if err := rows.Scan( + &i.ID, + &i.Creator, + &i.CreatorLink, + &i.Messageid, + &i.Description, + &i.Assignee, + &i.CreatedAt, + &i.DeletedAt, + &i.UpdatedAt, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + const listTickets = `-- name: ListTickets :many SELECT id, key, channelid, project_git, build_git, folder, created_at, deleted_at, updated_at FROM tickets WHERE deleted_at IS NULL ` @@ -260,18 +335,19 @@ func (q *Queries) SetNewConfig(ctx context.Context) (Appconfig, error) { const startTask = `-- name: StartTask :one UPDATE tasks -SET started_at = $1 -WHERE messageID = $2 -RETURNING id, creator, creator_link, messageid, description, started_at, closed_at, created_at, deleted_at, updated_at +SET updated_at = $1, assignee = $2 +WHERE messageID = $3 +RETURNING id, creator, creator_link, messageid, description, assignee, created_at, deleted_at, updated_at ` type StartTaskParams struct { - StartedAt pgtype.Timestamptz + UpdatedAt pgtype.Timestamptz + Assignee pgtype.Text Messageid pgtype.Text } func (q *Queries) StartTask(ctx context.Context, arg StartTaskParams) (Task, error) { - row := q.db.QueryRow(ctx, startTask, arg.StartedAt, arg.Messageid) + row := q.db.QueryRow(ctx, startTask, arg.UpdatedAt, arg.Assignee, arg.Messageid) var i Task err := row.Scan( &i.ID, @@ -279,8 +355,7 @@ func (q *Queries) StartTask(ctx context.Context, arg StartTaskParams) (Task, err &i.CreatorLink, &i.Messageid, &i.Description, - &i.StartedAt, - &i.ClosedAt, + &i.Assignee, &i.CreatedAt, &i.DeletedAt, &i.UpdatedAt, @@ -288,6 +363,22 @@ func (q *Queries) StartTask(ctx context.Context, arg StartTaskParams) (Task, err return i, err } +const updateTaskWithMessageID = `-- name: UpdateTaskWithMessageID :exec +UPDATE tasks +SET messageID = $1 +WHERE id = $2 +` + +type UpdateTaskWithMessageIDParams struct { + Messageid pgtype.Text + ID int32 +} + +func (q *Queries) UpdateTaskWithMessageID(ctx context.Context, arg UpdateTaskWithMessageIDParams) error { + _, err := q.db.Exec(ctx, updateTaskWithMessageID, arg.Messageid, arg.ID) + return err +} + const updateTicketBuildGit = `-- name: UpdateTicketBuildGit :one UPDATE tickets SET build_git = $1, updated_at = $2 diff --git a/internal/storage/migrate/003_init_tasks.sql b/internal/storage/migrate/0003_init_tasks.sql similarity index 80% rename from internal/storage/migrate/003_init_tasks.sql rename to internal/storage/migrate/0003_init_tasks.sql index dd7323f..81d440c 100644 --- a/internal/storage/migrate/003_init_tasks.sql +++ b/internal/storage/migrate/0003_init_tasks.sql @@ -6,10 +6,7 @@ CREATE TABLE tasks ( messageID VARCHAR(255), description TEXT, - - - started_at TIMESTAMPTZ, - closed_at TIMESTAMPTZ, + assignee VARCHAR(255), created_at TIMESTAMPTZ DEFAULT current_timestamp, deleted_at TIMESTAMPTZ, diff --git a/internal/storage/sqlc/queries.sql b/internal/storage/sqlc/queries.sql index c0c6a28..cae5e62 100644 --- a/internal/storage/sqlc/queries.sql +++ b/internal/storage/sqlc/queries.sql @@ -62,14 +62,28 @@ INSERT INTO tasks ( ) RETURNING *; +-- name: UpdateTaskWithMessageID :exec +UPDATE tasks +SET messageID = $1 +WHERE id = $2; + -- name: StartTask :one UPDATE tasks -SET started_at = $1 -WHERE messageID = $2 +SET updated_at = $1, assignee = $2 +WHERE messageID = $3 RETURNING *; -- name: CloseTask :one UPDATE tasks -SET closed_at = $1 -WHERE messageID = $2 -RETURNING *; \ No newline at end of file +SET deleted_at = $1, assignee = $2 +WHERE messageID = $3 +RETURNING *; + +-- name: GetTaskByMessage :one +SELECT * FROM tasks WHERE messageID = $1; + +-- name: ListTasksByCreator :many +SELECT * FROM tasks WHERE creator_link = $1 AND deleted_at is NULL; + +-- name: GetTaskByID :one +SELECT * FROM tasks WHERE id = $1; \ No newline at end of file