134 lines
2.6 KiB
Go
134 lines
2.6 KiB
Go
package repository
|
|
|
|
import (
|
|
"context"
|
|
"database/sql"
|
|
|
|
"github.com/google/uuid"
|
|
"github.com/marcopiovanello/yt-dlp-web-ui/v3/server/subscription/data"
|
|
"github.com/marcopiovanello/yt-dlp-web-ui/v3/server/subscription/domain"
|
|
)
|
|
|
|
type Repository struct {
|
|
db *sql.DB
|
|
}
|
|
|
|
// Delete implements domain.Repository.
|
|
func (r *Repository) Delete(ctx context.Context, id string) error {
|
|
conn, err := r.db.Conn(ctx)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
defer conn.Close()
|
|
|
|
_, err = conn.ExecContext(ctx, "DELETE FROM subscriptions WHERE id = ?", id)
|
|
|
|
return err
|
|
}
|
|
|
|
// GetCursor implements domain.Repository.
|
|
func (r *Repository) GetCursor(ctx context.Context, id string) (int64, error) {
|
|
conn, err := r.db.Conn(ctx)
|
|
if err != nil {
|
|
return -1, err
|
|
}
|
|
|
|
defer conn.Close()
|
|
|
|
row := conn.QueryRowContext(ctx, "SELECT rowid FROM subscriptions WHERE id = ?", id)
|
|
|
|
var rowId int64
|
|
|
|
if err := row.Scan(&rowId); err != nil {
|
|
return -1, err
|
|
}
|
|
|
|
return rowId, nil
|
|
}
|
|
|
|
// List implements domain.Repository.
|
|
func (r *Repository) List(ctx context.Context, start int64, limit int) (*[]data.Subscription, error) {
|
|
conn, err := r.db.Conn(ctx)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
defer conn.Close()
|
|
|
|
var elements []data.Subscription
|
|
|
|
rows, err := conn.QueryContext(ctx, "SELECT rowid, * FROM subscriptions WHERE rowid > ? LIMIT ?", start, limit)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
for rows.Next() {
|
|
var rowId int64
|
|
var element data.Subscription
|
|
|
|
if err := rows.Scan(
|
|
&rowId,
|
|
&element.Id,
|
|
&element.URL,
|
|
&element.Params,
|
|
&element.CronExpr,
|
|
); err != nil {
|
|
return &elements, err
|
|
}
|
|
|
|
elements = append(elements, element)
|
|
}
|
|
|
|
return &elements, nil
|
|
}
|
|
|
|
// Submit implements domain.Repository.
|
|
func (r *Repository) Submit(ctx context.Context, sub *data.Subscription) (*data.Subscription, error) {
|
|
conn, err := r.db.Conn(ctx)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
defer conn.Close()
|
|
|
|
_, err = conn.ExecContext(
|
|
ctx,
|
|
"INSERT INTO subscriptions (id, url, params, cron) VALUES (?, ?, ?, ?)",
|
|
uuid.NewString(),
|
|
sub.URL,
|
|
sub.Params,
|
|
sub.CronExpr,
|
|
)
|
|
|
|
return sub, err
|
|
}
|
|
|
|
// UpdateByExample implements domain.Repository.
|
|
func (r *Repository) UpdateByExample(ctx context.Context, example *data.Subscription) error {
|
|
conn, err := r.db.Conn(ctx)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
defer conn.Close()
|
|
|
|
_, err = conn.ExecContext(
|
|
ctx,
|
|
"UPDATE subscriptions SET url = ?, params = ?, cron = ? WHERE id = ? OR url = ?",
|
|
example.URL,
|
|
example.Params,
|
|
example.CronExpr,
|
|
example.Id,
|
|
example.URL,
|
|
)
|
|
|
|
return err
|
|
}
|
|
|
|
func New(db *sql.DB) domain.Repository {
|
|
return &Repository{
|
|
db: db,
|
|
}
|
|
}
|