add db structure
This commit is contained in:
parent
72c2bd05fa
commit
93da47c688
43
db/db.go
Normal file
43
db/db.go
Normal file
@ -0,0 +1,43 @@
|
||||
package db
|
||||
|
||||
import (
|
||||
"context"
|
||||
"database/sql"
|
||||
_ "embed"
|
||||
"fmt"
|
||||
|
||||
_ "modernc.org/sqlite"
|
||||
)
|
||||
|
||||
const (
|
||||
DEFAULT_DRIVER = "sqlite"
|
||||
)
|
||||
|
||||
var (
|
||||
//go:embed schema.sql
|
||||
schema string
|
||||
)
|
||||
|
||||
type DB struct {
|
||||
*sql.DB
|
||||
}
|
||||
|
||||
func Dial(ctx context.Context, driver, uri string) *DB {
|
||||
db, err := sql.Open(driver, uri)
|
||||
if err != nil {
|
||||
fmt.Println("Failed to connect to database:", err)
|
||||
panic(err)
|
||||
}
|
||||
err = db.PingContext(ctx)
|
||||
if err != nil {
|
||||
fmt.Printf("Pinging with context: %s", err)
|
||||
panic(err)
|
||||
}
|
||||
|
||||
_, err = db.ExecContext(ctx, schema)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
return &DB{db}
|
||||
}
|
||||
326
db/models.go
Normal file
326
db/models.go
Normal file
@ -0,0 +1,326 @@
|
||||
package db
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log/slog"
|
||||
"slices"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
type User struct {
|
||||
db *DB
|
||||
log *slog.Logger
|
||||
ID int
|
||||
TguID int
|
||||
Subs []string
|
||||
Created time.Time
|
||||
Edited time.Time
|
||||
Deleted time.Time
|
||||
}
|
||||
|
||||
type Inst struct {
|
||||
db *DB
|
||||
log *slog.Logger
|
||||
List []string
|
||||
}
|
||||
|
||||
func NewUser(db *DB, log *slog.Logger) User {
|
||||
return User{
|
||||
log: log,
|
||||
db: db,
|
||||
}
|
||||
}
|
||||
|
||||
// GetAll
|
||||
// Get all users in db
|
||||
func (u *User) GetAll(name string) (users []User, err error) {
|
||||
stmt, err := u.db.Prepare("SELECT users.id, users.tgu_id, users.subs FROM users WHERE users.subs LIKE ?")
|
||||
if err != nil {
|
||||
u.log.Error("[user-GetAll]", "error", err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
rows, err := stmt.Query("%" + name + "%")
|
||||
if err != nil {
|
||||
u.log.Error("[user-GetAll-stmt]", "error", err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
defer rows.Close()
|
||||
users = []User{}
|
||||
for rows.Next() {
|
||||
user := User{}
|
||||
subs := ""
|
||||
if err = rows.Scan(&user.ID, &user.TguID, &subs); err != nil {
|
||||
u.log.Error("[user-GetAll-scanning]", "error", err)
|
||||
return users, err
|
||||
}
|
||||
if subs == "" {
|
||||
u.log.Info("[user-GetAll-scanning] returning subs empty")
|
||||
continue
|
||||
}
|
||||
user.Subs = strings.Split(subs, ",")
|
||||
u.log.Info("user", "no", user)
|
||||
users = append(users, user)
|
||||
}
|
||||
if err := rows.Err(); err != nil {
|
||||
u.log.Error("[user-GetAll-returning]", "error", err)
|
||||
return users, err
|
||||
}
|
||||
return users, nil
|
||||
}
|
||||
|
||||
// Get
|
||||
// Get an specific user
|
||||
func (u *User) Get(telegramID int64) (user User, err error) {
|
||||
stmt, err := u.db.Prepare("SELECT users.id, users.tgu_id, users.subs FROM users WHERE tgu_id=?")
|
||||
if err != nil {
|
||||
u.log.Error("[user-Get]", "error", err)
|
||||
return user, err
|
||||
}
|
||||
subs := ""
|
||||
err = stmt.QueryRow(telegramID).Scan(&user.ID, &user.TguID, &subs)
|
||||
if err != nil {
|
||||
u.log.Error("[user-Get-stmt]", "error", err)
|
||||
return user, err
|
||||
}
|
||||
if subs != "" {
|
||||
user.Subs = strings.Split(subs, ",")
|
||||
} else {
|
||||
user.Subs = []string{}
|
||||
}
|
||||
u.ID, u.TguID, u.Subs = user.ID, user.TguID, user.Subs
|
||||
return user, nil
|
||||
}
|
||||
|
||||
// Add
|
||||
// Add user to database
|
||||
func (u *User) Add(telegramID int64) (bool, error) {
|
||||
stmt, err := u.db.Prepare("INSERT INTO users ('tgu_id', 'subs', 'created', 'edited') VALUES(?,?,datetime(),datetime())")
|
||||
if err != nil {
|
||||
u.log.Error("[user-Add-stmt]", "error", err)
|
||||
return false, err
|
||||
}
|
||||
_, err = stmt.Exec(telegramID, "")
|
||||
if err != nil {
|
||||
u.log.Error("[user-Add-exec]", "error", err)
|
||||
return false, err
|
||||
}
|
||||
return true, nil
|
||||
|
||||
}
|
||||
|
||||
// Edit
|
||||
// edit user info in database
|
||||
func (u *User) Subscribe(name string) (err error) {
|
||||
if u.TguID == 0 || u.ID == 0 {
|
||||
err = fmt.Errorf("user needs to have a telegram id or reference on db")
|
||||
u.log.Error("[user-Subscribe-check]", "error", err)
|
||||
return err
|
||||
}
|
||||
idx := slices.Index[[]string](u.Subs, name)
|
||||
if idx >= 0 {
|
||||
return fmt.Errorf("user alredy subscribed to inst")
|
||||
}
|
||||
u.Subs = append(u.Subs, name)
|
||||
stmt, err := u.db.Prepare("UPDATE users SET subs=? WHERE tgu_id=?")
|
||||
if err != nil {
|
||||
u.log.Error("[user-Subscribe-stmt]", "error", err)
|
||||
return err
|
||||
}
|
||||
strSubs := strings.Join(u.Subs, ",")
|
||||
_, err = stmt.Exec(strSubs, u.TguID)
|
||||
if err != nil {
|
||||
u.log.Error("[user-Subscribe-exec]", "error", err)
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// Delete
|
||||
// Delete user from database
|
||||
func (u *User) Unsubscribe(name string) (err error) {
|
||||
if u.TguID == 0 || u.ID == 0 {
|
||||
err = fmt.Errorf("user needs to have a telegram id or reference on db")
|
||||
u.log.Error("[user-UnSubscribe-check]", "error", err)
|
||||
return err
|
||||
}
|
||||
if len(u.Subs) <= 0 {
|
||||
err = fmt.Errorf("user needs to have a subscription to unsubcribe")
|
||||
u.log.Error("[user-UnSubscribe-check]", "error", err)
|
||||
return err
|
||||
}
|
||||
|
||||
idx := slices.Index[[]string](u.Subs, name)
|
||||
if idx >= 0 {
|
||||
u.Subs = slices.Delete[[]string](u.Subs, idx, idx+1)
|
||||
} else {
|
||||
err = fmt.Errorf("user is not subscribed to %s", name)
|
||||
u.log.Error("[user-UnSubscribe-check]", "error", err)
|
||||
return err
|
||||
}
|
||||
|
||||
stmt, err := u.db.Prepare("UPDATE users SET subs=? WHERE tgu_id=?")
|
||||
if err != nil {
|
||||
u.log.Error("[user-UnSubscribe-stmt]", "error", err)
|
||||
return err
|
||||
}
|
||||
strSubs := strings.Join(u.Subs, ",")
|
||||
_, err = stmt.Exec(strSubs, u.TguID)
|
||||
if err != nil {
|
||||
u.log.Error("[user-UnSubscribe-exec]", "error", err)
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// Reset
|
||||
// Clean user subscriptions on system
|
||||
func (u *User) Reset() (err error) {
|
||||
if u.TguID == 0 || u.ID == 0 {
|
||||
err = fmt.Errorf("user needs to have a telegram id or reference on db")
|
||||
u.log.Error("[user-Subscribe-check]", "error", err)
|
||||
return err
|
||||
}
|
||||
stmt, err := u.db.Prepare("UPDATE users SET subs=? WHERE tgu_id=?")
|
||||
if err != nil {
|
||||
u.log.Error("[user-Subscribe-stmt]", "error", err)
|
||||
return err
|
||||
}
|
||||
_, err = stmt.Exec("", u.TguID)
|
||||
if err != nil {
|
||||
u.log.Error("[user-Subscribe-exec]", "error", err)
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func NewInst(dbx *DB, log *slog.Logger) Inst {
|
||||
return Inst{
|
||||
log: log,
|
||||
db: dbx,
|
||||
}
|
||||
}
|
||||
|
||||
func (i *Inst) GetAll() ([]string, error) {
|
||||
stmt, err := i.db.Prepare("SELECT DISTINCT dolars.name FROM dolars WHERE name LIKE '%ban%' OR name LIKE '%scoti%' OR name LIKE '%asociacion%'")
|
||||
if err != nil {
|
||||
i.log.Error("[inst-GetAll]", "error", err)
|
||||
return nil, err
|
||||
}
|
||||
rows, err := stmt.Query()
|
||||
if err != nil {
|
||||
i.log.Error("[inst-GetAll-stmt]", "error", err)
|
||||
return nil, err
|
||||
}
|
||||
defer rows.Close()
|
||||
insts := []string{}
|
||||
for rows.Next() {
|
||||
inst := ""
|
||||
|
||||
if err = rows.Scan(&inst); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if inst == "" {
|
||||
continue
|
||||
}
|
||||
insts = append(insts, inst)
|
||||
}
|
||||
if err := rows.Err(); err != nil {
|
||||
return insts, err
|
||||
}
|
||||
return insts, nil
|
||||
|
||||
}
|
||||
func (i *Inst) GetBancos() ([]string, error) {
|
||||
stmt, err := i.db.Prepare("SELECT DISTINCT dolars.name FROM dolars WHERE name LIKE '%ban%' OR name LIKE '%scoti%'")
|
||||
if err != nil {
|
||||
i.log.Error("[inst-GetAll]", "error", err)
|
||||
return nil, err
|
||||
}
|
||||
rows, err := stmt.Query()
|
||||
if err != nil {
|
||||
i.log.Error("[inst-GetAll-stmt]", "error", err)
|
||||
return nil, err
|
||||
}
|
||||
defer rows.Close()
|
||||
insts := []string{}
|
||||
for rows.Next() {
|
||||
inst := ""
|
||||
|
||||
if err = rows.Scan(&inst); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if inst == "" {
|
||||
continue
|
||||
}
|
||||
insts = append(insts, inst)
|
||||
}
|
||||
if err := rows.Err(); err != nil {
|
||||
return insts, err
|
||||
}
|
||||
return insts, nil
|
||||
|
||||
}
|
||||
func (i *Inst) GetCajas() ([]string, error) {
|
||||
stmt, err := i.db.Prepare("SELECT DISTINCT dolars.name FROM dolars WHERE name LIKE '%asociacion%'")
|
||||
if err != nil {
|
||||
i.log.Error("[inst-GetAll]", "error", err)
|
||||
return nil, err
|
||||
}
|
||||
rows, err := stmt.Query()
|
||||
if err != nil {
|
||||
i.log.Error("[inst-GetAll-stmt]", "error", err)
|
||||
return nil, err
|
||||
}
|
||||
defer rows.Close()
|
||||
insts := []string{}
|
||||
for rows.Next() {
|
||||
inst := ""
|
||||
|
||||
if err = rows.Scan(&inst); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if inst == "" {
|
||||
continue
|
||||
}
|
||||
insts = append(insts, inst)
|
||||
}
|
||||
if err := rows.Err(); err != nil {
|
||||
return insts, err
|
||||
}
|
||||
return insts, nil
|
||||
|
||||
}
|
||||
|
||||
func (i *Inst) GetAgentes() ([]string, error) {
|
||||
stmt, err := i.db.Prepare("SELECT DISTINCT dolars.name FROM dolars WHERE name NOT LIKE '%ban%' AND name NOT LIKE '%scoti%' AND name NOT LIKE '%asociacion%'")
|
||||
if err != nil {
|
||||
i.log.Error("[inst-GetAll]", "error", err)
|
||||
return nil, err
|
||||
}
|
||||
rows, err := stmt.Query()
|
||||
if err != nil {
|
||||
i.log.Error("[inst-GetAll-stmt]", "error", err)
|
||||
return nil, err
|
||||
}
|
||||
defer rows.Close()
|
||||
insts := []string{}
|
||||
for rows.Next() {
|
||||
inst := ""
|
||||
|
||||
if err = rows.Scan(&inst); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if inst == "" {
|
||||
continue
|
||||
}
|
||||
insts = append(insts, inst)
|
||||
}
|
||||
if err := rows.Err(); err != nil {
|
||||
return insts, err
|
||||
}
|
||||
return insts, nil
|
||||
|
||||
}
|
||||
10
db/schema.sql
Normal file
10
db/schema.sql
Normal file
@ -0,0 +1,10 @@
|
||||
PRAGMA foreign_keys = ON;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS users (
|
||||
id INTEGER PRIMARY KEY NOT NULL,
|
||||
tgu_id INTEGER NOT NULL UNIQUE,
|
||||
subs TEXT NOT NULL,
|
||||
created TEXT NOT NULL,
|
||||
edited TEXT NOT NULL,
|
||||
deleted TEXT
|
||||
);
|
||||
Loading…
x
Reference in New Issue
Block a user