From 7872296b838f4d1b26c6a0a01d79d27fe5ab44cc Mon Sep 17 00:00:00 2001 From: Brian Picciano Date: Sat, 15 Apr 2023 21:07:16 +0200 Subject: Move asset store into its own package --- src/post/asset.go | 114 ------------------------------------------------------ 1 file changed, 114 deletions(-) delete mode 100644 src/post/asset.go (limited to 'src/post/asset.go') 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 -} -- cgit v1.2.3