From 4b3344519f58e520483290788b88a248fe7904c1 Mon Sep 17 00:00:00 2001 From: Takumi Akimoto <81888693+akimon658@users.noreply.github.com> Date: Sat, 1 Feb 2025 14:36:20 +0900 Subject: [PATCH] =?UTF-8?q?=E5=90=88=E5=AE=BF=E3=81=B8=E3=81=AE=E5=8F=82?= =?UTF-8?q?=E5=8A=A0=E7=99=BB=E9=8C=B2=E3=80=81=E3=82=AD=E3=83=A3=E3=83=B3?= =?UTF-8?q?=E3=82=BB=E3=83=AB=E3=82=92=E3=81=A7=E3=81=8D=E3=82=8B=E3=82=88?= =?UTF-8?q?=E3=81=86=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/handler/api.gen.go | 92 ++ backend/handler/camps.go | 48 + backend/model/camp.go | 1 + backend/repository/camp.go | 53 + frontend/src/api/schema.d.ts | 2974 +++++++++++++++++----------------- openapi.yaml | 35 + 6 files changed, 1746 insertions(+), 1457 deletions(-) diff --git a/backend/handler/api.gen.go b/backend/handler/api.gen.go index 6121b75..b8d7a57 100644 --- a/backend/handler/api.gen.go +++ b/backend/handler/api.gen.go @@ -245,6 +245,18 @@ type NotFound struct { Message *string `json:"message,omitempty"` } +// DeleteCampParticipantParams defines parameters for DeleteCampParticipant. +type DeleteCampParticipantParams struct { + // XForwardedUser ログインしているユーザーのtraQ ID(NeoShowcaseが自動で付与) + XForwardedUser *XForwardedUser `json:"X-Forwarded-User,omitempty"` +} + +// PostCampParticipantParams defines parameters for PostCampParticipant. +type PostCampParticipantParams struct { + // XForwardedUser ログインしているユーザーのtraQ ID(NeoShowcaseが自動で付与) + XForwardedUser *XForwardedUser `json:"X-Forwarded-User,omitempty"` +} + // PostCampParams defines parameters for PostCamp. type PostCampParams struct { // XForwardedUser ログインしているユーザーのtraQ ID(NeoShowcaseが自動で付与) @@ -563,6 +575,12 @@ func (t *PutAnswerRequest_Content) UnmarshalJSON(b []byte) error { // ServerInterface represents all server handlers. type ServerInterface interface { + // 合宿への参加をキャンセル + // (DELETE /api/camp/{camp_id}/register) + DeleteCampParticipant(ctx echo.Context, campId CampId, params DeleteCampParticipantParams) error + // 合宿に参加 + // (POST /api/camp/{camp_id}/register) + PostCampParticipant(ctx echo.Context, campId CampId, params PostCampParticipantParams) error // 合宿の一覧を取得 // (GET /api/camps) GetCamps(ctx echo.Context) error @@ -672,6 +690,78 @@ type ServerInterfaceWrapper struct { Handler ServerInterface } +// DeleteCampParticipant converts echo context to params. +func (w *ServerInterfaceWrapper) DeleteCampParticipant(ctx echo.Context) error { + var err error + // ------------- Path parameter "camp_id" ------------- + var campId CampId + + err = runtime.BindStyledParameterWithOptions("simple", "camp_id", ctx.Param("camp_id"), &campId, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter camp_id: %s", err)) + } + + // Parameter object where we will unmarshal all parameters from the context + var params DeleteCampParticipantParams + + headers := ctx.Request().Header + // ------------- Optional header parameter "X-Forwarded-User" ------------- + if valueList, found := headers[http.CanonicalHeaderKey("X-Forwarded-User")]; found { + var XForwardedUser XForwardedUser + n := len(valueList) + if n != 1 { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Expected one value for X-Forwarded-User, got %d", n)) + } + + err = runtime.BindStyledParameterWithOptions("simple", "X-Forwarded-User", valueList[0], &XForwardedUser, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationHeader, Explode: false, Required: false}) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter X-Forwarded-User: %s", err)) + } + + params.XForwardedUser = &XForwardedUser + } + + // Invoke the callback with all the unmarshaled arguments + err = w.Handler.DeleteCampParticipant(ctx, campId, params) + return err +} + +// PostCampParticipant converts echo context to params. +func (w *ServerInterfaceWrapper) PostCampParticipant(ctx echo.Context) error { + var err error + // ------------- Path parameter "camp_id" ------------- + var campId CampId + + err = runtime.BindStyledParameterWithOptions("simple", "camp_id", ctx.Param("camp_id"), &campId, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter camp_id: %s", err)) + } + + // Parameter object where we will unmarshal all parameters from the context + var params PostCampParticipantParams + + headers := ctx.Request().Header + // ------------- Optional header parameter "X-Forwarded-User" ------------- + if valueList, found := headers[http.CanonicalHeaderKey("X-Forwarded-User")]; found { + var XForwardedUser XForwardedUser + n := len(valueList) + if n != 1 { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Expected one value for X-Forwarded-User, got %d", n)) + } + + err = runtime.BindStyledParameterWithOptions("simple", "X-Forwarded-User", valueList[0], &XForwardedUser, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationHeader, Explode: false, Required: false}) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter X-Forwarded-User: %s", err)) + } + + params.XForwardedUser = &XForwardedUser + } + + // Invoke the callback with all the unmarshaled arguments + err = w.Handler.PostCampParticipant(ctx, campId, params) + return err +} + // GetCamps converts echo context to params. func (w *ServerInterfaceWrapper) GetCamps(ctx echo.Context) error { var err error @@ -1634,6 +1724,8 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL Handler: si, } + router.DELETE(baseURL+"/api/camp/:camp_id/register", wrapper.DeleteCampParticipant) + router.POST(baseURL+"/api/camp/:camp_id/register", wrapper.PostCampParticipant) router.GET(baseURL+"/api/camps", wrapper.GetCamps) router.POST(baseURL+"/api/camps", wrapper.PostCamp) router.GET(baseURL+"/api/camps/default", wrapper.GetDefaultCamp) diff --git a/backend/handler/camps.go b/backend/handler/camps.go index 4fb92a7..fc0b7a3 100644 --- a/backend/handler/camps.go +++ b/backend/handler/camps.go @@ -174,3 +174,51 @@ func (s *Server) PutCamp(e echo.Context, campID CampId, params PutCampParams) er return e.JSON(http.StatusOK, response) } + +func (s *Server) PostCampParticipant(e echo.Context, campID CampId, params PostCampParticipantParams) error { + user, err := s.repo.GetOrCreateUser(*params.XForwardedUser) + + if err != nil { + e.Logger().Errorf("failed to get or create user: %v", err) + + return echo.NewHTTPError(http.StatusInternalServerError, "Internal server error") + } + + if err := s.repo.AddUserToCamp(uint(campID), user); err != nil { + if errors.Is(err, model.ErrNotFound) { + return echo.NewHTTPError(http.StatusNotFound, "Not found") + } + + if errors.Is(err, model.ErrAlreadyExists) { + return echo.NewHTTPError(http.StatusConflict, "User already exists in camp") + } + + e.Logger().Errorf("failed to add user to camp: %v", err) + + return echo.NewHTTPError(http.StatusInternalServerError, "Internal server error") + } + + return e.NoContent(http.StatusNoContent) +} + +func (s *Server) DeleteCampParticipant(e echo.Context, campID CampId, params DeleteCampParticipantParams) error { + user, err := s.repo.GetOrCreateUser(*params.XForwardedUser) + + if err != nil { + e.Logger().Errorf("failed to get or create user: %v", err) + + return echo.NewHTTPError(http.StatusInternalServerError, "Internal server error") + } + + if err := s.repo.RemoveUserFromCamp(uint(campID), user); err != nil { + if errors.Is(err, model.ErrNotFound) { + return echo.NewHTTPError(http.StatusNotFound, "Not found") + } + + e.Logger().Errorf("failed to remove user from camp: %v", err) + + return echo.NewHTTPError(http.StatusInternalServerError, "Internal server error") + } + + return e.NoContent(http.StatusNoContent) +} diff --git a/backend/model/camp.go b/backend/model/camp.go index 205ad00..2f91560 100644 --- a/backend/model/camp.go +++ b/backend/model/camp.go @@ -8,6 +8,7 @@ type Camp struct { Name string Description string IsDraft bool + Participants []User `gorm:"many2many:camp_participants;"` Budgets []Budget Events []Event QuestionGroups []QuestionGroup diff --git a/backend/repository/camp.go b/backend/repository/camp.go index dfa631d..1a0742a 100644 --- a/backend/repository/camp.go +++ b/backend/repository/camp.go @@ -2,6 +2,7 @@ package repository import ( "errors" + "fmt" "github.com/go-sql-driver/mysql" "github.com/traP-jp/rucQ/backend/model" @@ -73,3 +74,55 @@ func (r *Repository) UpdateCamp(campID uint, camp *model.Camp) error { return nil } + +func (r *Repository) AddUserToCamp(campID uint, user *model.User) error { + var camp model.Camp + + if err := r.db.First(&camp, campID).Error; err != nil { + return fmt.Errorf("failed to get camp: %w", err) + } + + count := r.db. + Model(&camp). + Where(&model.User{ + TraqID: user.TraqID, + }). + Association("Participants"). + Count() + + if count > 0 { + return model.ErrAlreadyExists + } + + if err := r.db.Model(&camp).Association("Participants").Append(user); err != nil { + return fmt.Errorf("failed to append participant: %w", err) + } + + return nil +} + +func (r *Repository) RemoveUserFromCamp(campID uint, user *model.User) error { + var camp model.Camp + + if err := r.db.First(&camp, campID).Error; err != nil { + return fmt.Errorf("failed to get camp: %w", err) + } + + count := r.db. + Model(&camp). + Where(&model.User{ + TraqID: user.TraqID, + }). + Association("Participants"). + Count() + + if count == 0 { + return model.ErrNotFound + } + + if err := r.db.Model(&camp).Association("Participants").Delete(user); err != nil { + return fmt.Errorf("failed to delete participant: %w", err) + } + + return nil +} diff --git a/frontend/src/api/schema.d.ts b/frontend/src/api/schema.d.ts index 0d8c8b7..7658b22 100644 --- a/frontend/src/api/schema.d.ts +++ b/frontend/src/api/schema.d.ts @@ -4,1471 +4,1531 @@ */ export interface paths { - '/api/camps': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - /** 合宿の一覧を取得 */ - get: operations['getCamps'] - put?: never - /** 合宿を作成 */ - post: operations['postCamp'] - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/api/camps/default': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - /** デフォルトの合宿を取得 */ - get: operations['getDefaultCamp'] - put?: never - post?: never - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/api/camps/{camp_id}': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - /** 合宿の詳細を取得 */ - get: operations['getCamp'] - /** 合宿を更新 */ - put: operations['putCamp'] - post?: never - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/api/events': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - /** イベントの一覧を取得 */ - get: operations['getEvents'] - put?: never - /** イベントを作成 */ - post: operations['postEvent'] - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/api/events/{event_id}': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - /** イベントの詳細を取得 */ - get: operations['getEvent'] - /** イベントを更新 */ - put: operations['putEvent'] - post?: never - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/api/events/{event_id}/register': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - get?: never - put?: never - /** イベントに参加 */ - post: operations['registerEvent'] - /** イベントへの参加をキャンセル */ - delete: operations['unregisterEvent'] - options?: never - head?: never - patch?: never - trace?: never - } - '/api/events/{event_id}/participants': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - /** イベントの参加者一覧を取得 */ - get: operations['getParticipants'] - put?: never - post?: never - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/api/me': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - /** 自分の情報を取得 */ - get: operations['getMe'] - put?: never - post?: never - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/api/question_groups': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - /** 質問グループの一覧を取得 */ - get: operations['getQuestionGroups'] - put?: never - /** 質問グループを作成 */ - post: operations['postQuestionGroup'] - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/api/questions': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - /** 質問の一覧を取得 */ - get: operations['getQuestions'] - put?: never - /** 質問を作成 */ - post: operations['postQuestion'] - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/api/questions/{question_id}': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - /** 質問の詳細を取得 */ - get: operations['getQuestion'] - /** 質問を更新 */ - put: operations['putQuestion'] - post?: never - /** 質問を削除 */ - delete: operations['deleteQuestion'] - options?: never - head?: never - patch?: never - trace?: never - } - '/api/options': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - get?: never - put?: never - /** 選択肢を作成 */ - post: operations['postOption'] - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/api/options/{option_id}': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - get?: never - /** 選択肢を更新 */ - put: operations['putOption'] - post?: never - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/api/me/answers/{question_id}': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - /** 自分の回答を取得 */ - get: operations['getMyAnswer'] - /** 回答を更新 */ - put: operations['putAnswer'] - post?: never - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/api/users/{traq_id}/answers/{question_id}': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - /** ユーザーの回答を取得 */ - get: operations['getUserAnswer'] - /** 回答を更新 */ - put: operations['putUserAnswer'] - post?: never - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/api/me/budgets': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - /** 自分の予算を取得 */ - get: operations['getMyBudget'] - put?: never - post?: never - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/api/users/{traq_id}/budgets': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - /** ユーザーの予算を取得 */ - get: operations['getUserBudget'] - /** ユーザーの予算を更新 */ - put: operations['putUserBudget'] - /** ユーザーの予算を設定 */ - post: operations['postUserBudget'] - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } - '/api/staffs': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - /** 合宿係の一覧を取得 */ - get: operations['getStaffs'] - put?: never - /** 合宿係を追加 */ - post: operations['postStaff'] - /** 合宿係を削除 */ - delete: operations['deleteStaff'] - options?: never - head?: never - patch?: never - trace?: never - } - '/api/dm': { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - get?: never - put?: never - /** DMを送信 */ - post: operations['postDirectMessage'] - delete?: never - options?: never - head?: never - patch?: never - trace?: never - } + "/api/camps": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** 合宿の一覧を取得 */ + get: operations["getCamps"]; + put?: never; + /** 合宿を作成 */ + post: operations["postCamp"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/camps/default": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** デフォルトの合宿を取得 */ + get: operations["getDefaultCamp"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/camps/{camp_id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** 合宿の詳細を取得 */ + get: operations["getCamp"]; + /** 合宿を更新 */ + put: operations["putCamp"]; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/camp/{camp_id}/register": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** 合宿に参加 */ + post: operations["postCampParticipant"]; + /** 合宿への参加をキャンセル */ + delete: operations["deleteCampParticipant"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/events": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** イベントの一覧を取得 */ + get: operations["getEvents"]; + put?: never; + /** イベントを作成 */ + post: operations["postEvent"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/events/{event_id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** イベントの詳細を取得 */ + get: operations["getEvent"]; + /** イベントを更新 */ + put: operations["putEvent"]; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/events/{event_id}/register": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** イベントに参加 */ + post: operations["registerEvent"]; + /** イベントへの参加をキャンセル */ + delete: operations["unregisterEvent"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/events/{event_id}/participants": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** イベントの参加者一覧を取得 */ + get: operations["getParticipants"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/me": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** 自分の情報を取得 */ + get: operations["getMe"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/question_groups": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** 質問グループの一覧を取得 */ + get: operations["getQuestionGroups"]; + put?: never; + /** 質問グループを作成 */ + post: operations["postQuestionGroup"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/questions": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** 質問の一覧を取得 */ + get: operations["getQuestions"]; + put?: never; + /** 質問を作成 */ + post: operations["postQuestion"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/questions/{question_id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** 質問の詳細を取得 */ + get: operations["getQuestion"]; + /** 質問を更新 */ + put: operations["putQuestion"]; + post?: never; + /** 質問を削除 */ + delete: operations["deleteQuestion"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/options": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** 選択肢を作成 */ + post: operations["postOption"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/options/{option_id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + /** 選択肢を更新 */ + put: operations["putOption"]; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/me/answers/{question_id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** 自分の回答を取得 */ + get: operations["getMyAnswer"]; + /** 回答を更新 */ + put: operations["putAnswer"]; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/users/{traq_id}/answers/{question_id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** ユーザーの回答を取得 */ + get: operations["getUserAnswer"]; + /** 回答を更新 */ + put: operations["putUserAnswer"]; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/me/budgets": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** 自分の予算を取得 */ + get: operations["getMyBudget"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/users/{traq_id}/budgets": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** ユーザーの予算を取得 */ + get: operations["getUserBudget"]; + /** ユーザーの予算を更新 */ + put: operations["putUserBudget"]; + /** ユーザーの予算を設定 */ + post: operations["postUserBudget"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/staffs": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** 合宿係の一覧を取得 */ + get: operations["getStaffs"]; + put?: never; + /** 合宿係を追加 */ + post: operations["postStaff"]; + /** 合宿係を削除 */ + delete: operations["deleteStaff"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/dm": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** DMを送信 */ + post: operations["postDirectMessage"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; } -export type webhooks = Record +export type webhooks = Record; export interface components { - schemas: { - Camp: { - id: number - display_id: string - name: string - is_draft: boolean - description: string - } - PostCampRequest: { - display_id: string - name: string - is_draft: boolean - description: string - } - Event: { - id: number - name: string - description: string - location: string - /** Format: date-time */ - time_start: string - /** Format: date-time */ - time_end: string - camp_id: number - organizer_traq_id: string - by_staff: boolean - display_color: string - } - PostEventRequest: { - name: string - description: string - location: string - /** Format: date-time */ - time_start: string - /** Format: date-time */ - time_end: string - camp_id: number - create_as_staff: boolean - display_color: string - } - User: { - traq_id: string - is_staff: boolean - } - QuestionGroup: { - id: number - name: string - description: string | null - /** Format: date-time */ - due: string - questions: components['schemas']['Question'][] - camp_id: number - } - PostQuestionGroupRequest: { - name: string - description: string | null - /** Format: date-time */ - due: string - camp_id: number - } - Question: { - id: number - question_group_id: number - title: string - description: string | null - /** @enum {string} */ - type: 'single' | 'multiple' | 'free_text' | 'free_number' - is_public: boolean - is_open: boolean - options?: components['schemas']['Option'][] | null - } - PostQuestionRequest: { - question_group_id: number - title: string - description: string - /** @enum {string} */ - type: 'single' | 'multiple' | 'free_text' | 'free_number' - is_public: boolean - is_open: boolean - } - Option: { - id: number - question_id: number - content: string - } - PostOptionRequest: { - question_id: number - content: string - } - Answer: { - id: number - question_id: number - user_traq_id: string - content?: (string | string[]) | null - } - PutAnswerRequest: { - content?: (string | string[]) | null - } - Budget: { - id: number - camp_id: number - amount?: number | null - amount_paid: number - } - PostBudgetRequest: { - camp_id: number - amount?: number | null - amount_paid: number - } - PostStaffRequest: { - traq_id: string - } - PostDMRequest: { - target_user: string - content: string - /** Format: date-time */ - sendtime?: string - } - } - responses: { - /** @description No Content */ - NoContent: { - headers: { - [name: string]: unknown - } - content?: never - } - /** @description Bad Request */ - BadRequest: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': { - message?: string - } - } - } - /** @description Forbidden */ - Forbidden: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': { - message?: string - } - } - } - /** @description Not Found */ - NotFound: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': { - message?: string - } - } - } - /** @description Conflict */ - Conflict: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': { - message?: string - } - } - } - /** @description Internal Server Error */ - InternalServerError: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': { - /** @example Internal server error */ - message?: string - } - } - } - } - parameters: { - /** @description ログインしているユーザーのtraQ ID(NeoShowcaseが自動で付与) */ - 'X-Forwarded-User': string - /** @description traQ ID */ - TraqId: string - /** @description 合宿ID */ - CampId: number - /** @description イベントID */ - EventId: number - /** @description 質問ID */ - QuestionId: number - /** @description 選択肢ID */ - OptionId: number - /** @description 回答ID */ - AnswerId: number - /** @description 合宿係のtraQ ID */ - StaffId: string - } - requestBodies: never - headers: never - pathItems: never -} -export type $defs = Record -export interface operations { - getCamps: { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - requestBody?: never - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['Camp'][] - } - } - 500: components['responses']['InternalServerError'] - } - } - postCamp: { - parameters: { - query?: never - header?: { - /** @description ログインしているユーザーのtraQ ID(NeoShowcaseが自動で付与) */ - 'X-Forwarded-User'?: components['parameters']['X-Forwarded-User'] - } - path?: never - cookie?: never - } - requestBody: { - content: { - 'application/json': components['schemas']['PostCampRequest'] - } - } + schemas: { + Camp: { + id: number; + display_id: string; + name: string; + is_draft: boolean; + description: string; + }; + PostCampRequest: { + display_id: string; + name: string; + is_draft: boolean; + description: string; + }; + Event: { + id: number; + name: string; + description: string; + location: string; + /** Format: date-time */ + time_start: string; + /** Format: date-time */ + time_end: string; + camp_id: number; + organizer_traq_id: string; + by_staff: boolean; + display_color: string; + }; + PostEventRequest: { + name: string; + description: string; + location: string; + /** Format: date-time */ + time_start: string; + /** Format: date-time */ + time_end: string; + camp_id: number; + create_as_staff: boolean; + display_color: string; + }; + User: { + traq_id: string; + is_staff: boolean; + }; + QuestionGroup: { + id: number; + name: string; + description: string | null; + /** Format: date-time */ + due: string; + questions: components["schemas"]["Question"][]; + camp_id: number; + }; + PostQuestionGroupRequest: { + name: string; + description: string | null; + /** Format: date-time */ + due: string; + camp_id: number; + }; + Question: { + id: number; + question_group_id: number; + title: string; + description: string | null; + /** @enum {string} */ + type: "single" | "multiple" | "free_text" | "free_number"; + is_public: boolean; + is_open: boolean; + options?: components["schemas"]["Option"][] | null; + }; + PostQuestionRequest: { + question_group_id: number; + title: string; + description: string; + /** @enum {string} */ + type: "single" | "multiple" | "free_text" | "free_number"; + is_public: boolean; + is_open: boolean; + }; + Option: { + id: number; + question_id: number; + content: string; + }; + PostOptionRequest: { + question_id: number; + content: string; + }; + Answer: { + id: number; + question_id: number; + user_traq_id: string; + content?: (string | string[]) | null; + }; + PutAnswerRequest: { + content?: (string | string[]) | null; + }; + Budget: { + id: number; + camp_id: number; + amount?: number | null; + amount_paid: number; + }; + PostBudgetRequest: { + camp_id: number; + amount?: number | null; + amount_paid: number; + }; + PostStaffRequest: { + traq_id: string; + }; + PostDMRequest: { + target_user: string; + content: string; + /** Format: date-time */ + sendtime?: string; + }; + }; responses: { - /** @description Created */ - 201: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['PostCampRequest'] - } - } - 400: components['responses']['BadRequest'] - 403: components['responses']['Forbidden'] - 409: components['responses']['Conflict'] - 500: components['responses']['InternalServerError'] - } - } - getDefaultCamp: { + /** @description No Content */ + NoContent: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad Request */ + BadRequest: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message?: string; + }; + }; + }; + /** @description Forbidden */ + Forbidden: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message?: string; + }; + }; + }; + /** @description Not Found */ + NotFound: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message?: string; + }; + }; + }; + /** @description Conflict */ + Conflict: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message?: string; + }; + }; + }; + /** @description Internal Server Error */ + InternalServerError: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** @example Internal server error */ + message?: string; + }; + }; + }; + }; parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - requestBody?: never - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['Camp'] - } - } - 404: components['responses']['NotFound'] - 500: components['responses']['InternalServerError'] - } - } - getCamp: { - parameters: { - query?: never - header?: never - path: { - /** @description 合宿ID */ - camp_id: components['parameters']['CampId'] - } - cookie?: never - } - requestBody?: never - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['Camp'] - } - } - 404: components['responses']['NotFound'] - 500: components['responses']['InternalServerError'] - } - } - putCamp: { - parameters: { - query?: never - header?: { /** @description ログインしているユーザーのtraQ ID(NeoShowcaseが自動で付与) */ - 'X-Forwarded-User'?: components['parameters']['X-Forwarded-User'] - } - path: { + "X-Forwarded-User": string; + /** @description traQ ID */ + TraqId: string; /** @description 合宿ID */ - camp_id: components['parameters']['CampId'] - } - cookie?: never - } - requestBody: { - content: { - 'application/json': components['schemas']['PostCampRequest'] - } - } - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['Camp'] - } - } - 400: components['responses']['BadRequest'] - 403: components['responses']['Forbidden'] - 404: components['responses']['NotFound'] - 500: components['responses']['InternalServerError'] - } - } - getEvents: { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - requestBody?: never - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['Event'][] - } - } - 500: components['responses']['InternalServerError'] - } - } - postEvent: { - parameters: { - query?: never - header?: { - /** @description ログインしているユーザーのtraQ ID(NeoShowcaseが自動で付与) */ - 'X-Forwarded-User'?: components['parameters']['X-Forwarded-User'] - } - path?: never - cookie?: never - } - requestBody: { - content: { - 'application/json': components['schemas']['PostEventRequest'] - } - } - responses: { - /** @description Created */ - 201: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['Event'] - } - } - 400: components['responses']['BadRequest'] - 500: components['responses']['InternalServerError'] - } - } - getEvent: { - parameters: { - query?: never - header?: never - path: { - /** @description イベントID */ - event_id: components['parameters']['EventId'] - } - cookie?: never - } - requestBody?: never - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['Event'] - } - } - 404: components['responses']['NotFound'] - 500: components['responses']['InternalServerError'] - } - } - putEvent: { - parameters: { - query?: never - header?: { - /** @description ログインしているユーザーのtraQ ID(NeoShowcaseが自動で付与) */ - 'X-Forwarded-User'?: components['parameters']['X-Forwarded-User'] - } - path: { - /** @description イベントID */ - event_id: components['parameters']['EventId'] - } - cookie?: never - } - requestBody: { - content: { - 'application/json': components['schemas']['PostEventRequest'] - } - } - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['Event'] - } - } - 400: components['responses']['BadRequest'] - 403: components['responses']['Forbidden'] - 404: components['responses']['NotFound'] - 500: components['responses']['InternalServerError'] - } - } - registerEvent: { - parameters: { - query?: never - header?: { - /** @description ログインしているユーザーのtraQ ID(NeoShowcaseが自動で付与) */ - 'X-Forwarded-User'?: components['parameters']['X-Forwarded-User'] - } - path: { - /** @description イベントID */ - event_id: components['parameters']['EventId'] - } - cookie?: never - } - requestBody?: never - responses: { - 204: components['responses']['NoContent'] - 404: components['responses']['NotFound'] - 409: components['responses']['Conflict'] - 500: components['responses']['InternalServerError'] - } - } - unregisterEvent: { - parameters: { - query?: never - header?: { - /** @description ログインしているユーザーのtraQ ID(NeoShowcaseが自動で付与) */ - 'X-Forwarded-User'?: components['parameters']['X-Forwarded-User'] - } - path: { - /** @description イベントID */ - event_id: components['parameters']['EventId'] - } - cookie?: never - } - requestBody?: never - responses: { - 204: components['responses']['NoContent'] - 404: components['responses']['NotFound'] - 409: components['responses']['Conflict'] - 500: components['responses']['InternalServerError'] - } - } - getParticipants: { - parameters: { - query?: never - header?: never - path: { + CampId: number; /** @description イベントID */ - event_id: components['parameters']['EventId'] - } - cookie?: never - } - requestBody?: never - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['User'][] - } - } - 404: components['responses']['NotFound'] - 500: components['responses']['InternalServerError'] - } - } - getMe: { - parameters: { - query?: never - header?: { - /** @description ログインしているユーザーのtraQ ID(NeoShowcaseが自動で付与) */ - 'X-Forwarded-User'?: components['parameters']['X-Forwarded-User'] - } - path?: never - cookie?: never - } - requestBody?: never - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['User'] - } - } - 500: components['responses']['InternalServerError'] - } - } - getQuestionGroups: { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - requestBody?: never - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['QuestionGroup'][] - } - } - 500: components['responses']['InternalServerError'] - } - } - postQuestionGroup: { - parameters: { - query?: never - header?: { - /** @description ログインしているユーザーのtraQ ID(NeoShowcaseが自動で付与) */ - 'X-Forwarded-User'?: components['parameters']['X-Forwarded-User'] - } - path?: never - cookie?: never - } - requestBody: { - content: { - 'application/json': components['schemas']['PostQuestionGroupRequest'] - } - } - responses: { - /** @description Created */ - 201: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['QuestionGroup'] - } - } - 400: components['responses']['BadRequest'] - 403: components['responses']['Forbidden'] - 500: components['responses']['InternalServerError'] - } - } - getQuestions: { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - requestBody?: never - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['Question'][] - } - } - 500: components['responses']['InternalServerError'] - } - } - postQuestion: { - parameters: { - query?: never - header?: { - /** @description ログインしているユーザーのtraQ ID(NeoShowcaseが自動で付与) */ - 'X-Forwarded-User'?: components['parameters']['X-Forwarded-User'] - } - path?: never - cookie?: never - } - requestBody: { - content: { - 'application/json': components['schemas']['PostQuestionRequest'] - } - } - responses: { - /** @description Created */ - 201: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['Question'] - } - } - 400: components['responses']['BadRequest'] - 403: components['responses']['Forbidden'] - 500: components['responses']['InternalServerError'] - } - } - getQuestion: { - parameters: { - query?: never - header?: never - path: { - /** @description 質問ID */ - question_id: components['parameters']['QuestionId'] - } - cookie?: never - } - requestBody?: never - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['Question'] - } - } - 404: components['responses']['NotFound'] - 500: components['responses']['InternalServerError'] - } - } - putQuestion: { - parameters: { - query?: never - header?: { - /** @description ログインしているユーザーのtraQ ID(NeoShowcaseが自動で付与) */ - 'X-Forwarded-User'?: components['parameters']['X-Forwarded-User'] - } - path: { - /** @description 質問ID */ - question_id: components['parameters']['QuestionId'] - } - cookie?: never - } - requestBody: { - content: { - 'application/json': components['schemas']['PostQuestionRequest'] - } - } - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['Question'] - } - } - 400: components['responses']['BadRequest'] - 403: components['responses']['Forbidden'] - 404: components['responses']['NotFound'] - 500: components['responses']['InternalServerError'] - } - } - deleteQuestion: { - parameters: { - query?: never - header?: { - /** @description ログインしているユーザーのtraQ ID(NeoShowcaseが自動で付与) */ - 'X-Forwarded-User'?: components['parameters']['X-Forwarded-User'] - } - path: { + EventId: number; /** @description 質問ID */ - question_id: components['parameters']['QuestionId'] - } - cookie?: never - } - requestBody?: never - responses: { - 204: components['responses']['NoContent'] - 400: components['responses']['BadRequest'] - 403: components['responses']['Forbidden'] - 404: components['responses']['NotFound'] - 500: components['responses']['InternalServerError'] - } - } - postOption: { - parameters: { - query?: never - header?: { - /** @description ログインしているユーザーのtraQ ID(NeoShowcaseが自動で付与) */ - 'X-Forwarded-User'?: components['parameters']['X-Forwarded-User'] - } - path?: never - cookie?: never - } - requestBody: { - content: { - 'application/json': components['schemas']['PostOptionRequest'] - } - } - responses: { - /** @description Created */ - 201: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['Option'] - } - } - 400: components['responses']['BadRequest'] - 403: components['responses']['Forbidden'] - 500: components['responses']['InternalServerError'] - } - } - putOption: { - parameters: { - query?: never - header?: { - /** @description ログインしているユーザーのtraQ ID(NeoShowcaseが自動で付与) */ - 'X-Forwarded-User'?: components['parameters']['X-Forwarded-User'] - } - path: { + QuestionId: number; /** @description 選択肢ID */ - option_id: components['parameters']['OptionId'] - } - cookie?: never - } - requestBody: { - content: { - 'application/json': components['schemas']['PostOptionRequest'] - } - } - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['Option'] - } - } - 400: components['responses']['BadRequest'] - 403: components['responses']['Forbidden'] - 404: components['responses']['NotFound'] - 500: components['responses']['InternalServerError'] - } - } - getMyAnswer: { - parameters: { - query?: never - header?: { - /** @description ログインしているユーザーのtraQ ID(NeoShowcaseが自動で付与) */ - 'X-Forwarded-User'?: components['parameters']['X-Forwarded-User'] - } - path: { - /** @description 質問ID */ - question_id: components['parameters']['QuestionId'] - } - cookie?: never - } - requestBody?: never - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['Answer'] - } - } - 500: components['responses']['InternalServerError'] - } - } - putAnswer: { - parameters: { - query?: never - header?: { - /** @description ログインしているユーザーのtraQ ID(NeoShowcaseが自動で付与) */ - 'X-Forwarded-User'?: components['parameters']['X-Forwarded-User'] - } - path: { - /** @description 質問ID */ - question_id: components['parameters']['QuestionId'] - } - cookie?: never - } - requestBody: { - content: { - 'application/json': components['schemas']['PutAnswerRequest'] - } - } - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['Answer'] - } - } - 400: components['responses']['BadRequest'] - 403: components['responses']['Forbidden'] - 404: components['responses']['NotFound'] - 500: components['responses']['InternalServerError'] - } - } - getUserAnswer: { - parameters: { - query?: never - header?: { - /** @description ログインしているユーザーのtraQ ID(NeoShowcaseが自動で付与) */ - 'X-Forwarded-User'?: components['parameters']['X-Forwarded-User'] - } - path: { - /** @description traQ ID */ - traq_id: components['parameters']['TraqId'] - /** @description 質問ID */ - question_id: components['parameters']['QuestionId'] - } - cookie?: never - } - requestBody?: never - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['Answer'] - } - } - 403: components['responses']['Forbidden'] - 404: components['responses']['NotFound'] - 500: components['responses']['InternalServerError'] - } - } - putUserAnswer: { - parameters: { - query?: never - header?: { - /** @description ログインしているユーザーのtraQ ID(NeoShowcaseが自動で付与) */ - 'X-Forwarded-User'?: components['parameters']['X-Forwarded-User'] - } - path: { - /** @description traQ ID */ - traq_id: components['parameters']['TraqId'] - /** @description 質問ID */ - question_id: components['parameters']['QuestionId'] - } - cookie?: never - } - requestBody: { - content: { - 'application/json': components['schemas']['PutAnswerRequest'] - } - } - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['Answer'] - } - } - 400: components['responses']['BadRequest'] - 403: components['responses']['Forbidden'] - 404: components['responses']['NotFound'] - 500: components['responses']['InternalServerError'] - } - } - getMyBudget: { - parameters: { - query?: never - header?: { - /** @description ログインしているユーザーのtraQ ID(NeoShowcaseが自動で付与) */ - 'X-Forwarded-User'?: components['parameters']['X-Forwarded-User'] - } - path?: never - cookie?: never - } - requestBody?: never - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['Budget'] - } - } - 500: components['responses']['InternalServerError'] - } - } - getUserBudget: { - parameters: { - query?: never - header?: { - /** @description ログインしているユーザーのtraQ ID(NeoShowcaseが自動で付与) */ - 'X-Forwarded-User'?: components['parameters']['X-Forwarded-User'] - } - path: { - /** @description traQ ID */ - traq_id: components['parameters']['TraqId'] - } - cookie?: never - } - requestBody?: never - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['Budget'] - } - } - 403: components['responses']['Forbidden'] - 404: components['responses']['NotFound'] - 500: components['responses']['InternalServerError'] - } - } - putUserBudget: { - parameters: { - query?: never - header?: { - /** @description ログインしているユーザーのtraQ ID(NeoShowcaseが自動で付与) */ - 'X-Forwarded-User'?: components['parameters']['X-Forwarded-User'] - } - path: { - /** @description traQ ID */ - traq_id: components['parameters']['TraqId'] - } - cookie?: never - } - requestBody: { - content: { - 'application/json': components['schemas']['PostBudgetRequest'] - } - } - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['Budget'] - } - } - 400: components['responses']['BadRequest'] - 403: components['responses']['Forbidden'] - 404: components['responses']['NotFound'] - 500: components['responses']['InternalServerError'] - } - } - postUserBudget: { - parameters: { - query?: never - header?: { - /** @description ログインしているユーザーのtraQ ID(NeoShowcaseが自動で付与) */ - 'X-Forwarded-User'?: components['parameters']['X-Forwarded-User'] - } - path: { - /** @description traQ ID */ - traq_id: components['parameters']['TraqId'] - } - cookie?: never - } - requestBody: { - content: { - 'application/json': components['schemas']['PostBudgetRequest'] - } - } - responses: { - /** @description Created */ - 201: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['Budget'] - } - } - 400: components['responses']['BadRequest'] - 403: components['responses']['Forbidden'] - 404: components['responses']['NotFound'] - 500: components['responses']['InternalServerError'] - } - } - getStaffs: { - parameters: { - query?: never - header?: never - path?: never - cookie?: never - } - requestBody?: never - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown - } - content: { - 'application/json': components['schemas']['User'][] - } - } - 500: components['responses']['InternalServerError'] - } - } - postStaff: { - parameters: { - query?: never - header?: { - /** @description ログインしているユーザーのtraQ ID(NeoShowcaseが自動で付与) */ - 'X-Forwarded-User'?: components['parameters']['X-Forwarded-User'] - } - path?: never - cookie?: never - } - requestBody: { - content: { - 'application/json': components['schemas']['PostStaffRequest'] - } - } - responses: { - 204: components['responses']['NoContent'] - 400: components['responses']['BadRequest'] - 403: components['responses']['Forbidden'] - 404: components['responses']['NotFound'] - 500: components['responses']['InternalServerError'] - } - } - deleteStaff: { - parameters: { - query: { + OptionId: number; + /** @description 回答ID */ + AnswerId: number; /** @description 合宿係のtraQ ID */ - staff_id: components['parameters']['StaffId'] - } - header?: { - /** @description ログインしているユーザーのtraQ ID(NeoShowcaseが自動で付与) */ - 'X-Forwarded-User'?: components['parameters']['X-Forwarded-User'] - } - path?: never - cookie?: never - } - requestBody?: never - responses: { - 204: components['responses']['NoContent'] - 400: components['responses']['BadRequest'] - 403: components['responses']['Forbidden'] - 404: components['responses']['NotFound'] - 500: components['responses']['InternalServerError'] - } - } - postDirectMessage: { - parameters: { - query?: never - header?: { - /** @description ログインしているユーザーのtraQ ID(NeoShowcaseが自動で付与) */ - 'X-Forwarded-User'?: components['parameters']['X-Forwarded-User'] - } - path?: never - cookie?: never - } - requestBody: { - content: { - 'application/json': components['schemas']['PostDMRequest'] - } - } - responses: { - 204: components['responses']['NoContent'] - 400: components['responses']['BadRequest'] - 403: components['responses']['Forbidden'] - 404: components['responses']['NotFound'] - 500: components['responses']['InternalServerError'] - } - } + StaffId: string; + }; + requestBodies: never; + headers: never; + pathItems: never; +} +export type $defs = Record; +export interface operations { + getCamps: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Camp"][]; + }; + }; + 500: components["responses"]["InternalServerError"]; + }; + }; + postCamp: { + parameters: { + query?: never; + header?: { + /** @description ログインしているユーザーのtraQ ID(NeoShowcaseが自動で付与) */ + "X-Forwarded-User"?: components["parameters"]["X-Forwarded-User"]; + }; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["PostCampRequest"]; + }; + }; + responses: { + /** @description Created */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["PostCampRequest"]; + }; + }; + 400: components["responses"]["BadRequest"]; + 403: components["responses"]["Forbidden"]; + 409: components["responses"]["Conflict"]; + 500: components["responses"]["InternalServerError"]; + }; + }; + getDefaultCamp: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Camp"]; + }; + }; + 404: components["responses"]["NotFound"]; + 500: components["responses"]["InternalServerError"]; + }; + }; + getCamp: { + parameters: { + query?: never; + header?: never; + path: { + /** @description 合宿ID */ + camp_id: components["parameters"]["CampId"]; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Camp"]; + }; + }; + 404: components["responses"]["NotFound"]; + 500: components["responses"]["InternalServerError"]; + }; + }; + putCamp: { + parameters: { + query?: never; + header?: { + /** @description ログインしているユーザーのtraQ ID(NeoShowcaseが自動で付与) */ + "X-Forwarded-User"?: components["parameters"]["X-Forwarded-User"]; + }; + path: { + /** @description 合宿ID */ + camp_id: components["parameters"]["CampId"]; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["PostCampRequest"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Camp"]; + }; + }; + 400: components["responses"]["BadRequest"]; + 403: components["responses"]["Forbidden"]; + 404: components["responses"]["NotFound"]; + 500: components["responses"]["InternalServerError"]; + }; + }; + postCampParticipant: { + parameters: { + query?: never; + header?: { + /** @description ログインしているユーザーのtraQ ID(NeoShowcaseが自動で付与) */ + "X-Forwarded-User"?: components["parameters"]["X-Forwarded-User"]; + }; + path: { + /** @description 合宿ID */ + camp_id: components["parameters"]["CampId"]; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 204: components["responses"]["NoContent"]; + 404: components["responses"]["NotFound"]; + 409: components["responses"]["Conflict"]; + 500: components["responses"]["InternalServerError"]; + }; + }; + deleteCampParticipant: { + parameters: { + query?: never; + header?: { + /** @description ログインしているユーザーのtraQ ID(NeoShowcaseが自動で付与) */ + "X-Forwarded-User"?: components["parameters"]["X-Forwarded-User"]; + }; + path: { + /** @description 合宿ID */ + camp_id: components["parameters"]["CampId"]; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 204: components["responses"]["NoContent"]; + 404: components["responses"]["NotFound"]; + 409: components["responses"]["Conflict"]; + 500: components["responses"]["InternalServerError"]; + }; + }; + getEvents: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Event"][]; + }; + }; + 500: components["responses"]["InternalServerError"]; + }; + }; + postEvent: { + parameters: { + query?: never; + header?: { + /** @description ログインしているユーザーのtraQ ID(NeoShowcaseが自動で付与) */ + "X-Forwarded-User"?: components["parameters"]["X-Forwarded-User"]; + }; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["PostEventRequest"]; + }; + }; + responses: { + /** @description Created */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Event"]; + }; + }; + 400: components["responses"]["BadRequest"]; + 500: components["responses"]["InternalServerError"]; + }; + }; + getEvent: { + parameters: { + query?: never; + header?: never; + path: { + /** @description イベントID */ + event_id: components["parameters"]["EventId"]; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Event"]; + }; + }; + 404: components["responses"]["NotFound"]; + 500: components["responses"]["InternalServerError"]; + }; + }; + putEvent: { + parameters: { + query?: never; + header?: { + /** @description ログインしているユーザーのtraQ ID(NeoShowcaseが自動で付与) */ + "X-Forwarded-User"?: components["parameters"]["X-Forwarded-User"]; + }; + path: { + /** @description イベントID */ + event_id: components["parameters"]["EventId"]; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["PostEventRequest"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Event"]; + }; + }; + 400: components["responses"]["BadRequest"]; + 403: components["responses"]["Forbidden"]; + 404: components["responses"]["NotFound"]; + 500: components["responses"]["InternalServerError"]; + }; + }; + registerEvent: { + parameters: { + query?: never; + header?: { + /** @description ログインしているユーザーのtraQ ID(NeoShowcaseが自動で付与) */ + "X-Forwarded-User"?: components["parameters"]["X-Forwarded-User"]; + }; + path: { + /** @description イベントID */ + event_id: components["parameters"]["EventId"]; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 204: components["responses"]["NoContent"]; + 404: components["responses"]["NotFound"]; + 409: components["responses"]["Conflict"]; + 500: components["responses"]["InternalServerError"]; + }; + }; + unregisterEvent: { + parameters: { + query?: never; + header?: { + /** @description ログインしているユーザーのtraQ ID(NeoShowcaseが自動で付与) */ + "X-Forwarded-User"?: components["parameters"]["X-Forwarded-User"]; + }; + path: { + /** @description イベントID */ + event_id: components["parameters"]["EventId"]; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 204: components["responses"]["NoContent"]; + 404: components["responses"]["NotFound"]; + 409: components["responses"]["Conflict"]; + 500: components["responses"]["InternalServerError"]; + }; + }; + getParticipants: { + parameters: { + query?: never; + header?: never; + path: { + /** @description イベントID */ + event_id: components["parameters"]["EventId"]; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["User"][]; + }; + }; + 404: components["responses"]["NotFound"]; + 500: components["responses"]["InternalServerError"]; + }; + }; + getMe: { + parameters: { + query?: never; + header?: { + /** @description ログインしているユーザーのtraQ ID(NeoShowcaseが自動で付与) */ + "X-Forwarded-User"?: components["parameters"]["X-Forwarded-User"]; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["User"]; + }; + }; + 500: components["responses"]["InternalServerError"]; + }; + }; + getQuestionGroups: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["QuestionGroup"][]; + }; + }; + 500: components["responses"]["InternalServerError"]; + }; + }; + postQuestionGroup: { + parameters: { + query?: never; + header?: { + /** @description ログインしているユーザーのtraQ ID(NeoShowcaseが自動で付与) */ + "X-Forwarded-User"?: components["parameters"]["X-Forwarded-User"]; + }; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["PostQuestionGroupRequest"]; + }; + }; + responses: { + /** @description Created */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["QuestionGroup"]; + }; + }; + 400: components["responses"]["BadRequest"]; + 403: components["responses"]["Forbidden"]; + 500: components["responses"]["InternalServerError"]; + }; + }; + getQuestions: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Question"][]; + }; + }; + 500: components["responses"]["InternalServerError"]; + }; + }; + postQuestion: { + parameters: { + query?: never; + header?: { + /** @description ログインしているユーザーのtraQ ID(NeoShowcaseが自動で付与) */ + "X-Forwarded-User"?: components["parameters"]["X-Forwarded-User"]; + }; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["PostQuestionRequest"]; + }; + }; + responses: { + /** @description Created */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Question"]; + }; + }; + 400: components["responses"]["BadRequest"]; + 403: components["responses"]["Forbidden"]; + 500: components["responses"]["InternalServerError"]; + }; + }; + getQuestion: { + parameters: { + query?: never; + header?: never; + path: { + /** @description 質問ID */ + question_id: components["parameters"]["QuestionId"]; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Question"]; + }; + }; + 404: components["responses"]["NotFound"]; + 500: components["responses"]["InternalServerError"]; + }; + }; + putQuestion: { + parameters: { + query?: never; + header?: { + /** @description ログインしているユーザーのtraQ ID(NeoShowcaseが自動で付与) */ + "X-Forwarded-User"?: components["parameters"]["X-Forwarded-User"]; + }; + path: { + /** @description 質問ID */ + question_id: components["parameters"]["QuestionId"]; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["PostQuestionRequest"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Question"]; + }; + }; + 400: components["responses"]["BadRequest"]; + 403: components["responses"]["Forbidden"]; + 404: components["responses"]["NotFound"]; + 500: components["responses"]["InternalServerError"]; + }; + }; + deleteQuestion: { + parameters: { + query?: never; + header?: { + /** @description ログインしているユーザーのtraQ ID(NeoShowcaseが自動で付与) */ + "X-Forwarded-User"?: components["parameters"]["X-Forwarded-User"]; + }; + path: { + /** @description 質問ID */ + question_id: components["parameters"]["QuestionId"]; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 204: components["responses"]["NoContent"]; + 400: components["responses"]["BadRequest"]; + 403: components["responses"]["Forbidden"]; + 404: components["responses"]["NotFound"]; + 500: components["responses"]["InternalServerError"]; + }; + }; + postOption: { + parameters: { + query?: never; + header?: { + /** @description ログインしているユーザーのtraQ ID(NeoShowcaseが自動で付与) */ + "X-Forwarded-User"?: components["parameters"]["X-Forwarded-User"]; + }; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["PostOptionRequest"]; + }; + }; + responses: { + /** @description Created */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Option"]; + }; + }; + 400: components["responses"]["BadRequest"]; + 403: components["responses"]["Forbidden"]; + 500: components["responses"]["InternalServerError"]; + }; + }; + putOption: { + parameters: { + query?: never; + header?: { + /** @description ログインしているユーザーのtraQ ID(NeoShowcaseが自動で付与) */ + "X-Forwarded-User"?: components["parameters"]["X-Forwarded-User"]; + }; + path: { + /** @description 選択肢ID */ + option_id: components["parameters"]["OptionId"]; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["PostOptionRequest"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Option"]; + }; + }; + 400: components["responses"]["BadRequest"]; + 403: components["responses"]["Forbidden"]; + 404: components["responses"]["NotFound"]; + 500: components["responses"]["InternalServerError"]; + }; + }; + getMyAnswer: { + parameters: { + query?: never; + header?: { + /** @description ログインしているユーザーのtraQ ID(NeoShowcaseが自動で付与) */ + "X-Forwarded-User"?: components["parameters"]["X-Forwarded-User"]; + }; + path: { + /** @description 質問ID */ + question_id: components["parameters"]["QuestionId"]; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Answer"]; + }; + }; + 500: components["responses"]["InternalServerError"]; + }; + }; + putAnswer: { + parameters: { + query?: never; + header?: { + /** @description ログインしているユーザーのtraQ ID(NeoShowcaseが自動で付与) */ + "X-Forwarded-User"?: components["parameters"]["X-Forwarded-User"]; + }; + path: { + /** @description 質問ID */ + question_id: components["parameters"]["QuestionId"]; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["PutAnswerRequest"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Answer"]; + }; + }; + 400: components["responses"]["BadRequest"]; + 403: components["responses"]["Forbidden"]; + 404: components["responses"]["NotFound"]; + 500: components["responses"]["InternalServerError"]; + }; + }; + getUserAnswer: { + parameters: { + query?: never; + header?: { + /** @description ログインしているユーザーのtraQ ID(NeoShowcaseが自動で付与) */ + "X-Forwarded-User"?: components["parameters"]["X-Forwarded-User"]; + }; + path: { + /** @description traQ ID */ + traq_id: components["parameters"]["TraqId"]; + /** @description 質問ID */ + question_id: components["parameters"]["QuestionId"]; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Answer"]; + }; + }; + 403: components["responses"]["Forbidden"]; + 404: components["responses"]["NotFound"]; + 500: components["responses"]["InternalServerError"]; + }; + }; + putUserAnswer: { + parameters: { + query?: never; + header?: { + /** @description ログインしているユーザーのtraQ ID(NeoShowcaseが自動で付与) */ + "X-Forwarded-User"?: components["parameters"]["X-Forwarded-User"]; + }; + path: { + /** @description traQ ID */ + traq_id: components["parameters"]["TraqId"]; + /** @description 質問ID */ + question_id: components["parameters"]["QuestionId"]; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["PutAnswerRequest"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Answer"]; + }; + }; + 400: components["responses"]["BadRequest"]; + 403: components["responses"]["Forbidden"]; + 404: components["responses"]["NotFound"]; + 500: components["responses"]["InternalServerError"]; + }; + }; + getMyBudget: { + parameters: { + query?: never; + header?: { + /** @description ログインしているユーザーのtraQ ID(NeoShowcaseが自動で付与) */ + "X-Forwarded-User"?: components["parameters"]["X-Forwarded-User"]; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Budget"]; + }; + }; + 500: components["responses"]["InternalServerError"]; + }; + }; + getUserBudget: { + parameters: { + query?: never; + header?: { + /** @description ログインしているユーザーのtraQ ID(NeoShowcaseが自動で付与) */ + "X-Forwarded-User"?: components["parameters"]["X-Forwarded-User"]; + }; + path: { + /** @description traQ ID */ + traq_id: components["parameters"]["TraqId"]; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Budget"]; + }; + }; + 403: components["responses"]["Forbidden"]; + 404: components["responses"]["NotFound"]; + 500: components["responses"]["InternalServerError"]; + }; + }; + putUserBudget: { + parameters: { + query?: never; + header?: { + /** @description ログインしているユーザーのtraQ ID(NeoShowcaseが自動で付与) */ + "X-Forwarded-User"?: components["parameters"]["X-Forwarded-User"]; + }; + path: { + /** @description traQ ID */ + traq_id: components["parameters"]["TraqId"]; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["PostBudgetRequest"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Budget"]; + }; + }; + 400: components["responses"]["BadRequest"]; + 403: components["responses"]["Forbidden"]; + 404: components["responses"]["NotFound"]; + 500: components["responses"]["InternalServerError"]; + }; + }; + postUserBudget: { + parameters: { + query?: never; + header?: { + /** @description ログインしているユーザーのtraQ ID(NeoShowcaseが自動で付与) */ + "X-Forwarded-User"?: components["parameters"]["X-Forwarded-User"]; + }; + path: { + /** @description traQ ID */ + traq_id: components["parameters"]["TraqId"]; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["PostBudgetRequest"]; + }; + }; + responses: { + /** @description Created */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Budget"]; + }; + }; + 400: components["responses"]["BadRequest"]; + 403: components["responses"]["Forbidden"]; + 404: components["responses"]["NotFound"]; + 500: components["responses"]["InternalServerError"]; + }; + }; + getStaffs: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["User"][]; + }; + }; + 500: components["responses"]["InternalServerError"]; + }; + }; + postStaff: { + parameters: { + query?: never; + header?: { + /** @description ログインしているユーザーのtraQ ID(NeoShowcaseが自動で付与) */ + "X-Forwarded-User"?: components["parameters"]["X-Forwarded-User"]; + }; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["PostStaffRequest"]; + }; + }; + responses: { + 204: components["responses"]["NoContent"]; + 400: components["responses"]["BadRequest"]; + 403: components["responses"]["Forbidden"]; + 404: components["responses"]["NotFound"]; + 500: components["responses"]["InternalServerError"]; + }; + }; + deleteStaff: { + parameters: { + query: { + /** @description 合宿係のtraQ ID */ + staff_id: components["parameters"]["StaffId"]; + }; + header?: { + /** @description ログインしているユーザーのtraQ ID(NeoShowcaseが自動で付与) */ + "X-Forwarded-User"?: components["parameters"]["X-Forwarded-User"]; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + 204: components["responses"]["NoContent"]; + 400: components["responses"]["BadRequest"]; + 403: components["responses"]["Forbidden"]; + 404: components["responses"]["NotFound"]; + 500: components["responses"]["InternalServerError"]; + }; + }; + postDirectMessage: { + parameters: { + query?: never; + header?: { + /** @description ログインしているユーザーのtraQ ID(NeoShowcaseが自動で付与) */ + "X-Forwarded-User"?: components["parameters"]["X-Forwarded-User"]; + }; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["PostDMRequest"]; + }; + }; + responses: { + 204: components["responses"]["NoContent"]; + 400: components["responses"]["BadRequest"]; + 403: components["responses"]["Forbidden"]; + 404: components["responses"]["NotFound"]; + 500: components["responses"]["InternalServerError"]; + }; + }; } diff --git a/openapi.yaml b/openapi.yaml index d0e4087..800fec0 100644 --- a/openapi.yaml +++ b/openapi.yaml @@ -121,6 +121,41 @@ paths: $ref: "#/components/responses/NotFound" "500": $ref: "#/components/responses/InternalServerError" + /api/camp/{camp_id}/register: + post: + summary: 合宿に参加 + tags: + - Camps + operationId: postCampParticipant + parameters: + - $ref: "#/components/parameters/CampId" + - $ref: "#/components/parameters/X-Forwarded-User" + responses: + "204": + $ref: "#/components/responses/NoContent" + "404": + $ref: "#/components/responses/NotFound" + "409": + $ref: "#/components/responses/Conflict" + "500": + $ref: "#/components/responses/InternalServerError" + delete: + summary: 合宿への参加をキャンセル + tags: + - Camps + operationId: deleteCampParticipant + parameters: + - $ref: "#/components/parameters/CampId" + - $ref: "#/components/parameters/X-Forwarded-User" + responses: + "204": + $ref: "#/components/responses/NoContent" + "404": + $ref: "#/components/responses/NotFound" + "409": + $ref: "#/components/responses/Conflict" + "500": + $ref: "#/components/responses/InternalServerError" /api/events: get: summary: イベントの一覧を取得