Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 16 additions & 8 deletions controller/adapter.go
Original file line number Diff line number Diff line change
Expand Up @@ -211,7 +211,7 @@ func questionnaire2QuestionnaireDetail(questionnaires model.Questionnaires, admi
return res, nil
}

func respondentDetail2Response(ctx echo.Context, respondentDetail model.RespondentDetail) (openapi.Response, error) {
func respondentDetail2ResponseWithMetadata(ctx echo.Context, respondentDetail model.RespondentDetail, respondent *string, isAnonymous bool) (openapi.Response, error) {
oResponseBodies := []openapi.ResponseBody{}
for _, r := range respondentDetail.Responses {
oResponseBody := openapi.ResponseBody{}
Expand Down Expand Up @@ -318,13 +318,6 @@ func respondentDetail2Response(ctx echo.Context, respondentDetail model.Responde
oResponseBodies = append(oResponseBodies, oResponseBody)
}

isAnonymous, err := model.NewQuestionnaire().GetResponseIsAnonymousByQuestionnaireID(ctx.Request().Context(), respondentDetail.QuestionnaireID)
if err != nil {
ctx.Logger().Errorf("failed to get response is anonymous: %+v", err)
return openapi.Response{}, err
}

respondent := &respondentDetail.TraqID
if isAnonymous {
respondent = nil
}
Expand All @@ -343,6 +336,21 @@ func respondentDetail2Response(ctx echo.Context, respondentDetail model.Responde
return res, nil
}

func respondentDetail2Response(ctx echo.Context, respondentDetail model.RespondentDetail) (openapi.Response, error) {
isAnonymous, err := model.NewQuestionnaire().GetResponseIsAnonymousByQuestionnaireID(ctx.Request().Context(), respondentDetail.QuestionnaireID)
if err != nil {
ctx.Logger().Errorf("failed to get response is anonymous: %+v", err)
return openapi.Response{}, err
}

respondent := &respondentDetail.TraqID
if isAnonymous {
respondent = nil
}

return respondentDetail2ResponseWithMetadata(ctx, respondentDetail, respondent, isAnonymous)
}

func responseBody2ResponseMetas(body []openapi.NewResponseBody, questions []model.Questions) ([]*model.ResponseMeta, error) {
res := []*model.ResponseMeta{}

Expand Down
4 changes: 2 additions & 2 deletions controller/questionnaire.go
Original file line number Diff line number Diff line change
Expand Up @@ -1110,8 +1110,8 @@ func (q *Questionnaire) PostQuestionnaireResponse(c echo.Context, questionnaireI

responseMetas, err := responseBody2ResponseMetas(params.Body, questions)
if err != nil {
c.Logger().Errorf("failed to convert response body to response metas: %+v", err)
return res, echo.NewHTTPError(http.StatusInternalServerError, err)
c.Logger().Infof("invalid response body: %+v", err)
return res, echo.NewHTTPError(http.StatusBadRequest, fmt.Errorf("invalid response body: %w", err))
}

// validationでチェック
Expand Down
13 changes: 8 additions & 5 deletions controller/questionnaire_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -212,6 +212,9 @@ func TestGetQuestionnaires(t *testing.T) {

assertion := assert.New(t)

uniqueSearchTitle := fmt.Sprintf("search test %d", time.Now().UnixNano())
specialTargetUser := fmt.Sprintf("stgq%d", time.Now().UnixNano())

questionnaire := sampleQuestionnaire
e := echo.New()
body, err := json.Marshal(questionnaire)
Expand All @@ -224,7 +227,7 @@ func TestGetQuestionnaires(t *testing.T) {
require.NoError(t, err)

questionnaire = sampleQuestionnaire
questionnaire.Title = "search test"
questionnaire.Title = uniqueSearchTitle
e = echo.New()
body, err = json.Marshal(questionnaire)
require.NoError(t, err)
Expand All @@ -236,7 +239,7 @@ func TestGetQuestionnaires(t *testing.T) {
require.NoError(t, err)

questionnaire = sampleQuestionnaire
questionnaire.Title = "search test"
questionnaire.Title = uniqueSearchTitle
e = echo.New()
body, err = json.Marshal(questionnaire)
require.NoError(t, err)
Expand All @@ -260,7 +263,7 @@ func TestGetQuestionnaires(t *testing.T) {
require.NoError(t, err)

questionnaire = sampleQuestionnaire
questionnaire.Target.Users = []string{"specialTargetUser"}
questionnaire.Target.Users = []string{specialTargetUser}
e = echo.New()
body, err = json.Marshal(questionnaire)
require.NoError(t, err)
Expand Down Expand Up @@ -293,7 +296,7 @@ func TestGetQuestionnaires(t *testing.T) {
sortTitleDesc := (openapi.SortInQuery)("-title")
sortModifiedAt := (openapi.SortInQuery)("modified_at")
sortModifiedAtDesc := (openapi.SortInQuery)("-modified_at")
searchTest := (openapi.SearchInQuery)("search test")
searchTest := openapi.SearchInQuery(uniqueSearchTitle)
largePageNum := 100000000
constTrue := true

Expand Down Expand Up @@ -435,7 +438,7 @@ func TestGetQuestionnaires(t *testing.T) {
{
description: "only targeting by me special target user",
args: args{
userID: "specialTargetUser",
userID: specialTargetUser,
params: openapi.GetQuestionnairesParams{
OnlyTargetingMe: &constTrue,
},
Expand Down
107 changes: 43 additions & 64 deletions controller/response.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,88 +50,67 @@ func NewResponse(
}

func (r *Response) GetMyResponses(ctx echo.Context, params openapi.GetMyResponsesParams, userID string) (openapi.ResponsesWithQuestionnaireInfo, error) {
res := openapi.ResponsesWithQuestionnaireInfo{}
res := openapi.ResponsesWithQuestionnaireInfo{
ResponseGroups: []openapi.ResponseWithQuestionnaireInfoItem{},
}

var sort string
if params.Sort == nil {
sort = ""
var pageNum int
if params.Page == nil {
pageNum = 1
} else {
sort = string(*params.Sort)
pageNum = int(*params.Page)
}
if pageNum < 1 {
pageNum = 1
}
var questionnaireIDs []int
if params.QuestionnaireIDs == nil {
questionnaireIDs = nil
} else {
questionnaireIDs = *params.QuestionnaireIDs
}
responsesID, err := r.IRespondent.GetMyResponseIDs(ctx.Request().Context(), sort, userID, questionnaireIDs, params.IsDraft)
if err != nil {
ctx.Logger().Errorf("failed to get my responses ID: %+v", err)
return openapi.ResponsesWithQuestionnaireInfo{}, echo.NewHTTPError(http.StatusInternalServerError, fmt.Errorf("failed to get questionnaire responses: %w", err))
}

responseLists := make(map[int][]openapi.Response)
var responseQuestionnaireIDs []int

for _, responseID := range responsesID {
responseDetail, err := r.IRespondent.GetRespondentDetail(ctx.Request().Context(), responseID)
if err != nil {
ctx.Logger().Errorf("failed to get respondent detail: %+v", err)
return openapi.ResponsesWithQuestionnaireInfo{}, echo.NewHTTPError(http.StatusInternalServerError, fmt.Errorf("failed to get respondent detail: %w", err))
}

response, err := respondentDetail2Response(ctx, responseDetail)
if err != nil {
ctx.Logger().Errorf("failed to convert respondent detail into response: %+v", err)
return openapi.ResponsesWithQuestionnaireInfo{}, echo.NewHTTPError(http.StatusInternalServerError, fmt.Errorf("failed to convert respondent detail into response: %w", err))
}

tmp := openapi.Response{
Body: response.Body,
IsDraft: response.IsDraft,
ModifiedAt: response.ModifiedAt,
QuestionnaireId: response.QuestionnaireId,
Respondent: &userID,
ResponseId: response.ResponseId,
SubmittedAt: response.SubmittedAt,
IsAnonymous: response.IsAnonymous,
responseGroups, pageMax, err := r.IRespondent.GetMyResponseGroups(ctx.Request().Context(), userID, questionnaireIDs, params.IsDraft, pageNum)
if err != nil {
if errors.Is(err, model.ErrTooLargePageNum) {
ctx.Logger().Infof("invalid myResponses params: %+v", err)
return openapi.ResponsesWithQuestionnaireInfo{}, echo.NewHTTPError(http.StatusBadRequest, err)
}
responseLists[responseDetail.QuestionnaireID] = append(responseLists[responseDetail.QuestionnaireID], tmp)
responseQuestionnaireIDs = append(responseQuestionnaireIDs, responseDetail.QuestionnaireID)
ctx.Logger().Errorf("failed to get my response groups: %+v", err)
return openapi.ResponsesWithQuestionnaireInfo{}, echo.NewHTTPError(http.StatusInternalServerError, fmt.Errorf("failed to get questionnaire responses: %w", err))
}
res.PageMax = pageMax

questionnaireIDExists := make(map[int]bool, len(responseQuestionnaireIDs))
for _, questionnaireID := range responseQuestionnaireIDs {
if questionnaireIDExists[questionnaireID] {
continue
for _, responseGroup := range responseGroups {
var responseDueDateTime *time.Time
if responseGroup.QuestionnaireInfo.ResponseDueDateTime.Valid {
dueDateTime := responseGroup.QuestionnaireInfo.ResponseDueDateTime.Time
responseDueDateTime = &dueDateTime
}
questionnaireIDExists[questionnaireID] = true

questionnaire, _, _, _, _, _, _, _, err := r.IQuestionnaire.GetQuestionnaireInfo(ctx.Request().Context(), questionnaireID)
if err != nil {
ctx.Logger().Errorf("failed to get questionnaire info: %+v", err)
return openapi.ResponsesWithQuestionnaireInfo{}, echo.NewHTTPError(http.StatusInternalServerError, fmt.Errorf("failed to get questionnaire info: %w", err))
groupItem := openapi.ResponseWithQuestionnaireInfoItem{
QuestionnaireInfo: openapi.QuestionnaireInfo{
CreatedAt: responseGroup.QuestionnaireInfo.CreatedAt,
IsTargetingMe: responseGroup.QuestionnaireInfo.IsTargetingMe,
ModifiedAt: responseGroup.QuestionnaireInfo.ModifiedAt,
ResponseDueDateTime: responseDueDateTime,
Title: responseGroup.QuestionnaireInfo.Title,
},
Responses: []openapi.Response{},
}

isTargetingMe, err := r.ITarget.IsTargetingMe(ctx.Request().Context(), questionnaireID, userID)
if err != nil {
ctx.Logger().Errorf("failed to get target info: %+v", err)
return openapi.ResponsesWithQuestionnaireInfo{}, echo.NewHTTPError(http.StatusInternalServerError, fmt.Errorf("failed to get target info: %w", err))
}
for _, responseDetail := range responseGroup.Responses {
respondent := userID
response, err := respondentDetail2ResponseWithMetadata(ctx, responseDetail, &respondent, responseGroup.QuestionnaireInfo.IsAnonymous)
if err != nil {
ctx.Logger().Errorf("failed to convert respondent detail into response: %+v", err)
return openapi.ResponsesWithQuestionnaireInfo{}, echo.NewHTTPError(http.StatusInternalServerError, fmt.Errorf("failed to convert respondent detail into response: %w", err))
}

questionnaireInfo := openapi.QuestionnaireInfo{
CreatedAt: questionnaire.CreatedAt,
IsTargetingMe: isTargetingMe,
ModifiedAt: questionnaire.ModifiedAt,
ResponseDueDateTime: &questionnaire.ResTimeLimit.Time,
Title: questionnaire.Title,
groupItem.Responses = append(groupItem.Responses, response)
}

responses := responseLists[questionnaireID]
res = append(res, openapi.ResponseWithQuestionnaireInfoItem{
QuestionnaireInfo: questionnaireInfo,
Responses: responses,
})
res.ResponseGroups = append(res.ResponseGroups, groupItem)
}

return res, nil
Expand Down Expand Up @@ -217,8 +196,8 @@ func (r *Response) EditResponse(ctx echo.Context, responseID openapi.ResponseIDI

responseMetas, err := responseBody2ResponseMetas(req.Body, questions)
if err != nil {
ctx.Logger().Errorf("failed to convert response body into response metas: %+v", err)
return echo.NewHTTPError(http.StatusInternalServerError, fmt.Errorf("failed to convert response body into response metas: %w", err))
ctx.Logger().Infof("invalid response body: %+v", err)
return echo.NewHTTPError(http.StatusBadRequest, fmt.Errorf("invalid response body: %w", err))
}

// validationでチェック
Expand Down
Loading
Loading