mirror of
https://github.com/muety/wakapi.git
synced 2025-12-05 22:20:24 -08:00
113 lines
2.9 KiB
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
|
|
}
|