From d0aa58dcddfd136854157dbed1360e01d00989dd Mon Sep 17 00:00:00 2001 From: rito528 <39003544+rito528@users.noreply.github.com> Date: Fri, 14 Jun 2024 14:45:55 +0900 Subject: [PATCH] style: format all --- endpoints/forms.tsp | 453 +++++++++++++++++++++----------------------- endpoints/users.tsp | 9 +- main.tsp | 7 +- models/errors.tsp | 2 +- models/form.tsp | 14 +- models/user.tsp | 2 +- 6 files changed, 235 insertions(+), 252 deletions(-) diff --git a/endpoints/forms.tsp b/endpoints/forms.tsp index 0d3b7ac..f9fc0a2 100644 --- a/endpoints/forms.tsp +++ b/endpoints/forms.tsp @@ -12,155 +12,25 @@ using TypeSpec.Rest; @tag("Forms") @route("/forms") namespace Forms { - -/** - * フォームを新しく作ります。 - * - * 作られたフォームのIDがJSONとして返却され、作成されたフォームへのURLを含むHeaderが返されます。 - * - */ -@post -@summary("フォームの新規作成") -op create( - @header - contentType: "application/json", - @body body: { - title: string; - description?: string; - } -): { - @statusCode statusCode: 201; - @header Location: string; - @body body: { - id: uint32; - }; -} | { - @statusCode statusCode: 400 | 401 | 403 | 500; - @body body: Error; -}; - - -/** - * フォームの一覧を返す。 - * - * このエンドポイントでは最小限のフォーム情報を含むリストが返されます。 - * - * また、取得パラメータとしてlimitとoffsetを指定し、取得件数を絞り込むことができます。 - * レスポンス内容はid基準とし、昇順ソートしたものになります。 - * ※各フォームの詳細情報などは別APIを利用することを想定しています。 - */ -@get -@summary("フォームの一覧取得") -op list( - @doc("取得件数の下限値 例えば、offsetを1とすると2件目からのデータが取得できます。") - @query - offset: uint32, - @doc("取得件数の上限値 例えば、limitを10とすると10番目までのデータが取得できます。") - @minValue(1) - @query - limit: uint32 -): { - @statusCode statusCode: 200; - @body body: MinimalForm[]; -} | { - @statusCode statusCode: 400 | 401 | 500; - @body body: Error; -}; - -@route("/{formId}") -namespace IndividualForm { - - @get - @summary("フォームの詳細取得") - op get( - @path formId: uint32 - ): { - @statusCode statusCode: 200; - @body body: Form; - } | { - @statusCode statusCode: 400 | 401 | 403 | 404 | 500; - @body body: Error; - }; - - @delete - @summary("フォームの削除") - op delete( - @path formId: uint32 - ): { - @statusCode statusCode: 200; - } | { - @statusCode statusCode: 400 | 401 | 403 | 404 | 500; - @body body: Error; - }; - /** - * フォームの設定値を変更するエンドポイント。 - * 回答可能期間を新たに設定する場合、start_atとend_atの両方を指定してください。 + * フォームを新しく作ります。 + * + * 作られたフォームのIDがJSONとして返却され、作成されたフォームへのURLを含むHeaderが返されます。 + * */ - @patch - @summary("フォームの値を更新する") - op update( - @path formId: uint32, - @query title?: string, - @query description?: string, - @query start_at?: utcDateTime, - @query end_at?: utcDateTime, - @query webhook_url?: url, - /** - * 各回答に対して自動でつけられるタイトルを設定します。 - * `$[question_id]`と指定することで、`question_id`の質問の回答をタイトルに含めることができます。 - */ - @query default_answer_title?: string, - @query visibility?: Visibility, - ): { - @statusCode statusCode: 200; - @body body: Form; - } | { - @statusCode statusCode: 400 | 401 | 403 | 404 | 500; - @body body: Error; - }; - - @route("/questions") - @summary("フォームの質問一覧取得") - op listQuestions( - @path formId: uint32 - ): { - @statusCode statusCode: 200; - @body body: Question[]; - } | { - @statusCode statusCode: 400 | 401 | 404 | 500; - @body body: Error; - }; - - - @route("/answers") - @summary("フォームの回答一覧取得") - op listAnswers( - @path formId: uint32 - ): { - @statusCode statusCode: 200; - @body body: Answer[]; - } | { - @statusCode statusCode: 400 | 401 | 404 | 500; - @body body: Error; - }; - -} - -@route("/questions") -namespace Questions { - @post - @summary("質問の新規作成") + @summary("フォームの新規作成") op create( @header contentType: "application/json", + @body body: { - form_id: uint32; - questions: Question[]; - } + title: string; + description?: string; + }, ): { @statusCode statusCode: 201; + @header Location: string; @body body: { id: uint32; }; @@ -168,125 +38,134 @@ namespace Questions { @statusCode statusCode: 400 | 401 | 403 | 500; @body body: Error; }; - - @delete - @summary("質問の削除") - op delete( - @body body: { - question_id: uint32; - } - ): { - @statusCode statusCode: 200; - } | { - @statusCode statusCode: 400 | 401 | 403 | 404 | 500; - @body body: Error; - }; - - @put - @summary("質問の置き換え") - op replace( - @body body: { - form_id: uint32; - questions: Question[]; - } - ): { - @statusCode statusCode: 200; - } | { - @statusCode statusCode: 400 | 401 | 403 | 404 | 500; - @body body: Error; - }; - -} - -@route("/answers") -namespace Answers { + /** + * フォームの一覧を返す。 + * + * このエンドポイントでは最小限のフォーム情報を含むリストが返されます。 + * + * また、取得パラメータとしてlimitとoffsetを指定し、取得件数を絞り込むことができます。 + * レスポンス内容はid基準とし、昇順ソートしたものになります。 + * ※各フォームの詳細情報などは別APIを利用することを想定しています。 + */ @get - @summary("回答の一覧取得") - op list(): { + @summary("フォームの一覧取得") + op list( + @doc("取得件数の下限値 例えば、offsetを1とすると2件目からのデータが取得できます。") + @query + offset: uint32, + + @doc("取得件数の上限値 例えば、limitを10とすると10番目までのデータが取得できます。") + @minValue(1) + @query + limit: uint32, + ): { @statusCode statusCode: 200; - @body body: Answer[]; + @body body: MinimalForm[]; } | { - @statusCode statusCode: 400 | 401 | 403 | 500; + @statusCode statusCode: 400 | 401 | 500; @body body: Error; }; - @post - @summary("指定されたフォームに回答を追加する") - op create( - @header - contentType: "application/json", - @body body: { - form_id: uint32; - answers: RealAnswer[]; - } - ): { - @statusCode statusCode: 201; - @body body: { - id: uint32; + @route("/{formId}") + namespace IndividualForm { + @get + @summary("フォームの詳細取得") + op get(@path formId: uint32): { + @statusCode statusCode: 200; + @body body: Form; + } | { + @statusCode statusCode: 400 | 401 | 403 | 404 | 500; + @body body: Error; }; - } | { - @statusCode statusCode: 400 | 401 | 403 | 500; - @body body: Error; - }; - - @route("/labels") - namespace Labels { - - @post - @summary("フォームの回答につけられるラベルを作成する") - op createLabel( - @header - contentType: "application/json", - @body body: Label - ): { - @statusCode statusCode: 201; + @delete + @summary("フォームの削除") + op delete(@path formId: uint32): { + @statusCode statusCode: 200; } | { @statusCode statusCode: 400 | 401 | 403 | 404 | 500; @body body: Error; }; - @delete - @summary("フォームの回答につけられるラベルを削除する") - op deleteLabel( - @body body: { - id: uint32; - } + /** + * フォームの設定値を変更するエンドポイント。 + * 回答可能期間を新たに設定する場合、start_atとend_atの両方を指定してください。 + */ + @patch + @summary("フォームの値を更新する") + op update( + @path formId: uint32, + @query title?: string, + @query description?: string, + @query start_at?: utcDateTime, + @query end_at?: utcDateTime, + @query webhook_url?: url, + + /** + * 各回答に対して自動でつけられるタイトルを設定します。 + * `$[question_id]`と指定することで、`question_id`の質問の回答をタイトルに含めることができます。 + */ + @query default_answer_title?: string, + + @query visibility?: Visibility, ): { @statusCode statusCode: 200; + @body body: Form; } | { @statusCode statusCode: 400 | 401 | 403 | 404 | 500; @body body: Error; }; - } + @route("/questions") + @summary("フォームの質問一覧取得") + op listQuestions(@path formId: uint32): { + @statusCode statusCode: 200; + @body body: Question[]; + } | { + @statusCode statusCode: 400 | 401 | 404 | 500; + @body body: Error; + }; - @route("/comment") - namespace Comment { + @route("/answers") + @summary("フォームの回答一覧取得") + op listAnswers(@path formId: uint32): { + @statusCode statusCode: 200; + @body body: Answer[]; + } | { + @statusCode statusCode: 400 | 401 | 404 | 500; + @body body: Error; + }; + } + @route("/questions") + namespace Questions { @post - @summary("回答にコメントを追加する") + @summary("質問の新規作成") op create( @header contentType: "application/json", + @body body: { - answer_id: uint32; - content: string; - } + form_id: uint32; + questions: Question[]; + }, ): { @statusCode statusCode: 201; + @body body: { + id: uint32; + }; } | { - @statusCode statusCode: 400 | 401 | 403 | 404 | 500; + @statusCode statusCode: 400 | 401 | 403 | 500; @body body: Error; }; @delete - @summary("回答のコメントを削除する") + @summary("質問の削除") op delete( @body body: { - comment_id: uint32; - } + question_id: uint32; + }, ): { @statusCode statusCode: 200; } | { @@ -294,33 +173,140 @@ namespace Answers { @body body: Error; }; - @patch - @summary("回答のコメントを更新する") - op update( + @put + @summary("質問の置き換え") + op replace( @body body: { - comment_id: uint32; - content: string; - } + form_id: uint32; + questions: Question[]; + }, ): { @statusCode statusCode: 200; } | { @statusCode statusCode: 400 | 401 | 403 | 404 | 500; @body body: Error; }; - } + @route("/answers") + namespace Answers { + @get + @summary("回答の一覧取得") + op list(): { + @statusCode statusCode: 200; + @body body: Answer[]; + } | { + @statusCode statusCode: 400 | 401 | 403 | 500; + @body body: Error; + }; + + @post + @summary("指定されたフォームに回答を追加する") + op create( + @header + contentType: "application/json", + + @body body: { + form_id: uint32; + answers: RealAnswer[]; + }, + ): { + @statusCode statusCode: 201; + @body body: { + id: uint32; + }; + } | { + @statusCode statusCode: 400 | 401 | 403 | 500; + @body body: Error; + }; + + @route("/labels") + namespace Labels { + @post + @summary("フォームの回答につけられるラベルを作成する") + op createLabel( + @header + contentType: "application/json", + + @body body: Label, + ): { + @statusCode statusCode: 201; + } | { + @statusCode statusCode: 400 | 401 | 403 | 404 | 500; + @body body: Error; + }; + + @delete + @summary("フォームの回答につけられるラベルを削除する") + op deleteLabel( + @body body: { + id: uint32; + }, + ): { + @statusCode statusCode: 200; + } | { + @statusCode statusCode: 400 | 401 | 403 | 404 | 500; + @body body: Error; + }; + } + + @route("/comment") + namespace Comment { + @post + @summary("回答にコメントを追加する") + op create( + @header + contentType: "application/json", + + @body body: { + answer_id: uint32; + content: string; + }, + ): { + @statusCode statusCode: 201; + } | { + @statusCode statusCode: 400 | 401 | 403 | 404 | 500; + @body body: Error; + }; + + @delete + @summary("回答のコメントを削除する") + op delete( + @body body: { + comment_id: uint32; + }, + ): { + @statusCode statusCode: 200; + } | { + @statusCode statusCode: 400 | 401 | 403 | 404 | 500; + @body body: Error; + }; + + @patch + @summary("回答のコメントを更新する") + op update( + @body body: { + comment_id: uint32; + content: string; + }, + ): { + @statusCode statusCode: 200; + } | { + @statusCode statusCode: 400 | 401 | 403 | 404 | 500; + @body body: Error; + }; + } } @route("/labels") namespace Labels { - @post @summary("フォームにつけられるラベルを作成する") op create( @header contentType: "application/json", - @body body: Label + + @body body: Label, ): { @statusCode statusCode: 201; } | { @@ -333,15 +319,12 @@ namespace Answers { op delete( @body body: { id: uint32; - } + }, ): { @statusCode statusCode: 200; } | { @statusCode statusCode: 400 | 401 | 403 | 404 | 500; @body body: Error; }; - } } - - diff --git a/endpoints/users.tsp b/endpoints/users.tsp index 8c52626..80fd4e7 100644 --- a/endpoints/users.tsp +++ b/endpoints/users.tsp @@ -20,20 +20,17 @@ namespace Users { @statusCode statusCode: 400 | 401 | 403 | 500; @body body: Error; }; - + @patch @summary("ユーザー情報を更新する") @route("/{uuid}") - op update( - @path uuid: string; - @query role: Role; - ): { + op update(@path uuid: string, @query role: Role): { @statusCode statusCode: 200; } | { @statusCode statusCode: 400 | 401 | 403 | 404 | 500; @body body: Error; }; - + @get @summary("ユーザー一覧の取得") @route("/list") diff --git a/main.tsp b/main.tsp index 500e71e..35cb9d5 100644 --- a/main.tsp +++ b/main.tsp @@ -7,15 +7,14 @@ using TypeSpec.Rest; using TypeSpec.OpenAPI; @service({ - title: "seichi-portal-api-schema" + title: "seichi-portal-api-schema", }) @server("http://localhost:9000", "開発環境") @useAuth(BearerAuth) @info({ license: { name: "Apache 2.0", - url: "http://www.apache.org/licenses/LICENSE-2.0.html" - } + url: "http://www.apache.org/licenses/LICENSE-2.0.html", + }, }) namespace SeichiPortalApiSchema; - diff --git a/models/errors.tsp b/models/errors.tsp index e89027c..cb0a6ec 100644 --- a/models/errors.tsp +++ b/models/errors.tsp @@ -2,7 +2,7 @@ enum ErrorCode { FORM_NOT_FOUND, OUT_OF_PERIOD, DO_NOT_HAVE_PERMISSION_TO_POST_FORM_COMMENT, - INTERNAL_SERVER_ERROR + INTERNAL_SERVER_ERROR, } model Error { diff --git a/models/form.tsp b/models/form.tsp index f1453f3..1ac5cdb 100644 --- a/models/form.tsp +++ b/models/form.tsp @@ -5,7 +5,7 @@ model ResponsePeriod { /** * 必要最低限の情報を含むフォーム - * + * * 設定権限を持たないユーザーが必要な情報を取得するために使用することを想定 */ model MinimalForm { @@ -21,7 +21,7 @@ model MinimalForm { */ enum Visibility { PUBLIC: "PUBLIC", - PRIVATE: "PRIVATE" + PRIVATE: "PRIVATE", } /** @@ -32,7 +32,7 @@ enum Visibility { enum QuestionType { TEXT: "TEXT", SINGLE: "SINGLE", - MULTIPLE: "MULTIPLE" + MULTIPLE: "MULTIPLE", } model Question { @@ -50,10 +50,12 @@ model Form { description?: string; settings: { response_period: ResponsePeriod; + /** - * フォームに関する何らかのアクションが行われたときに通知を行うURL + * フォームに関する何らかのアクションが行われたときに通知を行うURL */ webhook_url: url; + default_title: string; visibility: Visibility; }; @@ -61,12 +63,13 @@ model Form { created_at: utcDateTime; updated_at: utcDateTime; }; - questions: Question[] + questions: Question[]; } model RealAnswer { @visibility("read") question_id: uint32; + answer: string; } @@ -79,5 +82,6 @@ model Answer { model Label { @visibility("read") id: uint32; + name: string; } diff --git a/models/user.tsp b/models/user.tsp index 9bca960..3293047 100644 --- a/models/user.tsp +++ b/models/user.tsp @@ -6,5 +6,5 @@ enum Role { model User { uuid: string; name: string; - role: Role + role: Role; }