127 lines
3.6 KiB
Go
127 lines
3.6 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 := getCategory(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})
|
|
}
|
|
|
|
//getCategory 操作数据库获取某个分类下的题目
|
|
func getCategory(c *gin.Context, challenges *[]ChallengeResponse) error {
|
|
var attachmentString, hints string
|
|
Link()
|
|
DB := db.DBsnctf
|
|
category := c.Param("category")
|
|
rows, err := DB.Raw("SELECT id, name, score, description, attachment, category, tags, hints FROM challenge WHERE visible=1 AND category=?;", category).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()
|
|
|
|
}
|
|
|
|
// 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()
|
|
}
|