From 9733c319772efb633b38b60626d2569ce17e9aa6 Mon Sep 17 00:00:00 2001 From: kavos113 Date: Wed, 7 Aug 2024 14:08:31 +0900 Subject: [PATCH 1/3] feat: PostQuestionnaireResponse handler --- handler/questionnaire.go | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/handler/questionnaire.go b/handler/questionnaire.go index 729fa111..0490f43b 100644 --- a/handler/questionnaire.go +++ b/handler/questionnaire.go @@ -147,6 +147,12 @@ func (h Handler) GetQuestionnaireResponses(ctx echo.Context, questionnaireID ope // (POST /questionnaires/{questionnaireID}/responses) func (h Handler) PostQuestionnaireResponse(ctx echo.Context, questionnaireID openapi.QuestionnaireIDInPath) error { res := openapi.Response{} + userID, err := getUserID(ctx) + if err != nil { + ctx.Logger().Errorf("failed to get userID: %+v", err) + return echo.NewHTTPError(http.StatusInternalServerError, fmt.Errorf("failed to get userID: %w", err)) + } + params := openapi.PostQuestionnaireResponseJSONRequestBody{} if err := ctx.Bind(¶ms); err != nil { ctx.Logger().Errorf("failed to bind request body: %+v", err) @@ -165,7 +171,11 @@ func (h Handler) PostQuestionnaireResponse(ctx echo.Context, questionnaireID ope } q := controller.NewQuestionnaire() - res, err = q.PostQuestionnaireResponse(ctx, questionnaireID, params) + res, err = q.PostQuestionnaireResponse(ctx, questionnaireID, params, userID) + if err != nil { + ctx.Logger().Errorf("failed to post questionnaire response: %+v", err) + return err + } return ctx.JSON(201, res) } From a26ceea6b0760a7ed606c16444729f38546c1455 Mon Sep 17 00:00:00 2001 From: kavos113 Date: Wed, 7 Aug 2024 14:09:31 +0900 Subject: [PATCH 2/3] feat: Insert QuestionnaireResponse --- controller/questionnaire.go | 46 +++++++++++++++++++++++++++++++++++-- 1 file changed, 44 insertions(+), 2 deletions(-) diff --git a/controller/questionnaire.go b/controller/questionnaire.go index 9ccbf238..9d8c8737 100644 --- a/controller/questionnaire.go +++ b/controller/questionnaire.go @@ -340,8 +340,50 @@ func (q Questionnaire) GetQuestionnaireResponses(c echo.Context, questionnaireID return res, nil } -func (q Questionnaire) PostQuestionnaireResponse(c echo.Context) error { - // todo: PostQuestionnaireResponse +func (q Questionnaire) PostQuestionnaireResponse(c echo.Context, questionnaireID int, params openapi.PostQuestionnaireResponseJSONRequestBody, userID string) (openapi.Response, error) { + res := openapi.Response{} + + limit, err := q.GetQuestionnaireLimit(c.Request().Context(), questionnaireID) + if err != nil { + if errors.Is(err, model.ErrRecordNotFound) { + c.Logger().Info("questionnaire not found") + return res, echo.NewHTTPError(http.StatusNotFound, err) + } + c.Logger().Errorf("failed to get questionnaire limit: %+v", err) + } + + // 回答期限を過ぎていたらエラー + if limit.Valid && limit.Time.Before(time.Now()) { + c.Logger().Info("expired questionnaire") + return res, echo.NewHTTPError(http.StatusUnprocessableEntity, err) + } + + var submittedAt, modifiedAt time.Time + if params.IsDraft { + submittedAt = time.Time{} + modifiedAt = time.Time{} + } else { + submittedAt = time.Now() + modifiedAt = time.Now() + } + + resopnseID, err := q.InsertRespondent(c.Request().Context(), userID, questionnaireID, null.NewTime(submittedAt, !params.IsDraft)) + if err != nil { + c.Logger().Errorf("failed to insert respondant: %+v", err) + return res, echo.NewHTTPError(http.StatusInternalServerError, err) + } + + res = openapi.Response{ + QuestionnaireId: questionnaireID, + ResponseId: resopnseID, + Respondent: userID, + SubmittedAt: submittedAt, + ModifiedAt: modifiedAt, + IsDraft: params.IsDraft, + Body: params.Body, + } + + return res, nil } func createQuestionnaireMessage(questionnaireID int, title string, description string, administrators []string, resTimeLimit null.Time, targets []string) string { From 65d79f51cf77932eaa9641ef207abe455c6c1670 Mon Sep 17 00:00:00 2001 From: kavos113 Date: Fri, 16 Aug 2024 19:43:49 +0900 Subject: [PATCH 3/3] fix: add missing error response --- controller/questionnaire.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/controller/questionnaire.go b/controller/questionnaire.go index 9d8c8737..2db3b479 100644 --- a/controller/questionnaire.go +++ b/controller/questionnaire.go @@ -350,6 +350,7 @@ func (q Questionnaire) PostQuestionnaireResponse(c echo.Context, questionnaireID return res, echo.NewHTTPError(http.StatusNotFound, err) } c.Logger().Errorf("failed to get questionnaire limit: %+v", err) + return res, echo.NewHTTPError(http.StatusInternalServerError, err) } // 回答期限を過ぎていたらエラー @@ -359,6 +360,7 @@ func (q Questionnaire) PostQuestionnaireResponse(c echo.Context, questionnaireID } var submittedAt, modifiedAt time.Time + //一時保存のときはnull if params.IsDraft { submittedAt = time.Time{} modifiedAt = time.Time{}