diff --git a/backend/controllers/question.go b/backend/controllers/question.go new file mode 100644 index 0000000..67b6b2c --- /dev/null +++ b/backend/controllers/question.go @@ -0,0 +1,101 @@ +package controllers + +import ( + "encoding/json" + + "github.com/Jsharkc/TechTree/backend/general" + "github.com/Jsharkc/TechTree/backend/models" + "github.com/Jsharkc/TechTree/backend/utils" + "github.com/Jsharkc/TechTree/lib/log" +) + +type QuestionController struct { + BaseController +} + +func (qc *QuestionController) GetQuestion() { + var ( + err error + q []models.Question + flag bool + num = 3 + ) + flag = false + user := qc.GetSession(general.SessionUserID).(string) + if flag { + num = 1 + } + q, err = models.QuestionService.GetQuestionByUser(user, num) + if err != nil { + log.Logger.Error("get question err:", err) + qc.Data["json"] = map[string]interface{}{general.RespKeyStatus: general.ErrMysql} + goto finish + } + + qc.Data["json"] = map[string]interface{}{general.RespKeyStatus: general.ErrSucceed, general.RespKeyData: q} +finish: + qc.ServeJSON(true) +} + +func (qc *QuestionController) AdminAddQuestion() { + var ( + err error + q models.Question + flag bool + ) + + err = json.Unmarshal(qc.Ctx.Input.RequestBody, &q) + if err != nil { + log.Logger.Error("AdminAddQuestion question json unmarshal err:", err) + qc.Data["json"] = map[string]interface{}{general.RespKeyStatus: general.ErrInvalidParams} + goto finish + } + + flag, err = utils.GlobalValid.Valid(&q) + if !flag { + for _, err := range utils.GlobalValid.Errors { + log.Logger.Error("The question key "+err.Key+" has err:", err) + } + + qc.Data["json"] = map[string]interface{}{general.RespKeyStatus: general.ErrInvalidParams} + goto finish + } + + err = models.QuestionService.AdminAddQuestion(&q) + if err != nil { + log.Logger.Error("Add question mysql err:", err) + qc.Data["json"] = map[string]interface{}{general.RespKeyStatus: general.ErrMysql} + goto finish + } + + qc.Data["json"] = map[string]interface{}{general.RespKeyStatus: general.ErrSucceed} + log.Logger.Info("Add question success") +finish: + qc.ServeJSON(true) +} + +func (qc *QuestionController) Delete() { + var ( + err error + id string + ) + + err = json.Unmarshal(qc.Ctx.Input.RequestBody, &id) + if err != nil { + log.Logger.Error("Delete question json unmarshal err:", err) + qc.Data["json"] = map[string]interface{}{general.RespKeyStatus: general.ErrInvalidParams} + goto finish + } + + err = models.QuestionService.DeleteQuestion(id) + if err != nil { + log.Logger.Error("Delete question mysql err:", err) + qc.Data["json"] = map[string]interface{}{general.RespKeyStatus: general.ErrMysql} + goto finish + } + + qc.Data["json"] = map[string]interface{}{general.RespKeyStatus: general.ErrSucceed} + log.Logger.Info("Delete question success") +finish: + qc.ServeJSON(true) +} \ No newline at end of file diff --git a/backend/general/constant.go b/backend/general/constant.go index 6dbd4b1..3c01bab 100644 --- a/backend/general/constant.go +++ b/backend/general/constant.go @@ -7,8 +7,8 @@ const ( RespKeyType = "type" RespKeyData = "data" - UserActive = 0x10 - UserInactive = 0x11 + Active = 0x10 + Inactive = 0x11 ErrSucceed = 0x0 ErrInvalidParams = 0x1 @@ -16,8 +16,6 @@ const ( ErrMysql = 0x3 ErrNotFound = 0x4 - NodeNoActive = 0x10 - NodeActive = 0x11 NodePassed = 0x12 NoseUserAdd = 0x13 diff --git a/backend/models/node.go b/backend/models/node.go index 5feb912..00f469a 100644 --- a/backend/models/node.go +++ b/backend/models/node.go @@ -39,7 +39,7 @@ func (u PassNode) TableName() string { } func (node *NodeServiceProvider) Add(n *Node) error { - n.Status = general.NodeNoActive + n.Status = general.Inactive return tidb.Conn.Create(n).Error } @@ -75,7 +75,7 @@ func (node *NodeServiceProvider) ListAll(uid string) ([]Node, error) { for index, node := range notPassNodes { if _, ok := nodeMap[node.PID]; ok { - notPassNodes[index].Status = general.NodeActive + notPassNodes[index].Status = general.Active } } diff --git a/backend/models/question.go b/backend/models/question.go index d9606f3..c6eb47b 100644 --- a/backend/models/question.go +++ b/backend/models/question.go @@ -1,20 +1,57 @@ package models +import ( + "github.com/satori/go.uuid" + + "github.com/Jsharkc/TechTree/backend/general" + "github.com/Jsharkc/TechTree/backend/tidb" +) + type QuestionServiceProvider struct { } var QuestionService *QuestionServiceProvider = &QuestionServiceProvider{} type Question struct { - ID string `json:"id" gorm:"column:id" valid:"Required"` - NID string `json:"nid" gorm:"column:nid" valid:"Required"` - Description string `json:"desci" gorm:"column:desc" valid:"Required"` - TestPath string `json:"testpath" gorm:"column:testpath" valid:"Required"` - PrepCode string `json:"prepcode gorm:"cllumn:"prepcode" valid:"Required"` + ID string `json:"id" gorm:"column:id" valid:"Required"` + NID string `json:"nid" gorm:"column:nid" valid:"Required"` + Description string `json:"desci" gorm:"column:desc" valid:"Required"` + TestPath string `json:"testpath" gorm:"column:testpath" valid:"Required"` + PrepCode string `json:"prepcode" gorm:"column:prepcode" valid:"Required"` + Status int `json:"status" gorm:"column:status"` +} + +type UserAddQues struct { + ID string `json:"id" gorm:"column:id" valid:"Required"` + NID string `json:"nid" gorm:"column:nid" valid:"Required"` + Description string `json:"desci" gorm:"column:desc" valid:"Required"` + Status int `json:"status" gorm:"column:status"` } type PassedQuestion struct { - UID string `json:"uid" gorm:"column:uid" valid:"Required"` - QID string `json:"qid" gorm:"column:qid" valid:"Required"` - NID string `json:"nid" gorm:"column:nid" valid:"Required"` + UID string `json:"uid" gorm:"column:uid" valid:"Required"` + QID string `json:"qid" gorm:"column:qid" valid:"Required"` + NID string `json:"nid" gorm:"column:nid" valid:"Required"` +} + +type QuestionVote struct { + UID string `json:"uid" gorm:"column:uid" valid:"Required"` + QID string `json:"qid" gorm:"column:qid" valid:"Required"` + Kind int `json:"kind" gorm:"column:kind"` +} + +func (qu *QuestionServiceProvider) GetQuestionByUser(user string, num int) ([]Question, error) { + var q []Question + err := tidb.Conn.Raw("SELECT * FROM question WHERE status = 17 AND id NOT IN (SELECT uid FROM passquestion WHERE uid = ? AND status = 17)", user).Scan(&q) + return q[0:num], err.Error +} + +func (qu *QuestionServiceProvider) AdminAddQuestion(question *Question) error { + question.ID = uuid.NewV4().String() + question.Status = general.Active + return tidb.Conn.Model(&Question{}).Create(question).Error +} + +func (qu *QuestionServiceProvider) DeleteQuestion(qid string) error { + return tidb.Conn.Model(&Question{}).Where("id = ?", qid).Update("status", general.Inactive).Error } diff --git a/backend/models/user.go b/backend/models/user.go index 6e70310..08906a8 100644 --- a/backend/models/user.go +++ b/backend/models/user.go @@ -67,7 +67,7 @@ func (us *UserServiceProvider) Register(u *User) error { } u.Password = string(hashcode) - u.Status = general.UserActive + u.Status = general.Active u.Created = time.Now() return err