2024-08-15 03:12:01 -04:00
|
|
|
package database
|
|
|
|
|
|
|
|
import (
|
|
|
|
"database/sql"
|
|
|
|
_ "github.com/mattn/go-sqlite3"
|
|
|
|
"log"
|
|
|
|
"time"
|
|
|
|
)
|
|
|
|
|
|
|
|
type KennelCat struct {
|
|
|
|
ID string `json:"id"`
|
|
|
|
UserID string `json:"user_id"`
|
2024-08-16 02:24:43 -04:00
|
|
|
Name string `json:"name"`
|
2024-08-15 03:12:01 -04:00
|
|
|
Link string `json:"link"`
|
|
|
|
Description string `json:"description"`
|
|
|
|
Spritesheet string `json:"spritesheet"`
|
|
|
|
CreatedAt time.Time `json:"created_at"`
|
|
|
|
}
|
|
|
|
|
|
|
|
type KennelState struct {
|
|
|
|
At time.Time `json:"at"`
|
|
|
|
EncodedState string `json:"state"`
|
|
|
|
}
|
|
|
|
|
|
|
|
func CountUserKennelCats(db *sql.DB, userID string) (int, error) {
|
|
|
|
log.Println("counting kennel cats for user", userID)
|
|
|
|
|
|
|
|
row := db.QueryRow("SELECT COUNT(*) FROM kennel_cat WHERE user_id = ?", userID)
|
|
|
|
var count int
|
|
|
|
err := row.Scan(&count)
|
|
|
|
if err != nil {
|
|
|
|
return 0, err
|
|
|
|
}
|
|
|
|
return count, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func GetUserKennelCats(db *sql.DB, userID string) ([]KennelCat, error) {
|
|
|
|
log.Println("getting kennel cats for user", userID)
|
|
|
|
|
|
|
|
rows, err := db.Query("SELECT * FROM kennel_cat WHERE user_id = ?", userID)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
defer rows.Close()
|
|
|
|
|
|
|
|
var cats []KennelCat
|
|
|
|
for rows.Next() {
|
|
|
|
var cat KennelCat
|
2024-08-16 02:24:43 -04:00
|
|
|
err := rows.Scan(&cat.ID, &cat.Name, &cat.UserID, &cat.Link, &cat.Description, &cat.Spritesheet, &cat.CreatedAt)
|
2024-08-15 03:12:01 -04:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
cats = append(cats, cat)
|
|
|
|
}
|
|
|
|
|
|
|
|
return cats, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func SaveKennelCat(db *sql.DB, cat *KennelCat) (*KennelCat, error) {
|
|
|
|
log.Println("saving kennel cat", cat.ID)
|
|
|
|
|
|
|
|
if (cat.CreatedAt == time.Time{}) {
|
|
|
|
cat.CreatedAt = time.Now()
|
|
|
|
}
|
|
|
|
|
2024-08-16 02:24:43 -04:00
|
|
|
_, err := db.Exec("INSERT OR REPLACE INTO kennel_cat (id, user_id, name, link, description, spritesheet, created_at) VALUES (?, ?, ?, ?, ?, ?, ?)", cat.ID, cat.UserID, cat.Name, cat.Link, cat.Description, cat.Spritesheet, cat.CreatedAt)
|
2024-08-15 03:12:01 -04:00
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return cat, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func GetKennelCat(db *sql.DB, catID string) (*KennelCat, error) {
|
|
|
|
log.Println("getting kennel cat", catID)
|
|
|
|
|
|
|
|
row := db.QueryRow("SELECT * FROM kennel_cat WHERE id = ?", catID)
|
|
|
|
var cat KennelCat
|
2024-08-16 02:24:43 -04:00
|
|
|
err := row.Scan(&cat.ID, &cat.Name, &cat.UserID, &cat.Link, &cat.Description, &cat.Spritesheet, &cat.CreatedAt)
|
2024-08-15 03:12:01 -04:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return &cat, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func DeleteKennelCat(db *sql.DB, catID string) error {
|
|
|
|
log.Println("deleting kennel cat", catID)
|
|
|
|
|
|
|
|
_, err := db.Exec("DELETE FROM kennel_cat WHERE id = ?", catID)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2024-08-17 18:23:22 -04:00
|
|
|
func GetRandomKennelCat(dbConn *sql.DB) (*KennelCat, error) {
|
|
|
|
log.Println("getting random kennel cat")
|
|
|
|
|
|
|
|
row := dbConn.QueryRow("SELECT * FROM kennel_cat ORDER BY RANDOM() LIMIT 1")
|
|
|
|
var cat KennelCat
|
|
|
|
err := row.Scan(&cat.ID, &cat.Name, &cat.UserID, &cat.Link, &cat.Description, &cat.Spritesheet, &cat.CreatedAt)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return &cat, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func GetNextKennelCat(dbConn *sql.DB, lastID string, next bool) (*KennelCat, error) {
|
|
|
|
log.Println("getting next kennel cat")
|
|
|
|
|
|
|
|
operation := ">"
|
|
|
|
sorted := "ASC"
|
|
|
|
if !next {
|
|
|
|
operation = "<"
|
|
|
|
sorted = "DESC"
|
|
|
|
}
|
|
|
|
|
|
|
|
row := dbConn.QueryRow("SELECT * FROM kennel_cat WHERE id "+operation+" ? ORDER BY id "+sorted+" LIMIT 1", lastID)
|
|
|
|
|
|
|
|
var cat KennelCat
|
|
|
|
err := row.Scan(&cat.ID, &cat.Name, &cat.UserID, &cat.Link, &cat.Description, &cat.Spritesheet, &cat.CreatedAt)
|
|
|
|
if err != nil {
|
|
|
|
if next {
|
|
|
|
// loop "back" to the first in the ring
|
|
|
|
row = dbConn.QueryRow("SELECT * FROM kennel_cat ORDER BY id ASC LIMIT 1")
|
|
|
|
} else {
|
|
|
|
// loop "forward" to the first in the ring
|
|
|
|
row = dbConn.QueryRow("SELECT * FROM kennel_cat ORDER BY id DESC LIMIT 1")
|
|
|
|
}
|
|
|
|
err = row.Scan(&cat.ID, &cat.Name, &cat.UserID, &cat.Link, &cat.Description, &cat.Spritesheet, &cat.CreatedAt)
|
|
|
|
}
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
return &cat, nil
|
|
|
|
}
|
|
|
|
|
2024-08-15 03:12:01 -04:00
|
|
|
func GetKennel(dbConn *sql.DB) ([]KennelCat, error) {
|
|
|
|
log.Println("getting kennel")
|
|
|
|
|
|
|
|
rows, err := dbConn.Query("SELECT * FROM kennel_cat")
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
defer rows.Close()
|
|
|
|
|
|
|
|
var cats []KennelCat
|
|
|
|
for rows.Next() {
|
|
|
|
var cat KennelCat
|
2024-08-16 02:24:43 -04:00
|
|
|
err := rows.Scan(&cat.ID, &cat.Name, &cat.UserID, &cat.Link, &cat.Description, &cat.Spritesheet, &cat.CreatedAt)
|
2024-08-15 03:12:01 -04:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
cats = append(cats, cat)
|
|
|
|
}
|
|
|
|
|
|
|
|
return cats, nil
|
|
|
|
}
|