feat: problem and submission framework

Co-authored-by: cxy004 <cxy004@qq.com>
Co-authored-by: wzt <w.zhongtao@qq.com>
This commit is contained in:
Paul Pan 2022-10-04 15:31:07 +08:00
parent 2ae99e2636
commit 2cec7d46bc
11 changed files with 90 additions and 13 deletions

1
go.mod
View File

@ -9,6 +9,7 @@ require (
github.com/gin-gonic/gin v1.8.1 github.com/gin-gonic/gin v1.8.1
github.com/go-redis/redis/v8 v8.11.5 github.com/go-redis/redis/v8 v8.11.5
github.com/golang-jwt/jwt/v4 v4.4.2 github.com/golang-jwt/jwt/v4 v4.4.2
github.com/lib/pq v1.10.2
github.com/prometheus/client_golang v1.13.0 github.com/prometheus/client_golang v1.13.0
github.com/swaggo/files v0.0.0-20220728132757-551d4a08d97a github.com/swaggo/files v0.0.0-20220728132757-551d4a08d97a
github.com/swaggo/gin-swagger v1.5.3 github.com/swaggo/gin-swagger v1.5.3

3
go.sum
View File

@ -415,8 +415,9 @@ go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI=
go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA=
go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=

View File

@ -19,13 +19,13 @@ type loginRequest struct {
// @Produce json // @Produce json
// @Param username formData string true "username" // @Param username formData string true "username"
// @Param password formData string true "password" // @Param password formData string true "password"
// @Response 200 {object} e.Response "jwt token" // @Response 200 {object} e.Response "jwt token and user nickname"
// @Router /v1/user/login [post] // @Router /v1/user/login [post]
func (h *handler) Login(c *gin.Context) { func (h *handler) Login(c *gin.Context) {
req := new(loginRequest) req := new(loginRequest)
if err := c.ShouldBind(req); err != nil { if err := c.ShouldBind(req); err != nil {
e.Pong(c, e.InvalidParameter, err.Error()) e.Pong(c, e.InvalidParameter, nil)
return return
} }
@ -52,5 +52,8 @@ func (h *handler) Login(c *gin.Context) {
Version: version, Version: version,
} }
token, status := h.jwtService.SignClaim(claim) token, status := h.jwtService.SignClaim(claim)
e.Pong(c, status, token) e.Pong(c, status, gin.H{
"token": token,
"nickname": user.NickName,
})
} }

View File

@ -34,7 +34,7 @@ func (h *handler) Profile(c *gin.Context) {
req := new(profileRequest) req := new(profileRequest)
if err := c.ShouldBind(req); err == nil { if err := c.ShouldBind(req); err == nil {
if req.UID != 0 && req.UID != uid { if req.UID != 0 && req.UID != uid {
if role >= model.RoleAdmin { if role >= model.RoleGeneral {
uid = req.UID uid = req.UID
} else { } else {
e.Pong(c, e.UserUnauthorized, nil) e.Pong(c, e.UserUnauthorized, nil)

View File

@ -1,6 +1,9 @@
package model package model
import "gorm.io/gorm" import (
"github.com/lib/pq"
"gorm.io/gorm"
)
type Problem struct { type Problem struct {
gorm.Model `json:"meta"` gorm.Model `json:"meta"`
@ -10,5 +13,7 @@ type Problem struct {
MemoryLimit uint `json:"memory_limit" gorm:"not null"` MemoryLimit uint `json:"memory_limit" gorm:"not null"`
ProviderID uint `json:"provider_id" gorm:"not null;index"` ProviderID uint `json:"provider_id" gorm:"not null;index"`
Provider User `json:"-" gorm:"foreignKey:ProviderID"` Provider User `json:"-" gorm:"foreignKey:ProviderID"`
Languages pq.Int32Array `json:"languages" gorm:"type:int[]"`
Points pq.Int32Array `json:"points" gorm:"type:int[]"`
IsEnabled bool `json:"is_enabled" gorm:"not null;index"` IsEnabled bool `json:"is_enabled" gorm:"not null;index"`
} }

View File

@ -0,0 +1,11 @@
package model
import "gorm.io/gorm"
type Status struct {
gorm.Model `json:"-"`
SubmissionID uint `json:"submission_id" gorm:"not null;index"`
Submission Submission `json:"-" gorm:"foreignKey:SubmissionID"`
Verdict Verdict `json:"verdict" gorm:"not null"`
Point int32 `json:"point" gorm:"not null"`
}

View File

@ -0,0 +1,13 @@
package model
import "gorm.io/gorm"
type Submission struct {
gorm.Model `json:"-"`
ProblemID uint `json:"problem_id" gorm:"not null;index"`
Problem Problem `json:"-" gorm:"foreignKey:ProblemID"`
UserID uint `json:"user_id" gorm:"not null;index"`
User User `json:"-" gorm:"foreignKey:UserID"`
Language Lang `json:"language" gorm:"not null"`
Code string `json:"code" gorm:"not null"`
}

View File

@ -0,0 +1,17 @@
package model
type Verdict int
const (
VerdictJudging Verdict = 1
VerdictAccepted Verdict = 2
VerdictWrongAnswer Verdict = 3
VerdictTimeLimitExceeded Verdict = 4
VerdictMemoryLimitExceeded Verdict = 5
VerdictRuntimeError Verdict = 6
VerdictCompileError Verdict = 7
VerdictSystemError Verdict = 8
VerdictJuryFailed Verdict = 9
VerdictSkipped Verdict = 10
VerdictPartiallyCorrect Verdict = 11
)

View File

@ -83,6 +83,7 @@ func (r *Repo) migrateDatabase() {
_ = r.db.AutoMigrate(&model.User{}) _ = r.db.AutoMigrate(&model.User{})
_ = r.db.AutoMigrate(&model.Problem{}) _ = r.db.AutoMigrate(&model.Problem{})
_ = r.db.AutoMigrate(&model.Submission{})
} }
// checkAlive deprecated // checkAlive deprecated

View File

@ -0,0 +1,24 @@
package submission
import (
"github.com/WHUPRJ/woj-server/internal/global"
"github.com/WHUPRJ/woj-server/internal/repo/amqp"
"go.uber.org/zap"
)
var _ Service = (*service)(nil)
type Service interface {
}
type service struct {
log *zap.Logger
mq *amqp.Repo
}
func NewService(g *global.Global) Service {
return &service{
log: g.Log,
mq: g.Mq.Get().(*amqp.Repo),
}
}

View File

@ -0,0 +1 @@
package submission