- Handle discordgo.ForumTags;

This commit is contained in:
naudachu 2023-11-14 20:26:10 +05:00
parent 77b8bd8abb
commit 0df0b21198
12 changed files with 386 additions and 107 deletions

View File

@ -59,6 +59,22 @@ func Run(conf domain.Config, opts DiscordOptions) error {
return fmt.Errorf("cannot open the session: %v", err) 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...") log.Println("Adding commands...")
var cmds []*discordgo.ApplicationCommand var cmds []*discordgo.ApplicationCommand
var logString []string var logString []string
@ -73,6 +89,7 @@ func Run(conf domain.Config, opts DiscordOptions) error {
log.Println("Following commands added:") log.Println("Following commands added:")
log.Println(logString) log.Println(logString)
defer session.Close() defer session.Close()
stop := make(chan os.Signal, 1) stop := make(chan os.Signal, 1)
signal.Notify(stop, os.Interrupt) 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) log.Panicf("Cannot delete '%v' command: %v", h.Name, err)
} }
} }
return nil return nil
} }

View File

@ -6,6 +6,34 @@ import (
"github.com/bwmarrin/discordgo" "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 { func (h *router) CreateExternalTask() CommandRoute {
return CommandRoute{ return CommandRoute{
@ -38,9 +66,20 @@ func (h *router) StartTask() ComponentRoute {
return ComponentRoute{ return ComponentRoute{
Handler: func(s *discordgo.Session, i *discordgo.InteractionCreate) { 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{ newMsg := discordgo.MessageEdit{
Content: &newContent,
Channel: i.ChannelID, Channel: i.ChannelID,
ID: i.Message.ID, ID: i.Message.ID,
Components: []discordgo.MessageComponent{ 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 { if err != nil {
log.Println("edition NOT complete, ", err) log.Println("edition NOT complete, ", err)
} }
log.Print(editedM)
}, },
} }
} }
@ -72,20 +110,28 @@ func (h *router) CloseTask() ComponentRoute {
return ComponentRoute{ return ComponentRoute{
Handler: func(s *discordgo.Session, i *discordgo.InteractionCreate) { 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{ newMsg := discordgo.MessageEdit{
Content: &newContent,
Channel: i.ChannelID, Channel: i.ChannelID,
ID: i.Message.ID, ID: i.Message.ID,
Components: []discordgo.MessageComponent{}, Components: []discordgo.MessageComponent{},
} }
editedM, err := s.ChannelMessageEditComplex(&newMsg) msgE, err := s.ChannelMessageEditComplex(&newMsg)
if err != nil { if err != nil {
log.Println("edition NOT complete, ", err) log.Println("edition NOT complete, ", err)
} }
log.Print(editedM) _ = msgE
h.setFlag(s, i, &h.Tags[1])
}, },
} }

View File

@ -13,13 +13,19 @@ func (h *router) Ping() CommandRoute {
Description: "pongs in a reply", Description: "pongs in a reply",
}, },
Handler: func(s *discordgo.Session, i *discordgo.InteractionCreate) { Handler: func(s *discordgo.Session, i *discordgo.InteractionCreate) {
log.Println("ok, I'm here..")
err := s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ err := s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{
Type: discordgo.InteractionResponseChannelMessageWithSource, Type: discordgo.InteractionResponseChannelMessageWithSource,
Data: &discordgo.InteractionResponseData{ Data: &discordgo.InteractionResponseData{
Content: "`pong`", TTS: false,
Title: "Pong reply", 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 { if err != nil {

View File

@ -11,6 +11,8 @@ import (
type router struct { type router struct {
Commands []CommandRoute Commands []CommandRoute
Components []ComponentRoute Components []ComponentRoute
Tags []discordgo.ForumTag
controller controller.WorkflowController controller controller.WorkflowController
conf *domain.DiscordConfig conf *domain.DiscordConfig
} }
@ -22,7 +24,7 @@ func InitRouter(wc controller.WorkflowController, conf *domain.DiscordConfig) *r
r.Commands = append(r.Commands, r.Commands = append(r.Commands,
// r.CreateRepoHandler(3), // r.CreateRepoHandler(3),
// r.CreateFolderHandler(3), // r.CreateFolderHandler(3),
// r.Ping(), r.Ping(),
// r.CreateTicketHandler(3), // r.CreateTicketHandler(3),
// r.InitProjectFromChannel(3), // r.InitProjectFromChannel(3),
// r.GetInfo(), // r.GetInfo(),
@ -34,6 +36,19 @@ func InitRouter(wc controller.WorkflowController, conf *domain.DiscordConfig) *r
) )
r.controller = wc r.controller = wc
r.conf = conf r.conf = conf
r.Tags = append(
r.Tags,
discordgo.ForumTag{
Name: "В работе",
Moderated: true,
EmojiName: "👩‍🍳",
},
discordgo.ForumTag{
Name: "Готово",
Moderated: true,
EmojiName: "✅",
})
return &r return &r
} }

View File

@ -2,6 +2,7 @@ package handler
import ( import (
"context" "context"
"strconv"
"strings" "strings"
"ticket-pimp/internal/domain" "ticket-pimp/internal/domain"
@ -11,9 +12,17 @@ import (
func (h *Handler) FarmTaskHandler(ctx context.Context, mu *tgb.MessageUpdate) error { 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 var summaryTail string
@ -36,42 +45,35 @@ func (h *Handler) FarmTaskHandler(ctx context.Context, mu *tgb.MessageUpdate) er
mu.Chat.ID.PeerID(), 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 { if err != nil {
answer := err.Error() answer := err.Error()
h.LogMessage(ctx, mu, answer) h.LogMessage(ctx, mu, answer)
return err return err
} }
// t.URL = url
// answer := tg.HTML.Text( i := strconv.Itoa(int(conv.ID))
// tg.HTML.Line(tg.HTML.Link("🤘 Задача", t.URL), "была создана!")) answer = tg.HTML.Text(
// h.LogMessage(ctx, mu, answer) tg.HTML.Line(
// return mu.Answer(answer). tg.HTML.Bold("Task ID: "),
// ReplyToMessageID(msgID).ParseMode(tg.HTML).DisableWebPagePreview(true).DoVoid(ctx) tg.HTML.Code(i),
answer := tg.HTML.Text( tg.HTML.Text(" was created"),
tg.HTML.Line("🤘 Задача была создана!")) ),
)
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) h.LogMessage(ctx, mu, answer)
return mu.Answer(answer). return mu.Answer(answer).
ReplyToMessageID(msgID).ParseMode(tg.HTML).DisableWebPagePreview(true).DoVoid(ctx) ReplyToMessageID(msgID).ParseMode(tg.HTML).DisableWebPagePreview(true).DoVoid(ctx)

View File

@ -3,8 +3,8 @@ package controller
import ( import (
"context" "context"
"fmt" "fmt"
"log"
"os" "os"
"strconv"
"ticket-pimp/internal/domain" "ticket-pimp/internal/domain"
"ticket-pimp/internal/storage/db" "ticket-pimp/internal/storage/db"
"time" "time"
@ -13,23 +13,9 @@ import (
"github.com/jackc/pgx/v5/pgtype" "github.com/jackc/pgx/v5/pgtype"
) )
func (wc *WorkflowController) InitTask(t *domain.Task) error { func (wc *WorkflowController) InitTask(t *domain.Task) (*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)
// [ ] Что делать, если не получилось создать задачу?
}
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{ dbtask, err := wc.q.InsertTask(context.TODO(), db.InsertTaskParams{
Creator: pgtype.Text{String: t.Creator, Valid: true}, Creator: pgtype.Text{String: t.Creator, Valid: true},
CreatorLink: pgtype.Text{ CreatorLink: pgtype.Text{
@ -42,18 +28,32 @@ func (wc *WorkflowController) InitTask(t *domain.Task) error {
}, },
}) })
if err != nil { 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( task := newConvertable(&dbtask).ExtractDomain()
"## TaskID: %d\nCreated by: %s\n\n%s",
dbtask.ID, // Инициализируем новый клиент дискорда
t.Creator, // [ ] Нездоровое получение параметров клиента из os..
t.Description, 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{ msg := discordgo.MessageSend{
Content: content, Content: task.NotStartedMessage(),
Components: []discordgo.MessageComponent{ Components: []discordgo.MessageComponent{
discordgo.ActionsRow{ discordgo.ActionsRow{
Components: []discordgo.MessageComponent{ 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 { if err != nil {
log.Println("unable to send task message") return task, fmt.Errorf("unable to update channel: %v", err)
} }
_ = dbtask err = wc.q.UpdateTaskWithMessageID(context.TODO(), db.UpdateTaskWithMessageIDParams{
_ = st Messageid: pgtype.Text{String: th.ID, Valid: true},
return err 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 { switch opt {
case 0: case 0:
wc.q.StartTask(context.TODO(), db.StartTaskParams{ dbtask, err = wc.q.StartTask(context.TODO(), db.StartTaskParams{
StartedAt: pgtype.Timestamptz{Time: time.Now(), InfinityModifier: 0, Valid: true}, UpdatedAt: pgtype.Timestamptz{Time: time.Now(), InfinityModifier: 0, Valid: true},
Assignee: pgtype.Text{String: user, Valid: true},
Messageid: pgtype.Text{String: id, Valid: true}, Messageid: pgtype.Text{String: id, Valid: true},
}) })
return &TaskConvertable{&dbtask}, err
case 1: case 1:
wc.q.CloseTask(context.TODO(), db.CloseTaskParams{ dbtask, err = wc.q.CloseTask(context.TODO(), db.CloseTaskParams{
ClosedAt: pgtype.Timestamptz{Time: time.Now(), InfinityModifier: 0, Valid: true}, DeletedAt: pgtype.Timestamptz{Time: time.Now(), InfinityModifier: 0, Valid: true},
Assignee: pgtype.Text{String: user, Valid: true},
Messageid: pgtype.Text{String: id, Valid: true}, Messageid: pgtype.Text{String: id, Valid: true},
}) })
return &TaskConvertable{&dbtask}, err
} }
return &TaskConvertable{&dbtask}, nil
} }

View File

@ -5,6 +5,7 @@ import (
"ticket-pimp/internal/services" "ticket-pimp/internal/services"
"ticket-pimp/internal/storage/db" "ticket-pimp/internal/storage/db"
"github.com/bwmarrin/discordgo"
"github.com/jackc/pgx/v5/pgxpool" "github.com/jackc/pgx/v5/pgxpool"
) )
@ -14,6 +15,7 @@ type WorkflowController struct {
ICoda services.ICoda ICoda services.ICoda
pool *pgxpool.Pool pool *pgxpool.Pool
q *db.Queries q *db.Queries
ATags []discordgo.ForumTag
} }
func NewWorkflowController( func NewWorkflowController(
@ -35,3 +37,28 @@ type ProjectResponse struct {
Project *domain.Project Project *domain.Project
Message error 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: "",
}
}

View File

@ -1,6 +1,9 @@
package domain package domain
import "fmt" import (
"fmt"
"time"
)
type Folder struct { type Folder struct {
Title string // k Title string // k
@ -51,14 +54,55 @@ func (r *Row) NewCell(col string, value string) *Row {
} }
type Task struct { type Task struct {
ID int32
Summary string Summary string
Description string Description string
Creator string Creator string
CreatorLink string CreatorLink string
Assignee string
CreatedAt time.Time
DeletedAt time.Time
UpdatedAt time.Time
URL string 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 { func NewTask(summ, desc, c, cLink string) *Task {
return &Task{ return &Task{
Summary: summ, Summary: summ,

View File

@ -19,8 +19,7 @@ type Task struct {
CreatorLink pgtype.Text CreatorLink pgtype.Text
Messageid pgtype.Text Messageid pgtype.Text
Description pgtype.Text Description pgtype.Text
StartedAt pgtype.Timestamptz Assignee pgtype.Text
ClosedAt pgtype.Timestamptz
CreatedAt pgtype.Timestamptz CreatedAt pgtype.Timestamptz
DeletedAt pgtype.Timestamptz DeletedAt pgtype.Timestamptz
UpdatedAt pgtype.Timestamptz UpdatedAt pgtype.Timestamptz

View File

@ -13,18 +13,19 @@ import (
const closeTask = `-- name: CloseTask :one const closeTask = `-- name: CloseTask :one
UPDATE tasks UPDATE tasks
SET closed_at = $1 SET deleted_at = $1, assignee = $2
WHERE messageID = $2 WHERE messageID = $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 CloseTaskParams struct { type CloseTaskParams struct {
ClosedAt pgtype.Timestamptz DeletedAt pgtype.Timestamptz
Assignee pgtype.Text
Messageid pgtype.Text Messageid pgtype.Text
} }
func (q *Queries) CloseTask(ctx context.Context, arg CloseTaskParams) (Task, error) { 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 var i Task
err := row.Scan( err := row.Scan(
&i.ID, &i.ID,
@ -32,8 +33,7 @@ func (q *Queries) CloseTask(ctx context.Context, arg CloseTaskParams) (Task, err
&i.CreatorLink, &i.CreatorLink,
&i.Messageid, &i.Messageid,
&i.Description, &i.Description,
&i.StartedAt, &i.Assignee,
&i.ClosedAt,
&i.CreatedAt, &i.CreatedAt,
&i.DeletedAt, &i.DeletedAt,
&i.UpdatedAt, &i.UpdatedAt,
@ -102,6 +102,48 @@ func (q *Queries) GetConfig(ctx context.Context) (Appconfig, error) {
return i, err 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 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 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 ( ) VALUES (
$1, $2, $3 $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 { type InsertTaskParams struct {
@ -168,8 +210,7 @@ func (q *Queries) InsertTask(ctx context.Context, arg InsertTaskParams) (Task, e
&i.CreatorLink, &i.CreatorLink,
&i.Messageid, &i.Messageid,
&i.Description, &i.Description,
&i.StartedAt, &i.Assignee,
&i.ClosedAt,
&i.CreatedAt, &i.CreatedAt,
&i.DeletedAt, &i.DeletedAt,
&i.UpdatedAt, &i.UpdatedAt,
@ -177,6 +218,40 @@ func (q *Queries) InsertTask(ctx context.Context, arg InsertTaskParams) (Task, e
return i, err 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 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 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 const startTask = `-- name: StartTask :one
UPDATE tasks UPDATE tasks
SET started_at = $1 SET updated_at = $1, assignee = $2
WHERE messageID = $2 WHERE messageID = $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 StartTaskParams struct { type StartTaskParams struct {
StartedAt pgtype.Timestamptz UpdatedAt pgtype.Timestamptz
Assignee pgtype.Text
Messageid pgtype.Text Messageid pgtype.Text
} }
func (q *Queries) StartTask(ctx context.Context, arg StartTaskParams) (Task, error) { 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 var i Task
err := row.Scan( err := row.Scan(
&i.ID, &i.ID,
@ -279,8 +355,7 @@ func (q *Queries) StartTask(ctx context.Context, arg StartTaskParams) (Task, err
&i.CreatorLink, &i.CreatorLink,
&i.Messageid, &i.Messageid,
&i.Description, &i.Description,
&i.StartedAt, &i.Assignee,
&i.ClosedAt,
&i.CreatedAt, &i.CreatedAt,
&i.DeletedAt, &i.DeletedAt,
&i.UpdatedAt, &i.UpdatedAt,
@ -288,6 +363,22 @@ func (q *Queries) StartTask(ctx context.Context, arg StartTaskParams) (Task, err
return i, 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 const updateTicketBuildGit = `-- name: UpdateTicketBuildGit :one
UPDATE tickets UPDATE tickets
SET build_git = $1, updated_at = $2 SET build_git = $1, updated_at = $2

View File

@ -6,10 +6,7 @@ CREATE TABLE tasks (
messageID VARCHAR(255), messageID VARCHAR(255),
description TEXT, description TEXT,
assignee VARCHAR(255),
started_at TIMESTAMPTZ,
closed_at TIMESTAMPTZ,
created_at TIMESTAMPTZ DEFAULT current_timestamp, created_at TIMESTAMPTZ DEFAULT current_timestamp,
deleted_at TIMESTAMPTZ, deleted_at TIMESTAMPTZ,

View File

@ -62,14 +62,28 @@ INSERT INTO tasks (
) )
RETURNING *; RETURNING *;
-- name: UpdateTaskWithMessageID :exec
UPDATE tasks
SET messageID = $1
WHERE id = $2;
-- name: StartTask :one -- name: StartTask :one
UPDATE tasks UPDATE tasks
SET started_at = $1 SET updated_at = $1, assignee = $2
WHERE messageID = $2 WHERE messageID = $3
RETURNING *; RETURNING *;
-- name: CloseTask :one -- name: CloseTask :one
UPDATE tasks UPDATE tasks
SET closed_at = $1 SET deleted_at = $1, assignee = $2
WHERE messageID = $2 WHERE messageID = $3
RETURNING *; 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;