/
workflow.go
123 lines (97 loc) · 2.8 KB
/
workflow.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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
package workflow
import (
"context"
"errors"
"strings"
"github.com/trenddapp/backend/service/wordle/pkg/model"
"github.com/trenddapp/backend/service/wordle/pkg/repository/word"
"github.com/trenddapp/backend/service/wordle/pkg/repository/wordle"
)
type Engine struct {
wordRepository word.Repository
wordleRepository wordle.Repository
}
func NewEngine(
wordRepository word.Repository,
wordleRepository wordle.Repository,
) *Engine {
return &Engine{
wordRepository: wordRepository,
wordleRepository: wordleRepository,
}
}
func (e Engine) GetWordle(ctx context.Context, id string, opts ...wordle.Option) (model.Wordle, error) {
out, err := e.wordleRepository.GetWordle(ctx, id, opts...)
if err != nil {
return model.Wordle{}, err
}
return out, nil
}
func (e Engine) CreateWordle(ctx context.Context, in model.Wordle) (model.Wordle, error) {
word, err := e.wordRepository.GetRandomWord(ctx, "en_US")
if err != nil {
return model.Wordle{}, err
}
in.Solution = word.Value
out, err := e.wordleRepository.CreateWordle(ctx, in)
if err != nil {
return model.Wordle{}, err
}
return out, nil
}
func (e Engine) UpdateWordle(ctx context.Context, in model.Wordle, opts ...wordle.Option) (model.Wordle, error) {
out, err := e.wordleRepository.GetWordle(ctx, in.ID, wordle.WithUserID(in.UserID))
if err != nil {
return model.Wordle{}, err
}
if out.Status == model.StatusComplete {
return model.Wordle{}, errors.New("cannot update complete wordle")
}
if len(in.Guesses) > 6 || len(in.Guesses) < len(out.Guesses) {
return model.Wordle{}, errors.New("invalid guesses length")
}
for i, guess := range out.Guesses {
if in.Guesses[i] == guess {
continue
}
return model.Wordle{}, errors.New("cannot change old guesses")
}
if len(in.Guesses) == 6 {
in.Status = model.StatusComplete
}
for _, guess := range in.Guesses {
word := model.Word{
Locale: "en_US",
Value: strings.ToLower(guess),
}
isValidWord, err := e.wordRepository.IsValidWord(ctx, word)
if err != nil {
return model.Wordle{}, err
}
if !isValidWord {
return model.Wordle{}, errors.New("invalid word")
}
if guess == out.Solution {
in.Status = model.StatusComplete
}
}
out, err = e.wordleRepository.UpdateWordle(ctx, in, opts...)
if err != nil {
return model.Wordle{}, err
}
return out, nil
}
func (e Engine) DeleteWordle(ctx context.Context, id string, opts ...wordle.Option) (model.Wordle, error) {
out, err := e.wordleRepository.DeleteWordle(ctx, id, opts...)
if err != nil {
return model.Wordle{}, err
}
return out, err
}
func (e Engine) ListWordles(ctx context.Context, opts ...wordle.Option) ([]model.Wordle, string, error) {
wordles, nextPageToken, err := e.wordleRepository.ListWordles(ctx, opts...)
if err != nil {
return nil, "", err
}
return wordles, nextPageToken, nil
}