Files
wakapi/repositories/duration.go

113 lines
2.9 KiB
Go

package repositories
import (
"time"
conf "github.com/muety/wakapi/config"
"github.com/muety/wakapi/models"
"gorm.io/gorm"
)
type DurationRepository struct {
BaseRepository
config *conf.Config
}
func NewDurationRepository(db *gorm.DB) *DurationRepository {
return &DurationRepository{BaseRepository: NewBaseRepository(db), config: conf.Get()}
}
func (r *DurationRepository) GetAll() ([]*models.Duration, error) {
var durations []*models.Duration
if err := r.db.
Where(&models.Duration{}).
Find(&durations).Error; err != nil {
return nil, err
}
return durations, nil
}
func (r *DurationRepository) StreamAllBatched(batchSize int) (chan []*models.Duration, error) {
out := make(chan []*models.Duration)
rows, err := r.db.Model(&models.Duration{}).Rows()
if err != nil {
return nil, err
}
go streamRowsBatched[models.Duration](rows, out, r.db, batchSize, func(err error) {
conf.Log().Error("failed to scan duration row", "error", err)
})
return out, nil
}
func (r *DurationRepository) StreamByUserBatched(user *models.User, batchSize int) (chan []*models.Duration, error) {
out := make(chan []*models.Duration)
rows, err := r.db.Model(&models.Duration{UserID: user.ID}).Rows()
if err != nil {
return nil, err
}
go streamRowsBatched[models.Duration](rows, out, r.db, batchSize, func(err error) {
conf.Log().Error("failed to scan duration row", "error", err)
})
return out, nil
}
func (r *DurationRepository) GetAllWithin(from, to time.Time, user *models.User) ([]*models.Duration, error) {
return r.GetAllWithinByFilters(from, to, user, map[string][]string{})
}
func (r *DurationRepository) GetAllWithinByFilters(from, to time.Time, user *models.User, filterMap map[string][]string) ([]*models.Duration, error) {
var durations []*models.Duration
q := r.db.
Where(&models.Duration{UserID: user.ID}).
Where("time >= ?", from.Local()).
Where("time < ?", to.Local()).
Order("time asc")
if len(filterMap) > 0 {
q = filteredQuery(q, filterMap)
}
if err := q.Find(&durations).Error; err != nil {
return nil, err
}
return durations, nil
}
func (r *DurationRepository) GetLatestByUser(user *models.User) (*models.Duration, error) {
var duration *models.Duration
err := r.db.
Where(&models.Duration{UserID: user.ID}).
Order("time desc").
First(&duration).
Error
return duration, err
}
func (r *DurationRepository) InsertBatch(durations []*models.Duration) error {
return InsertBatchChunked[*models.Duration](durations, &models.Duration{}, r.db)
}
func (r *DurationRepository) DeleteByUser(user *models.User) error {
if err := r.db.
Where("user_id = ?", user.ID).
Delete(models.Duration{}).Error; err != nil {
return err
}
return nil
}
func (r *DurationRepository) DeleteByUserBefore(user *models.User, t time.Time) error {
if err := r.db.
Where("user_id = ?", user.ID).
Where("time <= ?", t.Local()).
Delete(models.Duration{}).Error; err != nil {
return err
}
return nil
}