141 lines
4.3 KiB
Go
141 lines
4.3 KiB
Go
package api
|
|
|
|
import (
|
|
"encoding/json"
|
|
"errors"
|
|
"strconv"
|
|
|
|
"srs.epita.fr/fic-server/libfic"
|
|
|
|
"github.com/julienschmidt/httprouter"
|
|
)
|
|
|
|
func init() {
|
|
router.GET("/api/qa/:eid", apiHandler(exerciceHandler(getExerciceQA)))
|
|
router.POST("/api/qa/:eid", apiHandler(exerciceHandler(createExerciceQA)))
|
|
|
|
router.PUT("/api/qa/:eid/:qid", apiHandler(qaHandler(updateExerciceQA)))
|
|
router.DELETE("/api/qa/:eid/:qid", apiHandler(qaHandler(deleteExerciceQA)))
|
|
|
|
router.GET("/api/qa/:eid/:qid/comments", apiHandler(qaHandler(getQAComments)))
|
|
router.POST("/api/qa/:eid/:qid/comments", apiHandler(qaHandler(createQAComment)))
|
|
|
|
router.DELETE("/api/qa/:eid/:qid/comments/:cid", apiHandler(qaCommentHandler(deleteQAComment)))
|
|
}
|
|
|
|
func qaHandler(f func(QAUser, fic.QAQuery, fic.Exercice, []byte) (interface{}, error)) func(QAUser, httprouter.Params, []byte) (interface{}, error) {
|
|
return func(u QAUser, ps httprouter.Params, body []byte) (interface{}, error) {
|
|
return exerciceHandler(func(u QAUser, exercice fic.Exercice, _ []byte) (interface{}, error) {
|
|
if qid, err := strconv.ParseInt(string(ps.ByName("qid")), 10, 64); err != nil {
|
|
return nil, err
|
|
} else if query, err := exercice.GetQAQuery(qid); err != nil {
|
|
return nil, err
|
|
} else {
|
|
return f(u, query, exercice, body)
|
|
}
|
|
})(u, ps, body)
|
|
}
|
|
}
|
|
|
|
func qaCommentHandler(f func(QAUser, fic.QAComment, fic.QAQuery, fic.Exercice, []byte) (interface{}, error)) func(QAUser, httprouter.Params, []byte) (interface{}, error) {
|
|
return func(u QAUser, ps httprouter.Params, body []byte) (interface{}, error) {
|
|
return qaHandler(func(u QAUser, query fic.QAQuery, exercice fic.Exercice, _ []byte) (interface{}, error) {
|
|
if cid, err := strconv.ParseInt(string(ps.ByName("cid")), 10, 64); err != nil {
|
|
return nil, err
|
|
} else if comment, err := query.GetComment(cid); err != nil {
|
|
return nil, err
|
|
} else {
|
|
return f(u, comment, query, exercice, body)
|
|
}
|
|
})(u, ps, body)
|
|
}
|
|
}
|
|
|
|
func getExerciceQA(_ QAUser, exercice fic.Exercice, body []byte) (interface{}, error) {
|
|
return exercice.GetQAQueries()
|
|
}
|
|
|
|
func createExerciceQA(u QAUser, exercice fic.Exercice, body []byte) (interface{}, error) {
|
|
// Create a new query
|
|
var uq fic.QAQuery
|
|
if err := json.Unmarshal(body, &uq); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if len(uq.State) == 0 {
|
|
return nil, errors.New("State not filled")
|
|
}
|
|
|
|
if len(uq.Subject) == 0 {
|
|
return nil, errors.New("Subject not filled")
|
|
}
|
|
|
|
if qa, err := exercice.NewQAQuery(uq.Subject, u.TeamId, u.User, uq.State); err != nil {
|
|
return nil, err
|
|
} else {
|
|
var uc fic.QAComment
|
|
if err := json.Unmarshal(body, &uc); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if uc.Content != "" {
|
|
_, err = qa.AddComment(uc.Content, u.TeamId, u.User)
|
|
}
|
|
|
|
return qa, err
|
|
}
|
|
}
|
|
|
|
func updateExerciceQA(u QAUser, query fic.QAQuery, exercice fic.Exercice, body []byte) (interface{}, error) {
|
|
var uq fic.QAQuery
|
|
if err := json.Unmarshal(body, &uq); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
uq.Id = query.Id
|
|
|
|
if uq.User != query.User && (uq.IdExercice != query.IdExercice || uq.IdTeam != query.IdTeam || uq.User != query.User || uq.Creation != query.Creation || uq.State != query.State || uq.Subject != query.Subject || uq.Closed != query.Closed) {
|
|
return nil, errors.New("You can only update your own entry.")
|
|
}
|
|
|
|
if _, err := uq.Update(); err != nil {
|
|
return nil, err
|
|
} else {
|
|
return uq, err
|
|
}
|
|
}
|
|
|
|
func deleteExerciceQA(u QAUser, query fic.QAQuery, exercice fic.Exercice, body []byte) (interface{}, error) {
|
|
if u.User != query.User {
|
|
return nil, errors.New("You can only delete your own entry.")
|
|
}
|
|
|
|
return query.Delete()
|
|
}
|
|
|
|
func getQAComments(_ QAUser, query fic.QAQuery, exercice fic.Exercice, body []byte) (interface{}, error) {
|
|
return query.GetComments()
|
|
}
|
|
|
|
func createQAComment(u QAUser, query fic.QAQuery, exercice fic.Exercice, body []byte) (interface{}, error) {
|
|
// Create a new query
|
|
var uc fic.QAComment
|
|
if err := json.Unmarshal(body, &uc); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if len(uc.Content) == 0 {
|
|
return nil, errors.New("Empty comment")
|
|
}
|
|
|
|
return query.AddComment(uc.Content, u.TeamId, u.User)
|
|
}
|
|
|
|
func deleteQAComment(u QAUser, comment fic.QAComment, query fic.QAQuery, exercice fic.Exercice, body []byte) (interface{}, error) {
|
|
if u.User != comment.User {
|
|
return nil, errors.New("You can only delete your own comment.")
|
|
}
|
|
|
|
return comment.Delete()
|
|
}
|