diff --git a/cmd/main.go b/cmd/main.go index f750f95..c764e4e 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -62,7 +62,6 @@ func run(conf domain.Config) { } }() - // go func() { opts := telegram.TelegramOptions{ // TicketsRepo: db, GitService: gitService, @@ -75,6 +74,4 @@ func run(conf domain.Config) { log.Fatalf("telegram bot cannot be runned: %v", err) defer os.Exit(1) } - // }() - } diff --git a/discord/handler/handle_folder.go b/discord/handler/handle_folder.go index fd69214..50ce21d 100644 --- a/discord/handler/handle_folder.go +++ b/discord/handler/handle_folder.go @@ -5,6 +5,7 @@ import ( "fmt" "log" "strconv" + "ticket-pimp/internal/controller" "github.com/bwmarrin/discordgo" ) @@ -30,20 +31,21 @@ func (h *router) CreateFolderHandler(nameMinLenght int) route { }, Handler: func(s *discordgo.Session, i *discordgo.InteractionCreate) { + // Моментальный ответ для избежания столкновения с протуханием токена initialResponse := discordgo.InteractionResponse{ - // Ignore type for now, they will be discussed in "responses" Type: discordgo.InteractionResponseChannelMessageWithSource, Data: &discordgo.InteractionResponseData{ Flags: discordgo.MessageFlagsEphemeral, - Content: "..folder is going to be created", - Title: "📂 Folder creation", + Content: "Cooking your query..", }, } s.InteractionRespond(i.Interaction, &initialResponse) + // Определение переменной для ответа var result string = "unexpected result" + // Определение выбранных вариантов ответа options := i.ApplicationCommandData().Options optionMap := make(map[string]*discordgo.ApplicationCommandInteractionDataOption, len(options)) @@ -51,49 +53,54 @@ func (h *router) CreateFolderHandler(nameMinLenght int) route { optionMap[opt.Name] = opt } - var str string = "" - + name, insertedValueNotNil := optionMap[nameOption] dchan, err := s.Channel(i.ChannelID) + // Creating request: + var req controller.FolderRequest if err != nil { log.Printf("error while identifying channel: %v", err) + } else { + + if dchan.ParentID == strconv.Itoa(1150719794853716028) { + req.ChannelID = dchan.ID + if insertedValueNotNil { + req.InsertedName = name.StringValue() + } + + } else { + req.ChannelID = "" + if insertedValueNotNil { + req.InsertedName = name.StringValue() + } + } } - if dchan.ParentID == strconv.Itoa(1150719794853716028) { - log.Println("yes, channel is from `Projects`") - 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 { - switch { - case project == nil: - if option, ok := optionMap[nameOption]; ok { - str = option.StringValue() - } else { - str = "Ты, либо в проекте директорию создавай, либо имя напиши, блет!" - } - default: - str = project.ShortName - } + // Making request: + resp := h.controller.CreateFolder(context.TODO(), req) + if resp.Project == nil { + result = "Надо написать имя для папки, или создать папку из проекта!" + } else { + result = fmt.Sprintf( + "## Project info:\n🔑 key: %s\n📂 folder: %s\n👾 project git: %s\n🚀 build git: %s\n\nErrors: %v", + resp.Project.ShortName, + resp.Project.Cloud, + resp.Project.ProjectGit, + resp.Project.BuildGit, + resp.Message, + ) + } - resp := h.controller.ICloud.CreateFolder(str) - if resp.ErrMessage != nil { - result = fmt.Sprintf("Command executed w/ errors: ``` %v``` \n But check this link: %s\n", resp.ErrMessage, resp.Folder.PrivateURL) - } else { - result = fmt.Sprintf("📂 Folder was created: %s", resp.Folder.PrivateURL) - } - } + // Sending result: + _, err = s.FollowupMessageCreate(i.Interaction, true, &discordgo.WebhookParams{ + Content: result, + }) - _, err = s.FollowupMessageCreate(i.Interaction, true, &discordgo.WebhookParams{ - Content: result, + if err != nil { + s.FollowupMessageCreate(i.Interaction, true, &discordgo.WebhookParams{ + Content: fmt.Sprintf("Something went wrong: %v", err), }) - - if err != nil { - s.FollowupMessageCreate(i.Interaction, true, &discordgo.WebhookParams{ - Content: fmt.Sprintf("Something went wrong: %v", err), - }) - return - } + return } }, } diff --git a/internal/controller/control_folder.go b/internal/controller/control_folder.go new file mode 100644 index 0000000..a445ee6 --- /dev/null +++ b/internal/controller/control_folder.go @@ -0,0 +1,100 @@ +package controller + +import ( + "context" + "errors" + "fmt" + "log" + "ticket-pimp/internal/domain" + "ticket-pimp/internal/storage/db" + "time" + + "github.com/jackc/pgx/v5/pgtype" +) + +type FolderRequest struct { + ChannelID string + InsertedName string +} + +type ProjectResponse struct { + Project *domain.Project + Message error +} + +func (wc *WorkflowController) CreateFolder(ctx context.Context, req FolderRequest) *ProjectResponse { + + project, err := wc.GetProjectByChannelID(ctx, req.ChannelID) + if err != nil { + return &ProjectResponse{ + Project: nil, + Message: fmt.Errorf("unable to retrieve project from db: %v", err), + } + } + + var ( + name string + dbticket db.Ticket + result ProjectResponse + ) + + if project != nil { + switch { + case project.Cloud != "": + return &ProjectResponse{ + Project: project, + Message: nil, + } + case project.ShortName != "": + name = project.ShortName + case req.InsertedName != "": + name = req.InsertedName + } + response := wc.ICloud.CreateFolder(name) + + dbticket, err = wc.q.UpdateTicketFolder( + ctx, + db.UpdateTicketFolderParams{ + Folder: pgtype.Text{String: response.Folder.PrivateURL, Valid: true}, + UpdatedAt: pgtype.Timestamptz{Time: time.Now(), InfinityModifier: 0, Valid: true}, + Channelid: pgtype.Text{String: req.ChannelID, Valid: true}, + }) + if err != nil { + log.Printf("unable to scan row from db: %v", err) + return &ProjectResponse{ + Project: project, + Message: fmt.Errorf("unable to update project: %v", err), + } + } + + result = ProjectResponse{ + Project: &domain.Project{ + ID: string(dbticket.ID), + ShortName: dbticket.Key.String, + ChannelID: dbticket.Channelid.String, + ProjectGit: dbticket.ProjectGit.String, + BuildGit: dbticket.BuildGit.String, + Cloud: dbticket.Folder.String, + }, + Message: response.ErrMessage, + } + } else { + if req.InsertedName != "" { + response := wc.ICloud.CreateFolder(req.InsertedName) + result = ProjectResponse{ + Project: &domain.Project{ + Cloud: response.Folder.PrivateURL, + }, + Message: response.ErrMessage, + } + } else { + return &ProjectResponse{ + Project: nil, + Message: errors.New("передано пустое имя"), + } + } + } + + return &result + +} diff --git a/internal/controller/project.go b/internal/controller/project.go index ee68bfe..54094f3 100644 --- a/internal/controller/project.go +++ b/internal/controller/project.go @@ -74,10 +74,13 @@ func (wc *WorkflowController) GetProjectByChannelID(ctx context.Context, id stri return nil, err } else { proj = domain.Project{ - ID: string(dbTicket.ID), - ShortName: dbTicket.Key.String, - Name: dbTicket.Key.String, - ChannelID: dbTicket.Channelid.String, + ID: string(dbTicket.ID), + ShortName: dbTicket.Key.String, + Name: dbTicket.Key.String, + ChannelID: dbTicket.Channelid.String, + ProjectGit: dbTicket.ProjectGit.String, + BuildGit: dbTicket.BuildGit.String, + Cloud: dbTicket.Folder.String, } } return &proj, nil diff --git a/internal/domain/models.go b/internal/domain/models.go index 96f5a99..8dff715 100644 --- a/internal/domain/models.go +++ b/internal/domain/models.go @@ -87,6 +87,10 @@ type Project struct { ShortName string `json:"shortName"` Name string `json:"name"` ChannelID string `json:"channel_id"` + + ProjectGit string `json:"project_git"` + BuildGit string `json:"build_git"` + Cloud string `json:"cloud"` } type ProjectID struct { diff --git a/internal/services/cloud.go b/internal/services/cloud.go index 2b3946a..cd37732 100644 --- a/internal/services/cloud.go +++ b/internal/services/cloud.go @@ -1,6 +1,7 @@ package services import ( + "errors" "fmt" "log" "strconv" @@ -82,7 +83,7 @@ func (c *Cloud) CreateFolder(name string) Response { // if strings.Contains(err.Error(), "already exists") { R.Folder.PrivateURL = c.BaseURL + R.Folder.PathTo - R.ErrMessage = err + R.ErrMessage = errors.New("guess, that folder already exists") // Try to set short URL to the d entity if err := c.setPrivateURL(requestPath, R.Folder); err != nil { R.ErrMessage = err diff --git a/internal/storage/db/queries.sql.go b/internal/storage/db/queries.sql.go index 505ed37..d760019 100644 --- a/internal/storage/db/queries.sql.go +++ b/internal/storage/db/queries.sql.go @@ -215,3 +215,33 @@ func (q *Queries) UpdateTicketByID(ctx context.Context, arg UpdateTicketByIDPara ) return err } + +const updateTicketFolder = `-- name: UpdateTicketFolder :one +UPDATE tickets +SET folder = $1, updated_at = $2 +WHERE channelID = $3 +RETURNING id, key, channelid, project_git, build_git, folder, created_at, deleted_at, updated_at +` + +type UpdateTicketFolderParams struct { + Folder pgtype.Text + UpdatedAt pgtype.Timestamptz + Channelid pgtype.Text +} + +func (q *Queries) UpdateTicketFolder(ctx context.Context, arg UpdateTicketFolderParams) (Ticket, error) { + row := q.db.QueryRow(ctx, updateTicketFolder, arg.Folder, arg.UpdatedAt, arg.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 +} diff --git a/internal/storage/sqlc/queries.sql b/internal/storage/sqlc/queries.sql index b9911aa..69c3280 100644 --- a/internal/storage/sqlc/queries.sql +++ b/internal/storage/sqlc/queries.sql @@ -15,6 +15,12 @@ INSERT INTO tickets ( ) RETURNING *; +-- name: UpdateTicketFolder :one +UPDATE tickets +SET folder = $1, updated_at = $2 +WHERE channelID = $3 +RETURNING *; + -- name: ListTickets :many SELECT * FROM tickets WHERE deleted_at IS NULL;