diff --git a/controller/adapter.go b/controller/adapter.go index 44794d72..051a5a71 100644 --- a/controller/adapter.go +++ b/controller/adapter.go @@ -153,8 +153,8 @@ func questionnaire2QuestionnaireDetail(questionnaires model.Questionnaires, admi CreatedAt: questionnaires.CreatedAt, Description: questionnaires.Description, // IsAllowingMultipleResponses: questionnaires.IsAllowingMultipleResponses, - // IsAnonymous: questionnaires.IsAnonymous, - // IsPublished: questionnaires.IsPublished, + IsAnonymous: questionnaires.IsAnonymous, + IsPublished: questionnaires.IsPublished, ModifiedAt: questionnaires.ModifiedAt, QuestionnaireId: questionnaires.ID, Questions: convertQuestions(questionnaires.Questions), @@ -264,6 +264,12 @@ 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 + } + res := openapi.Response{ Body: oResponseBodies, IsDraft: respondentDetail.SubmittedAt.Valid, @@ -272,6 +278,7 @@ func respondentDetail2Response(ctx echo.Context, respondentDetail model.Responde Respondent: &respondentDetail.TraqID, ResponseId: respondentDetail.ResponseID, SubmittedAt: respondentDetail.SubmittedAt.Time, + IsAnonymous: &isAnonymous, } return res, nil diff --git a/controller/questionnaire.go b/controller/questionnaire.go index 43d7bc56..88a34bc1 100644 --- a/controller/questionnaire.go +++ b/controller/questionnaire.go @@ -111,7 +111,7 @@ func (q Questionnaire) PostQuestionnaire(c echo.Context, userID string, params o questionnaireID := 0 err := q.ITransaction.Do(c.Request().Context(), nil, func(ctx context.Context) error { - questionnaireID, err := q.InsertQuestionnaire(ctx, params.Title, params.Description, responseDueDateTime, convertResponseViewableBy(params.ResponseViewableBy), params.IsPublished) + questionnaireID, err := q.InsertQuestionnaire(ctx, params.Title, params.Description, responseDueDateTime, convertResponseViewableBy(params.ResponseViewableBy), params.IsPublished, params.IsAnonymous) if err != nil { c.Logger().Errorf("failed to insert questionnaire: %+v", err) return err @@ -302,13 +302,24 @@ func (q Questionnaire) GetQuestionnaire(ctx echo.Context, questionnaireID int) ( } func (q Questionnaire) EditQuestionnaire(c echo.Context, questionnaireID int, params openapi.EditQuestionnaireJSONRequestBody) error { + // unable to change the questionnaire from anoymous to non-anonymous + isAnonymous, err := q.GetResponseIsAnonymousByQuestionnaireID(c.Request().Context(), questionnaireID) + if err != nil { + c.Logger().Errorf("failed to get anonymous info: %+v", err) + return echo.NewHTTPError(http.StatusInternalServerError, "failed to get anonymous info") + } + if isAnonymous && !params.IsAnonymous { + c.Logger().Info("unable to change the questionnaire from anoymous to non-anonymous") + return echo.NewHTTPError(http.StatusBadRequest, "unable to change the questionnaire from anoymous to non-anonymous") + } + responseDueDateTime := null.Time{} if params.ResponseDueDateTime != nil { responseDueDateTime.Valid = true responseDueDateTime.Time = *params.ResponseDueDateTime } - err := q.ITransaction.Do(c.Request().Context(), nil, func(ctx context.Context) error { - err := q.UpdateQuestionnaire(ctx, params.Title, params.Description, responseDueDateTime, string(params.ResponseViewableBy), questionnaireID, params.IsPublished) + err = q.ITransaction.Do(c.Request().Context(), nil, func(ctx context.Context) error { + err := q.UpdateQuestionnaire(ctx, params.Title, params.Description, responseDueDateTime, string(params.ResponseViewableBy), questionnaireID, params.IsPublished, params.IsAnonymous) if err != nil && !errors.Is(err, model.ErrNoRecordUpdated) { c.Logger().Errorf("failed to update questionnaire: %+v", err) return err @@ -715,6 +726,8 @@ func (q Questionnaire) PostQuestionnaireResponse(c echo.Context, questionnaireID } } + isAnonymous, err := q.GetResponseIsAnonymousByQuestionnaireID(c.Request().Context(), questionnaireID) + res = openapi.Response{ QuestionnaireId: questionnaireID, ResponseId: resopnseID, @@ -722,6 +735,7 @@ func (q Questionnaire) PostQuestionnaireResponse(c echo.Context, questionnaireID SubmittedAt: submittedAt, ModifiedAt: modifiedAt, IsDraft: params.IsDraft, + IsAnonymous: &isAnonymous, Body: params.Body, } diff --git a/controller/response.go b/controller/response.go index 346f548e..425b874c 100644 --- a/controller/response.go +++ b/controller/response.go @@ -79,6 +79,7 @@ func (r Response) GetMyResponses(ctx echo.Context, params openapi.GetMyResponses Respondent: &userID, ResponseId: response.ResponseId, SubmittedAt: response.SubmittedAt, + IsAnonymous: response.IsAnonymous, } res = append(res, tmp) } @@ -244,6 +245,6 @@ func (r Response) EditResponse(ctx echo.Context, responseID openapi.ResponseIDIn return echo.NewHTTPError(http.StatusInternalServerError, fmt.Errorf("failed to insert responses: %w", err)) } } - + return nil -} \ No newline at end of file +} diff --git a/docs/db_schema.md b/docs/db_schema.md index aafc17f7..7d1f4523 100644 --- a/docs/db_schema.md +++ b/docs/db_schema.md @@ -48,9 +48,10 @@ | res_time_limit | timestamp | YES | | _NULL_ | | 回答の締切日時 (締切がない場合は NULL) | | deleted_at | timestamp | YES | | _NULL_ | | アンケートが削除された日時 (削除されていない場合は NULL) | | res_shared_to | char(30) | NO | | administrators | | アンケートの結果を, 運営は見られる ("administrators"), 回答済みの人は見られる ("respondents") 誰でも見られる ("public") | +| is_anonymous | boolean | NO | | false | | アンケートが匿名解答かどうか | | created_at | timestamp | NO | | CURRENT_TIMESTAMP | | アンケートが作成された日時 | | modified_at | timestamp | NO | | CURRENT_TIMESTAMP | | アンケートが更新された日時 | -| is_published | bookean | NO | | false | | アンケートが公開かどうか +| is_published | boolean | NO | | false | | アンケートが公開かどうか | ### respondents diff --git a/docs/swagger/swagger.yaml b/docs/swagger/swagger.yaml index d3658844..23d733e9 100644 --- a/docs/swagger/swagger.yaml +++ b/docs/swagger/swagger.yaml @@ -91,7 +91,7 @@ paths: # TODO 変数の命名を確認する operationId: editQuestionnaire tags: - questionnaire - description: アンケートの情報を変更します。 + description: アンケートの情報を変更します。匿名のアンケートを非匿名アンケートに変更することができません。 parameters: - $ref: "#/components/parameters/questionnaireIDInPath" requestBody: @@ -105,6 +105,8 @@ paths: # TODO 変数の命名を確認する description: 正常にアンケートを変更できました。 "400": description: アンケートのIDが無効です + "405": + description: 匿名のアンケートを非匿名アンケートに変更することができません "500": description: 正常にアンケートを変更できませんでした delete: diff --git a/handler/questionnaire.go b/handler/questionnaire.go index 8b885ee1..954f50b9 100644 --- a/handler/questionnaire.go +++ b/handler/questionnaire.go @@ -93,7 +93,7 @@ func (h Handler) EditQuestionnaire(ctx echo.Context, questionnaireID openapi.Que err := q.EditQuestionnaire(ctx, questionnaireID, params) if err != nil { ctx.Logger().Errorf("failed to edit questionnaire: %+v", err) - return echo.NewHTTPError(http.StatusInternalServerError, fmt.Errorf("failed to edit questionnaire: %w", err)) + return err } return ctx.NoContent(200) diff --git a/model/questionnaires.go b/model/questionnaires.go index 225ac674..e6ac50c8 100644 --- a/model/questionnaires.go +++ b/model/questionnaires.go @@ -10,8 +10,8 @@ import ( // IQuestionnaire QuestionnaireのRepository type IQuestionnaire interface { - InsertQuestionnaire(ctx context.Context, title string, description string, resTimeLimit null.Time, resSharedTo string, isPublished bool) (int, error) - UpdateQuestionnaire(ctx context.Context, title string, description string, resTimeLimit null.Time, resSharedTo string, questionnaireID int, isPublished bool) error + InsertQuestionnaire(ctx context.Context, title string, description string, resTimeLimit null.Time, resSharedTo string, isPublished bool, isAnonymous bool) (int, error) + UpdateQuestionnaire(ctx context.Context, title string, description string, resTimeLimit null.Time, resSharedTo string, questionnaireID int, isPublished bool, isAnonymous bool) error DeleteQuestionnaire(ctx context.Context, questionnaireID int) error GetQuestionnaires(ctx context.Context, userID string, sort string, search string, pageNum int, onlyTargetingMe bool, onlyAdministratedByMe bool) ([]QuestionnaireInfo, int, error) GetAdminQuestionnaires(ctx context.Context, userID string) ([]Questionnaires, error) @@ -21,5 +21,6 @@ type IQuestionnaire interface { GetQuestionnaireLimitByResponseID(ctx context.Context, responseID int) (null.Time, error) GetResponseReadPrivilegeInfoByResponseID(ctx context.Context, userID string, responseID int) (*ResponseReadPrivilegeInfo, error) GetResponseReadPrivilegeInfoByQuestionnaireID(ctx context.Context, userID string, questionnaireID int) (*ResponseReadPrivilegeInfo, error) + GetResponseIsAnonymousByQuestionnaireID(ctx context.Context, questionnaireID int) (bool, error) GetQuestionnairesInfoForReminder(ctx context.Context) ([]Questionnaires, error) } diff --git a/model/questionnaires_impl.go b/model/questionnaires_impl.go index e194e049..f8fa8c3d 100755 --- a/model/questionnaires_impl.go +++ b/model/questionnaires_impl.go @@ -28,6 +28,7 @@ type Questionnaires struct { ResTimeLimit null.Time `json:"res_time_limit,omitempty" gorm:"type:TIMESTAMP NULL;default:NULL;"` DeletedAt gorm.DeletedAt `json:"-" gorm:"type:TIMESTAMP NULL;default:NULL;"` ResSharedTo string `json:"res_shared_to" gorm:"type:char(30);size:30;not null;default:administrators"` + IsAnonymous bool `json:"is_anonymous" gorm:"type:boolean;not null;default:false"` CreatedAt time.Time `json:"created_at" gorm:"type:timestamp;not null;default:CURRENT_TIMESTAMP"` ModifiedAt time.Time `json:"modified_at" gorm:"type:timestamp;not null;default:CURRENT_TIMESTAMP"` Administrators []Administrators `json:"-" gorm:"foreignKey:QuestionnaireID"` @@ -82,7 +83,7 @@ type ResponseReadPrivilegeInfo struct { } // InsertQuestionnaire アンケートの追加 -func (*Questionnaire) InsertQuestionnaire(ctx context.Context, title string, description string, resTimeLimit null.Time, resSharedTo string, isPublished bool) (int, error) { +func (*Questionnaire) InsertQuestionnaire(ctx context.Context, title string, description string, resTimeLimit null.Time, resSharedTo string, isPublished bool, isAnonymous bool) (int, error) { db, err := getTx(ctx) if err != nil { return 0, fmt.Errorf("failed to get tx: %w", err) @@ -95,6 +96,7 @@ func (*Questionnaire) InsertQuestionnaire(ctx context.Context, title string, des Description: description, ResSharedTo: resSharedTo, IsPublished: isPublished, + IsAnonymous: isAnonymous, } } else { questionnaire = Questionnaires{ @@ -103,6 +105,7 @@ func (*Questionnaire) InsertQuestionnaire(ctx context.Context, title string, des ResTimeLimit: resTimeLimit, ResSharedTo: resSharedTo, IsPublished: isPublished, + IsAnonymous: isAnonymous, } } @@ -115,7 +118,7 @@ func (*Questionnaire) InsertQuestionnaire(ctx context.Context, title string, des } // UpdateQuestionnaire アンケートの更新 -func (*Questionnaire) UpdateQuestionnaire(ctx context.Context, title string, description string, resTimeLimit null.Time, resSharedTo string, questionnaireID int, isPublished bool) error { +func (*Questionnaire) UpdateQuestionnaire(ctx context.Context, title string, description string, resTimeLimit null.Time, resSharedTo string, questionnaireID int, isPublished bool, isAnonymous bool) error { db, err := getTx(ctx) if err != nil { return fmt.Errorf("failed to get tx: %w", err) @@ -129,6 +132,7 @@ func (*Questionnaire) UpdateQuestionnaire(ctx context.Context, title string, des ResTimeLimit: resTimeLimit, ResSharedTo: resSharedTo, IsPublished: isPublished, + IsAnonymous: isAnonymous, } } else { questionnaire = map[string]interface{}{ @@ -137,6 +141,7 @@ func (*Questionnaire) UpdateQuestionnaire(ctx context.Context, title string, des "res_time_limit": gorm.Expr("NULL"), "res_shared_to": resSharedTo, "is_published": isPublished, + "is_anonymous": isAnonymous, } } @@ -495,6 +500,28 @@ func (*Questionnaire) GetResponseReadPrivilegeInfoByQuestionnaireID(ctx context. return &responseReadPrivilegeInfo, nil } +func (*Questionnaire) GetResponseIsAnonymousByQuestionnaireID(ctx context.Context, questionnaireID int) (bool, error) { + db, err := getTx(ctx) + if err != nil { + return true, fmt.Errorf("failed to get tx: %w", err) + } + + var isAnonymous bool + err = db. + Table("questionnaires"). + Where("questionnaires.id = ?", questionnaireID). + Select("questionnaires.is_anonymous"). + Take(&isAnonymous).Error + if errors.Is(err, gorm.ErrRecordNotFound) { + return true, ErrRecordNotFound + } + if err != nil { + return true, fmt.Errorf("failed to get is_anonymous: %w", err) + } + + return isAnonymous, nil +} + func setQuestionnairesOrder(query *gorm.DB, sort string) (*gorm.DB, error) { switch sort { case "created_at": diff --git a/model/questionnaires_test.go b/model/questionnaires_test.go index a3a32a87..d828e7f8 100644 --- a/model/questionnaires_test.go +++ b/model/questionnaires_test.go @@ -369,6 +369,7 @@ func insertQuestionnaireTest(t *testing.T) { resTimeLimit null.Time resSharedTo string isPublished bool + isAnonymous bool } type expect struct { isErr bool @@ -390,6 +391,7 @@ func insertQuestionnaireTest(t *testing.T) { resTimeLimit: null.NewTime(time.Time{}, false), resSharedTo: "public", isPublished: true, + isAnonymous: false, }, }, { @@ -400,6 +402,7 @@ func insertQuestionnaireTest(t *testing.T) { resTimeLimit: null.NewTime(time.Now(), true), resSharedTo: "public", isPublished: true, + isAnonymous: false, }, }, { @@ -410,6 +413,7 @@ func insertQuestionnaireTest(t *testing.T) { resTimeLimit: null.NewTime(time.Time{}, false), resSharedTo: "respondents", isPublished: true, + isAnonymous: false, }, }, { @@ -420,6 +424,7 @@ func insertQuestionnaireTest(t *testing.T) { resTimeLimit: null.NewTime(time.Time{}, false), resSharedTo: "administrators", isPublished: true, + isAnonymous: false, }, }, { @@ -430,6 +435,7 @@ func insertQuestionnaireTest(t *testing.T) { resTimeLimit: null.NewTime(time.Time{}, false), resSharedTo: "public", isPublished: true, + isAnonymous: false, }, }, { @@ -440,6 +446,7 @@ func insertQuestionnaireTest(t *testing.T) { resTimeLimit: null.NewTime(time.Time{}, false), resSharedTo: "public", isPublished: true, + isAnonymous: false, }, expect: expect{ isErr: true, @@ -453,6 +460,7 @@ func insertQuestionnaireTest(t *testing.T) { resTimeLimit: null.NewTime(time.Time{}, false), resSharedTo: "public", isPublished: true, + isAnonymous: false, }, }, { @@ -463,6 +471,7 @@ func insertQuestionnaireTest(t *testing.T) { resTimeLimit: null.NewTime(time.Time{}, false), resSharedTo: "public", isPublished: true, + isAnonymous: false, }, expect: expect{ isErr: true, @@ -476,6 +485,18 @@ func insertQuestionnaireTest(t *testing.T) { resTimeLimit: null.NewTime(time.Time{}, false), resSharedTo: "public", isPublished: false, + isAnonymous: false, + }, + }, + { + description: "anonymous questionnaire", + args: args{ + title: "第1回集会らん☆ぷろ募集アンケート", + description: "第1回集会らん☆ぷろ参加者募集", + resTimeLimit: null.NewTime(time.Time{}, false), + resSharedTo: "public", + isPublished: true, + isAnonymous: true, }, }, } @@ -483,7 +504,7 @@ func insertQuestionnaireTest(t *testing.T) { for _, testCase := range testCases { ctx := context.Background() - questionnaireID, err := questionnaireImpl.InsertQuestionnaire(ctx, testCase.args.title, testCase.args.description, testCase.args.resTimeLimit, testCase.args.resSharedTo, testCase.args.isPublished) + questionnaireID, err := questionnaireImpl.InsertQuestionnaire(ctx, testCase.args.title, testCase.args.description, testCase.args.resTimeLimit, testCase.args.resSharedTo, testCase.args.isPublished, testCase.args.isAnonymous) if !testCase.expect.isErr { assertion.NoError(err, testCase.description, "no error") @@ -525,6 +546,7 @@ func updateQuestionnaireTest(t *testing.T) { resTimeLimit null.Time resSharedTo string isPublished bool + isAnonymous bool } type expect struct { isErr bool @@ -547,6 +569,7 @@ func updateQuestionnaireTest(t *testing.T) { resTimeLimit: null.NewTime(time.Time{}, false), resSharedTo: "public", isPublished: true, + isAnonymous: false, }, after: args{ title: "第1回集会らん☆ぷろ募集アンケート", @@ -554,6 +577,7 @@ func updateQuestionnaireTest(t *testing.T) { resTimeLimit: null.NewTime(time.Time{}, false), resSharedTo: "respondents", isPublished: true, + isAnonymous: false, }, }, { @@ -564,6 +588,7 @@ func updateQuestionnaireTest(t *testing.T) { resTimeLimit: null.NewTime(time.Time{}, false), resSharedTo: "public", isPublished: true, + isAnonymous: false, }, after: args{ title: "第2回集会らん☆ぷろ募集アンケート", @@ -571,6 +596,7 @@ func updateQuestionnaireTest(t *testing.T) { resTimeLimit: null.NewTime(time.Time{}, false), resSharedTo: "public", isPublished: true, + isAnonymous: false, }, }, { @@ -581,6 +607,7 @@ func updateQuestionnaireTest(t *testing.T) { resTimeLimit: null.NewTime(time.Time{}, false), resSharedTo: "public", isPublished: true, + isAnonymous: false, }, after: args{ title: "第1回集会らん☆ぷろ募集アンケート", @@ -588,6 +615,7 @@ func updateQuestionnaireTest(t *testing.T) { resTimeLimit: null.NewTime(time.Time{}, false), resSharedTo: "public", isPublished: true, + isAnonymous: false, }, }, { @@ -598,6 +626,7 @@ func updateQuestionnaireTest(t *testing.T) { resTimeLimit: null.NewTime(time.Now(), true), resSharedTo: "public", isPublished: true, + isAnonymous: false, }, after: args{ title: "第1回集会らん☆ぷろ募集アンケート", @@ -605,6 +634,7 @@ func updateQuestionnaireTest(t *testing.T) { resTimeLimit: null.NewTime(time.Now(), true), resSharedTo: "respondents", isPublished: true, + isAnonymous: false, }, }, { @@ -615,6 +645,7 @@ func updateQuestionnaireTest(t *testing.T) { resTimeLimit: null.NewTime(time.Now(), true), resSharedTo: "public", isPublished: true, + isAnonymous: false, }, after: args{ title: "第2回集会らん☆ぷろ募集アンケート", @@ -622,6 +653,7 @@ func updateQuestionnaireTest(t *testing.T) { resTimeLimit: null.NewTime(time.Now(), true), resSharedTo: "public", isPublished: true, + isAnonymous: false, }, }, { @@ -632,6 +664,7 @@ func updateQuestionnaireTest(t *testing.T) { resTimeLimit: null.NewTime(time.Now(), true), resSharedTo: "public", isPublished: true, + isAnonymous: false, }, after: args{ title: "第1回集会らん☆ぷろ募集アンケート", @@ -639,6 +672,7 @@ func updateQuestionnaireTest(t *testing.T) { resTimeLimit: null.NewTime(time.Now(), true), resSharedTo: "public", isPublished: true, + isAnonymous: false, }, }, { @@ -649,6 +683,7 @@ func updateQuestionnaireTest(t *testing.T) { resTimeLimit: null.NewTime(time.Time{}, false), resSharedTo: "public", isPublished: true, + isAnonymous: false, }, after: args{ title: "第1回集会らん☆ぷろ募集アンケート", @@ -656,6 +691,7 @@ func updateQuestionnaireTest(t *testing.T) { resTimeLimit: null.NewTime(time.Now(), true), resSharedTo: "public", isPublished: true, + isAnonymous: false, }, }, { @@ -666,6 +702,7 @@ func updateQuestionnaireTest(t *testing.T) { resTimeLimit: null.NewTime(time.Now(), true), resSharedTo: "public", isPublished: true, + isAnonymous: false, }, after: args{ title: "第1回集会らん☆ぷろ募集アンケート", @@ -673,6 +710,7 @@ func updateQuestionnaireTest(t *testing.T) { resTimeLimit: null.NewTime(time.Now().Add(time.Minute), true), resSharedTo: "public", isPublished: true, + isAnonymous: false, }, }, { @@ -683,6 +721,7 @@ func updateQuestionnaireTest(t *testing.T) { resTimeLimit: null.NewTime(time.Now(), true), resSharedTo: "public", isPublished: true, + isAnonymous: false, }, after: args{ title: "第1回集会らん☆ぷろ募集アンケート", @@ -690,6 +729,7 @@ func updateQuestionnaireTest(t *testing.T) { resTimeLimit: null.NewTime(time.Time{}, false), resSharedTo: "public", isPublished: true, + isAnonymous: false, }, }, { @@ -700,6 +740,7 @@ func updateQuestionnaireTest(t *testing.T) { resTimeLimit: null.NewTime(time.Time{}, false), resSharedTo: "public", isPublished: false, + isAnonymous: false, }, after: args{ title: "第1回集会らん☆ぷろ募集アンケート", @@ -707,6 +748,26 @@ func updateQuestionnaireTest(t *testing.T) { resTimeLimit: null.NewTime(time.Time{}, false), resSharedTo: "public", isPublished: true, + isAnonymous: false, + }, + }, + { + description: "update is_anonymous(false->true)", + before: args{ + title: "第1回集会らん☆ぷろ募集アンケート", + description: "第1回集会らん☆ぷろ参加者募集", + resTimeLimit: null.NewTime(time.Time{}, true), + resSharedTo: "public", + isPublished: true, + isAnonymous: false, + }, + after: args{ + title: "第1回集会らん☆ぷろ募集アンケート", + description: "第1回集会らん☆ぷろ参加者募集", + resTimeLimit: null.NewTime(time.Time{}, true), + resSharedTo: "public", + isPublished: true, + isAnonymous: true, }, }, } @@ -732,7 +793,7 @@ func updateQuestionnaireTest(t *testing.T) { createdAt := questionnaire.CreatedAt questionnaireID := questionnaire.ID after := &testCase.after - err = questionnaireImpl.UpdateQuestionnaire(ctx, after.title, after.description, after.resTimeLimit, after.resSharedTo, questionnaireID, after.isPublished) + err = questionnaireImpl.UpdateQuestionnaire(ctx, after.title, after.description, after.resTimeLimit, after.resSharedTo, questionnaireID, after.isPublished, false) if !testCase.expect.isErr { assertion.NoError(err, testCase.description, "no error") @@ -786,6 +847,7 @@ func updateQuestionnaireTest(t *testing.T) { resTimeLimit: null.NewTime(time.Time{}, false), resSharedTo: "public", isPublished: true, + isAnonymous: false, }, { title: "第1回集会らん☆ぷろ募集アンケート", @@ -793,13 +855,14 @@ func updateQuestionnaireTest(t *testing.T) { resTimeLimit: null.NewTime(time.Now(), true), resSharedTo: "public", isPublished: true, + isAnonymous: false, }, } for _, arg := range invalidTestCases { ctx := context.Background() - err := questionnaireImpl.UpdateQuestionnaire(ctx, arg.title, arg.description, arg.resTimeLimit, arg.resSharedTo, invalidQuestionnaireID, arg.isPublished) + err := questionnaireImpl.UpdateQuestionnaire(ctx, arg.title, arg.description, arg.resTimeLimit, arg.resSharedTo, invalidQuestionnaireID, arg.isPublished, arg.isAnonymous) if !errors.Is(err, ErrNoRecordUpdated) { if err == nil { t.Errorf("Succeeded with invalid questionnaireID") @@ -821,6 +884,7 @@ func deleteQuestionnaireTest(t *testing.T) { resTimeLimit null.Time resSharedTo string isPublished bool + isAnonymous bool } type expect struct { isErr bool @@ -839,6 +903,7 @@ func deleteQuestionnaireTest(t *testing.T) { resTimeLimit: null.NewTime(time.Time{}, false), resSharedTo: "public", isPublished: true, + isAnonymous: false, }, }, } @@ -852,6 +917,7 @@ func deleteQuestionnaireTest(t *testing.T) { ResTimeLimit: testCase.args.resTimeLimit, ResSharedTo: testCase.args.resSharedTo, IsPublished: testCase.isPublished, + IsAnonymous: testCase.args.isAnonymous, } err := db. Session(&gorm.Session{NewDB: true}). diff --git a/model/respondents_impl.go b/model/respondents_impl.go index 2cbf4aaf..70c500e9 100755 --- a/model/respondents_impl.go +++ b/model/respondents_impl.go @@ -291,16 +291,25 @@ func (*Respondent) GetRespondentDetails(ctx context.Context, questionnaireID int responseIDs = append(responseIDs, respondent.ResponseID) } + isAnonymous, err := NewQuestionnaire().GetResponseIsAnonymousByQuestionnaireID(ctx, questionnaireID) + respondentDetails := make([]RespondentDetail, 0, len(respondents)) respondentDetailMap := make(map[int]*RespondentDetail, len(respondents)) for i, respondent := range respondents { - respondentDetails = append(respondentDetails, RespondentDetail{ + r := RespondentDetail{ ResponseID: respondent.ResponseID, - TraqID: respondent.UserTraqid, QuestionnaireID: questionnaireID, SubmittedAt: respondent.SubmittedAt, ModifiedAt: respondent.ModifiedAt, - }) + } + + if !isAnonymous { + r.TraqID = respondent.UserTraqid + } else { + r.TraqID = "" + } + + respondentDetails = append(respondentDetails, r) respondentDetailMap[respondent.ResponseID] = &respondentDetails[i] } diff --git a/model/respondents_test.go b/model/respondents_test.go index a9f353bc..6dde78ca 100644 --- a/model/respondents_test.go +++ b/model/respondents_test.go @@ -19,7 +19,7 @@ func TestInsertRespondent(t *testing.T) { assertion := assert.New(t) ctx := context.Background() - questionnaireID, err := questionnaireImpl.InsertQuestionnaire(ctx, "第1回集会らん☆ぷろ募集アンケート", "第1回メンバー集会でのらん☆ぷろで発表したい人を募集します らん☆ぷろで発表したい人あつまれー!", null.NewTime(time.Now(), false), "private", true) + questionnaireID, err := questionnaireImpl.InsertQuestionnaire(ctx, "第1回集会らん☆ぷろ募集アンケート", "第1回メンバー集会でのらん☆ぷろで発表したい人を募集します らん☆ぷろで発表したい人あつまれー!", null.NewTime(time.Now(), false), "private", true, false) require.NoError(t, err) err = administratorImpl.InsertAdministrators(ctx, questionnaireID, []string{userOne}) @@ -129,7 +129,7 @@ func TestUpdateSubmittedAt(t *testing.T) { assertion := assert.New(t) ctx := context.Background() - questionnaireID, err := questionnaireImpl.InsertQuestionnaire(ctx, "第1回集会らん☆ぷろ募集アンケート", "第1回メンバー集会でのらん☆ぷろで発表したい人を募集します らん☆ぷろで発表したい人あつまれー!", null.NewTime(time.Now(), false), "private", true) + questionnaireID, err := questionnaireImpl.InsertQuestionnaire(ctx, "第1回集会らん☆ぷろ募集アンケート", "第1回メンバー集会でのらん☆ぷろで発表したい人を募集します らん☆ぷろで発表したい人あつまれー!", null.NewTime(time.Now(), false), "private", true, false) require.NoError(t, err) err = administratorImpl.InsertAdministrators(ctx, questionnaireID, []string{userOne}) @@ -203,7 +203,7 @@ func TestDeleteRespondent(t *testing.T) { assertion := assert.New(t) ctx := context.Background() - questionnaireID, err := questionnaireImpl.InsertQuestionnaire(ctx, "第1回集会らん☆ぷろ募集アンケート", "第1回メンバー集会でのらん☆ぷろで発表したい人を募集します らん☆ぷろで発表したい人あつまれー!", null.NewTime(time.Now(), false), "private", true) + questionnaireID, err := questionnaireImpl.InsertQuestionnaire(ctx, "第1回集会らん☆ぷろ募集アンケート", "第1回メンバー集会でのらん☆ぷろで発表したい人を募集します らん☆ぷろで発表したい人あつまれー!", null.NewTime(time.Now(), false), "private", true, false) require.NoError(t, err) err = administratorImpl.InsertAdministrators(ctx, questionnaireID, []string{userOne}) @@ -391,9 +391,9 @@ func TestGetRespondentInfos(t *testing.T) { args expect } - questionnaireID, err := questionnaireImpl.InsertQuestionnaire(ctx, "第1回集会らん☆ぷろ募集アンケート", "第2回メンバー集会でのらん☆ぷろで発表したい人を募集します らん☆ぷろで発表したい人あつまれー!", null.NewTime(time.Now(), false), "public", true) + questionnaireID, err := questionnaireImpl.InsertQuestionnaire(ctx, "第1回集会らん☆ぷろ募集アンケート", "第2回メンバー集会でのらん☆ぷろで発表したい人を募集します らん☆ぷろで発表したい人あつまれー!", null.NewTime(time.Now(), false), "public", true, false) require.NoError(t, err) - questionnaireID2, err := questionnaireImpl.InsertQuestionnaire(ctx, "第1回集会らん☆ぷろ募集アンケート", "第2回メンバー集会でのらん☆ぷろで発表したい人を募集します らん☆ぷろで発表したい人あつまれー!", null.NewTime(time.Now(), false), "public", true) + questionnaireID2, err := questionnaireImpl.InsertQuestionnaire(ctx, "第1回集会らん☆ぷろ募集アンケート", "第2回メンバー集会でのらん☆ぷろで発表したい人を募集します らん☆ぷろで発表したい人あつまれー!", null.NewTime(time.Now(), false), "public", true, false) require.NoError(t, err) questionnaire := Questionnaires{} @@ -523,7 +523,7 @@ func TestGetRespondentDetail(t *testing.T) { assertion := assert.New(t) ctx := context.Background() - questionnaireID, err := questionnaireImpl.InsertQuestionnaire(ctx, "第1回集会らん☆ぷろ募集アンケート", "第1回メンバー集会でのらん☆ぷろで発表したい人を募集します らん☆ぷろで発表したい人あつまれー!", null.NewTime(time.Now(), false), "private", true) + questionnaireID, err := questionnaireImpl.InsertQuestionnaire(ctx, "第1回集会らん☆ぷろ募集アンケート", "第1回メンバー集会でのらん☆ぷろで発表したい人を募集します らん☆ぷろで発表したい人あつまれー!", null.NewTime(time.Now(), false), "private", true, false) require.NoError(t, err) questionnaire := Questionnaires{} @@ -620,7 +620,7 @@ func TestGetRespondentDetails(t *testing.T) { assertion := assert.New(t) ctx := context.Background() - questionnaireID, err := questionnaireImpl.InsertQuestionnaire(ctx, "第1回集会らん☆ぷろ募集アンケート", "第1回メンバー集会でのらん☆ぷろで発表したい人を募集します らん☆ぷろで発表したい人あつまれー!", null.NewTime(time.Now(), false), "private", true) + questionnaireID, err := questionnaireImpl.InsertQuestionnaire(ctx, "第1回集会らん☆ぷろ募集アンケート", "第1回メンバー集会でのらん☆ぷろで発表したい人を募集します らん☆ぷろで発表したい人あつまれー!", null.NewTime(time.Now(), false), "private", true, false) require.NoError(t, err) questionnaire := Questionnaires{} @@ -868,7 +868,7 @@ func TestGetRespondentDetails(t *testing.T) { } for _, testCase := range testCases { - respondentDetails, err := respondentImpl.GetRespondentDetails(ctx, testCase.args.questionnaireID, testCase.args.sort) + respondentDetails, err := respondentImpl.GetRespondentDetails(ctx, testCase.args.questionnaireID, testCase.args.sort, false, "") if !testCase.expect.isErr { assertion.NoError(err, testCase.description, "no error") } else if testCase.expect.err != nil { @@ -909,7 +909,7 @@ func TestGetRespondentsUserIDs(t *testing.T) { } questionnaireIDs := make([]int, 0, 3) for i := 0; i < 3; i++ { - questionnaireID, err := questionnaireImpl.InsertQuestionnaire(ctx, "第1回集会らん☆ぷろ募集アンケート", "第1回メンバー集会でのらん☆ぷろで発表したい人を募集します らん☆ぷろで発表したい人あつまれー!", null.NewTime(time.Now(), false), "public", true) + questionnaireID, err := questionnaireImpl.InsertQuestionnaire(ctx, "第1回集会らん☆ぷろ募集アンケート", "第1回メンバー集会でのらん☆ぷろで発表したい人を募集します らん☆ぷろで発表したい人あつまれー!", null.NewTime(time.Now(), false), "public", true, false) require.NoError(t, err) questionnaireIDs = append(questionnaireIDs, questionnaireID) } @@ -997,7 +997,7 @@ func TestGetMyResponseIDs(t *testing.T) { assertion := assert.New(t) ctx := context.Background() - questionnaireID, err := questionnaireImpl.InsertQuestionnaire(ctx, "第1回集会らん☆ぷろ募集アンケート", "第1回メンバー集会でのらん☆ぷろで発表したい人を募集します らん☆ぷろで発表したい人あつまれー!", null.NewTime(time.Now(), false), "private", true) + questionnaireID, err := questionnaireImpl.InsertQuestionnaire(ctx, "第1回集会らん☆ぷろ募集アンケート", "第1回メンバー集会でのらん☆ぷろで発表したい人を募集します らん☆ぷろで発表したい人あつまれー!", null.NewTime(time.Now(), false), "private", true, false) require.NoError(t, err) respondents := []Respondents{ @@ -1092,7 +1092,7 @@ func TestTestCheckRespondent(t *testing.T) { assertion := assert.New(t) ctx := context.Background() - questionnaireID, err := questionnaireImpl.InsertQuestionnaire(ctx, "第1回集会らん☆ぷろ募集アンケート", "第1回メンバー集会でのらん☆ぷろで発表したい人を募集します らん☆ぷろで発表したい人あつまれー!", null.NewTime(time.Now(), false), "private", true) + questionnaireID, err := questionnaireImpl.InsertQuestionnaire(ctx, "第1回集会らん☆ぷろ募集アンケート", "第1回メンバー集会でのらん☆ぷろで発表したい人を募集します らん☆ぷろで発表したい人あつまれー!", null.NewTime(time.Now(), false), "private", true, false) require.NoError(t, err) err = administratorImpl.InsertAdministrators(ctx, questionnaireID, []string{userOne}) diff --git a/model/responses_test.go b/model/responses_test.go index ec0b5b1d..cd6793f3 100644 --- a/model/responses_test.go +++ b/model/responses_test.go @@ -19,7 +19,7 @@ func TestInsertResponses(t *testing.T) { assertion := assert.New(t) ctx := context.Background() - questionnaireID, err := questionnaireImpl.InsertQuestionnaire(ctx, "第1回集会らん☆ぷろ募集アンケート", "第1回メンバー集会でのらん☆ぷろで発表したい人を募集します らん☆ぷろで発表したい人あつまれー!", null.NewTime(time.Now(), false), "public", true) + questionnaireID, err := questionnaireImpl.InsertQuestionnaire(ctx, "第1回集会らん☆ぷろ募集アンケート", "第1回メンバー集会でのらん☆ぷろで発表したい人を募集します らん☆ぷろで発表したい人あつまれー!", null.NewTime(time.Now(), false), "public", true, false) require.NoError(t, err) err = administratorImpl.InsertAdministrators(ctx, questionnaireID, []string{userOne}) @@ -142,7 +142,7 @@ func TestDeleteResponse(t *testing.T) { assertion := assert.New(t) ctx := context.Background() - questionnaireID, err := questionnaireImpl.InsertQuestionnaire(ctx, "第1回集会らん☆ぷろ募集アンケート", "第1回メンバー集会でのらん☆ぷろで発表したい人を募集します らん☆ぷろで発表したい人あつまれー!", null.NewTime(time.Now(), false), "public", true) + questionnaireID, err := questionnaireImpl.InsertQuestionnaire(ctx, "第1回集会らん☆ぷろ募集アンケート", "第1回メンバー集会でのらん☆ぷろで発表したい人を募集します らん☆ぷろで発表したい人あつまれー!", null.NewTime(time.Now(), false), "public", true, false) require.NoError(t, err) err = administratorImpl.InsertAdministrators(ctx, questionnaireID, []string{userOne}) diff --git a/model/scale_labels_test.go b/model/scale_labels_test.go index ad5ea98e..12e12b11 100644 --- a/model/scale_labels_test.go +++ b/model/scale_labels_test.go @@ -20,7 +20,7 @@ func TestInsertScaleLabel(t *testing.T) { assertion := assert.New(t) ctx := context.Background() - questionnaireID, err := questionnaireImpl.InsertQuestionnaire(ctx, "第1回集会らん☆ぷろ募集アンケート", "第1回メンバー集会でのらん☆ぷろで発表したい人を募集します らん☆ぷろで発表したい人あつまれー!", null.NewTime(time.Now(), false), "public", true) + questionnaireID, err := questionnaireImpl.InsertQuestionnaire(ctx, "第1回集会らん☆ぷろ募集アンケート", "第1回メンバー集会でのらん☆ぷろで発表したい人を募集します らん☆ぷろで発表したい人あつまれー!", null.NewTime(time.Now(), false), "public", true, false) require.NoError(t, err) err = administratorImpl.InsertAdministrators(ctx, questionnaireID, []string{userOne}) @@ -163,7 +163,7 @@ func TestUpdateScaleLabel(t *testing.T) { assertion := assert.New(t) ctx := context.Background() - questionnaireID, err := questionnaireImpl.InsertQuestionnaire(ctx, "第1回集会らん☆ぷろ募集アンケート", "第1回メンバー集会でのらん☆ぷろで発表したい人を募集します らん☆ぷろで発表したい人あつまれー!", null.NewTime(time.Now(), false), "public", true) + questionnaireID, err := questionnaireImpl.InsertQuestionnaire(ctx, "第1回集会らん☆ぷろ募集アンケート", "第1回メンバー集会でのらん☆ぷろで発表したい人を募集します らん☆ぷろで発表したい人あつまれー!", null.NewTime(time.Now(), false), "public", true, false) require.NoError(t, err) err = administratorImpl.InsertAdministrators(ctx, questionnaireID, []string{userOne}) @@ -283,7 +283,7 @@ func TestDeleteScaleLabel(t *testing.T) { assertion := assert.New(t) ctx := context.Background() - questionnaireID, err := questionnaireImpl.InsertQuestionnaire(ctx, "第1回集会らん☆ぷろ募集アンケート", "第1回メンバー集会でのらん☆ぷろで発表したい人を募集します らん☆ぷろで発表したい人あつまれー!", null.NewTime(time.Now(), false), "public", true) + questionnaireID, err := questionnaireImpl.InsertQuestionnaire(ctx, "第1回集会らん☆ぷろ募集アンケート", "第1回メンバー集会でのらん☆ぷろで発表したい人を募集します らん☆ぷろで発表したい人あつまれー!", null.NewTime(time.Now(), false), "public", true, false) require.NoError(t, err) err = administratorImpl.InsertAdministrators(ctx, questionnaireID, []string{userOne}) @@ -371,7 +371,7 @@ func TestGetScaleLabels(t *testing.T) { assertion := assert.New(t) ctx := context.Background() - questionnaireID, err := questionnaireImpl.InsertQuestionnaire(ctx, "第1回集会らん☆ぷろ募集アンケート", "第1回メンバー集会でのらん☆ぷろで発表したい人を募集します らん☆ぷろで発表したい人あつまれー!", null.NewTime(time.Now(), false), "public", true) + questionnaireID, err := questionnaireImpl.InsertQuestionnaire(ctx, "第1回集会らん☆ぷろ募集アンケート", "第1回メンバー集会でのらん☆ぷろで発表したい人を募集します らん☆ぷろで発表したい人あつまれー!", null.NewTime(time.Now(), false), "public", true, false) require.NoError(t, err) err = administratorImpl.InsertAdministrators(ctx, questionnaireID, []string{userOne}) @@ -489,7 +489,7 @@ func TestCheckScaleLabel(t *testing.T) { assertion := assert.New(t) ctx := context.Background() - questionnaireID, err := questionnaireImpl.InsertQuestionnaire(ctx, "第1回集会らん☆ぷろ募集アンケート", "第1回メンバー集会でのらん☆ぷろで発表したい人を募集します らん☆ぷろで発表したい人あつまれー!", null.NewTime(time.Now(), false), "public", true) + questionnaireID, err := questionnaireImpl.InsertQuestionnaire(ctx, "第1回集会らん☆ぷろ募集アンケート", "第1回メンバー集会でのらん☆ぷろで発表したい人を募集します らん☆ぷろで発表したい人あつまれー!", null.NewTime(time.Now(), false), "public", true, false) require.NoError(t, err) err = administratorImpl.InsertAdministrators(ctx, questionnaireID, []string{userOne}) diff --git a/model/targets_test.go b/model/targets_test.go index 2cd8f51e..b525eb6e 100644 --- a/model/targets_test.go +++ b/model/targets_test.go @@ -318,7 +318,7 @@ func TestIsTargetingMe(t *testing.T) { assertion := assert.New(t) ctx := context.Background() - questionnaireID, err := questionnaireImpl.InsertQuestionnaire(ctx, "第1回集会らん☆ぷろ募集アンケート", "第1回メンバー集会でのらん☆ぷろで発表したい人を募集します らん☆ぷろで発表したい人あつまれー!", null.NewTime(time.Now(), false), "private", true) + questionnaireID, err := questionnaireImpl.InsertQuestionnaire(ctx, "第1回集会らん☆ぷろ募集アンケート", "第1回メンバー集会でのらん☆ぷろで発表したい人を募集します らん☆ぷろで発表したい人あつまれー!", null.NewTime(time.Now(), false), "private", true, false) require.NoError(t, err) err = targetImpl.InsertTargets(ctx, questionnaireID, []string{userOne}) diff --git a/model/v3.go b/model/v3.go index 3421bab8..2bf827b9 100644 --- a/model/v3.go +++ b/model/v3.go @@ -15,9 +15,9 @@ func v3() *gormigrate.Migration { if err := tx.AutoMigrate(&v3Targets{}); err != nil { return err } - if err := tx.AutoMigrate(&v3Questionnaires{}); err != nil { + if err := tx.AutoMigrate(&v3Questionnaires{}); err != nil { return err - } + } return nil }, } @@ -40,11 +40,11 @@ type v3Questionnaires struct { ResTimeLimit null.Time `json:"res_time_limit,omitempty" gorm:"type:TIMESTAMP NULL;default:NULL;"` DeletedAt gorm.DeletedAt `json:"-" gorm:"type:TIMESTAMP NULL;default:NULL;"` ResSharedTo string `json:"res_shared_to" gorm:"type:char(30);size:30;not null;default:administrators"` + IsAnonymous bool `json:"is_anonymous" gorm:"type:boolean;not null;default:false"` CreatedAt time.Time `json:"created_at" gorm:"type:timestamp;not null;default:CURRENT_TIMESTAMP"` ModifiedAt time.Time `json:"modified_at" gorm:"type:timestamp;not null;default:CURRENT_TIMESTAMP"` Administrators []Administrators `json:"-" gorm:"foreignKey:QuestionnaireID"` Targets []Targets `json:"-" gorm:"foreignKey:QuestionnaireID"` - TargetGroups []TargetGroups `json:"-" gorm:"foreignKey:QuestionnaireID"` Questions []Questions `json:"-" gorm:"foreignKey:QuestionnaireID"` Respondents []Respondents `json:"-" gorm:"foreignKey:QuestionnaireID"` IsPublished bool `json:"is_published" gorm:"type:boolean;default:false"` @@ -52,4 +52,4 @@ type v3Questionnaires struct { func (*v3Questionnaires) TableName() string { return "questionnaires" -} \ No newline at end of file +} diff --git a/model/validations_test.go b/model/validations_test.go index 54ab6548..c59e1adf 100644 --- a/model/validations_test.go +++ b/model/validations_test.go @@ -20,7 +20,7 @@ func TestInsertValidation(t *testing.T) { assertion := assert.New(t) ctx := context.Background() - questionnaireID, err := questionnaireImpl.InsertQuestionnaire(ctx, "第1回集会らん☆ぷろ募集アンケート", "第1回メンバー集会でのらん☆ぷろで発表したい人を募集します らん☆ぷろで発表したい人あつまれー!", null.NewTime(time.Now(), false), "public", true) + questionnaireID, err := questionnaireImpl.InsertQuestionnaire(ctx, "第1回集会らん☆ぷろ募集アンケート", "第1回メンバー集会でのらん☆ぷろで発表したい人を募集します らん☆ぷろで発表したい人あつまれー!", null.NewTime(time.Now(), false), "public", true, false) require.NoError(t, err) err = administratorImpl.InsertAdministrators(ctx, questionnaireID, []string{userOne}) @@ -212,7 +212,7 @@ func TestUpdateValidation(t *testing.T) { assertion := assert.New(t) ctx := context.Background() - questionnaireID, err := questionnaireImpl.InsertQuestionnaire(ctx, "第1回集会らん☆ぷろ募集アンケート", "第1回メンバー集会でのらん☆ぷろで発表したい人を募集します らん☆ぷろで発表したい人あつまれー!", null.NewTime(time.Now(), false), "public", true) + questionnaireID, err := questionnaireImpl.InsertQuestionnaire(ctx, "第1回集会らん☆ぷろ募集アンケート", "第1回メンバー集会でのらん☆ぷろで発表したい人を募集します らん☆ぷろで発表したい人あつまれー!", null.NewTime(time.Now(), false), "public", true, false) require.NoError(t, err) err = administratorImpl.InsertAdministrators(ctx, questionnaireID, []string{userOne}) @@ -360,7 +360,7 @@ func TestDeleteValidation(t *testing.T) { assertion := assert.New(t) ctx := context.Background() - questionnaireID, err := questionnaireImpl.InsertQuestionnaire(ctx, "第1回集会らん☆ぷろ募集アンケート", "第1回メンバー集会でのらん☆ぷろで発表したい人を募集します らん☆ぷろで発表したい人あつまれー!", null.NewTime(time.Now(), false), "public", true) + questionnaireID, err := questionnaireImpl.InsertQuestionnaire(ctx, "第1回集会らん☆ぷろ募集アンケート", "第1回メンバー集会でのらん☆ぷろで発表したい人を募集します らん☆ぷろで発表したい人あつまれー!", null.NewTime(time.Now(), false), "public", true, false) require.NoError(t, err) err = administratorImpl.InsertAdministrators(ctx, questionnaireID, []string{userOne}) @@ -458,7 +458,7 @@ func TestGetValidations(t *testing.T) { assertion := assert.New(t) ctx := context.Background() - questionnaireID, err := questionnaireImpl.InsertQuestionnaire(ctx, "第1回集会らん☆ぷろ募集アンケート", "第1回メンバー集会でのらん☆ぷろで発表したい人を募集します らん☆ぷろで発表したい人あつまれー!", null.NewTime(time.Now(), false), "public", true) + questionnaireID, err := questionnaireImpl.InsertQuestionnaire(ctx, "第1回集会らん☆ぷろ募集アンケート", "第1回メンバー集会でのらん☆ぷろで発表したい人を募集します らん☆ぷろで発表したい人あつまれー!", null.NewTime(time.Now(), false), "public", true, false) require.NoError(t, err) err = administratorImpl.InsertAdministrators(ctx, questionnaireID, []string{userOne}) diff --git a/openapi/spec.go b/openapi/spec.go index 603ecd54..7351397d 100644 --- a/openapi/spec.go +++ b/openapi/spec.go @@ -17,75 +17,75 @@ import ( // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - - "H4sIAAAAAAAC/+xc628TyZb/V6ze/QDaDjaBK931t0BGV5GGu0DC7gcSWR27kvRcu9t0twEvipRq8wjE", - "QMQjTAhDCJOBAEPCDCyb4fm/bKUd+9P+C6uqflX1ux0bZkYrIRR316k6dc6vzjl16lRf4IpypSpLQNJU", - "Ln+BqwqKUAEaUMgvWSrXh0oVURJVTRE0UDpSPwZGpBM1oNTx+xJQi4pY1URZ4vJc+8pzY/4ygs3dzbXd", - "xcvtuUsIvkDwOYI/IvgEwYvk74tI1xHcJP8+GzeXjE/3Mvs0pQb285lQQn3BotJ1Y/EF0iF5vozgbwg+", - "sTuZEsoq2I/mdNS4ghp3kf4MNV6gxjyCW+QVmtPHJY7nRMzsGTIHnpOECuDywTPleE4tzoCKgOeq1au4", - "4aQsl4EgcbOzPCE6Vj8J1KosqfFy2TRWHu6+vBM4c0+bnfc/GetLfZ2ty3iSaY4JyjTQRGk6if6R/hk1", - "PiD9V9RoEI5ClBkkiKS0/RQNNdk42VSF6XCB7Hy8ixr3yXS2d1c2EVzI7Gs9eG5s3t/99Azr+tEbYxFz", - "dZButj+EMzxUEDuipIFpoBB2ztSAigeXBFEBI8Mj0nFBm/EzhvTHqPEa6b/gQRvzI8OuOKqYwBnT0x/H", - "cwo4UxMVUOLyWGEx7Cj20gjlxIR7OANuD92OPSorWriGtp8g+Lrz6HJm387HB635xda9n1rLOoLN1tIr", - "BO8heDEzzqm1yYqoaaBUELRxjs94mho31812A96GGMz6OkZe4wWCm63vr+ChxjlN1MogoEFn+brZYMBp", - "0Vp501p6FchWRS6JU6IzmKelyxXTLhMGL1VWNAZe/6yAKS7P/VPW9RBZ862aPUkJdwzLHktcBYJSnAmV", - "tVcY6w923zwOY4Z0FYR2VVNEadocb++aLSpASKBXttmfVquUNmdtGhIH/E2Ra1Xyl6iBiuqXNmmQOXXK", - "WsjgvFCplgGXP8h79eY8EBRFqOPffwfnTlhmBncslMv/NsXlT0ezalMcEVTAzfLJGo8CDVt19UjdnOUE", - "OzoxculZIGQOH1VFrgJFEwGRkm0/WdlF9UpLwyesWdoGnqZ6n7Dn4vj0vJeVSblUT8yF3c0RTBSgM1Et", - "lBRhSsP9OMo2jXKAk6R5dih5k6MJh0Ke/A4UNdz7V4KDT3vusmfmyQ3mBnMDuYMDuYNjuVye/PuX3L/m", - "czmO56ZkpYLbcyVBAwOaWME+27cGbM0VxBLTtbteHFfmceoJKEJQ4pCzw/P0NE0cMdL0AYlZ+Rf8cxPV", - "gjt8sL83Pl/qPJpHcAHBZwheRnCBmA0vdHjTpAZbf3qKZjOeGYtlJApmHhyQfQ9IATqbfgyc11KDDxN9", - "KxPJpSP8e60ySfCRjmxUlKbL4OiMLBbTr5RjtbImVrsmHy0KZcvsxvSceuFjzQVwxyJXrvptcYx78gDN", - "7sEPp6BJWSrqajKUetlJVITzhbNCuQaC4l6eq4hS+OvZRGybauqKa0vDgUyXhUlQDhR5gilFEMdMmFaf", - "25YeNJkymYXTnXC8S+/ropOYq64m4hi6ACUDadrc53WHPcccds2YY0wTMCdZiyyatwDbkg8L9Aqa5UKA", - "VKtgnXgIJ/gYV8Z2FOW2KCuRnB2LoMdsOBYjIRdm+14z4VmgSXmhyXrMkr3EErJCmveBBXtBpWCDkPSQ", - "FXeT1N3+aoxEeEkDDkIyTAWDqQjtzc9wDQwLGhjDMXxXHfy7CM4Jk2VwpJ6OfkQdkmSpXpFramrCclk+", - "J0rTttmxWUnd0fHaZFlUZ0ApHaGZOlWHpBLJpqusJSVNjprbjaGAldGvDZcHtvSGJw6zw+xuJ3Ir5DK8", - "+/PPB42Vh6ixhhqvUWMRNT50Vi7vfLiP4FOSvb6K9Nv/8/1lBP8b6dcRfLq7/K69tkGSQKsIXtx59w7p", - "t4yF1c7KZfLwE4LLmURkUEdwHRPoTdT48L8fYKw46FkkkIcmiOUuV/HIcDo0pdrOe8CViuyYlUwb0nqS", - "xAnP4Nh56ZJ94BbVzSkVKGpE1oftbMK/1EaGw81+r7IJsYgZkabkL2f192y8e4OgFJaWPm2ajZdmhIn3", - "6VpUC4LVulCxmhcUur03aT5HTEizvX6ldfeVsfLQPrJ8iuB1pC/4Ujapk39R/CSZvOMYAydLv/Uknpqf", - "jcXr9nT2PAtnoAQ8u640iOcq/TbymA7BpnHp587SAoJ3sXV3TkT3PB2XhwTTOQkqolT6RsKRTfCUFNKi", - "ANwmwQfFL4wt7NfwFBrPUeMhOTR5jRpXEWy2Hlw1rv1GT42c5z4hx6Rv8f+waWx9av+yRsoFnmK/p18j", - "7ddtLd+jyw6sw9Y5iOBtBDeNuXUEm1hANnETwVd+PjpzcOfzmiVxfcE+Oo6XqUcICQRLG4IgsWr2+0IF", - "7On0fc94YTiJndm3ohoQ61WFaVCoCOcDlurifHtjHodJ9ql46+6rsHOlsDx5emdNyEZrlYqg1GNTLQ73", - "vmFjxUF5Cp9QqEO9vkbA9DixDAe5VB/nthUvlGqggBkpaGIQTM212Xqw2llexCuaLEbreFO/1YE3EP63", - "ivSrjOvBCL6J/ydLUKqVy3T9BNMpbnrPXqc9lWAyMVG7vnApnbUaFSbrCc7iRmcEBTjn7LQiAzuM1aiN", - "8i8Txf//3v2PsXf3hKJfe9sllMsFe38TFBzZVV/YELiBQNOyBdvzCH52bEQGe7YM0m+1P9/BhNjw/ID0", - "plVnB7cypDCMaZHZx3T78nvjgbnTpqIJuOXpeX8Sh8pzM4JaqNTdM3RvGL7QWtkmZs8ZF0dJXERXCnXw", - "H2Rxk3TlSNs14IXJuhVtdOFlmFn6OeU9Kg7YwPrSST6LKjjPY3fSQ1LJKmTBttzsOS2h9+DZ6oW3+Yg1", - "vWP2iTY7Deeg25dDsvJGbOrHygyx+4NYfZiDBLHI+Jj4fcjm7n8tth4+QPotPtOBC8bSWwS32k8WCJc4", - "TM7sG7ckMs7t5zOeNUn2mL72VC5jnNufaT9/hX2/rvv6leqyBMY5a6lZSWtL/mxKhLca4zm7grWeBZRl", - "0NUz3TvG6G1prG3oWwxIyyYO92OKcGakxFF1lIlKVegCyL4GsDRXnmH5uOg2tgDLgQExSEwtVOLiEJoq", - "UWGIlyBRUQhNlLAghCZJVQxCE6YsBGHGdItA6MdHBBWMWEDyG3lJPWc+j8lOWg1DTBwzWNjRqW8s6pC4", - "y6FGTQzHDxUC9oRD9amGhvUFHbjduvawrT8mxxhmnuQKajSQvoX03xDc7Fy6bszfI7Y5bLbe8gbKgERu", - "ukPl4AVTjwpvkkKagpOPlZ4U06RhxF5Efk56X8DSFV8pITUu+afSg9KVNKxb6zeQjR4Vq+yVHad02xe8", - "2Z5y984GgpuqrGg4ftvY7Kw9pMInjwcd8Py2CywH7D9oF8szxej+qgGeOz+Axxk4KyiSUMHW4DQ3ag8w", - "pA2NHuV4+sHwN+QJCZWH3D+tx+6mccjzmzSgpfIfojbjO4sa0UAlucbcWICPOUmzjrmSR4uYIKj0KMLM", - "q6kruIOOIJ3eAuWTeohwKQeMHQ5UW5xoDjKSNYGL9I/u7sOLXupAn6dva/QFuU6uw4Sf83PPqLVibp9g", - "NEU4kfHerOCK1cFcUIxvHhon1aEb53sV5dn5+oKXaed5VP/uhrtm85X+xNsk5e0h/QuEXD4q1hRRq4/i", - "nqyAo1oti0XBrs6YKsvnzOc1bUZWxP8kb47KJeB7eEopc3luRtOqaj6bPXNAU4Tqge+qWaEqZs8eysq4", - "8WDWJjFv5clVO8UrlLAcy3i4DP4lStMZBahyTSkCPI1ziqgBtwlBYJ1thPUh/wMkZIQ0ZUwJeW5e47Ht", - "UlGWNKFI3KZ1N0hThOMcz9WYMaZFbaY2eaAoV7L4vSZqoDiTFaR/gAFNxnyx2LReZIaOjziLzfv0LFBU", - "s/XBA7kDuQFZUA/hnuQqkISqyOW5Q/g5DhgFbYYIMes/y5kGgZmyGwjOW+kBuNr6YW3n/Vuk32q9myMV", - "McuDuZ33b3fe/7SzvUCMiDeRgRrPcdjamEf6LfP6qFNug+Z0jjCpEEzglcn9DWgnWM545sp0iDNxm2Tp", - "S2thjp9uztypS0BAX0hN0Dzkbm9CytC74diJMXUGg7mcDUIr+0Ctzux3qrlEk11T8x8uEqCzyGi9/NHY", - "3kbwha1V8xjpk1UrNaf7sWDuXOxULoWCWZ47bPIfjb7GJePRLwhuGh8fGx9uItjcvfuKnFldM/vCHf0l", - "qCMvL/qtcPZXkH6b/MTzMHs85O9x9MS3mJHN1fZas7Wsd5ZuI9g8pOLJvb2EmYar9oG4vrP9HsEXrZc/", - "tp/cbK9t7N78hGDTuLFqrDwisyfZ0mnVV/1DnFZVVgPWpXOh0T8z85Jl5Co7LqvsMrPu/gJVs5MwPQGS", - "7+7fLOt5NKUGZn1APtgfIFuFdVFQDhemF9z2c7NOZNVP+HuCuG8SHohH4G+W97qK7AXPnfVZk5cy0EAS", - "royr1zrL65HwHCadeQGazg0EX9QPM5uJ8WBz78VDqH79VnBkGGv14hqpvnmaRqVw0x6+2ZUy+WAf7x/G", - "QmFXHrvPmvoqdiHMxe1V64dzhxMVpblHo5a+++Hoor2QoBVn0kFn/Wpr5U0kdL4piX3ETu/dWShs4jxa", - "ShtjSe6L2Jg0fPTWbWQrdbPScVQTtFr4FqTLYsaujNcxlqU/minz1o7+SWwaq+72xktj836/LVv3qOvC", - "7vURdn22goGI24s57Jfx+xqw7LP9ZKSaMLIzLm1YFV1m0VKQlWQr+d0i0JNOcQOW77N3raUrxst7eEdv", - "VkDbW5QkhtbNt/cI7PH5lKDvVSVMw/i/QddXm07VJf4pDLiDtR5Z7OiMiDOaPxHin4VzD2f35R3j5la7", - "8ZFwwdxn6MAbxo331OcFm/Y2zNz9J86yUN8D/D0beKZA58smbNhxw4DvVXBMcsZp38+czJ5WzeHBwZhC", - "fth0K/fhKtIhW7wftwK9soPNPeaEHASQKD7ODzkf32Rqip2PdaY+IjhW795/BLqBvVrzVMe5IafC/uKc", - "9LbfkWlUqj0QIQHfUA1QSwK0ONXHXqBccD81GZkydCMTNlMYkibs2qj6vp2ZMjno45NRRlLj4ojbtjLB", - "xuVQAjnhTUpr45lpLuzreraubHN3OFGU6DBlWx9yO7Xpsz5h9iz3ly7tWYA0Iw2bq8SuURqSFY0IkINM", - "Uv9h+AUdbNrIktJCUDwZBd7O0q/tJ0+7B28MEnsfjzLICUkeuNhJlgzoNXh6HxOmCwiTmc2gnf6XNJvW", - "+FHI+0PYzC9nKuk6IAJPpgLotFmaY9ffTGAsqkA5a2OZZaeqyKVa0fqSJFsiY1W30MU4AVWtZbkolBna", - "fDZLHs7Iqpb/a+6vOZNywpnLhcDPbpO+PZ/D5mYnZv8vAAD//69Dqo+7XwAA", + "H4sIAAAAAAAC/+xcb3PTSJP/Ki7dvYA6BZvAU/Wc3wWy9VSqlueAhLsXJOVS7EmifWzJSDLgo1KVkfkT", + "iIFUgGRD2ISwWQhkSdiF47L8/S43kWO/uq9wNaN/I2lkSY4Nu1tXRVGxND3T0/2b7p6eHl3h8nKpLEtA", + "0lQue4UrC4pQAhpQyC9ZKlYHCiVRElVNETRQOFE9BYakMxWgVPH7AlDziljWRFnislzzxgtj9jqC9f3t", + "9f35682ZawhuIfgCwR8RfIrgVfL3VaTrCG6Tf5+Nu4vGp6XUIU2pgMN8KpRQn7OodN2Y30I6JM+XEfwN", + "wad2JxNCUQWH0YyOajdQ7QHSn6PaFqrNIrhDXqEZfVTieE7EzF4gc+A5SSgBLsueKcdzan4KlAQ8V61a", + "xg3HZbkIBImbnuYJ0anqWaCWZUmNlsu2sbK6//I+c+a+NnvvfzI2Fns6W5fxONMcEZRJoInSZBz9I/0z", + "qn1A+q+oViMchSiTJYi4tL0UDTXZKNmUhclwgex9fIBqD8l0dvdXthGcSx1qPHphbD/c//Qc6/rxG2Me", + "c3WUbnY4hDM8FIsdUdLAJFAIOxcqQMWDS4KogKHBIem0oE0FGUP6E1R7jfRf8KC12aFBVxxlTOCM6euP", + "4zkFXKiICihwWaywCHYUe2mEcmLCPZwBt4dOxx6WFS1cQ7tPEXzdenw9dWjv46PG7Hxj6afGso5gvbH4", + "CsElBK+mRjm1Ml4SNQ0UcoI2yvEpX1Pj7obZrs/fEINZ38DIq20huN34/gYeapTTRK0IGA1ay7fNBn1O", + "i8bKm8biKyZbJbkgTojOYL6WLleedqkweKmyonng9c8KmOCy3D+lXQ+RNt+q6bOUcEew7LHEVSAo+alQ", + "WfuFsfFo/82TMGZIVyy0q5oiSpPmeAfXbF4BQgy9epv9abVKaXPapiFxwN8UuVImf4kaKKlBaZMGqXPn", + "rIUMLgulchFw2aO8X2/OA0FRhCr+/Xdw6YxlZnDHQrH4bxNc9nx7Vm2KE4IKuGk+XuNhoGGrrp6omrMc", + "845OjFxyFgiZw0dZkctA0URApGTbT6/s2vVKSyMgrGnaBp6neh+z5+L49KyflXG5UI3Nhd3NCUzE0Jmo", + "5gqKMKHhfhxlm0aZ4SRpnh1K3uRozKGQx78DeQ33/pXgENCeu+w98+T6M/2ZvszRvszRkUwmS/79S+Zf", + "s5kMx3MTslLC7bmCoIE+TSxhnx1YA7bmcmLB07W7XryuLKhzTMnTHJoQ8AgigAHPor0SZEtUc+5YbFdt", + "fL7WejyL4ByCzxG8juAcWfF+rftCkRjz5E37yTb1LAk4HduUvIdh72zawcyHA7LvAQlAZ9OPgMtaYvBh", + "om9lIv5khH+vlMaJ3JKRDYvSZBGcnJLFfPKVcqpS1MRyx+TDeaFomd2InhMvfKw5Bnde+MvloC2OcE8+", + "7Nk9BOHEmpSloo4mQ6nXO4mScDl3UShWACvu5bmSKIW/no7Ftqmmjri2NMxkuiiMgyJT5DGm1IY4YsK0", + "+ty29KDxlOlZOJ0Jx7/0vi46ibnqaCKOoWMoGUiT5j6vM+w55rBjxhxjGoM5yVpk7Xlj2JZsWKCX0ywX", + "AqRKCevERzjGx/RuZkft3BZlJeKzYxF0mQ3HYsTkwmzfbSZ8CzQuLzRZl1myl1hMVkjzHrBgL6gEbBCS", + "LrLibpI621+NkAgvbsBBSAapYDARob35GayAQUEDIziG76iDfxfBJWG8CE5Uk9EPqQOSLFVLckVNTFgs", + "ypdEadI2OzYriTs6XRkviuoUKCQjNFOn6oBUINl01WtJSZOT5p5lgLEyerXh8sGW3jVFYXbQu2Vqu59y", + "Gd7/+eejxsoqqq2j2mtUm0e1D62V63sfHiL4jGSvbyL93v98fx3B/0b6bQSf7S+/a65vkiTQGoJX9969", + "Q/qCMbfWWrlOHn5CcDkViwzqCG5gAr2Oah/+9wOMFAc9ixjy0ASx2OEqHhpMhqZE23kfuBKRnbKSaQNa", + "V5I44RkcOy9dsA/c2nVzTgWK2ibr4+1sLLjUhgbDzX7cfXnU7jsSMUPShPzlrP6BjXd3EJTA0tKnTdPR", + "0mxj4gO6FtWcYLXOlazmOYVu70+azxATUm9u3Gg8eGWsrNpHls8QvI30uUDeJ3Hyrx0/cSbvOEbmZOm3", + "vuxV/bMxf9uezoFn4QwUg2fXlbJ4LtNv2x7TIVg3rv3cWpxD8AG27s6J6IGn4/IQYzpnQUmUCt9IOLJh", + "T0khLXLAbcI+KN4ydrBfw1OovUC1VXJo8hrVbiJYbzy6adz6jZ4aOc99So5J3+L/Yd3Y+dT8ZZ2UCzzD", + "fk+/Rdpv2FpeossOrMPWGYjgPQS3jZkNBOtYQDZxHcFXQT5aM3Dv87olcX3OPjqOlqlPCDEESxsCllg1", + "+32uBA50+n5gvHg4iZzZt6LKiPXKwiTIlYTLjKU6P9vcnMVhkn0q3njwKuxcicoTeVxTcmdNyIYrpZKg", + "VCNTLQ73gWEjxUF5ioBQqEO9nkbA9DiRDLNcaoBz24rnChWQw4zkNJEFU3NtNh6ttZbn8Yomi9E63tQX", + "WvAOwv/WkH7T43owgu/i/8kSlCrFIl0/4ekUN12y12lXJRhPTNSuL1xKF61GufFqjLO44SlBAc45O61I", + "ZoeRGrVR/mWi+P/fu/8x9u6+UPRrb7uEYjFn729YwZFd9YUNgRsI1C1bsDuL4GfHRqSwZ0shfaH5+T4m", + "xIbnB6TXrTo7uJMihWGeFqlDnm5ffm88MnfaVDQBd3w9H47jUHluSlBzpap7hu4Pw+caK7vE7Dnj4iiJ", + "a9OVQh38syxunK4cabsGPDdetaKNDryMZ5ZBTnmfihkb2EA6KWBRBed55E56QCpYhSzYlps9JyX0zdDu", + "hbf5iDS9I/Yht3caztl3IIdk5Y28qR8rM+TdH0TqwxyExaLHx0TvQ7b3/2u+sfoI6Qt8qgXnjMW3CO40", + "n84RLnGYnDo0aklklDvMp3xrkuwxA+2pXMYodzjVfPEK+35dD/QrVWUJjHLWUrOS1pb8vSkR3mqM5+wK", + "1nrGKMugq2c6d4ztt6WRtqFnMSAtmyjcjyjChaECR9VRxirhoAsgexrA0lz5huWjotvIAiwHBsQgeWqh", + "YheH0FSxCkP8BLGKQmiimAUhNEmiYhCaMGEhiGdMtwiEfnxCUMGQBaSgkZfUS+bziOyk1TDExHkGCzs6", + "DYxFHRJ3ONSwieHooULAHnOoHtXQeH1BC+42bq029SfkGMPMk9xAtRrSd5D+G4LbrWu3jdklYpvDZusv", + "b6BrwNptukPl4AdTlwpv4kKaglOAla4U0yRhxF5EQU66X8DSEV8JITUqBafShdKVJKxb65fJRpeKVQ7K", + "jlO6HQjebE+5f38TwW1VVjQcv21ut9ZXqfDJ50H7fL/tAss++w/axfKeYvRg1QDPXe7D4/RdFBRJKGFr", + "cJ4btgcY0AaGT3I8/WDwG/KEhMoD7p/WY3fTOOD7TRrQUvkPUZsKnEUNaaAUX2NuLMBHnKRZx1zxo0VM", + "wCo9amPm1cQV3KwjSKc3pnwSDxEuZcbY4UC1xYlmoEeyJnCR/tHdffjRSx3o8/RtjZ4g18l1mPBzfh4Y", + "tVbMHRCMpghnUv6bFVy+3J9hxfjmoXFcHbpxvl9Rvp1vIHiZdJ6369/dcFdsvpKfeJukvD1kcIGQy0f5", + "iiJq1WHckxVwlMtFMS/Y1RkTRfmS+byiTcmK+J/kzUm5AAIPzylFLstNaVpZzabTF45oilA+8l05LZTF", + "9MVjaRk37k/bJOatPLlsp3iFApZjEQ+Xwr9EaTKlAFWuKHmAp3FJETXgNiEIrHobYX3I/wAxGSFNPaaE", + "PDev8dh2KS9LmpAnbtO6G6QpwmmO5yqeMSZFbaoyfiQvl9L4vSZqID+VFqR/gD5Nxnx5sWm9SA2cHnIW", + "m//pRaCoZuujRzJHMn2yoB7DPcllIAllkctyx/BzHDAK2hQRYjp4ljMJmJmyOwjOWukBuNb4YX3v/Vuk", + "LzTezZCKmOX+zN77t3vvf9rbnSNGxJ/IQLUXOGytzSJ9wbw+6pTboBmdI0wqBBN4ZXJ/A9oZL2e858p0", + "iDNxm6TpS2thjp9u7rlTF4OAvpAao3nI3d6YlKF3w7ET89QZ9GcyNgit7AO1OtPfqeYSjXdNLXi4SIDu", + "RUbj5Y/G7i6CW7ZWzWOkT1at1IwexIK5c7FTuRQKpnnuuMl/e/TVrhmPf0Fw2/j4xPhwF8H6/oNX5Mzq", + "ltkX7ugvrI78vOgL4eyvIP0e+YnnYfZ4LNjj8JlvMSPba831emNZby3eQ7B+TMWTe3sNMw3X7ANxfW/3", + "PYJbjZc/Np/eba5v7t/9hGDduLNmrDwmsyfZ0kk1UP1DnFZZVhnr0rnQGJyZecmy7So7LaveZWbd/QWq", + "ZidhugKkwN2/aa/n0ZQKmA4A+WhvgGwV1rWDcrgw/eC2n5t1ImtBwt8TxAOT8EG8Df6meb+rSF/x3Vmf", + "NnkpAg3E4cq4eau1vNEWnoOkMz9Ak7kB9kX9MLMZGw829348hOo3aAWHBrFWr66T6ptnSVQKt+3h6x0p", + "k2f7+OAwFgo78tg91tRXsQthLu6gWj+eOR6rKM09GrX03QtH194LCVp+Khl0Nm42Vt7Q0DErBBlRor7Q", + "+mHVeuvvcMvuh1SxwXsIbjLgz8DlNwWxh8Dsvq8MxWSUu0xowCxxdh/KfwmrCe2FxkMXQJKpd9cNpktV", + "s3JzWBO0SviWqsPizI6M8SkvS3800+yvhf2T2GivupubL43th7221J2jLmDHo01tD2HXY8PLRNxBLHDv", + "7O2Xh2WP7adHqjEjVePaplWhZhZhsayk92aCW9R61inWwPJ9/q6xeMN4uWTMLlkV3faWK46hdc8PugT2", + "6PwQ6/tbMdNKwW/q9dSmU3WWfwoD7mCtSxa7fYbHGS2Y2AnOwrlXtP/yvnF3p1n7SLjw3M9owTvGnffU", + "5xLr9rbSzGbEzhpR3zf8PRt4T8HRl01AeccNA75fwRHJJqd9L3NMB1o1x/v7Iy4mwLp7EwGuIR16LyPE", + "jvIdCB8wx+UggETxUX7I+Ziop0ba+fho4iOPU9XO/QfTDRzUmic6ng455Q4WGyW3/Y5M2x0dMBHC+CYs", + "Qy0x0OJUU/uBcsX9dGbbFKgbmXgznyFpz46NauBboAmTnQE+PcqIa1wccdtWhm1cjsWQE96kNDafm+bC", + "vn5IZXxiWykXA471Ibdt6wHrE2bPmMmNOPaMIc22hs1VYscoDcnytgmQWSap9zD8gg42aWRJaYEVT7YD", + "b2vx1+bTZ52DNwKJ3Y9HPcgJSR642ImXDOg2eLofEyYLCOOZTdZO/0uaTSptGoa8P4TN/HKmkq5rIvD0", + "VDSdN0uN7HqiMYxFFSgXbSx72SkrcqGSt76M6S35sap16OIiRpVuUc4LRQ9tNp0mD6dkVcv+NfPXjEk5", + "5szlCvMz4qRv3+e9uemx6f8LAAD//68dSQSLYAAA", } // GetSwagger returns the content of the embedded swagger specification file