BrainMinder/models/field.go

169 lines
4.8 KiB
Go
Raw Permalink Normal View History

2024-08-22 10:13:16 +02:00
package models
import (
"database/sql"
"errors"
"brainminder.speedtech.it/internal/database"
)
type FieldModel struct {
DB *database.DB
}
type Field struct {
2025-02-04 18:03:31 +01:00
TypeFieldId int64 `db:"type_field_id"`
WidgetId int64 `db:"widget_id"`
TypeId int64 `db:"type_id"`
Widget string `db:"widget"`
Title string `db:"title"`
Position int `db:"position"`
ShowOnList int64 `db:"show_on_list"`
ShowOnView int64 `db:"show_on_view"`
ValidValues string `db:"valid_values"`
UiSection string `db:"ui_section"`
IsMultiple int64 `db:"is_multiple"`
ToRemove int64
2024-08-22 10:13:16 +02:00
}
type FieldValue struct {
2025-02-04 18:03:31 +01:00
TypeFieldId int64 `db:"type_field_id"`
Value string `db:"value"`
Title string `db:"title"`
Widget string `db:"widget"`
Number int64 `db:"number"`
Counter int `db:"counter"`
2024-08-22 10:13:16 +02:00
}
2025-02-04 18:03:31 +01:00
func (model *FieldModel) ByTypeSection(typeId int64) (map[string][]Field, bool, error) {
2024-08-22 10:13:16 +02:00
ctx, cancel := database.GetContext()
defer cancel()
query := `SELECT btf.id AS type_field_id, btf.widget_id, btf.type_id, bw.widget, btf.title, btf.position,
btf.valid_values, btf.show_on_list, btf.show_on_view, btf.ui_section, btf.is_multiple
FROM bm_type_fields btf INNER JOIN bm_widgets bw ON btf.widget_id=bw.id WHERE btf.type_id=$1 ORDER BY btf.position`
var rows []Field
rowsBySection := make(map[string][]Field)
2025-02-04 18:03:31 +01:00
err := model.DB.SelectContext(ctx, &rows, query, typeId)
2024-08-22 10:13:16 +02:00
if errors.Is(err, sql.ErrNoRows) {
return nil, false, nil
}
for _, row := range rows {
2025-02-04 18:03:31 +01:00
if value, found := rowsBySection[row.UiSection]; found {
rowsBySection[row.UiSection] = append(value, row)
2024-08-22 10:13:16 +02:00
} else {
2025-02-04 18:03:31 +01:00
rowsBySection[row.UiSection] = []Field{row}
2024-08-22 10:13:16 +02:00
}
}
return rowsBySection, true, err
}
2025-02-04 18:03:31 +01:00
func (model *FieldModel) ByType(typeId int64) ([]Field, bool, error) {
2024-08-22 10:13:16 +02:00
ctx, cancel := database.GetContext()
defer cancel()
query := `SELECT btf.id AS type_field_id, btf.widget_id, btf.type_id, bw.widget, btf.title, btf.position,
btf.valid_values, btf.show_on_list, btf.show_on_view, btf.ui_section, btf.is_multiple
FROM bm_type_fields btf INNER JOIN bm_widgets bw ON btf.widget_id=bw.id WHERE btf.type_id=$1 ORDER BY btf.position`
var rows []Field
2025-02-04 18:03:31 +01:00
err := model.DB.SelectContext(ctx, &rows, query, typeId)
2024-08-22 10:13:16 +02:00
if errors.Is(err, sql.ErrNoRows) {
return nil, false, nil
}
return rows, true, err
}
2025-02-04 18:03:31 +01:00
func (model *FieldModel) ByTypeOnList(typeId int64) ([]Field, bool, error) {
2024-08-22 10:13:16 +02:00
ctx, cancel := database.GetContext()
defer cancel()
query := `SELECT btf.id AS type_field_id, btf.widget_id, btf.type_id, bw.widget, btf.title, btf.position,
btf.valid_values, btf.show_on_list, btf.show_on_view, btf.ui_section, btf.is_multiple
FROM bm_type_fields btf INNER JOIN bm_widgets bw ON btf.widget_id=bw.id WHERE btf.show_on_list=1 AND btf.type_id=$1 ORDER BY btf.position`
var rows []Field
2025-02-04 18:03:31 +01:00
err := model.DB.SelectContext(ctx, &rows, query, typeId)
2024-08-22 10:13:16 +02:00
if errors.Is(err, sql.ErrNoRows) {
return nil, false, nil
}
return rows, true, err
}
2025-02-04 18:03:31 +01:00
func (model *FieldModel) SaveValues(itemId int64, typeFieldId int64, values map[int]string) bool {
2024-08-22 10:13:16 +02:00
ctx, cancel := database.GetContext()
defer cancel()
2025-02-04 18:03:31 +01:00
qyDelete := `DELETE FROM bm_item_fields WHERE item_id=? AND type_field_id=?`
2024-08-22 10:13:16 +02:00
2025-02-04 18:03:31 +01:00
_, err := model.DB.ExecContext(ctx, qyDelete, itemId, typeFieldId)
2024-08-22 10:13:16 +02:00
if errors.Is(err, sql.ErrNoRows) {
return false
}
2025-02-04 18:03:31 +01:00
qyInsert := `INSERT INTO bm_item_fields (item_id, type_field_id, counter, value) VALUES(?, ?, ?, ?)`
2024-08-22 10:13:16 +02:00
for counter, value := range values {
2025-02-04 18:03:31 +01:00
model.DB.MustExecContext(ctx, qyInsert, itemId, typeFieldId, counter, value)
2024-08-22 10:13:16 +02:00
}
return true
}
2025-02-04 18:03:31 +01:00
func (model *FieldModel) GetFieldValues(itemId int64, typeFieldId int64) map[int]string {
2024-08-22 10:13:16 +02:00
ctx, cancel := database.GetContext()
defer cancel()
2025-02-04 18:03:31 +01:00
rows, _ := model.DB.QueryContext(ctx, "SELECT counter, value FROM bm_item_fields WHERE item_id=? AND type_field_id=?", itemId, typeFieldId)
2024-08-22 10:13:16 +02:00
values := make(map[int]string)
for rows.Next() {
var counter int
var value string
rows.Scan(&counter, &value)
values[counter] = value
}
return values
}
2025-02-04 18:03:31 +01:00
func (model *FieldModel) GetFieldsValues(itemId int64) []FieldValue {
2024-08-22 10:13:16 +02:00
ctx, cancel := database.GetContext()
defer cancel()
var values []FieldValue
q := `SELECT bw.widget, btf.title, bif.type_field_id, bif.value, bif.counter FROM bm_item_fields bif
INNER JOIN bm_type_fields btf on btf.id=bif.type_field_id
INNER JOIN bm_widgets bw on bw.id=btf.widget_id
WHERE bif.item_id=$1`
2025-02-04 18:03:31 +01:00
model.DB.SelectContext(ctx, &values, q, itemId)
2024-08-22 10:13:16 +02:00
return values
}
2025-02-04 18:03:31 +01:00
func (model *FieldModel) GetFieldsValuesAsMap(itemId int64) map[int64]map[int]string {
values := model.GetFieldsValues(itemId)
2024-08-22 10:13:16 +02:00
2025-02-04 18:03:31 +01:00
valuesMap := make(map[int64]map[int]string)
2024-08-22 10:13:16 +02:00
2025-02-04 18:03:31 +01:00
for _, itemValue := range values {
_, found := valuesMap[itemValue.TypeFieldId]
2024-08-22 10:13:16 +02:00
if !found {
2025-02-04 18:03:31 +01:00
valuesMap[itemValue.TypeFieldId] = make(map[int]string)
2024-08-22 10:13:16 +02:00
}
2025-02-04 18:03:31 +01:00
valuesMap[itemValue.TypeFieldId][itemValue.Counter] = itemValue.Value
2024-08-22 10:13:16 +02:00
}
2025-02-04 18:03:31 +01:00
return valuesMap
2024-08-22 10:13:16 +02:00
}