coai/manager/conversation/mask.go

87 lines
2.0 KiB
Go

package conversation
import (
"chat/auth"
"chat/globals"
"chat/utils"
"database/sql"
)
type Mask struct {
Id int `json:"id"`
Avatar string `json:"avatar"`
Name string `json:"name"`
Description string `json:"description"`
Context []globals.Message `json:"context"`
}
func (c *Conversation) LoadMask(data string) {
message := utils.UnmarshalForm[[]globals.Message](data)
if message != nil && len(*message) > 0 {
c.InsertMessages(*message, 0)
}
}
func (m *Mask) Save(db *sql.DB, user *auth.User) error {
userId := user.GetID(db)
if m.Id == -1 {
_, err := globals.ExecDb(db,
"INSERT INTO mask (mask.user_id, avatar, name, description, context) VALUES (?, ?, ?, ?, ?)",
userId, m.Avatar, m.Name, m.Description, utils.Marshal(m.Context),
)
return err
}
_, err := globals.ExecDb(db,
"UPDATE mask SET avatar = ?, name = ?, description = ?, context = ? WHERE id = ? AND user_id = ?",
m.Avatar, m.Name, m.Description, utils.Marshal(m.Context), m.Id, userId,
)
return err
}
func (m *Mask) Delete(db *sql.DB, user *auth.User) error {
_, err := globals.ExecDb(db, "DELETE FROM mask WHERE id = ? AND user_id = ?", m.Id, user.GetID(db))
return err
}
func LoadMask(db *sql.DB, user *auth.User) ([]Mask, error) {
rows, err := globals.QueryDb(db, `
SELECT id, avatar, name, description, context
FROM mask WHERE user_id = ?
ORDER BY id DESC
`, user.GetID(db))
if err != nil {
return nil, err
}
defer func(rows *sql.Rows) {
err := rows.Close()
if err != nil {
globals.Warn(err.Error())
}
}(rows)
masks := make([]Mask, 0)
for rows.Next() {
var mask Mask
var context string
err = rows.Scan(&mask.Id, &mask.Avatar, &mask.Name, &mask.Description, &context)
if err != nil {
return nil, err
}
data, err := utils.UnmarshalString[[]globals.Message](context)
if err != nil {
return nil, err
}
mask.Context = data
masks = append(masks, mask)
}
return masks, nil
}