Files
SNCTF/api/solve.go
jiayuqi7813 7cb171bc90 default
2022-05-21 23:29:23 +08:00

153 lines
4.3 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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()
}