/
character.go
75 lines (64 loc) · 1.7 KB
/
character.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
package repositorygorm
import (
"context"
"github.com/akbarpambudi/go-rpg-game/internal/app/entity"
"github.com/akbarpambudi/go-rpg-game/internal/app/entity/predicate"
"gorm.io/gorm"
)
type CharacterOptions struct {
DB *gorm.DB
}
type Character struct {
opts *CharacterOptions
}
func NewCharacter(opts *CharacterOptions) *Character {
return &Character{opts: opts}
}
func (c Character) CreateOrUpdate(ctx context.Context, chara *entity.Character) error {
return c.opts.
DB.
WithContext(ctx).
Save(chara).Error
}
func (c Character) LoadByID(ctx context.Context, id uint) (*entity.Character, error) {
chara := entity.Character{}
err := c.opts.
DB.
WithContext(ctx).
Joins("Stat").
Joins("State").
Find(&chara, id).
Error
if err != nil {
return nil, err
}
return &chara, nil
}
func (c Character) LoadMany(ctx context.Context, predicate predicate.Character) ([]*entity.Character, error) {
var charas []*entity.Character
structQuery, fields := c.predicateToGormStructCondition(predicate)
err := c.opts.
DB.
WithContext(ctx).
Where(structQuery, fields).
Joins("Stat").
Joins("State").
Find(&charas).
Error
if err != nil {
return nil, err
}
return charas, nil
}
func (c Character) RemoveByID(ctx context.Context, id uint) error {
return c.opts.DB.WithContext(ctx).Delete(&entity.Character{}, id).Error
}
func (c Character) predicateToGormStructCondition(pred predicate.Character) (queryStruct interface{}, fields []interface{}) {
var affectedFields []interface{}
structQuery := pred()
affectedFieldsInArrayString := structQuery.FilledFields()
for _, f := range affectedFieldsInArrayString {
affectedFields = append(affectedFields, f)
}
return structQuery, affectedFields
}