feat: add problem service

This commit is contained in:
Paul Pan 2022-09-20 16:42:57 +08:00
parent 5b5bf0a070
commit 8d01144d8b
8 changed files with 117 additions and 4 deletions

View File

@ -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",
}

View 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"`
}

View File

@ -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

View 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
}

View 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
}

View 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
}

View 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),
}
}

View File

@ -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