🏡 index : quine-global/quintodrome.git

package persistence

import (
	"context"
	"time"

	. "github.com/Masterminds/squirrel"
	"github.com/deluan/rest"
	"github.com/navidrome/navidrome/model"
	"github.com/pocketbase/dbx"
)

type scrobbleRepository struct {
	sqlRepository
}

func fromTs(_ string, value any) Sqlizer {
	return GtOrEq{"scrobbles.submission_time": value}
}

func toTs(_ string, value any) Sqlizer {
	return LtOrEq{"scrobbles.submission_time": value}
}

func (r *scrobbleRepository) baseQuery(ctx context.Context, options ...model.QueryOptions) SelectBuilder {
	user := loggedUser(ctx)

	return r.newSelect(ctx, options...).
		Columns("id", "media_file_id", "submission_time").
		Where(Eq{"scrobbles.user_id": user.ID})
}

func NewScrobbleRepository(db dbx.Builder) model.ScrobbleRepository {
	r := &scrobbleRepository{}
	r.db = db
	r.tableName = "scrobbles"
	r.registerModel(&model.Scrobble{}, map[string]filterFunc{
		"from": fromTs,
		"to":   toTs,
	})
	r.setSortMappings(map[string]string{
		"submission_time": "submission_time",
	})
	return r
}

func (r *scrobbleRepository) RecordScrobble(ctx context.Context, mediaFileID string, submissionTime time.Time) error {
	userID := loggedUser(ctx).ID
	values := map[string]any{
		"media_file_id":   mediaFileID,
		"user_id":         userID,
		"submission_time": submissionTime.Unix(),
	}
	insert := Insert(r.tableName).SetMap(values)
	_, err := r.executeSQL(ctx, insert)
	return err
}

func (r *scrobbleRepository) CountAll(ctx context.Context, options ...model.QueryOptions) (int64, error) {
	return r.count(ctx, r.baseQuery(ctx), options...)
}

func (r *scrobbleRepository) Count(ctx context.Context, options ...rest.QueryOptions) (int64, error) {
	return r.CountAll(ctx, r.parseRestOptions(ctx, options...))
}

func (r *scrobbleRepository) Get(ctx context.Context, id string) (*model.Scrobble, error) {
	sel := r.baseQuery(ctx).Where(Eq{"id": id})
	var res model.Scrobble
	err := r.queryOne(ctx, sel, &res)
	return &res, err
}

func (r *scrobbleRepository) GetAll(ctx context.Context, options ...model.QueryOptions) (model.Scrobbles, error) {
	sel := r.baseQuery(ctx, options...)
	var scrobbles model.Scrobbles
	err := r.queryAll(ctx, sel, &scrobbles)
	return scrobbles, err
}

func (r *scrobbleRepository) Read(ctx context.Context, id string) (*model.Scrobble, error) {
	return r.Get(ctx, id)
}

func (r *scrobbleRepository) ReadAll(ctx context.Context, options ...rest.QueryOptions) ([]model.Scrobble, error) {
	return r.GetAll(ctx, r.parseRestOptions(ctx, options...))
}

var _ model.ScrobbleRepository = (*scrobbleRepository)(nil)
var _ rest.Repository[model.Scrobble] = (*scrobbleRepository)(nil)