Add score retrieval
This commit is contained in:
parent
7201c3d02a
commit
e9c25ddd96
2 changed files with 38 additions and 22 deletions
44
surveys.go
44
surveys.go
|
@ -4,8 +4,8 @@ import (
|
|||
"encoding/json"
|
||||
"errors"
|
||||
"net/http"
|
||||
"time"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"github.com/julienschmidt/httprouter"
|
||||
)
|
||||
|
@ -24,7 +24,7 @@ func init() {
|
|||
router.POST("/api/surveys", apiHandler(func(_ httprouter.Params, body []byte) HTTPResponse {
|
||||
var new Survey
|
||||
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))
|
||||
|
@ -36,14 +36,14 @@ func init() {
|
|||
} else {
|
||||
return APIErrorResponse{
|
||||
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 {
|
||||
var new Survey
|
||||
if err := json.Unmarshal(body, &new); err != nil {
|
||||
return APIErrorResponse{err:err}
|
||||
return APIErrorResponse{err: err}
|
||||
}
|
||||
|
||||
new.Id = current.Id
|
||||
|
@ -56,11 +56,17 @@ func init() {
|
|||
router.GET("/api/surveys/:sid/score", apiAuthHandler(surveyAuthHandler(
|
||||
func(s Survey, u *User, _ []byte) HTTPResponse {
|
||||
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 {
|
||||
return APIErrorResponse{
|
||||
status: http.StatusForbidden,
|
||||
err: errors.New("Not accessible"),
|
||||
err: errors.New("Not accessible"),
|
||||
}
|
||||
}
|
||||
}), loggedUser))
|
||||
|
@ -69,9 +75,9 @@ func init() {
|
|||
func surveyHandler(f func(Survey, []byte) HTTPResponse) func(httprouter.Params, []byte) HTTPResponse {
|
||||
return func(ps httprouter.Params, body []byte) HTTPResponse {
|
||||
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 {
|
||||
return APIErrorResponse{err:err}
|
||||
return APIErrorResponse{err: err}
|
||||
} else {
|
||||
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 {
|
||||
return func(u *User, ps httprouter.Params, body []byte) HTTPResponse {
|
||||
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 {
|
||||
return APIErrorResponse{err:err}
|
||||
return APIErrorResponse{err: err}
|
||||
} else {
|
||||
return f(survey, u, body)
|
||||
}
|
||||
|
@ -99,8 +105,8 @@ type Survey struct {
|
|||
EndAvailability time.Time `json:"end_availability"`
|
||||
}
|
||||
|
||||
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 {
|
||||
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 {
|
||||
return nil, errr
|
||||
} else {
|
||||
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) {
|
||||
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)
|
||||
func (s Survey) GetScore(u *User) (score *float64, err error) {
|
||||
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
|
||||
}
|
||||
|
||||
|
|
Reference in a new issue