110 lines
3.3 KiB
Go

package ds
import (
"context"
"time"
"github.com/oklog/ulid/v2"
"github.com/timetracker/backend/internal/domain/entities"
"github.com/timetracker/backend/internal/domain/persistence"
"github.com/timetracker/backend/internal/infrastructure/persistence/db/dbo"
"gorm.io/gorm"
)
type TimeEntryDatasource struct {
db *gorm.DB
}
func NewTimeEntryDatasource(db *gorm.DB) persistence.TimeEntryDatasource {
return &TimeEntryDatasource{db: db}
}
func (r *TimeEntryDatasource) Get(ctx context.Context, id ulid.ULID) (*entities.TimeEntry, error) {
var timeEntryDBO dbo.TimeEntryDBO
if err := r.db.WithContext(ctx).First(&timeEntryDBO, "id = ?", id).Error; err != nil {
return nil, err
}
timeEntry := &entities.TimeEntry{
EntityBase: entities.EntityBase{
ID: timeEntryDBO.ID,
CreatedAt: timeEntryDBO.CreatedAt,
UpdatedAt: timeEntryDBO.UpdatedAt,
},
UserID: timeEntryDBO.UserID,
ProjectID: timeEntryDBO.ProjectID,
ActivityID: timeEntryDBO.ActivityID,
Start: timeEntryDBO.Start,
End: timeEntryDBO.End,
Description: timeEntryDBO.Description,
Billable: timeEntryDBO.Billable,
}
return timeEntry, nil
}
func (r *TimeEntryDatasource) Create(ctx context.Context, timeEntry *entities.TimeEntry) error {
timeEntryDBO := dbo.TimeEntryDBO{
ID: timeEntry.ID,
CreatedAt: timeEntry.CreatedAt,
UpdatedAt: timeEntry.UpdatedAt,
UserID: timeEntry.UserID,
ProjectID: timeEntry.ProjectID,
ActivityID: timeEntry.ActivityID,
Start: timeEntry.Start,
End: timeEntry.End,
Description: timeEntry.Description,
Billable: timeEntry.Billable,
}
return r.db.WithContext(ctx).Create(&timeEntryDBO).Error
}
func (r *TimeEntryDatasource) Update(ctx context.Context, timeEntry *entities.TimeEntry) error {
timeEntryDBO := dbo.TimeEntryDBO{
ID: timeEntry.ID,
CreatedAt: timeEntry.CreatedAt,
UpdatedAt: timeEntry.UpdatedAt,
UserID: timeEntry.UserID,
ProjectID: timeEntry.ProjectID,
ActivityID: timeEntry.ActivityID,
Start: timeEntry.Start,
End: timeEntry.End,
Description: timeEntry.Description,
Billable: timeEntry.Billable,
}
return r.db.WithContext(ctx).Save(&timeEntryDBO).Error
}
func (r *TimeEntryDatasource) Delete(ctx context.Context, id ulid.ULID) error {
return r.db.WithContext(ctx).Delete(&dbo.TimeEntryDBO{}, "id = ?", id).Error
}
func (r *TimeEntryDatasource) GetByRange(ctx context.Context, userID ulid.ULID, from time.Time, to time.Time) ([]*entities.TimeEntry, error) {
var timeEntryDBOs []*dbo.TimeEntryDBO
if err := r.db.WithContext(ctx).Where("user_id = ? AND start_time >= ? AND end_time <= ?", userID, from, to).Find(&timeEntryDBOs).Error; err != nil {
return nil, err
}
timeEntries := make([]*entities.TimeEntry, len(timeEntryDBOs))
for i, timeEntryDBO := range timeEntryDBOs {
timeEntries[i] = &entities.TimeEntry{
EntityBase: entities.EntityBase{
ID: timeEntryDBO.ID,
CreatedAt: timeEntryDBO.CreatedAt,
UpdatedAt: timeEntryDBO.UpdatedAt,
},
UserID: timeEntryDBO.UserID,
ProjectID: timeEntryDBO.ProjectID,
ActivityID: timeEntryDBO.ActivityID,
Start: timeEntryDBO.Start,
End: timeEntryDBO.End,
Description: timeEntryDBO.Description,
Billable: timeEntryDBO.Billable,
}
}
return timeEntries, nil
}