132 lines
2.9 KiB
Go
132 lines
2.9 KiB
Go
package models
|
|
|
|
import (
|
|
"database/sql"
|
|
"errors"
|
|
"strconv"
|
|
|
|
"brainminder.speedtech.it/internal/database"
|
|
"brainminder.speedtech.it/internal/funcs"
|
|
"github.com/jmoiron/sqlx"
|
|
)
|
|
|
|
type CategoryModel struct {
|
|
DB *database.DB
|
|
}
|
|
|
|
type Category struct {
|
|
Id int64 `db:"id"`
|
|
Name string `db:"name"`
|
|
}
|
|
|
|
func (model *CategoryModel) One(id int) (*Category, bool, error) {
|
|
ctx, cancel := database.GetContext()
|
|
defer cancel()
|
|
|
|
var row Category
|
|
|
|
query := `SELECT id, name FROM bm_category WHERE id = $1`
|
|
|
|
err := model.DB.GetContext(ctx, &row, query, id)
|
|
if errors.Is(err, sql.ErrNoRows) {
|
|
return nil, false, nil
|
|
}
|
|
|
|
return &row, true, err
|
|
}
|
|
|
|
func (model *CategoryModel) All() ([]Category, bool, error) {
|
|
ctx, cancel := database.GetContext()
|
|
defer cancel()
|
|
|
|
query := `SELECT id, name FROM bm_category ORDER BY name`
|
|
|
|
var rows []Category
|
|
|
|
err := model.DB.SelectContext(ctx, &rows, query)
|
|
if errors.Is(err, sql.ErrNoRows) {
|
|
return nil, false, nil
|
|
}
|
|
|
|
return rows, true, err
|
|
}
|
|
|
|
func (model *CategoryModel) Find(ids []int64) ([]Category, bool, error) {
|
|
ctx, cancel := database.GetContext()
|
|
defer cancel()
|
|
|
|
query, args, _ := sqlx.In("SELECT id, name FROM bm_category WHERE id IN (?) ORDER BY name", ids)
|
|
query = model.DB.Rebind(query)
|
|
|
|
var rows []Category
|
|
|
|
err := model.DB.SelectContext(ctx, &rows, query, args)
|
|
if errors.Is(err, sql.ErrNoRows) {
|
|
return nil, false, nil
|
|
}
|
|
|
|
return rows, true, err
|
|
}
|
|
|
|
func (model *CategoryModel) AllAsOptions() []funcs.WidgetOption {
|
|
categories, _, _ := model.All()
|
|
var selectOptions []funcs.WidgetOption
|
|
for _, category := range categories {
|
|
selectOptions = append(selectOptions, funcs.WidgetOption{Key: strconv.FormatInt(category.Id, 10), Value: category.Name})
|
|
}
|
|
return selectOptions
|
|
}
|
|
|
|
func (model *CategoryModel) AllAsMap() map[string]string {
|
|
categories, _, _ := model.All()
|
|
var categories_map = make(map[string]string)
|
|
for _, category := range categories {
|
|
categories_map[strconv.FormatInt(category.Id, 10)] = category.Name
|
|
}
|
|
return categories_map
|
|
}
|
|
|
|
func (model *CategoryModel) Delete(id int) (bool, error) {
|
|
ctx, cancel := database.GetContext()
|
|
defer cancel()
|
|
|
|
query := `DELETE FROM bm_category WHERE id = $1`
|
|
|
|
_, err := model.DB.ExecContext(ctx, query, id)
|
|
if errors.Is(err, sql.ErrNoRows) {
|
|
return false, nil
|
|
}
|
|
|
|
return true, err
|
|
}
|
|
|
|
func (model *CategoryModel) Create(Category *Category) (int64, error) {
|
|
ctx, cancel := database.GetContext()
|
|
defer cancel()
|
|
|
|
query := `INSERT INTO bm_category (name) VALUES (:name)`
|
|
|
|
result, err := model.DB.NamedExecContext(ctx, query, Category)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
|
|
id, err := result.LastInsertId()
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
|
|
return id, err
|
|
}
|
|
|
|
func (model *CategoryModel) Update(Category *Category) error {
|
|
ctx, cancel := database.GetContext()
|
|
defer cancel()
|
|
|
|
query := `UPDATE bm_category SET name=:name WHERE id = :id`
|
|
|
|
_, err := model.DB.NamedExecContext(ctx, query, Category)
|
|
|
|
return err
|
|
}
|