mirror of
https://github.com/crawlab-team/crawlab.git
synced 2026-01-22 17:31:03 +01:00
188 lines
4.4 KiB
Go
188 lines
4.4 KiB
Go
package model
|
|
|
|
import (
|
|
"crawlab/database"
|
|
"github.com/apex/log"
|
|
"github.com/globalsign/mgo"
|
|
"github.com/globalsign/mgo/bson"
|
|
"runtime/debug"
|
|
"time"
|
|
)
|
|
|
|
type Challenge struct {
|
|
Id bson.ObjectId `json:"_id" bson:"_id"`
|
|
Name string `json:"name" bson:"name"`
|
|
TitleCn string `json:"title_cn" bson:"title_cn"`
|
|
TitleEn string `json:"title_en" bson:"title_en"`
|
|
DescriptionCn string `json:"description_cn" bson:"description_cn"`
|
|
DescriptionEn string `json:"description_en" bson:"description_en"`
|
|
Difficulty int `json:"difficulty" bson:"difficulty"`
|
|
Path string `json:"path" bson:"path"`
|
|
|
|
// 前端展示
|
|
Achieved bool `json:"achieved" bson:"achieved"`
|
|
|
|
CreateTs time.Time `json:"create_ts" bson:"create_ts"`
|
|
UpdateTs time.Time `json:"update_ts" bson:"update_ts"`
|
|
}
|
|
|
|
func (ch *Challenge) Save() error {
|
|
s, c := database.GetCol("challenges")
|
|
defer s.Close()
|
|
|
|
ch.UpdateTs = time.Now()
|
|
|
|
if err := c.UpdateId(ch.Id, ch); err != nil {
|
|
debug.PrintStack()
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (ch *Challenge) Add() error {
|
|
s, c := database.GetCol("challenges")
|
|
defer s.Close()
|
|
|
|
ch.Id = bson.NewObjectId()
|
|
ch.UpdateTs = time.Now()
|
|
ch.CreateTs = time.Now()
|
|
if err := c.Insert(ch); err != nil {
|
|
log.Errorf(err.Error())
|
|
debug.PrintStack()
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func GetChallenge(id bson.ObjectId) (Challenge, error) {
|
|
s, c := database.GetCol("challenges")
|
|
defer s.Close()
|
|
|
|
var ch Challenge
|
|
if err := c.Find(bson.M{"_id": id}).One(&ch); err != nil {
|
|
if err != mgo.ErrNotFound {
|
|
log.Errorf(err.Error())
|
|
debug.PrintStack()
|
|
return ch, err
|
|
}
|
|
}
|
|
|
|
return ch, nil
|
|
}
|
|
|
|
func GetChallengeByName(name string) (Challenge, error) {
|
|
s, c := database.GetCol("challenges")
|
|
defer s.Close()
|
|
|
|
var ch Challenge
|
|
if err := c.Find(bson.M{"name": name}).One(&ch); err != nil {
|
|
if err != mgo.ErrNotFound {
|
|
log.Errorf(err.Error())
|
|
debug.PrintStack()
|
|
return ch, err
|
|
}
|
|
}
|
|
|
|
return ch, nil
|
|
}
|
|
|
|
func GetChallengeList(filter interface{}, skip int, limit int, sortKey string) ([]Challenge, error) {
|
|
s, c := database.GetCol("challenges")
|
|
defer s.Close()
|
|
|
|
var challenges []Challenge
|
|
if err := c.Find(filter).Skip(skip).Limit(limit).Sort(sortKey).All(&challenges); err != nil {
|
|
debug.PrintStack()
|
|
return challenges, err
|
|
}
|
|
|
|
return challenges, nil
|
|
}
|
|
|
|
func GetChallengeListWithAchieved(filter interface{}, skip int, limit int, sortKey string, uid bson.ObjectId) ([]Challenge, error) {
|
|
challenges, err := GetChallengeList(filter, skip, limit, sortKey)
|
|
if err != nil {
|
|
return challenges, err
|
|
}
|
|
|
|
for i, ch := range challenges {
|
|
query := bson.M{
|
|
"user_id": uid,
|
|
"challenge_id": ch.Id,
|
|
}
|
|
|
|
list, err := GetChallengeAchievementList(query, 0, 1, "-_id")
|
|
if err != nil {
|
|
continue
|
|
}
|
|
|
|
challenges[i].Achieved = len(list) > 0
|
|
}
|
|
|
|
return challenges, nil
|
|
}
|
|
|
|
func GetChallengeListTotal(filter interface{}) (int, error) {
|
|
s, c := database.GetCol("challenges")
|
|
defer s.Close()
|
|
|
|
var result int
|
|
result, err := c.Find(filter).Count()
|
|
if err != nil {
|
|
return result, err
|
|
}
|
|
return result, nil
|
|
}
|
|
|
|
type ChallengeAchievement struct {
|
|
Id bson.ObjectId `json:"_id" bson:"_id"`
|
|
ChallengeId bson.ObjectId `json:"challenge_id" bson:"challenge_id"`
|
|
UserId bson.ObjectId `json:"user_id" bson:"user_id"`
|
|
|
|
CreateTs time.Time `json:"create_ts" bson:"create_ts"`
|
|
UpdateTs time.Time `json:"update_ts" bson:"update_ts"`
|
|
}
|
|
|
|
func (ca *ChallengeAchievement) Save() error {
|
|
s, c := database.GetCol("challenges_achievements")
|
|
defer s.Close()
|
|
|
|
ca.UpdateTs = time.Now()
|
|
|
|
if err := c.UpdateId(ca.Id, c); err != nil {
|
|
debug.PrintStack()
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (ca *ChallengeAchievement) Add() error {
|
|
s, c := database.GetCol("challenges_achievements")
|
|
defer s.Close()
|
|
|
|
ca.Id = bson.NewObjectId()
|
|
ca.UpdateTs = time.Now()
|
|
ca.CreateTs = time.Now()
|
|
if err := c.Insert(ca); err != nil {
|
|
log.Errorf(err.Error())
|
|
debug.PrintStack()
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func GetChallengeAchievementList(filter interface{}, skip int, limit int, sortKey string) ([]ChallengeAchievement, error) {
|
|
s, c := database.GetCol("challenges_achievements")
|
|
defer s.Close()
|
|
|
|
var challengeAchievements []ChallengeAchievement
|
|
if err := c.Find(filter).Skip(skip).Limit(limit).Sort(sortKey).All(&challengeAchievements); err != nil {
|
|
debug.PrintStack()
|
|
return challengeAchievements, err
|
|
}
|
|
|
|
return challengeAchievements, nil
|
|
}
|