Use gin-gonic instead of httprouter
This commit is contained in:
parent
7c719d9fd5
commit
a203cdc36a
22 changed files with 1668 additions and 1392 deletions
339
responses.go
339
responses.go
|
@ -1,33 +1,53 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"log"
|
||||
"net/http"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"github.com/julienschmidt/httprouter"
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
func init() {
|
||||
router.POST("/api/surveys/:sid", apiAuthHandler(surveyAuthHandler(func(s Survey, u *User, body []byte) HTTPResponse {
|
||||
func declareAPIAuthResponsesRoutes(router *gin.RouterGroup) {
|
||||
router.POST("", func(c *gin.Context) {
|
||||
s := c.MustGet("survey").(*Survey)
|
||||
uauth := c.MustGet("LoggedUser").(*User)
|
||||
|
||||
var u *User
|
||||
if user, ok := c.Get("user"); ok {
|
||||
if !u.IsAdmin {
|
||||
c.AbortWithStatusJSON(http.StatusForbidden, gin.H{"errmsg": "Not authorized"})
|
||||
return
|
||||
}
|
||||
|
||||
u = user.(*User)
|
||||
} else {
|
||||
u = uauth
|
||||
}
|
||||
|
||||
var responses []Response
|
||||
if err := json.Unmarshal(body, &responses); err != nil {
|
||||
return APIErrorResponse{err: err}
|
||||
if err := c.ShouldBindJSON(responses); err != nil {
|
||||
c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"errmsg": err.Error()})
|
||||
return
|
||||
}
|
||||
|
||||
// Check the survey is open
|
||||
now := time.Now()
|
||||
if now.Before(s.StartAvailability) {
|
||||
return APIErrorResponse{err: fmt.Errorf("Le questionnaire n'a pas encore commencé")}
|
||||
} else if now.After(s.EndAvailability.Add(5 * time.Minute)) {
|
||||
return APIErrorResponse{err: fmt.Errorf("Le questionnaire n'est plus ouvert")}
|
||||
if !uauth.IsAdmin {
|
||||
now := time.Now()
|
||||
if now.Before(s.StartAvailability) {
|
||||
c.AbortWithStatusJSON(http.StatusPaymentRequired, gin.H{"errmsg": "Le questionnaire n'a pas encore commencé"})
|
||||
return
|
||||
} else if now.After(s.EndAvailability.Add(5 * time.Minute)) {
|
||||
c.AbortWithStatusJSON(http.StatusPaymentRequired, gin.H{"errmsg": "Le questionnaire n'est plus ouvert"})
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
for _, response := range responses {
|
||||
if !s.Shown && (s.Direct == nil || *s.Direct != response.IdQuestion) {
|
||||
return APIErrorResponse{err: fmt.Errorf("Cette question n'est pas disponible")}
|
||||
if !uauth.IsAdmin && !s.Shown && (s.Direct == nil || *s.Direct != response.IdQuestion) {
|
||||
c.AbortWithStatusJSON(http.StatusForbidden, gin.H{"errmsg": "Cette question n'est pas disponible"})
|
||||
return
|
||||
} else if len(response.Answer) > 0 {
|
||||
// Check if the response has changed
|
||||
if response.Id != 0 {
|
||||
|
@ -39,7 +59,9 @@ func init() {
|
|||
}
|
||||
|
||||
if _, err := s.NewResponse(response.IdQuestion, u.Id, response.Answer); err != nil {
|
||||
return APIErrorResponse{err: err}
|
||||
log.Printf("Unable to NewResponse(uid=%d;sid=%d;qid=%d): %s", u.Id, s.Id, response.IdQuestion, err.Error())
|
||||
c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"errmsg": "Une erreur s'est produite durant l'enregistrement des réponses. Veuillez réessayer dans quelques instants."})
|
||||
return
|
||||
}
|
||||
|
||||
if s.Direct != nil {
|
||||
|
@ -48,98 +70,113 @@ func init() {
|
|||
}
|
||||
}
|
||||
|
||||
return APIResponse{true}
|
||||
}), loggedUser))
|
||||
router.POST("/api/users/:uid/surveys/:sid", apiAuthHandler(func(u *User, ps httprouter.Params, body []byte) HTTPResponse {
|
||||
return surveyAuthHandler(func(s Survey, u *User, _ []byte) HTTPResponse {
|
||||
return userHandler(func(u User, _ []byte) HTTPResponse {
|
||||
var responses []Response
|
||||
if err := json.Unmarshal(body, &responses); err != nil {
|
||||
return APIErrorResponse{err: err}
|
||||
}
|
||||
c.JSON(http.StatusOK, true)
|
||||
})
|
||||
router.GET("/responses", func(c *gin.Context) {
|
||||
u := c.MustGet("LoggedUser").(*User)
|
||||
s := c.MustGet("survey").(*Survey)
|
||||
|
||||
for _, response := range responses {
|
||||
if len(response.Answer) > 0 {
|
||||
// Check if the response has changed
|
||||
if response.Id != 0 {
|
||||
if res, err := s.GetResponse(int(response.Id)); err == nil {
|
||||
if res.IdUser == u.Id && res.Answer == response.Answer {
|
||||
continue
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if _, err := s.NewResponse(response.IdQuestion, u.Id, response.Answer); err != nil {
|
||||
return APIErrorResponse{err: err}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return APIResponse{true}
|
||||
})(ps, body)
|
||||
})(u, ps, body)
|
||||
}, adminRestricted))
|
||||
router.GET("/api/surveys/:sid/responses", apiAuthHandler(surveyAuthHandler(
|
||||
func(s Survey, u *User, _ []byte) HTTPResponse {
|
||||
return formatApiResponse(s.GetMyResponses(u, s.Corrected))
|
||||
}), loggedUser))
|
||||
router.GET("/api/questions/:qid/response", apiAuthHandler(questionAuthHandler(
|
||||
func(q Question, u *User, _ []byte) HTTPResponse {
|
||||
return formatApiResponse(q.GetMyResponse(u, false))
|
||||
}), loggedUser))
|
||||
router.GET("/api/users/:uid/surveys/:sid/responses", apiAuthHandler(func(u *User, ps httprouter.Params, body []byte) HTTPResponse {
|
||||
return surveyAuthHandler(func(s Survey, u *User, _ []byte) HTTPResponse {
|
||||
return userHandler(func(u User, _ []byte) HTTPResponse {
|
||||
return formatApiResponse(s.GetMyResponses(&u, s.Corrected))
|
||||
})(ps, body)
|
||||
})(u, ps, body)
|
||||
}, adminRestricted))
|
||||
router.GET("/api/surveys/:sid/responses/:rid", apiAuthHandler(responseAuthHandler(
|
||||
func(r Response, _ *User, _ []byte) HTTPResponse {
|
||||
return APIResponse{r}
|
||||
}), adminRestricted))
|
||||
router.POST("/api/surveys/:sid/responses/:rid/report", apiAuthHandler(surveyResponseAuthHandler(
|
||||
func(s *Survey, r Response, u *User, _ []byte) HTTPResponse {
|
||||
if s == nil || !s.Corrected || r.IdUser != u.Id {
|
||||
return APIErrorResponse{err: fmt.Errorf("Cette action est impossible pour l'instant"), status: http.StatusForbidden}
|
||||
if user, ok := c.Get("user"); ok {
|
||||
if !u.IsAdmin {
|
||||
c.AbortWithStatusJSON(http.StatusForbidden, gin.H{"errmsg": "Not authorized"})
|
||||
return
|
||||
}
|
||||
|
||||
if r.TimeScored == nil || r.TimeReported == nil || r.TimeReported.Before(*r.TimeScored) {
|
||||
now := time.Now()
|
||||
r.TimeReported = &now
|
||||
} else {
|
||||
r.TimeReported = nil
|
||||
}
|
||||
if _, err := r.Update(); err != nil {
|
||||
return APIErrorResponse{err: err}
|
||||
}
|
||||
|
||||
return APIResponse{r}
|
||||
}), loggedUser))
|
||||
router.GET("/api/surveys/:sid/questions/:qid/responses", apiAuthHandler(questionAuthHandler(
|
||||
func(q Question, u *User, _ []byte) HTTPResponse {
|
||||
return formatApiResponse(q.GetResponses())
|
||||
}), adminRestricted))
|
||||
router.PUT("/api/surveys/:sid/questions/:qid/responses/:rid", apiAuthHandler(responseAuthHandler(func(current Response, u *User, body []byte) HTTPResponse {
|
||||
var new Response
|
||||
if err := json.Unmarshal(body, &new); err != nil {
|
||||
return APIErrorResponse{err: err}
|
||||
u = user.(*User)
|
||||
}
|
||||
|
||||
if new.Score != nil && (current.Score == nil || *new.Score != *current.Score) {
|
||||
responses, err := s.GetMyResponses(u, s.Corrected)
|
||||
if err != nil {
|
||||
log.Printf("Unable to GetMyResponses(uid=%d;sid=%d): %s", u.Id, s.Id, err.Error())
|
||||
c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"errmsg": "Une erreur s'est produite pendant la récupération des réponses."})
|
||||
return
|
||||
}
|
||||
|
||||
c.JSON(http.StatusOK, responses)
|
||||
})
|
||||
|
||||
responsesRoutes := router.Group("/responses/:rid")
|
||||
responsesRoutes.Use(responseHandler)
|
||||
|
||||
responsesRoutes.GET("", func(c *gin.Context) {
|
||||
c.JSON(http.StatusOK, c.MustGet("response"))
|
||||
})
|
||||
responsesRoutes.POST("/report", func(c *gin.Context) {
|
||||
s := c.MustGet("survey").(*Survey)
|
||||
r := c.MustGet("response").(*Response)
|
||||
u := c.MustGet("LoggedUser").(*User)
|
||||
|
||||
if user, ok := c.Get("user"); ok {
|
||||
if !u.IsAdmin {
|
||||
c.AbortWithStatusJSON(http.StatusForbidden, gin.H{"errmsg": "Not authorized"})
|
||||
return
|
||||
}
|
||||
|
||||
u = user.(*User)
|
||||
}
|
||||
|
||||
if s == nil || !s.Corrected || r.IdUser != u.Id {
|
||||
c.AbortWithStatusJSON(http.StatusForbidden, gin.H{"errmsg": "Cette action est impossible pour l'instant"})
|
||||
return
|
||||
}
|
||||
|
||||
if r.TimeScored == nil || r.TimeReported == nil || r.TimeReported.Before(*r.TimeScored) {
|
||||
now := time.Now()
|
||||
new.IdCorrector = &u.Id
|
||||
new.TimeScored = &now
|
||||
r.TimeReported = &now
|
||||
} else {
|
||||
r.TimeReported = nil
|
||||
}
|
||||
if _, err := r.Update(); err != nil {
|
||||
log.Printf("Unable to Update(uid=%d;rid=%d) response: %s", u.Id, r.Id, err.Error())
|
||||
c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"errmsg": "Une erreur s'est produite lors de la mise à jour du statut de la réponse. Veuillez réessayer dans quelques instants."})
|
||||
return
|
||||
}
|
||||
|
||||
new.Id = current.Id
|
||||
new.IdUser = current.IdUser
|
||||
return formatApiResponse(new.Update())
|
||||
}), adminRestricted))
|
||||
router.PUT("/api/questions/:qid/responses/:rid", apiAuthHandler(responseAuthHandler(func(current Response, u *User, body []byte) HTTPResponse {
|
||||
c.JSON(http.StatusOK, r)
|
||||
})
|
||||
}
|
||||
|
||||
func declareAPIAuthQuestionResponsesRoutes(router *gin.RouterGroup) {
|
||||
router.GET("/response", func(c *gin.Context) {
|
||||
u := c.MustGet("LoggedUser").(*User)
|
||||
q := c.MustGet("question").(*Question)
|
||||
|
||||
res, err := q.GetMyResponse(u, false)
|
||||
if err != nil {
|
||||
log.Printf("Unable to GetMyResponse(uid=%d;qid=%d;false): %s", u.Id, q.Id, err.Error())
|
||||
c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"errmsg": "An error occurs during response retrieval."})
|
||||
return
|
||||
}
|
||||
|
||||
c.JSON(http.StatusOK, res)
|
||||
})
|
||||
}
|
||||
|
||||
func declareAPIAdminResponsesRoutes(router *gin.RouterGroup) {
|
||||
router.GET("/responses", func(c *gin.Context) {
|
||||
q := c.MustGet("question").(*Question)
|
||||
|
||||
res, err := q.GetResponses()
|
||||
if err != nil {
|
||||
log.Printf("Unable to GetResponses(qid=%d): %s", q.Id, err.Error())
|
||||
c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"errmsg": "An error occurs during responses retrieval."})
|
||||
return
|
||||
}
|
||||
|
||||
c.JSON(http.StatusOK, res)
|
||||
})
|
||||
|
||||
responsesRoutes := router.Group("/responses/:rid")
|
||||
responsesRoutes.Use(responseHandler)
|
||||
|
||||
responsesRoutes.PUT("", func(c *gin.Context) {
|
||||
u := c.MustGet("LoggedUser").(*User)
|
||||
current := c.MustGet("response").(*Response)
|
||||
|
||||
var new Response
|
||||
if err := json.Unmarshal(body, &new); err != nil {
|
||||
return APIErrorResponse{err: err}
|
||||
if err := c.ShouldBindJSON(&new); err != nil {
|
||||
c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"errmsg": err.Error()})
|
||||
return
|
||||
}
|
||||
|
||||
if new.Score != nil && (current.Score == nil || *new.Score != *current.Score) {
|
||||
|
@ -147,6 +184,7 @@ func init() {
|
|||
new.IdCorrector = &u.Id
|
||||
new.TimeScored = &now
|
||||
|
||||
// Remove from cache
|
||||
if _, ok := _score_cache[current.IdUser]; ok {
|
||||
if surveyId, err := current.GetSurveyId(); err == nil {
|
||||
if _, ok = _score_cache[current.IdUser][surveyId]; ok {
|
||||
|
@ -158,60 +196,42 @@ func init() {
|
|||
|
||||
new.Id = current.Id
|
||||
new.IdUser = current.IdUser
|
||||
return formatApiResponse(new.Update())
|
||||
}), adminRestricted))
|
||||
}
|
||||
|
||||
func responseHandler(f func(Response, []byte) HTTPResponse) func(httprouter.Params, []byte) HTTPResponse {
|
||||
return func(ps httprouter.Params, body []byte) HTTPResponse {
|
||||
return surveyResponseHandler(func(s *Survey, r Response, b []byte) HTTPResponse {
|
||||
return f(r, b)
|
||||
})(ps, body)
|
||||
}
|
||||
}
|
||||
|
||||
func surveyResponseHandler(f func(*Survey, Response, []byte) HTTPResponse) func(httprouter.Params, []byte) HTTPResponse {
|
||||
return func(ps httprouter.Params, body []byte) HTTPResponse {
|
||||
var survey *Survey = nil
|
||||
|
||||
if sid, err := strconv.Atoi(string(ps.ByName("sid"))); err == nil {
|
||||
if s, err := getSurvey(sid); err == nil {
|
||||
survey = &s
|
||||
}
|
||||
response, err := new.Update()
|
||||
if err != nil {
|
||||
log.Println("Unable to Update response:", err)
|
||||
c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"errmsg": "An error occurs during response updating."})
|
||||
return
|
||||
}
|
||||
|
||||
if rid, err := strconv.Atoi(string(ps.ByName("rid"))); err != nil {
|
||||
return APIErrorResponse{err: err}
|
||||
} else if survey == nil {
|
||||
if response, err := getResponse(rid); err != nil {
|
||||
return APIErrorResponse{err: err}
|
||||
} else {
|
||||
return f(survey, response, body)
|
||||
}
|
||||
} else {
|
||||
if response, err := survey.GetResponse(rid); err != nil {
|
||||
return APIErrorResponse{err: err}
|
||||
} else {
|
||||
return f(survey, response, body)
|
||||
}
|
||||
c.JSON(http.StatusOK, response)
|
||||
})
|
||||
}
|
||||
|
||||
func responseHandler(c *gin.Context) {
|
||||
var survey *Survey
|
||||
|
||||
if s, ok := c.Get("survey"); ok {
|
||||
survey = s.(*Survey)
|
||||
}
|
||||
|
||||
var response *Response
|
||||
if rid, err := strconv.Atoi(string(c.Param("rid"))); err != nil {
|
||||
c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"errmsg": "Bad response identifier."})
|
||||
return
|
||||
} else if survey == nil {
|
||||
if response, err = getResponse(rid); err != nil {
|
||||
c.AbortWithStatusJSON(http.StatusNotFound, gin.H{"errmsg": "Response not found."})
|
||||
return
|
||||
}
|
||||
} else if response, err = survey.GetResponse(rid); err != nil {
|
||||
c.AbortWithStatusJSON(http.StatusNotFound, gin.H{"errmsg": "Response not found."})
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
func surveyResponseAuthHandler(f func(*Survey, Response, *User, []byte) HTTPResponse) func(*User, httprouter.Params, []byte) HTTPResponse {
|
||||
return func(u *User, ps httprouter.Params, body []byte) HTTPResponse {
|
||||
return surveyResponseHandler(func(s *Survey, r Response, body []byte) HTTPResponse {
|
||||
return f(s, r, u, body)
|
||||
})(ps, body)
|
||||
}
|
||||
}
|
||||
c.Set("response", response)
|
||||
|
||||
func responseAuthHandler(f func(Response, *User, []byte) HTTPResponse) func(*User, httprouter.Params, []byte) HTTPResponse {
|
||||
return func(u *User, ps httprouter.Params, body []byte) HTTPResponse {
|
||||
return responseHandler(func(r Response, body []byte) HTTPResponse {
|
||||
return f(r, u, body)
|
||||
})(ps, body)
|
||||
}
|
||||
c.Next()
|
||||
}
|
||||
|
||||
type Response struct {
|
||||
|
@ -227,7 +247,7 @@ type Response struct {
|
|||
TimeReported *time.Time `json:"time_reported,omitempty"`
|
||||
}
|
||||
|
||||
func (s *Survey) GetResponses() (responses []Response, err error) {
|
||||
func (s *Survey) GetResponses() (responses []*Response, err error) {
|
||||
if rows, errr := DBQuery("SELECT R.id_response, R.id_question, R.id_user, R.answer, R.time_submit, R.score, R.score_explanation, R.id_corrector, R.time_scored, R.time_reported FROM survey_responses R INNER JOIN survey_quests Q ON Q.id_question = R.id_question WHERE Q.id_survey=?", s.Id); errr != nil {
|
||||
return nil, errr
|
||||
} else {
|
||||
|
@ -238,7 +258,7 @@ func (s *Survey) GetResponses() (responses []Response, err error) {
|
|||
if err = rows.Scan(&r.Id, &r.IdQuestion, &r.IdUser, &r.Answer, &r.TimeSubmit, &r.Score, &r.ScoreExplaination, &r.IdCorrector, &r.TimeScored, &r.TimeReported); err != nil {
|
||||
return
|
||||
}
|
||||
responses = append(responses, r)
|
||||
responses = append(responses, &r)
|
||||
}
|
||||
if err = rows.Err(); err != nil {
|
||||
return
|
||||
|
@ -248,7 +268,7 @@ func (s *Survey) GetResponses() (responses []Response, err error) {
|
|||
}
|
||||
}
|
||||
|
||||
func (s *Survey) GetMyResponses(u *User, showScore bool) (responses []Response, err error) {
|
||||
func (s *Survey) GetMyResponses(u *User, showScore bool) (responses []*Response, err error) {
|
||||
if rows, errr := DBQuery("SELECT R.id_response, R.id_question, R.id_user, R.answer, R.time_submit, R.score, R.score_explanation, R.id_corrector, R.time_scored, R.time_reported FROM survey_responses R INNER JOIN survey_quests Q ON Q.id_question = R.id_question WHERE Q.id_survey=? AND R.id_user=? ORDER BY time_submit DESC", s.Id, u.Id); errr != nil {
|
||||
return nil, errr
|
||||
} else {
|
||||
|
@ -263,7 +283,7 @@ func (s *Survey) GetMyResponses(u *User, showScore bool) (responses []Response,
|
|||
r.Score = nil
|
||||
r.ScoreExplaination = nil
|
||||
}
|
||||
responses = append(responses, r)
|
||||
responses = append(responses, &r)
|
||||
}
|
||||
if err = rows.Err(); err != nil {
|
||||
return
|
||||
|
@ -273,7 +293,8 @@ func (s *Survey) GetMyResponses(u *User, showScore bool) (responses []Response,
|
|||
}
|
||||
}
|
||||
|
||||
func (q *Question) GetMyResponse(u *User, showScore bool) (r Response, err error) {
|
||||
func (q *Question) GetMyResponse(u *User, showScore bool) (r *Response, err error) {
|
||||
r = new(Response)
|
||||
err = DBQueryRow("SELECT R.id_response, R.id_question, R.id_user, R.answer, R.time_submit, R.score, R.score_explanation, R.id_corrector, R.time_scored, R.time_reported FROM survey_responses R WHERE R.id_question=? AND R.id_user=? ORDER BY time_submit DESC LIMIT 1", q.Id, u.Id).Scan(&r.Id, &r.IdQuestion, &r.IdUser, &r.Answer, &r.TimeSubmit, &r.Score, &r.ScoreExplaination, &r.IdCorrector, &r.TimeScored, &r.TimeReported)
|
||||
if !showScore {
|
||||
r.Score = nil
|
||||
|
@ -282,7 +303,7 @@ func (q *Question) GetMyResponse(u *User, showScore bool) (r Response, err error
|
|||
return
|
||||
}
|
||||
|
||||
func (q *Question) GetResponses() (responses []Response, err error) {
|
||||
func (q *Question) GetResponses() (responses []*Response, err error) {
|
||||
if rows, errr := DBQuery("SELECT id_response, id_question, S.id_user, answer, S.time_submit, score, score_explanation, id_corrector, time_scored, time_reported FROM (SELECT id_user, MAX(time_submit) AS time_submit FROM survey_responses WHERE id_question=? GROUP BY id_user) R INNER JOIN survey_responses S ON S.id_user = R.id_user AND S.time_submit = R.time_submit AND S.id_question=?", q.Id, q.Id); errr != nil {
|
||||
return nil, errr
|
||||
} else {
|
||||
|
@ -293,7 +314,7 @@ func (q *Question) GetResponses() (responses []Response, err error) {
|
|||
if err = rows.Scan(&r.Id, &r.IdQuestion, &r.IdUser, &r.Answer, &r.TimeSubmit, &r.Score, &r.ScoreExplaination, &r.IdCorrector, &r.TimeScored, &r.TimeReported); err != nil {
|
||||
return
|
||||
}
|
||||
responses = append(responses, r)
|
||||
responses = append(responses, &r)
|
||||
}
|
||||
if err = rows.Err(); err != nil {
|
||||
return
|
||||
|
@ -303,23 +324,25 @@ func (q *Question) GetResponses() (responses []Response, err error) {
|
|||
}
|
||||
}
|
||||
|
||||
func getResponse(id int) (r Response, err error) {
|
||||
func getResponse(id int) (r *Response, err error) {
|
||||
r = new(Response)
|
||||
err = DBQueryRow("SELECT id_response, id_question, id_user, answer, time_submit, score, score_explanation, id_corrector, time_scored, time_reported FROM survey_responses WHERE id_response=?", id).Scan(&r.Id, &r.IdQuestion, &r.IdUser, &r.Answer, &r.TimeSubmit, &r.Score, &r.ScoreExplaination, &r.IdCorrector, &r.TimeScored, &r.TimeReported)
|
||||
return
|
||||
}
|
||||
|
||||
func (s *Survey) GetResponse(id int) (r Response, err error) {
|
||||
func (s *Survey) GetResponse(id int) (r *Response, err error) {
|
||||
r = new(Response)
|
||||
err = DBQueryRow("SELECT R.id_response, R.id_question, R.id_user, R.answer, R.time_submit, R.score, R.score_explanation, R.id_corrector, R.time_scored, R.time_reported FROM survey_responses R INNER JOIN survey_quests Q ON Q.id_question = R.id_question WHERE R.id_response=? AND Q.id_survey=?", id, s.Id).Scan(&r.Id, &r.IdQuestion, &r.IdUser, &r.Answer, &r.TimeSubmit, &r.Score, &r.ScoreExplaination, &r.IdCorrector, &r.TimeScored, &r.TimeReported)
|
||||
return
|
||||
}
|
||||
|
||||
func (s *Survey) NewResponse(id_question int64, id_user int64, response string) (Response, error) {
|
||||
func (s *Survey) NewResponse(id_question int64, id_user int64, response string) (*Response, error) {
|
||||
if res, err := DBExec("INSERT INTO survey_responses (id_question, id_user, answer, time_submit) VALUES (?, ?, ?, ?)", id_question, id_user, response, time.Now()); err != nil {
|
||||
return Response{}, err
|
||||
return nil, err
|
||||
} else if rid, err := res.LastInsertId(); err != nil {
|
||||
return Response{}, err
|
||||
return nil, err
|
||||
} else {
|
||||
return Response{rid, id_question, id_user, response, time.Now(), nil, nil, nil, nil, nil}, nil
|
||||
return &Response{rid, id_question, id_user, response, time.Now(), nil, nil, nil, nil, nil}, nil
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Reference in a new issue