summaryrefslogtreecommitdiffstats
path: root/pkg/database
diff options
context:
space:
mode:
authorLeonardo Bishop <me@leonardobishop.net>2025-09-17 18:13:30 +0100
committerLeonardo Bishop <me@leonardobishop.net>2025-09-17 18:13:30 +0100
commit39a926cd521806aedc298ddd671d1a118794fcec (patch)
treea38908af8c91e01b2acec112b871c951e1bf6c1b /pkg/database
parent1b7c07d9bbfb7984536a3aeade0f543251f1a666 (diff)
Add endpoints for web extension
Diffstat (limited to 'pkg/database')
-rw-r--r--pkg/database/migrations/0003_unique_url.sql3
-rw-r--r--pkg/database/migrations/0004_unread_kind.sql5
-rw-r--r--pkg/database/query/entries.sql20
-rw-r--r--pkg/database/sqlc/entries.sql.go99
4 files changed, 127 insertions, 0 deletions
diff --git a/pkg/database/migrations/0003_unique_url.sql b/pkg/database/migrations/0003_unique_url.sql
new file mode 100644
index 0000000..8be3293
--- /dev/null
+++ b/pkg/database/migrations/0003_unique_url.sql
@@ -0,0 +1,3 @@
+-- +goose Up
+
+CREATE UNIQUE INDEX ux_entries_url ON entries(url);
diff --git a/pkg/database/migrations/0004_unread_kind.sql b/pkg/database/migrations/0004_unread_kind.sql
new file mode 100644
index 0000000..e583050
--- /dev/null
+++ b/pkg/database/migrations/0004_unread_kind.sql
@@ -0,0 +1,5 @@
+-- +goose Up
+
+INSERT INTO kinds (name, emoji)
+VALUES
+ ("unread", "📚");
diff --git a/pkg/database/query/entries.sql b/pkg/database/query/entries.sql
index 1f39016..9584adf 100644
--- a/pkg/database/query/entries.sql
+++ b/pkg/database/query/entries.sql
@@ -5,7 +5,27 @@ FROM kinds
WHERE kinds.name = ?
RETURNING *;
+-- name: UpdateEntryKind :one
+UPDATE entries
+SET kind = (SELECT id FROM kinds WHERE kinds.name = ?)
+WHERE entries.id = ?
+RETURNING *;
+
+-- name: DeleteEntry :execrows
+DELETE FROM entries
+WHERE id = ?;
+
-- name: GetEntries :many
SELECT title, url, description, timestamp, kinds.name as kind_name, kinds.emoji as kind_emoji FROM entries
JOIN kinds ON entries.kind == kinds.id
ORDER BY timestamp DESC;
+
+-- name: GetEntryURLs :many
+SELECT url FROM entries
+ORDER BY timestamp DESC;
+
+-- name: GetEntryByUrl :one
+SELECT entries.id, title, url, description, timestamp, kinds.name as kind_name, kinds.emoji as kind_emoji FROM entries
+JOIN kinds ON entries.kind == kinds.id
+WHERE url = ?
+LIMIT 1;
diff --git a/pkg/database/sqlc/entries.sql.go b/pkg/database/sqlc/entries.sql.go
index c7b5e1c..846076d 100644
--- a/pkg/database/sqlc/entries.sql.go
+++ b/pkg/database/sqlc/entries.sql.go
@@ -43,6 +43,19 @@ func (q *Queries) CreateEntryWithKindName(ctx context.Context, arg CreateEntryWi
return i, err
}
+const deleteEntry = `-- name: DeleteEntry :execrows
+DELETE FROM entries
+WHERE id = ?
+`
+
+func (q *Queries) DeleteEntry(ctx context.Context, id int64) (int64, error) {
+ result, err := q.db.ExecContext(ctx, deleteEntry, id)
+ if err != nil {
+ return 0, err
+ }
+ return result.RowsAffected()
+}
+
const getEntries = `-- name: GetEntries :many
SELECT title, url, description, timestamp, kinds.name as kind_name, kinds.emoji as kind_emoji FROM entries
JOIN kinds ON entries.kind == kinds.id
@@ -87,3 +100,89 @@ func (q *Queries) GetEntries(ctx context.Context) ([]GetEntriesRow, error) {
}
return items, nil
}
+
+const getEntryByUrl = `-- name: GetEntryByUrl :one
+SELECT entries.id, title, url, description, timestamp, kinds.name as kind_name, kinds.emoji as kind_emoji FROM entries
+JOIN kinds ON entries.kind == kinds.id
+WHERE url = ?
+LIMIT 1
+`
+
+type GetEntryByUrlRow struct {
+ ID int64 `json:"id"`
+ Title string `json:"title"`
+ Url string `json:"url"`
+ Description string `json:"description"`
+ Timestamp string `json:"timestamp"`
+ KindName string `json:"kind_name"`
+ KindEmoji string `json:"kind_emoji"`
+}
+
+func (q *Queries) GetEntryByUrl(ctx context.Context, url string) (GetEntryByUrlRow, error) {
+ row := q.db.QueryRowContext(ctx, getEntryByUrl, url)
+ var i GetEntryByUrlRow
+ err := row.Scan(
+ &i.ID,
+ &i.Title,
+ &i.Url,
+ &i.Description,
+ &i.Timestamp,
+ &i.KindName,
+ &i.KindEmoji,
+ )
+ return i, err
+}
+
+const getEntryURLs = `-- name: GetEntryURLs :many
+SELECT url FROM entries
+ORDER BY timestamp DESC
+`
+
+func (q *Queries) GetEntryURLs(ctx context.Context) ([]string, error) {
+ rows, err := q.db.QueryContext(ctx, getEntryURLs)
+ if err != nil {
+ return nil, err
+ }
+ defer rows.Close()
+ var items []string
+ for rows.Next() {
+ var url string
+ if err := rows.Scan(&url); err != nil {
+ return nil, err
+ }
+ items = append(items, url)
+ }
+ if err := rows.Close(); err != nil {
+ return nil, err
+ }
+ if err := rows.Err(); err != nil {
+ return nil, err
+ }
+ return items, nil
+}
+
+const updateEntryKind = `-- name: UpdateEntryKind :one
+UPDATE entries
+SET kind = (SELECT id FROM kinds WHERE kinds.name = ?)
+WHERE entries.id = ?
+RETURNING id, title, kind, url, description, timestamp
+`
+
+type UpdateEntryKindParams struct {
+ Name string `json:"name"`
+ ID int64 `json:"id"`
+}
+
+func (q *Queries) UpdateEntryKind(ctx context.Context, arg UpdateEntryKindParams) (Entry, error) {
+ row := q.db.QueryRowContext(ctx, updateEntryKind, arg.Name, arg.ID)
+ var i Entry
+ err := row.Scan(
+ &i.ID,
+ &i.Title,
+ &i.Kind,
+ &i.Url,
+ &i.Description,
+ &i.Timestamp,
+ )
+ return i, err
+}