-
Notifications
You must be signed in to change notification settings - Fork 0
/
use_case.go
85 lines (67 loc) · 1.62 KB
/
use_case.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
package initialize
import (
"context"
"errors"
"github.com/devdammit/shekel/cmd/unit/internal/entities"
"github.com/devdammit/shekel/pkg/pointer"
"github.com/devdammit/shekel/pkg/types/datetime"
)
type PeriodsRepository interface {
GetCount(ctx context.Context) (uint64, error)
}
type UnitOfWork interface {
SetStartDate(date datetime.Date)
CreatePeriod(period entities.Period) error
Commit(ctx context.Context) error
}
type DateTimeProvider interface {
Now() datetime.DateTime
}
type UseCase struct {
periods PeriodsRepository
dateTime DateTimeProvider
unit UnitOfWork
}
func NewUseCase(
periods PeriodsRepository,
provider DateTimeProvider,
unit UnitOfWork,
) *UseCase {
return &UseCase{
periods: periods,
dateTime: provider,
unit: unit,
}
}
func (uc *UseCase) Execute(ctx context.Context, startDate datetime.Date) error {
count, err := uc.periods.GetCount(ctx)
if err != nil {
return err
}
if count > 0 {
return errors.New("periods already initialized")
}
uc.unit.SetStartDate(startDate)
sequenceOfYear := uint8(1)
for date := startDate; date.Before(uc.dateTime.Now().Time); date = datetime.NewDate(date.AddDate(0, 1, 0)) {
period := entities.Period{
CreatedAt: datetime.NewDateTime(date.Time),
}
if date.AddDate(0, 1, 0).After(uc.dateTime.Now().Time) {
period.ClosedAt = nil
} else {
period.ClosedAt = pointer.Ptr(datetime.NewDateTime(date.AddDate(0, 1, 0)))
}
period.SequenceOfYear = sequenceOfYear
err = uc.unit.CreatePeriod(period)
if err != nil {
return err
}
sequenceOfYear++
}
err = uc.unit.Commit(ctx)
if err != nil {
return err
}
return nil
}