feat: add problem service
This commit is contained in:
parent
5b5bf0a070
commit
8d01144d8b
@ -8,6 +8,7 @@ const (
|
||||
InvalidParameter Status = 101
|
||||
NotFound Status = 102
|
||||
DatabaseError Status = 103
|
||||
RedisError Status = 104
|
||||
|
||||
TokenUnknown Status = 200
|
||||
TokenEmpty Status = 201
|
||||
@ -24,7 +25,7 @@ const (
|
||||
UserUnauthorized Status = 304
|
||||
UserDisabled Status = 305
|
||||
|
||||
RedisError Status = 400
|
||||
ProblemNotFound Status = 500
|
||||
)
|
||||
|
||||
var msgText = map[Status]string{
|
||||
@ -35,6 +36,7 @@ var msgText = map[Status]string{
|
||||
InvalidParameter: "Invalid Parameter",
|
||||
NotFound: "Not Found",
|
||||
DatabaseError: "Database Error",
|
||||
RedisError: "Redis Error",
|
||||
|
||||
TokenUnknown: "Unknown Error (Token)",
|
||||
TokenEmpty: "Token Empty",
|
||||
@ -51,5 +53,5 @@ var msgText = map[Status]string{
|
||||
UserUnauthorized: "User Unauthorized",
|
||||
UserDisabled: "User Disabled",
|
||||
|
||||
RedisError: "Redis Error",
|
||||
ProblemNotFound: "Problem Not Found",
|
||||
}
|
||||
|
14
internal/repo/model/Problem.go
Normal file
14
internal/repo/model/Problem.go
Normal file
@ -0,0 +1,14 @@
|
||||
package model
|
||||
|
||||
import "gorm.io/gorm"
|
||||
|
||||
type Problem struct {
|
||||
gorm.Model `json:"-"`
|
||||
Title string `json:"title" gorm:"not null"`
|
||||
Content string `json:"content" gorm:"not null"`
|
||||
TimeLimit uint `json:"time_limit" gorm:"not null"`
|
||||
MemoryLimit uint `json:"memory_limit" gorm:"not null"`
|
||||
ProviderID uint `json:"provider_id" gorm:"not null;index"`
|
||||
Provider User `json:"provider" gorm:"foreignKey:ProviderID"`
|
||||
IsEnabled bool `json:"is_enabled" gorm:"not null;index"`
|
||||
}
|
@ -82,6 +82,7 @@ func (r *Repo) migrateDatabase() {
|
||||
r.log.Info("Auto Migrating database...")
|
||||
|
||||
_ = r.db.AutoMigrate(&model.User{})
|
||||
_ = r.db.AutoMigrate(&model.Problem{})
|
||||
}
|
||||
|
||||
// checkAlive deprecated
|
||||
|
19
internal/service/problem/create.go
Normal file
19
internal/service/problem/create.go
Normal file
@ -0,0 +1,19 @@
|
||||
package problem
|
||||
|
||||
import (
|
||||
"github.com/WHUPRJ/woj-server/internal/e"
|
||||
"github.com/WHUPRJ/woj-server/internal/repo/model"
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
func (s *service) Create(uid uint, problem *model.Problem) (*model.Problem, e.Status) {
|
||||
problem.ProviderID = uid
|
||||
problem.IsEnabled = true
|
||||
|
||||
if err := s.db.Create(problem).Error; err != nil {
|
||||
s.log.Debug("create problem error", zap.Error(err), zap.Any("problem", problem))
|
||||
return nil, e.DatabaseError
|
||||
}
|
||||
|
||||
return problem, e.Success
|
||||
}
|
23
internal/service/problem/query.go
Normal file
23
internal/service/problem/query.go
Normal file
@ -0,0 +1,23 @@
|
||||
package problem
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"github.com/WHUPRJ/woj-server/internal/e"
|
||||
"github.com/WHUPRJ/woj-server/internal/repo/model"
|
||||
"gorm.io/gorm"
|
||||
"gorm.io/gorm/clause"
|
||||
)
|
||||
|
||||
func (s *service) Query(problemId uint) (*model.Problem, e.Status) {
|
||||
problem := new(model.Problem)
|
||||
|
||||
err := s.db.Preload(clause.Associations).First(&problem, problemId).Error
|
||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
return nil, e.ProblemNotFound
|
||||
}
|
||||
if err != nil {
|
||||
return nil, e.DatabaseError
|
||||
}
|
||||
|
||||
return problem, e.Success
|
||||
}
|
25
internal/service/problem/queryFuzz.go
Normal file
25
internal/service/problem/queryFuzz.go
Normal file
@ -0,0 +1,25 @@
|
||||
package problem
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"github.com/WHUPRJ/woj-server/internal/e"
|
||||
"github.com/WHUPRJ/woj-server/internal/repo/model"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
func (s *service) QueryFuzz(search string) ([]*model.Problem, e.Status) {
|
||||
var problems []*model.Problem
|
||||
|
||||
err := s.db.
|
||||
Where("title LIKE ?", "%"+search+"%").
|
||||
Or("content LIKE ?", "%"+search+"%").
|
||||
Find(&problems).Error
|
||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
return nil, e.ProblemNotFound
|
||||
}
|
||||
if err != nil {
|
||||
return nil, e.DatabaseError
|
||||
}
|
||||
|
||||
return problems, e.Success
|
||||
}
|
29
internal/service/problem/service.go
Normal file
29
internal/service/problem/service.go
Normal file
@ -0,0 +1,29 @@
|
||||
package problem
|
||||
|
||||
import (
|
||||
"github.com/WHUPRJ/woj-server/internal/e"
|
||||
"github.com/WHUPRJ/woj-server/internal/global"
|
||||
"github.com/WHUPRJ/woj-server/internal/repo/model"
|
||||
"go.uber.org/zap"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
var _ Service = (*service)(nil)
|
||||
|
||||
type Service interface {
|
||||
Create(uint, *model.Problem) (*model.Problem, e.Status)
|
||||
Query(uint) (*model.Problem, e.Status)
|
||||
QueryFuzz(string) ([]*model.Problem, e.Status)
|
||||
}
|
||||
|
||||
type service struct {
|
||||
log *zap.Logger
|
||||
db *gorm.DB
|
||||
}
|
||||
|
||||
func NewProblemService(g *global.Global) Service {
|
||||
return &service{
|
||||
log: g.Log,
|
||||
db: g.Db.Get().(*gorm.DB),
|
||||
}
|
||||
}
|
@ -12,10 +12,10 @@ func (s *service) Profile(id uint) (*model.User, e.Status) {
|
||||
|
||||
err := s.db.First(&user, id).Error
|
||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
return user, e.UserNotFound
|
||||
return nil, e.UserNotFound
|
||||
}
|
||||
if err != nil {
|
||||
return user, e.DatabaseError
|
||||
return nil, e.DatabaseError
|
||||
}
|
||||
|
||||
return user, e.Success
|
||||
|
Loading…
Reference in New Issue
Block a user