apollo-backend/internal/repository/postgres_subreddit.go

96 lines
2 KiB
Go
Raw Permalink Normal View History

2021-09-25 16:56:01 +00:00
package repository
import (
"context"
"strings"
"github.com/christianselig/apollo-backend/internal/domain"
"github.com/jackc/pgx/v4/pgxpool"
)
type postgresSubredditRepository struct {
pool *pgxpool.Pool
}
func NewPostgresSubreddit(pool *pgxpool.Pool) domain.SubredditRepository {
return &postgresSubredditRepository{pool: pool}
}
func (p *postgresSubredditRepository) fetch(ctx context.Context, query string, args ...interface{}) ([]domain.Subreddit, error) {
rows, err := p.pool.Query(ctx, query, args...)
if err != nil {
return nil, err
}
defer rows.Close()
var srs []domain.Subreddit
for rows.Next() {
var sr domain.Subreddit
if err := rows.Scan(
&sr.ID,
&sr.SubredditID,
&sr.Name,
2021-10-09 14:59:20 +00:00
&sr.LastCheckedAt,
2021-09-25 16:56:01 +00:00
); err != nil {
return nil, err
}
srs = append(srs, sr)
}
return srs, nil
}
func (p *postgresSubredditRepository) GetByID(ctx context.Context, id int64) (domain.Subreddit, error) {
query := `
2021-10-09 14:59:20 +00:00
SELECT id, subreddit_id, name, last_checked_at
2021-09-25 16:56:01 +00:00
FROM subreddits
WHERE id = $1`
srs, err := p.fetch(ctx, query, id)
if err != nil {
return domain.Subreddit{}, err
}
if len(srs) == 0 {
return domain.Subreddit{}, domain.ErrNotFound
}
return srs[0], nil
}
func (p *postgresSubredditRepository) GetByName(ctx context.Context, name string) (domain.Subreddit, error) {
query := `
2021-10-09 14:59:20 +00:00
SELECT id, subreddit_id, name, last_checked_at
2021-09-25 16:56:01 +00:00
FROM subreddits
WHERE name = $1`
name = strings.ToLower(name)
srs, err := p.fetch(ctx, query, name)
if err != nil {
return domain.Subreddit{}, err
}
if len(srs) == 0 {
return domain.Subreddit{}, domain.ErrNotFound
}
return srs[0], nil
}
func (p *postgresSubredditRepository) CreateOrUpdate(ctx context.Context, sr *domain.Subreddit) error {
2021-10-12 14:18:40 +00:00
if err := sr.Validate(); err != nil {
return err
}
2021-09-25 16:56:01 +00:00
query := `
INSERT INTO subreddits (subreddit_id, name)
VALUES ($1, $2)
2021-10-10 15:51:42 +00:00
ON CONFLICT(subreddit_id) DO NOTHING
2021-09-25 16:56:01 +00:00
RETURNING id`
return p.pool.QueryRow(
ctx,
query,
sr.SubredditID,
sr.NormalizedName(),
).Scan(&sr.ID)
}