84 lines
2.5 KiB
Go
84 lines
2.5 KiB
Go
package store
|
|||
|
|
|
||
|
|
import (
|
||
|
|
"context"
|
||
|
|
"database/sql"
|
||
|
|
"errors"
|
||
|
|
"fmt"
|
||
|
|
|
||
|
|
"g.fc.run/ai/byre/internal/api"
|
||
|
|
"g.fc.run/ai/byre/internal/ids"
|
||
|
|
)
|
||
|
|
|
||
|
|
func (s *Store) SavedCommands(ctx context.Context, owner string) ([]api.SavedCommand, error) {
|
||
|
|
rows, err := s.db.QueryContext(ctx, `SELECT id, name, command FROM saved_commands WHERE owner = ? ORDER BY name, id`, owner)
|
||
|
|
if err != nil {
|
||
|
|
return nil, err
|
||
|
|
}
|
||
|
|
defer rows.Close()
|
||
|
|
|
||
|
|
cmds := []api.SavedCommand{}
|
||
|
|
for rows.Next() {
|
||
|
|
c := api.SavedCommand{}
|
||
|
|
err = rows.Scan(&c.Id, &c.Name, &c.Command)
|
||
|
|
if err != nil {
|
||
|
|
return nil, err
|
||
|
|
}
|
||
|
|
cmds = append(cmds, c)
|
||
|
|
}
|
||
|
|
return cmds, rows.Err()
|
||
|
|
}
|
||
|
|
|
||
|
|
func (s *Store) SavedCommand(ctx context.Context, owner, id string) (api.SavedCommand, error) {
|
||
|
|
c := api.SavedCommand{Id: id}
|
||
|
|
err := s.db.QueryRowContext(ctx, `SELECT name, command FROM saved_commands WHERE id = ? AND owner = ?`, id, owner).Scan(&c.Name, &c.Command)
|
||
|
|
if errors.Is(err, sql.ErrNoRows) {
|
||
|
|
return c, fmt.Errorf("saved command %s: %w", id, ErrNotFound)
|
||
|
|
}
|
||
|
|
return c, err
|
||
|
|
}
|
||
|
|
|
||
|
|
func (s *Store) SaveSavedCommand(ctx context.Context, owner, id, name, command, actor string) (api.SavedCommand, error) {
|
||
|
|
c := api.SavedCommand{Id: id, Name: name, Command: command}
|
||
|
|
err := s.write(ctx, func(tx *sql.Tx, emit emitFunc) error {
|
||
|
|
if id == "" {
|
||
|
|
c.Id = ids.New(ids.SavedCommand)
|
||
|
|
_, err := tx.ExecContext(ctx, `INSERT INTO saved_commands (id, owner, name, command) VALUES (?, ?, ?, ?)`, c.Id, owner, name, command)
|
||
|
|
if err != nil {
|
||
|
|
return err
|
||
|
|
}
|
||
|
|
} else {
|
||
|
|
res, err := tx.ExecContext(ctx, `UPDATE saved_commands SET name = ?, command = ? WHERE id = ? AND owner = ?`, name, command, id, owner)
|
||
|
|
if err != nil {
|
||
|
|
return err
|
||
|
|
}
|
||
|
|
n, err := res.RowsAffected()
|
||
|
|
if err != nil {
|
||
|
|
return err
|
||
|
|
}
|
||
|
|
if n == 0 {
|
||
|
|
return fmt.Errorf("saved command %s: %w", id, ErrNotFound)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return emit(api.Event{Kind: "command.saved", Owner: &owner, Actor: actor, Payload: ToPayload(c)})
|
||
|
|
})
|
||
|
|
return c, err
|
||
|
|
}
|
||
|
|
|
||
|
|
func (s *Store) DeleteSavedCommand(ctx context.Context, owner, id, actor string) error {
|
||
|
|
return s.write(ctx, func(tx *sql.Tx, emit emitFunc) error {
|
||
|
|
res, err := tx.ExecContext(ctx, `DELETE FROM saved_commands WHERE id = ? AND owner = ?`, id, owner)
|
||
|
|
if err != nil {
|
||
|
|
return err
|
||
|
|
}
|
||
|
|
n, err := res.RowsAffected()
|
||
|
|
if err != nil {
|
||
|
|
return err
|
||
|
|
}
|
||
|
|
if n == 0 {
|
||
|
|
return fmt.Errorf("saved command %s: %w", id, ErrNotFound)
|
||
|
|
}
|
||
|
|
return emit(api.Event{Kind: "command.deleted", Owner: &owner, Actor: actor, Payload: map[string]any{"id": id}})
|
||
|
|
})
|
||
|
|
}
|