diff --git a/cmd/main.go b/cmd/main.go index 6ff0c67..f4f3198 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -7,11 +7,15 @@ import ( "os" "os/signal" "syscall" + "ticket-pimp/bot/handler" - discordbot "ticket-pimp/discord-bot" + "ticket-pimp/internal/controller" "ticket-pimp/internal/domain" "ticket-pimp/internal/services" - db "ticket-pimp/internal/storage/db/tickets" + + discordbot "ticket-pimp/discord-bot" + configDB "ticket-pimp/internal/storage/db/config" + ticketDB "ticket-pimp/internal/storage/db/tickets" "github.com/jackc/pgx/v5" "github.com/joho/godotenv" @@ -22,7 +26,39 @@ import ( func main() { log.Print("started") config := env("develop.env") - run(config) + // run(config) + test(config) +} + +func test(conf domain.Config) { + ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt, os.Kill, syscall.SIGTERM) + defer cancel() + conn, err := pgx.Connect( + 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) + // appconfig, err := q.GetConfig(ctx) + + // appconfigNew, err := q.SetNewConfig(ctx) + + // _ = appconfig + // _ = appconfigNew + + appController := controller.NewAppConfig(q) + ticketConfig, err := appController.NewKey(ctx) + _ = ticketConfig + } func run(conf domain.Config) { @@ -45,7 +81,7 @@ func run(conf domain.Config) { defer conn.Close(ctx) opts := TelegramOptions{ - ticketsRepo: db.New(conn), + ticketsRepo: ticketDB.New(conn), gitService: services.NewGit(conf.Git), cloudService: services.NewCloud(conf.Cloud), coda: services.NewCodaClient(conf.Coda), @@ -56,6 +92,7 @@ func run(conf domain.Config) { if err := runDiscrodBot(conf); err != nil { log.Fatalf("discord bot cannot be runned: %v", err) } + }() if err := runTgBot(ctx, opts); err != nil { @@ -143,7 +180,7 @@ func runDiscrodBot(conf domain.Config) error { } type TelegramOptions struct { - ticketsRepo *db.Queries + ticketsRepo *ticketDB.Queries gitService *services.Git cloudService *services.Cloud coda *services.Coda diff --git a/internal/controller/tickets_config.go b/internal/controller/tickets_config.go new file mode 100644 index 0000000..c37da9a --- /dev/null +++ b/internal/controller/tickets_config.go @@ -0,0 +1,38 @@ +package controller + +import ( + "context" + "ticket-pimp/internal/domain" + db "ticket-pimp/internal/storage/db/config" +) + +type IConfigController interface { + Get(context.Context) (domain.ApplicationConfig, error) + Update(context.Context) (domain.ApplicationConfig, error) +} + +type AppConfig struct { + db *db.Queries +} + +func NewAppConfig(db *db.Queries) AppConfig { + return 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/config.go b/internal/domain/config.go index 18739a5..8ee777d 100644 --- a/internal/domain/config.go +++ b/internal/domain/config.go @@ -43,3 +43,8 @@ type TelegramConfig struct { type DiscordConfig struct { Token string } + +type ApplicationConfig struct { + Key string + ID int +} diff --git a/internal/storage/db/config/config.sql.go b/internal/storage/db/config/config.sql.go new file mode 100644 index 0000000..8a8d6b2 --- /dev/null +++ b/internal/storage/db/config/config.sql.go @@ -0,0 +1,35 @@ +// 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/db.go b/internal/storage/db/config/db.go new file mode 100644 index 0000000..7d918df --- /dev/null +++ b/internal/storage/db/config/db.go @@ -0,0 +1,32 @@ +// 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/db/config/models.go b/internal/storage/db/config/models.go new file mode 100644 index 0000000..91729b1 --- /dev/null +++ b/internal/storage/db/config/models.go @@ -0,0 +1,14 @@ +// 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/migrate/0001_init_schema.sql b/internal/storage/migrate/0001_init_tickets.sql similarity index 100% rename from internal/storage/migrate/0001_init_schema.sql rename to internal/storage/migrate/0001_init_tickets.sql diff --git a/internal/storage/migrate/0002_init_config.sql b/internal/storage/migrate/0002_init_config.sql new file mode 100644 index 0000000..a4e78cc --- /dev/null +++ b/internal/storage/migrate/0002_init_config.sql @@ -0,0 +1,8 @@ +-- +migrate Up +CREATE TABLE appconfig ( + ticket_key VARCHAR(5), + ticket_id INT +); + +-- +migrate Down +DROP TABLE appconfig; \ No newline at end of file diff --git a/internal/storage/sqlc.yaml b/internal/storage/sqlc.yaml index 7ad84aa..74dae84 100644 --- a/internal/storage/sqlc.yaml +++ b/internal/storage/sqlc.yaml @@ -2,9 +2,17 @@ version: "2" sql: - engine: "postgresql" queries: "sqlc/tickets.sql" - schema: "migrate" + schema: "migrate/0001_init_tickets.sql" gen: go: package: "db" sql_package: "pgx/v5" - out: "db/tickets" \ No newline at end of file + 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 diff --git a/internal/storage/sqlc/config.sql b/internal/storage/sqlc/config.sql new file mode 100644 index 0000000..391c651 --- /dev/null +++ b/internal/storage/sqlc/config.sql @@ -0,0 +1,8 @@ +-- 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/readme.md b/readme.md index 62e4d8f..a9bed3b 100644 --- a/readme.md +++ b/readme.md @@ -26,6 +26,7 @@ sql-migrate up # To-do P1: - [ ] Сделать нормальный Gracefull ShutDown с потоками и всей хернёй + https://callistaenterprise.se/blogg/teknik/2019/10/05/go-worker-cancellation/