/
repository.go
92 lines (83 loc) · 2.41 KB
/
repository.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
package ranklists
import (
"github.com/infinity-oj/server-v2/pkg/models"
"github.com/spf13/cast"
"go.uber.org/zap"
"gorm.io/gorm"
"gorm.io/gorm/clause"
)
type Repository interface {
CreateRankList() (p *models.RankList, err error)
CreateRankListModel(id uint64) (*models.RankListModel, error)
CreateRankListRecord(rl *models.RankList, account *models.Account, key string, value interface{}) (*models.RankListRecord, error)
GetRankList(id uint64) (*models.RankList, error)
GetRankListsByProblem(problem *models.Problem) ([]*models.RankList, error)
}
type repository struct {
logger *zap.Logger
db *gorm.DB
}
func (m repository) GetRankListsByProblem(problem *models.Problem) ([]*models.RankList, error) {
var rl []*models.RankList
if err := m.db.Model(&models.RankList{}).Where("problem_id = ?", problem.ID).Find(&rl).Error; err != nil {
return nil, err
}
return rl, nil
}
func (m repository) CreateRankListModel(id uint64) (*models.RankListModel, error) {
rm := &models.RankListModel{
RankListID: 0,
Key: "key",
Priority: 1,
Order: "dec",
}
if err := m.db.Create(&rm).Error; err != nil {
return nil, err
}
return rm, nil
}
func (m repository) CreateRankListRecord(rl *models.RankList, account *models.Account, key string, value interface{}) (*models.RankListRecord, error) {
rlc := &models.RankListRecord{
RankListID: rl.ID,
AccountID: account.ID,
Account: *account,
Key: key,
Value: cast.ToFloat64(value),
}
if err := m.db.Model(rlc).Create(rlc).Error; err != nil {
m.logger.Error("create rank list record error",
zap.Any("rank list", rl), zap.Any("record", rlc), zap.Error(err))
return nil, err
}
return rlc, nil
}
func (m repository) GetRankList(id uint64) (*models.RankList, error) {
rl := &models.RankList{}
if err := m.db.Model(rl).Preload("Records.Account").Preload(clause.Associations).First(rl, id).Error; err != nil {
return nil, err
}
return rl, nil
}
func (m repository) CreateRankList() (rl *models.RankList, err error) {
rl = &models.RankList{
Model: models.Model{},
ProblemID: 0,
Name: "",
Title: "",
Models: []models.RankListModel{
{
Key: "score",
Priority: 0,
Order: "inc",
},
},
Records: nil,
}
return rl, m.db.Create(rl).Error
}
func NewRepository(logger *zap.Logger, db *gorm.DB) Repository {
return &repository{
logger: logger.With(zap.String("type", " repository")),
db: db,
}
}