summaryrefslogtreecommitdiff
path: root/src/post/asset.go
diff options
context:
space:
mode:
authorBrian Picciano <mediocregopher@gmail.com>2023-04-15 21:07:16 +0200
committerBrian Picciano <mediocregopher@gmail.com>2023-04-15 21:07:16 +0200
commit7872296b838f4d1b26c6a0a01d79d27fe5ab44cc (patch)
tree9487f5abb93d88ab3b52700d2b3002b7dda373d6 /src/post/asset.go
parent68f3215df6e2e4f345076dd5b20b9bf5867353cf (diff)
Move asset store into its own package
Diffstat (limited to 'src/post/asset.go')
-rw-r--r--src/post/asset.go114
1 files changed, 0 insertions, 114 deletions
diff --git a/src/post/asset.go b/src/post/asset.go
deleted file mode 100644
index a7b605b..0000000
--- a/src/post/asset.go
+++ /dev/null
@@ -1,114 +0,0 @@
-package post
-
-import (
- "bytes"
- "database/sql"
- "errors"
- "fmt"
- "io"
-)
-
-var (
- // ErrAssetNotFound is used to indicate an Asset could not be found in the
- // AssetStore.
- ErrAssetNotFound = errors.New("asset not found")
-)
-
-// AssetStore implements the storage and retrieval of binary assets, which are
-// intended to be used by posts (e.g. images).
-type AssetStore interface {
-
- // Set sets the id to the contents of the given io.Reader.
- Set(id string, from io.Reader) error
-
- // Get writes the id's body to the given io.Writer, or returns
- // ErrAssetNotFound.
- Get(id string, into io.Writer) error
-
- // Delete's the body stored for the id, if any.
- Delete(id string) error
-
- // List returns all ids which are currently stored.
- List() ([]string, error)
-}
-
-type assetStore struct {
- db *sql.DB
-}
-
-// NewAssetStore initializes a new AssetStore using an existing SQLDB.
-func NewAssetStore(db *SQLDB) AssetStore {
- return &assetStore{
- db: db.db,
- }
-}
-
-func (s *assetStore) Set(id string, from io.Reader) error {
-
- body, err := io.ReadAll(from)
- if err != nil {
- return fmt.Errorf("reading body fully into memory: %w", err)
- }
-
- _, err = s.db.Exec(
- `INSERT INTO assets (id, body)
- VALUES (?, ?)
- ON CONFLICT (id) DO UPDATE SET body=excluded.body`,
- id, body,
- )
-
- if err != nil {
- return fmt.Errorf("inserting into assets: %w", err)
- }
-
- return nil
-}
-
-func (s *assetStore) Get(id string, into io.Writer) error {
-
- var body []byte
-
- err := s.db.QueryRow(`SELECT body FROM assets WHERE id = ?`, id).Scan(&body)
-
- if errors.Is(err, sql.ErrNoRows) {
- return ErrAssetNotFound
- } else if err != nil {
- return fmt.Errorf("selecting from assets: %w", err)
- }
-
- if _, err := io.Copy(into, bytes.NewReader(body)); err != nil {
- return fmt.Errorf("writing body to io.Writer: %w", err)
- }
-
- return nil
-}
-
-func (s *assetStore) Delete(id string) error {
- _, err := s.db.Exec(`DELETE FROM assets WHERE id = ?`, id)
- return err
-}
-
-func (s *assetStore) List() ([]string, error) {
-
- rows, err := s.db.Query(`SELECT id FROM assets ORDER BY id ASC`)
-
- if err != nil {
- return nil, fmt.Errorf("querying: %w", err)
- }
-
- defer rows.Close()
-
- var ids []string
-
- for rows.Next() {
-
- var id string
- if err := rows.Scan(&id); err != nil {
- return nil, fmt.Errorf("scanning row: %w", err)
- }
-
- ids = append(ids, id)
- }
-
- return ids, nil
-}