apps/sipp/internal/store/store.go 2.4 K raw
1
package store
2
3
import (
4
	"database/sql"
5
	"errors"
6
7
	"github.com/stevedylandev/andromeda/pkg/auth"
8
	"github.com/stevedylandev/andromeda/pkg/sqlite"
9
)
10
11
type Snippet struct {
12
	ID      int64  `json:"id"`
13
	ShortID string `json:"short_id"`
14
	Content string `json:"content"`
15
	Name    string `json:"name"`
16
}
17
18
type SnippetInput struct {
19
	Name    string `json:"name"`
20
	Content string `json:"content"`
21
}
22
23
const schema = `
24
CREATE TABLE IF NOT EXISTS snippets (
25
    id INTEGER PRIMARY KEY AUTOINCREMENT,
26
    short_id TEXT NOT NULL UNIQUE,
27
    content TEXT NOT NULL,
28
    name TEXT NOT NULL
29
);
30
`
31
32
func Open(path string) (*sql.DB, error) {
33
	return sqlite.Open(path, schema)
34
}
35
36
func scanSnippet(s interface{ Scan(...any) error }) (*Snippet, error) {
37
	var sn Snippet
38
	err := s.Scan(&sn.ID, &sn.ShortID, &sn.Content, &sn.Name)
39
	if errors.Is(err, sql.ErrNoRows) {
40
		return nil, nil
41
	}
42
	if err != nil {
43
		return nil, err
44
	}
45
	return &sn, nil
46
}
47
48
func Create(db *sql.DB, name, content string) (*Snippet, error) {
49
	shortID, err := auth.GenerateShortID(10)
50
	if err != nil {
51
		return nil, err
52
	}
53
	res, err := db.Exec(`INSERT INTO snippets (short_id, content, name) VALUES (?, ?, ?)`, shortID, content, name)
54
	if err != nil {
55
		return nil, err
56
	}
57
	id, _ := res.LastInsertId()
58
	return &Snippet{ID: id, ShortID: shortID, Content: content, Name: name}, nil
59
}
60
61
func GetByShortID(db *sql.DB, shortID string) (*Snippet, error) {
62
	return scanSnippet(db.QueryRow(`SELECT id, short_id, content, name FROM snippets WHERE short_id = ?`, shortID))
63
}
64
65
func List(db *sql.DB) ([]Snippet, error) {
66
	rows, err := db.Query(`SELECT id, short_id, content, name FROM snippets ORDER BY id DESC`)
67
	if err != nil {
68
		return nil, err
69
	}
70
	defer rows.Close()
71
	out := []Snippet{}
72
	for rows.Next() {
73
		s, err := scanSnippet(rows)
74
		if err != nil {
75
			return nil, err
76
		}
77
		out = append(out, *s)
78
	}
79
	return out, rows.Err()
80
}
81
82
func DeleteByShortID(db *sql.DB, shortID string) (bool, error) {
83
	res, err := db.Exec(`DELETE FROM snippets WHERE short_id = ?`, shortID)
84
	if err != nil {
85
		return false, err
86
	}
87
	n, _ := res.RowsAffected()
88
	return n > 0, nil
89
}
90
91
func UpdateByShortID(db *sql.DB, shortID, name, content string) (*Snippet, error) {
92
	res, err := db.Exec(`UPDATE snippets SET name = ?, content = ? WHERE short_id = ?`, name, content, shortID)
93
	if err != nil {
94
		return nil, err
95
	}
96
	if n, _ := res.RowsAffected(); n == 0 {
97
		return nil, nil
98
	}
99
	return GetByShortID(db, shortID)
100
}