171 lines
4.3 KiB
Go
171 lines
4.3 KiB
Go
package db
|
|
|
|
import (
|
|
"context"
|
|
"database/sql"
|
|
"log/slog"
|
|
|
|
"git.maximotejeda.com/maximo/tgb-user/internal/application/core/domain"
|
|
)
|
|
|
|
type BotUser struct {
|
|
db *sql.DB
|
|
log *slog.Logger
|
|
ID int64 `json:"id"`
|
|
Tgb_ID int64 `json:"tgb_id"`
|
|
Bot_id int64 `json:"bot_id"`
|
|
Created int64 `json:"edited"`
|
|
}
|
|
|
|
func NewBotUser(db *sql.DB, log *slog.Logger) *BotUser {
|
|
log = log.With("obj", "BotUsers")
|
|
return &BotUser{
|
|
db: db,
|
|
log: log,
|
|
}
|
|
}
|
|
|
|
func (bu BotUser) GetUsers(ctx context.Context, botName string) (ul []*domain.User, err error) {
|
|
smt, err := bu.db.PrepareContext(ctx,
|
|
`SELECT u.tgb_id, u.username, u.first_name, u.last_name, u.created, u.edited
|
|
FROM bot_users AS bu
|
|
JOIN bots as b ON b.id = bu.bot_id
|
|
JOIN users as u ON bu.tgb_id = u.tgb_id
|
|
WHERE b.bot_name = ? AND u.deleted IS NULL;`)
|
|
if err != nil {
|
|
bu.log.Error("prepare stmt getUsers", "error", err)
|
|
return nil, err
|
|
}
|
|
defer smt.Close()
|
|
rows, err := smt.QueryContext(ctx, botName)
|
|
if err != nil {
|
|
bu.log.Error("query getUsers", "error", err)
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
for rows.Next() {
|
|
u := &domain.User{}
|
|
err = rows.Scan(&u.TGB_ID, &u.Username, &u.FirstName, &u.LastName, &u.Created, &u.Edited)
|
|
if err != nil {
|
|
bu.log.Error("canning getUsers", "error", err)
|
|
return nil, err
|
|
}
|
|
ul = append(ul, u)
|
|
}
|
|
return ul, nil
|
|
}
|
|
|
|
func (bu BotUser) GetBots(ctx context.Context, tgb_id int64) (bl []*domain.Bot, err error) {
|
|
stmt, err := bu.db.PrepareContext(ctx,
|
|
`SELECT b.id, b.bot_name, b.created FROM bot_users AS bu
|
|
JOIN bots AS b ON bu.bot_id = b.id
|
|
WHERE bu.tgb_id = ?;`)
|
|
if err != nil {
|
|
bu.log.Error("prepare stmt getBots", "error", err)
|
|
return nil, err
|
|
}
|
|
defer stmt.Close()
|
|
rows, err := stmt.QueryContext(ctx, tgb_id)
|
|
if err != nil {
|
|
bu.log.Error("query get bots", "error", err)
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
bl = []*domain.Bot{}
|
|
for rows.Next() {
|
|
bot := &domain.Bot{}
|
|
err := rows.Scan(&bot.ID, &bot.BotName, &bot.Created)
|
|
if err != nil {
|
|
bu.log.Error("scanning get bots", "error", err)
|
|
return nil, err
|
|
}
|
|
bl = append(bl, bot)
|
|
|
|
}
|
|
return bl, nil
|
|
}
|
|
|
|
func (bu BotUser) CreateBot(ctx context.Context, bot_name string) (bool, error) {
|
|
stmt, err := bu.db.PrepareContext(ctx,
|
|
`INSERT OR IGNORE INTO bots (bot_name, created) VALUES(?, strftime('%s', 'now'));`)
|
|
if err != nil {
|
|
bu.log.Error("prepare stmt add", "error", err)
|
|
return false, err
|
|
}
|
|
defer stmt.Close()
|
|
_, err = stmt.ExecContext(ctx, bot_name)
|
|
|
|
if err != nil {
|
|
bu.log.Error("exec context add", "error", err)
|
|
return false, err
|
|
}
|
|
return true, nil
|
|
|
|
}
|
|
|
|
func (bu BotUser) Add(ctx context.Context, tgb_id int64, bot_name string) (bool, error) {
|
|
|
|
stmt1, err := bu.db.PrepareContext(ctx,
|
|
`
|
|
INSERT INTO bot_users
|
|
(tgb_id, bot_id, created)
|
|
VALUES(?,(SELECT id FROM bots WHERE bot_name = ?),strftime('%s', 'now'));`)
|
|
|
|
if err != nil {
|
|
bu.log.Error("prepare stmt add botusers", "error", err)
|
|
return false, err
|
|
}
|
|
defer stmt1.Close()
|
|
_, err = stmt1.ExecContext(ctx, tgb_id, bot_name)
|
|
if err != nil {
|
|
bu.log.Error("exec add bot users", "error", err)
|
|
return false, err
|
|
}
|
|
return true, nil
|
|
}
|
|
|
|
func (bu BotUser) Delete(ctx context.Context, tgb_id int64, botname string) (bool, error) {
|
|
stmt, err := bu.db.PrepareContext(ctx,
|
|
`
|
|
DELETE FROM bot_users as u
|
|
WHERE u.bot_id = (SELECT id FROM bots WHERE bot_name = ?) AND u.tgb_id = ?
|
|
`)
|
|
if err != nil {
|
|
bu.log.Error("prepare stmt delete", "error", err)
|
|
return false, err
|
|
}
|
|
defer stmt.Close()
|
|
_, err = stmt.ExecContext(ctx, botname, tgb_id)
|
|
if err != nil {
|
|
bu.log.Error("exec delete", "error", err)
|
|
return false, err
|
|
}
|
|
return true, nil
|
|
}
|
|
|
|
func (bu BotUser) GetAllBots(ctx context.Context) ([]*domain.Bot, error) {
|
|
stmt, err := bu.db.Prepare(`SELECT id, bot_name, created FROM bots`)
|
|
if err != nil {
|
|
bu.log.Error("prepare stmt get all bots", "error", err)
|
|
return nil, err
|
|
}
|
|
stmt.Close()
|
|
rows, err := stmt.Query()
|
|
if err != nil {
|
|
bu.log.Error("query get all bots", "error", err)
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
list := []*domain.Bot{}
|
|
for rows.Next() {
|
|
bot := &domain.Bot{}
|
|
err := rows.Scan(&bot.ID, &bot.BotName, &bot.Created)
|
|
if err != nil {
|
|
bu.log.Error("scanning get all bots", "error", err)
|
|
continue
|
|
}
|
|
list = append(list, bot)
|
|
}
|
|
return list, nil
|
|
}
|