153 lines
4.3 KiB
Go
153 lines
4.3 KiB
Go
package api
|
||
|
||
import (
|
||
"github.com/gin-gonic/gin"
|
||
db "main.go/database"
|
||
."main.go/type"
|
||
"strconv"
|
||
)
|
||
|
||
//GetAllSolves 获取所有解题记录
|
||
func GetAllSolves(c *gin.Context){
|
||
var solves []SolveResponse
|
||
|
||
if err := getAllSolves(&solves); err != nil {
|
||
c.JSON(400, gin.H{"code": 400, "msg": "Get all solves failure!"})
|
||
return
|
||
}
|
||
|
||
c.JSON(200, gin.H{"code": 200, "data": solves})
|
||
}
|
||
//GetSolvesByCid 获取某个用户的所有解题记录
|
||
func GetSolvesByCid(c *gin.Context){
|
||
var solves []SolveResponse
|
||
|
||
cid, err := strconv.ParseInt(c.Param("cid"), 10, 64)
|
||
if err != nil {
|
||
c.JSON(400, gin.H{"code": 400, "msg": "Get solves failure!"})
|
||
return
|
||
}
|
||
|
||
if err := getSolvesByCid(&solves, int(cid)); err != nil {
|
||
c.JSON(400, gin.H{"code": 400, "msg": "Get solves failure!"})
|
||
return
|
||
}
|
||
|
||
c.JSON(200, gin.H{"code": 200, "data": solves})
|
||
}
|
||
|
||
// GetSolvesByUid 根据用户id获取正确的flag提交记录。
|
||
func GetSolvesByUid(c *gin.Context) {
|
||
uid, err := strconv.ParseInt(c.Param("uid"), 10, 64)
|
||
if err != nil {
|
||
|
||
c.JSON(400, gin.H{"code": 400, "msg": "Wrong uid!"})
|
||
return
|
||
}
|
||
|
||
if uid == 1 {
|
||
c.JSON(400, gin.H{"code": 400, "msg": "Not allowed!"})
|
||
return
|
||
}
|
||
|
||
var solves []SolveResponse
|
||
if err := getSolvesByUid(&solves, int(uid)); err != nil {
|
||
c.JSON(400, gin.H{"code": 400, "msg": "Get specified solves failure!"})
|
||
return
|
||
}
|
||
|
||
c.JSON(200, gin.H{"code": 200, "data": solves})
|
||
}
|
||
|
||
// GetSelfSolves 获取当前用户的所有解题记录
|
||
func GetSelfSolves(c *gin.Context){
|
||
var solves []SolveResponse
|
||
|
||
session, err := Store.Get(c.Request, "SNCTFSESSID")
|
||
if err != nil {
|
||
c.JSON(200, gin.H{"code": 400, "msg": "Get SNCTFSESSID error"})
|
||
return
|
||
}
|
||
user, ok := session.Values["user"].(User)
|
||
if !ok {
|
||
c.JSON(200, gin.H{"code": 400, "msg": "No session"})
|
||
return
|
||
}
|
||
|
||
if err := getSolvesByUid(&solves, user.ID); err != nil {
|
||
c.JSON(400, gin.H{"code": 400, "msg": "Get self solves failure!"})
|
||
return
|
||
}
|
||
|
||
c.JSON(200, gin.H{"code": 200, "data": solves})
|
||
}
|
||
|
||
// getSolverCount 操作数据库获取指定id题目的解出人数。
|
||
func getSolverCount(id int) (count int, err error) {
|
||
Link()
|
||
DB := db.DBsnctf
|
||
//SELECT COUNT(*) FROM solve WHERE cid = ?;
|
||
err = DB.Table("solve").Select("COUNT(*)").Where("cid = ?", id).Scan(&count).Error
|
||
if err != nil {
|
||
return 0, err
|
||
}
|
||
return count, nil
|
||
}
|
||
|
||
|
||
|
||
// getAllSolves 操作数据库获取所有正确的提交记录,按提交时间从早到晚排序。
|
||
func getAllSolves(solves *[]SolveResponse) error {
|
||
DB :=db.DBsnctf
|
||
rows,err := DB.Raw("SELECT s.id, s.uid, s.cid, u.username, c.name, s.submitted_at, c.score FROM solve AS s, user AS u, challenge AS c WHERE u.hidden=0 AND s.uid=u.id AND s.cid=c.id ORDER BY s.submitted_at ASC;").Rows()
|
||
if err != nil {
|
||
return err
|
||
}
|
||
defer rows.Close()
|
||
for rows.Next() {
|
||
var s SolveResponse
|
||
err = rows.Scan(&s.ID, &s.Uid, &s.Cid, &s.Username, &s.ChallengeName, &s.SubmittedAt, &s.Score)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
*solves = append(*solves, s)
|
||
}
|
||
return rows.Err()
|
||
}
|
||
|
||
// getSolvesByUid 操作数据库根据用户id获取正确的flag提交记录,按提交时间从早到晚排序。
|
||
func getSolvesByUid(solves *[]SolveResponse, uid int) error {
|
||
DB :=db.DBsnctf
|
||
rows,err := DB.Debug().Raw("SELECT s.id, s.uid, s.cid, u.username, c.name, s.submitted_at, c.score FROM solve AS s, user AS u, challenge AS c WHERE u.hidden=0 AND s.uid=? AND u.id=s.uid AND c.id=s.cid ORDER BY s.submitted_at ASC;",uid).Rows()
|
||
if err != nil {
|
||
return err
|
||
}
|
||
defer rows.Close()
|
||
for rows.Next() {
|
||
var s SolveResponse
|
||
err = rows.Scan(&s.ID, &s.Uid, &s.Cid, &s.Username, &s.ChallengeName, &s.SubmittedAt, &s.Score)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
*solves = append(*solves, s)
|
||
}
|
||
return rows.Err()
|
||
}
|
||
// getSolvesByCid 操作数据库根据题目id获取正确的提交记录,按提交时间从早到晚排序。
|
||
func getSolvesByCid(solves *[]SolveResponse, cid int) error {
|
||
DB :=db.DBsnctf
|
||
rows,err := DB.Raw("SELECT s.id, s.uid, s.cid, u.username, c.name, s.submitted_at, c.score FROM solve AS s, user AS u, challenge AS c WHERE u.hidden=0 AND s.cid=? AND u.id=s.uid AND c.id=s.cid ORDER BY s.submitted_at ASC;",cid).Rows()
|
||
if err != nil {
|
||
return err
|
||
}
|
||
defer rows.Close()
|
||
for rows.Next() {
|
||
var s SolveResponse
|
||
err = rows.Scan(&s.ID, &s.Uid, &s.Cid, &s.Username, &s.ChallengeName, &s.SubmittedAt, &s.Score)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
*solves = append(*solves, s)
|
||
}
|
||
return rows.Err()
|
||
} |