Add score retrieval

This commit is contained in:
nemunaire 2020-09-13 16:37:30 +02:00
parent 7201c3d02a
commit e9c25ddd96
2 changed files with 38 additions and 22 deletions

View File

@ -2,8 +2,8 @@ package main
import ( import (
"encoding/json" "encoding/json"
"time"
"strconv" "strconv"
"time"
"github.com/julienschmidt/httprouter" "github.com/julienschmidt/httprouter"
) )
@ -12,13 +12,13 @@ func init() {
router.POST("/api/surveys/:sid", apiAuthHandler(surveyAuthHandler(func(s Survey, u *User, body []byte) HTTPResponse { router.POST("/api/surveys/:sid", apiAuthHandler(surveyAuthHandler(func(s Survey, u *User, body []byte) HTTPResponse {
var responses []Response var responses []Response
if err := json.Unmarshal(body, &responses); err != nil { if err := json.Unmarshal(body, &responses); err != nil {
return APIErrorResponse{err:err} return APIErrorResponse{err: err}
} }
for _, response := range responses { for _, response := range responses {
if len(response.Answer) > 0 { if len(response.Answer) > 0 {
if _, err := s.NewResponse(response.IdQuestion, u.Id, response.Answer); err != nil { if _, err := s.NewResponse(response.IdQuestion, u.Id, response.Answer); err != nil {
return APIErrorResponse{err:err} return APIErrorResponse{err: err}
} }
} }
} }
@ -40,10 +40,10 @@ func init() {
router.PUT("/api/surveys/:sid/questions/:qid/responses/:rid", apiAuthHandler(responseAuthHandler(func(current Response, u *User, body []byte) HTTPResponse { router.PUT("/api/surveys/:sid/questions/:qid/responses/:rid", apiAuthHandler(responseAuthHandler(func(current Response, u *User, body []byte) HTTPResponse {
var new Response var new Response
if err := json.Unmarshal(body, &new); err != nil { if err := json.Unmarshal(body, &new); err != nil {
return APIErrorResponse{err:err} return APIErrorResponse{err: err}
} }
if new.Score != nil && (current.Score != nil || *new.Score != *current.Score) { if new.Score != nil && (current.Score == nil || *new.Score != *current.Score) {
now := time.Now() now := time.Now()
new.IdCorrector = &u.Id new.IdCorrector = &u.Id
new.TimeScored = &now new.TimeScored = &now
@ -66,16 +66,16 @@ func responseHandler(f func(Response, []byte) HTTPResponse) func(httprouter.Para
} }
if rid, err := strconv.Atoi(string(ps.ByName("rid"))); err != nil { if rid, err := strconv.Atoi(string(ps.ByName("rid"))); err != nil {
return APIErrorResponse{err:err} return APIErrorResponse{err: err}
} else if survey == nil { } else if survey == nil {
if response, err := getResponse(rid); err != nil { if response, err := getResponse(rid); err != nil {
return APIErrorResponse{err:err} return APIErrorResponse{err: err}
} else { } else {
return f(response, body) return f(response, body)
} }
} else { } else {
if response, err := survey.GetResponse(rid); err != nil { if response, err := survey.GetResponse(rid); err != nil {
return APIErrorResponse{err:err} return APIErrorResponse{err: err}
} else { } else {
return f(response, body) return f(response, body)
} }

View File

@ -4,8 +4,8 @@ import (
"encoding/json" "encoding/json"
"errors" "errors"
"net/http" "net/http"
"time"
"strconv" "strconv"
"time"
"github.com/julienschmidt/httprouter" "github.com/julienschmidt/httprouter"
) )
@ -24,7 +24,7 @@ func init() {
router.POST("/api/surveys", apiHandler(func(_ httprouter.Params, body []byte) HTTPResponse { router.POST("/api/surveys", apiHandler(func(_ httprouter.Params, body []byte) HTTPResponse {
var new Survey var new Survey
if err := json.Unmarshal(body, &new); err != nil { if err := json.Unmarshal(body, &new); err != nil {
return APIErrorResponse{err:err} return APIErrorResponse{err: err}
} }
return formatApiResponse(NewSurvey(new.Title, new.Shown, new.StartAvailability, new.EndAvailability)) return formatApiResponse(NewSurvey(new.Title, new.Shown, new.StartAvailability, new.EndAvailability))
@ -36,14 +36,14 @@ func init() {
} else { } else {
return APIErrorResponse{ return APIErrorResponse{
status: http.StatusForbidden, status: http.StatusForbidden,
err: errors.New("Not accessible"), err: errors.New("Not accessible"),
} }
} }
}))) })))
router.PUT("/api/surveys/:sid", apiHandler(surveyHandler(func(current Survey, body []byte) HTTPResponse { router.PUT("/api/surveys/:sid", apiHandler(surveyHandler(func(current Survey, body []byte) HTTPResponse {
var new Survey var new Survey
if err := json.Unmarshal(body, &new); err != nil { if err := json.Unmarshal(body, &new); err != nil {
return APIErrorResponse{err:err} return APIErrorResponse{err: err}
} }
new.Id = current.Id new.Id = current.Id
@ -56,11 +56,17 @@ func init() {
router.GET("/api/surveys/:sid/score", apiAuthHandler(surveyAuthHandler( router.GET("/api/surveys/:sid/score", apiAuthHandler(surveyAuthHandler(
func(s Survey, u *User, _ []byte) HTTPResponse { func(s Survey, u *User, _ []byte) HTTPResponse {
if s.Shown || (u != nil && u.IsAdmin) { if s.Shown || (u != nil && u.IsAdmin) {
return formatApiResponse(s.GetScore(u)) if score, err := s.GetScore(u); err != nil {
return APIErrorResponse{err: err}
} else if score == nil {
return APIResponse{map[string]string{"score": "N/A"}}
} else {
return APIResponse{map[string]float64{"score": *score}}
}
} else { } else {
return APIErrorResponse{ return APIErrorResponse{
status: http.StatusForbidden, status: http.StatusForbidden,
err: errors.New("Not accessible"), err: errors.New("Not accessible"),
} }
} }
}), loggedUser)) }), loggedUser))
@ -69,9 +75,9 @@ func init() {
func surveyHandler(f func(Survey, []byte) HTTPResponse) func(httprouter.Params, []byte) HTTPResponse { func surveyHandler(f func(Survey, []byte) HTTPResponse) func(httprouter.Params, []byte) HTTPResponse {
return func(ps httprouter.Params, body []byte) HTTPResponse { return func(ps httprouter.Params, body []byte) HTTPResponse {
if sid, err := strconv.Atoi(string(ps.ByName("sid"))); err != nil { if sid, err := strconv.Atoi(string(ps.ByName("sid"))); err != nil {
return APIErrorResponse{err:err} return APIErrorResponse{err: err}
} else if survey, err := getSurvey(sid); err != nil { } else if survey, err := getSurvey(sid); err != nil {
return APIErrorResponse{err:err} return APIErrorResponse{err: err}
} else { } else {
return f(survey, body) return f(survey, body)
} }
@ -81,9 +87,9 @@ func surveyHandler(f func(Survey, []byte) HTTPResponse) func(httprouter.Params,
func surveyAuthHandler(f func(Survey, *User, []byte) HTTPResponse) func(*User, httprouter.Params, []byte) HTTPResponse { func surveyAuthHandler(f func(Survey, *User, []byte) HTTPResponse) func(*User, httprouter.Params, []byte) HTTPResponse {
return func(u *User, ps httprouter.Params, body []byte) HTTPResponse { return func(u *User, ps httprouter.Params, body []byte) HTTPResponse {
if sid, err := strconv.Atoi(string(ps.ByName("sid"))); err != nil { if sid, err := strconv.Atoi(string(ps.ByName("sid"))); err != nil {
return APIErrorResponse{err:err} return APIErrorResponse{err: err}
} else if survey, err := getSurvey(sid); err != nil { } else if survey, err := getSurvey(sid); err != nil {
return APIErrorResponse{err:err} return APIErrorResponse{err: err}
} else { } else {
return f(survey, u, body) return f(survey, u, body)
} }
@ -99,8 +105,8 @@ type Survey struct {
EndAvailability time.Time `json:"end_availability"` EndAvailability time.Time `json:"end_availability"`
} }
func getSurveys(cnd string, param... interface{}) (surveys []Survey, err error) { func getSurveys(cnd string, param ...interface{}) (surveys []Survey, err error) {
if rows, errr := DBQuery("SELECT id_survey, title, shown, corrected, start_availability, end_availability FROM surveys " + cnd, param...); errr != nil { if rows, errr := DBQuery("SELECT id_survey, title, shown, corrected, start_availability, end_availability FROM surveys "+cnd, param...); errr != nil {
return nil, errr return nil, errr
} else { } else {
defer rows.Close() defer rows.Close()
@ -135,8 +141,18 @@ func NewSurvey(title string, shown bool, startAvailability time.Time, endAvailab
} }
} }
func (s Survey) GetScore(u *User) (score int64, err error) { func (s Survey) GetScore(u *User) (score *float64, err error) {
err = DBQueryRow("SELECT SUM(M.score) FROM (SELECT MAX(score) FROM survey_responses R INNER JOIN survey_quests Q ON Q.id_question = R.id_question WHERE Q.id_survey=? AND R.id_user=? GROUP BY id_question) M", s.Id, u.Id).Scan(&score) if err = DBQueryRow("SELECT SUM(M.score) FROM (SELECT MAX(score) AS score FROM survey_responses R INNER JOIN survey_quests Q ON Q.id_question = R.id_question WHERE Q.id_survey=? AND R.id_user=? GROUP BY Q.id_question) M", s.Id, u.Id).Scan(&score); err != nil || score == nil {
return
}
var questions []Question
if questions, err = s.GetQuestions(); err != nil {
return
}
*score = *score / (float64(len(questions)) * 5.0)
return return
} }