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

85 lines
2.2 KiB
Go

package api
import (
"errors"
"fmt"
"github.com/gin-gonic/gin"
db "main.go/database"
. "main.go/type"
"strings"
)
//GetAllChallenges 获取全部题目
func GetAllChallenges(c * gin.Context){
var challenges []ChallengeResponse
if err := getAllChallenges(c, &challenges); err != nil {
c.JSON(400, gin.H{"code": 400, "msg": "Get all challenges failure!"})
return
}
c.JSON(200, gin.H{"code": 200, "data": challenges})
}
//GetChallengesByCategory 获取某个分类下的题目
func GetChallengesByCategory(c *gin.Context){
category := c.Param("category")
if matched := CheckCategory(category); !matched {
c.JSON(400, gin.H{"code": 400, "msg": "Wrong category!"})
return
}
var challenges []ChallengeResponse
if err := getAllChallenges(c, &challenges); err != nil {
c.JSON(400, gin.H{"code": 400, "msg": "Get all challenges failure!"})
return
}
c.JSON(200, gin.H{"code": 200, "data": challenges})
}
// getAllChallenges 操作数据库获取所有题目。
func getAllChallenges(c *gin.Context, challenges *[]ChallengeResponse) error {
var attachmentString, hints string
Link()
DB := db.DBsnctf
rows,err := DB.Raw("SELECT id, name, score, description, attachment, category, tags, hints FROM challenge WHERE visible=1;").Rows()
if err != nil {
return err
}
defer rows.Close()
for rows.Next(){
var challenge ChallengeResponse
err = rows.Scan(&challenge.ID, &challenge.Name, &challenge.Score, &challenge.Description, &attachmentString, &challenge.Category, &challenge.Tags, &hints)
fmt.Println(err)
if err != nil {
return err
}
// 解析为切片
challenge.Attachment = strings.Split(attachmentString, ",")
challenge.Hints = strings.Split(hints, ",")
solverCount, err := getSolverCount(challenge.ID)
if err != nil {
return err
}
challenge.SolverCount = solverCount
session, err := Store.Get(c.Request, "SNCTFSESSID")
if err != nil {
c.JSON(200, gin.H{"code": 400, "msg": "Get SNCTFSESSID error"})
return err
}
user, ok := session.Values["user"].(User)
if !ok {
c.JSON(200, gin.H{"code": 400, "msg": "No session"})
return errors.New("no session")
}
challenge.IsSolved = hasAlreadySolved(user.ID, challenge.ID)
*challenges = append(*challenges, challenge)
}
return rows.Err()
}