diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 62ee32d..636d491 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -25,8 +25,8 @@ jobs: - name: install dependencies run: pnpm install - name: check formatting - run: pnpm lint:prettier + run: pnpm check:format - name: build run: pnpm build:tsp - name: lint openapi - run: pnpm lint:redocly + run: pnpm check:lint diff --git a/.prettierignore b/.prettierignore deleted file mode 100644 index 69c00d3..0000000 --- a/.prettierignore +++ /dev/null @@ -1,7 +0,0 @@ -# depenencies -node_modules/ - -# auto-generated -pnpm-lock.yaml -dist/ -tsp-output/ \ No newline at end of file diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000..087accf --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://json.schemastore.org/prettierrc", + + "printWidth": 100, + "tabWidth": 2, + "useTabs": false, + "trailingComma": "es5", + "semi": false, + "singleQuote": false, + + "plugins": ["@typespec/prettier-plugin-typespec"], + "overrides": [ + { + "files": "*.tsp", + "options": { "parser": "typespec" } + } + ] +} diff --git a/.prettierrc.mjs b/.prettierrc.mjs deleted file mode 100644 index bd6e374..0000000 --- a/.prettierrc.mjs +++ /dev/null @@ -1,13 +0,0 @@ -/** @type {import("prettier").Config} */ -const prettierConfig = { - printWidth: 100, - tabWidth: 2, - useTabs: false, - trailingComma: "es5", - semi: false, - singleQuote: false, - plugins: ["@typespec/prettier-plugin-typespec"], - overrides: [{ files: "*.tsp", options: { parser: "typespec" } }], -} - -export default prettierConfig diff --git a/README.md b/README.md index a9478ea..217fe1d 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,12 @@ # ODPT OpenAPI +OpenAPI specification of ODPT API + +## About ODPT API + +- [Official Document](https://developer.odpt.org/documents) +- [Datasets](https://ckan.odpt.org/dataset) + ## Development ### Requirements @@ -15,16 +22,23 @@ pnpm i ``` -2. Start Typespec watcher and documentation server from openapi +2. (Optional) Install VSCode Extension -selectedAPIName is the name of `openapi.${selectedAPIName}.yaml` +```bash +pnpm tsp code install +``` + +3. Start TypeSpec watcher and Document server ```bash -NAME=${selectedAPIName} pnpm dev +pnpm dev ``` +Document page will be available at [`http://127.0.0.1:8080`](http://127.0.0.1:8080) + ### Scripts -- `pnpm dev` - 2. Start Typespec watcher and documentation server from openapi -- `pnpm build` - Build the tsp files -- `pnpm lint` - Lint the tsp files and openapi files +- `pnpm dev`: Run TypeSpec watcher and Document Server +- `pnpm build`: Compile TypeSpec and Build document page +- `pnpm check`: Check TypeSpec format and OpenAPI lint +- `pnpm fix`: Fix TypeSpec format diff --git a/package.json b/package.json index 11369d4..3f076cd 100644 --- a/package.json +++ b/package.json @@ -1,19 +1,20 @@ { "name": "odpt-openapi", - "version": "0.1.0", + "version": "1.0.1", "type": "module", "scripts": { - "dev": "pnpm dev:tsp & pnpm dev:docs", - "dev:tsp": "pnpm build:tsp --watch", - "dev:docs": "redocly preview-docs ./dist/@typespec/openapi3/openapi.$NAME.yaml", - "build": "pnpm build:tsp && pnpm build:docs", - "build:tsp": "tsp compile ./src --output-dir ./dist", - "build:docs": "redocly build-docs -o ./dist/doc/index.html", - "lint": "pnpm /^lint:.*/", - "lint:prettier": "pnpm run:prettier . --check", - "lint:redocly": "redocly lint ./dist/@typespec/openapi3/openapi.*.yaml", - "typecheck": "pnpm build:tsp --noEmit", - "run:prettier": "prettier --ignore-unknown --no-error-on-unmatched-pattern --cache" + "dev": "pnpm /^watch:.*/", + "watch:tsp": "tsp compile ./src/ --watch", + "watch:redocly": "redocly preview-docs", + "build": "pnpm build:tsp && pnpm build:redocly", + "build:tsp": "tsp compile ./src/", + "build:redocly": "redocly build-docs -o './dist/docs/index.html'", + "prebuild": "pnpx rimraf ./dist", + "check": "pnpm /^check:.*/", + "check:format": "prettier -c ./src/", + "check:lint": "redocly lint", + "fix": "pnpm /^fix:.*/", + "fix:format": "prettier -w ./src/" }, "peerDependencies": { "@typespec/compiler": "0.61.0", @@ -25,10 +26,10 @@ "@redocly/cli": "^1.25.8", "@typespec/compiler": "0.61.0", "@typespec/http": "0.61.0", + "@typespec/openapi": "0.61.0", "@typespec/openapi3": "0.61.0", "@typespec/prettier-plugin-typespec": "^0.61.0", "@typespec/rest": "0.61.0", "prettier": "^3.3.3" - }, - "private": true + } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6f67a2b..e22a9a7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,6 +17,9 @@ importers: '@typespec/http': specifier: 0.61.0 version: 0.61.0(@typespec/compiler@0.61.0) + '@typespec/openapi': + specifier: 0.61.0 + version: 0.61.0(@typespec/compiler@0.61.0)(@typespec/http@0.61.0(@typespec/compiler@0.61.0)) '@typespec/openapi3': specifier: 0.61.0 version: 0.61.0(@typespec/compiler@0.61.0)(@typespec/http@0.61.0(@typespec/compiler@0.61.0))(@typespec/openapi@0.61.0(@typespec/compiler@0.61.0)(@typespec/http@0.61.0(@typespec/compiler@0.61.0)))(@typespec/versioning@0.61.0(@typespec/compiler@0.61.0))(openapi-types@12.1.3) @@ -39,10 +42,6 @@ packages: resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} engines: {node: '>=6.9.0'} - '@babel/code-frame@7.25.7': - resolution: {integrity: sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==} - engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.25.7': resolution: {integrity: sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==} engines: {node: '>=6.9.0'} @@ -1373,11 +1372,6 @@ snapshots: '@babel/highlight': 7.25.7 picocolors: 1.1.1 - '@babel/code-frame@7.25.7': - dependencies: - '@babel/highlight': 7.25.7 - picocolors: 1.1.1 - '@babel/helper-validator-identifier@7.25.7': {} '@babel/highlight@7.25.7': @@ -1430,7 +1424,7 @@ snapshots: '@readme/better-ajv-errors@1.6.0(ajv@8.17.1)': dependencies: - '@babel/code-frame': 7.25.7 + '@babel/code-frame': 7.24.7 '@babel/runtime': 7.25.7 '@humanwhocodes/momoa': 2.0.4 ajv: 8.17.1 diff --git a/redocly.yaml b/redocly.yaml new file mode 100644 index 0000000..d507c5c --- /dev/null +++ b/redocly.yaml @@ -0,0 +1,6 @@ +extends: + - recommended + +apis: + odpt@v4: + root: ./dist/openapi/openapi.yaml diff --git a/src/common/class.tsp b/src/common/class.tsp index ca6e525..3cee2f0 100644 --- a/src/common/class.tsp +++ b/src/common/class.tsp @@ -1,14 +1,8 @@ -import "@typespec/http"; - -import "./error.tsp"; - -using TypeSpec.Http; - @doc("アクセストークン") scalar ConsumerKey extends string; @doc("固有識別子") -scalar URN extends string; +scalar `odpt.urn` extends string; @doc("固有識別子の別名 多くが`odpt.hoge:fuga`形式") scalar `odpt.url` extends string; @@ -39,7 +33,7 @@ model Calendar { `@context`: url; @doc("固有識別子(ucode)") - `@id`: URN; + `@id`: `odpt.urn`; @doc("クラス指定") `@type`: "odpt:Calendar"; @@ -50,10 +44,10 @@ model Calendar { @doc("固有識別子") `owl:sameAs`: url; - @doc("カレンダー名称(日本語)") + @doc("カレンダー名称(日本語)") `dc:title`?: string; - @doc("カレンダー名称(多言語対応)") + @doc("カレンダー名称(多言語対応)") `odpt:calendarTitle`?: MultilingualTitle; } @@ -64,7 +58,7 @@ model Operator { `@context`: url; @doc("固有識別子(ucode)") - `@id`: URN; + `@id`: `odpt.urn`; @doc("クラス指定") `@type`: "odpt:Operator"; @@ -75,31 +69,9 @@ model Operator { @doc("固有識別子") `owl:sameAs`: url; - @doc("事業者名称(日本語)") + @doc("事業者名称(日本語)") `dc:title`?: string; - @doc("事業者名称(多言語対応)") + @doc("事業者名称(多言語対応)") `odpt:operatorTitle`?: MultilingualTitle; } - -@route("/api/v4/odpt/Calendar") -interface CalendarOperations { - @doc("曜日・日付区分(odpt:Calendar)の内容を取得する") - @get - getCalendars( - @query @doc("開発者サイトにて提供されるアクセストークン") `acl:consumerKey`: ConsumerKey, - @query @doc("データに付与された固有識別子") `@id`?: URN, - @query @doc("データに付与された固有識別子の別名") `owl:sameAs`?: url, - ): Calendar[] | Common.Error; -} - -@route("/api/v4/odpt/Operator") -interface OperatorOperations { - @doc("公共交通機関の事業者(odpt:Operator)の内容を取得する") - @get - getOperators( - @query @doc("開発者サイトにて提供されるアクセストークン") `acl:consumerKey`: ConsumerKey, - @query @doc("データに付与された固有識別子") `@id`?: URN, - @query @doc("データに付与された固有識別子の別名") `owl:sameAs`?: url, - ): Operator[] | Common.Error; -} diff --git a/src/file/index.tsp b/src/file/index.tsp deleted file mode 100644 index eea37d4..0000000 --- a/src/file/index.tsp +++ /dev/null @@ -1,31 +0,0 @@ -import "@typespec/http"; -import "@typespec/rest"; -import "../common/class.tsp"; -import "../common/error.tsp"; - -@service({ - title: "ODPT File API", -}) -@server("https://api.odpt.org/api/v4", "API サーバー") -@doc("配布されるファイルを取得するためのAPI") -@useAuth(ApiKeyAuth) -namespace FileAPI; - -using TypeSpec.Http; -using TypeSpec.Rest; - -@doc("ファイルリンクへのリダイレクト") -model FileRedirect { - @statusCode _: 302; -} - -@doc("各社提供ファイル取得用API") -@route("/files/{filePath}") -interface FilesOperations { - @summary("ファイルを取得する") - @get - getFiles( - @query @doc("開発者サイトにて提供されるアクセストークン") `acl:consumerKey`: ConsumerKey, - @path @doc("ファイルパス") filePath: string, - ): FileRedirect | Common.Error; -} diff --git a/src/main.tsp b/src/main.tsp index be59df6..bf264cb 100644 --- a/src/main.tsp +++ b/src/main.tsp @@ -1,12 +1,23 @@ import "@typespec/http"; -import "@typespec/rest"; -import "@typespec/openapi3"; +import "@typespec/openapi"; +import "./routes/index.tsp"; -import "./common/error.tsp"; -import "./common/class.tsp"; +using TypeSpec.Http; +using TypeSpec.OpenAPI; -import "./search/index.tsp"; -import "./airplane/index.tsp"; -import "./train/index.tsp"; -import "./bus/index.tsp"; -import "./file/index.tsp"; +@service({ + title: "ODPT API", +}) +@server("https://api.odpt.org/api/v4", "公共交通のオープンデータ API") +@server( + "https://api-challenge2024.odpt.org/api/v4", + "公共交通のオープンデータ API (チャレンジ2024専用)" +) +@info({ + license: { + name: "公共交通オープンデータ基本ライセンス, 公共交通オープンデータチャレンジ限定ライセンス", + url: "https://developer.odpt.org/terms", + }, +}) +@useAuth(ApiKeyAuth) +namespace OdptAPI; diff --git a/src/airplane/index.tsp b/src/models/airplane.tsp similarity index 55% rename from src/airplane/index.tsp rename to src/models/airplane.tsp index c851f8a..64fba0d 100644 --- a/src/airplane/index.tsp +++ b/src/models/airplane.tsp @@ -1,18 +1,4 @@ -import "@typespec/http"; -import "@typespec/rest"; import "../common/class.tsp"; -import "../common/error.tsp"; - -@service({ - title: "ODPT Airplane API", -}) -@server("https://api.odpt.org/api/v4", "API サーバー") -@doc("航空機に関連するデータを提供するAPI") -@useAuth(ApiKeyAuth) -namespace AirplaneAPI; - -using TypeSpec.Http; -using TypeSpec.Rest; @doc("空港の情報") model Airport { @@ -20,7 +6,7 @@ model Airport { `@context`: url; @doc("固有識別子(ucode)") - `@id`: URN; + `@id`: `odpt.urn`; @doc("クラス名") `@type`: "odpt:Airport"; @@ -31,10 +17,10 @@ model Airport { @doc("固有識別子") `owl:sameAs`: `odpt.url`; - @doc("空港名(日本語)") + @doc("空港名(日本語)") `dc:title`?: string; - @doc("空港名(多言語対応)") + @doc("空港名(多言語対応)") `odpt:airportTitle`?: MultilingualTitle; @doc("空港のターミナルを表す ID のリスト") @@ -56,7 +42,7 @@ model AirportTerminal { `@context`: url; @doc("固有識別子(ucode)") - `@id`: URN; + `@id`: `odpt.urn`; @doc("クラス名") `@type`: "odpt:AirportTerminal"; @@ -67,10 +53,10 @@ model AirportTerminal { @doc("固有識別子") `owl:sameAs`: `odpt.url`; - @doc("空港ターミナル名(日本語)") + @doc("空港ターミナル名(日本語)") `dc:title`?: string; - @doc("空港ターミナル名(多言語対応)") + @doc("空港ターミナル名(多言語対応)") `odpt:airportTerminalTitle`?: MultilingualTitle; @doc("空港を示すID") @@ -92,7 +78,7 @@ model FlightInformationArrival { `@context`: url; @doc("固有識別子(ucode又はuuid)") - `@id`: URN; + `@id`: `odpt.urn`; @doc("クラス指定") `@type`: "odpt:FlightInformationArrival"; @@ -118,10 +104,10 @@ model FlightInformationArrival { @doc("フライト状況を表すID") `odpt:flightStatus`?: url; - @doc("運行情報の要約(多言語対応)") + @doc("運行情報の要約(多言語対応)") `odpt:flightInformationSummary`?: MultilingualTitle; - @doc("運行情報の詳細(多言語対応)") + @doc("運行情報の詳細(多言語対応)") `odpt:flightInformationText`?: MultilingualTitle; @doc("定刻の到着時刻") @@ -161,7 +147,7 @@ model FlightInformationDeparture { `@context`: url; @doc("固有識別子(ucode又はuuid)") - `@id`: URN; + `@id`: `odpt.urn`; @doc("クラス指定") `@type`: "odpt:FlightInformationDeparture"; @@ -187,10 +173,10 @@ model FlightInformationDeparture { @doc("フライト状況を表すID") `odpt:flightStatus`?: url; - @doc("運行情報の要約(多言語対応)") + @doc("運行情報の要約(多言語対応)") `odpt:flightInformationSummary`?: MultilingualTitle; - @doc("運行情報の詳細(多言語対応)") + @doc("運行情報の詳細(多言語対応)") `odpt:flightInformationText`?: MultilingualTitle; @doc("定刻の出発時刻") @@ -256,7 +242,7 @@ model FlightScheduleObject { @doc("データ適用終了日時") `odpt:isValidTo`?: DateTime; - @doc("注釈情報(多言語対応)") + @doc("注釈情報(多言語対応)") `odpt:note`?: MultilingualTitle; } @@ -266,7 +252,7 @@ model FlightSchedule { `@context`: url; @doc("固有識別子(ucode)") - `@id`: URN; + `@id`: `odpt.urn`; @doc("クラス指定") `@type`: "odpt:FlightSchedule"; @@ -299,7 +285,7 @@ model FlightStatus { `@context`: url; @doc("固有識別子(ucode)") - `@id`: URN; + `@id`: `odpt.urn`; @doc("クラス名") `@type`: "odpt:FlightStatus"; @@ -310,91 +296,9 @@ model FlightStatus { @doc("固有識別子") `owl:sameAs`: `odpt.url`; - @doc("フライト状況(日本語)") + @doc("フライト状況(日本語)") `dc:title`?: string; - @doc("フライト状況(多言語対応)") + @doc("フライト状況(多言語対応)") `odpt:flightStatusTitle`?: MultilingualTitle; } -@route("/odpt:Airport") -interface AirportOperations { - @summary("空港情報の取得") - @get - getAirports( - @query @doc("開発者サイトにて提供されるアクセストークン") `acl:consumerKey`: ConsumerKey, - @query @doc("データに付与された固有識別子") `@id`?: URN, - @query @doc("データに付与された固有識別子の別名") `owl:sameAs`?: `odpt.url`, - ): Airport[] | Common.Error; -} - -@route("/odpt:AirportTerminal") -interface AirportTerminalOperations { - @summary("空港ターミナル情報の取得") - @get - getAirportTerminals( - @query @doc("開発者サイトにて提供されるアクセストークン") `acl:consumerKey`: ConsumerKey, - @query @doc("データに付与された固有識別子") `@id`?: URN, - @query @doc("データに付与された固有識別子の別名") `owl:sameAs`?: `odpt.url`, - @query @doc("空港を示すID") `odpt:airport`?: url, - ): AirportTerminal[] | Common.Error; -} - -@route("/odpt:FlightInformationArrival") -interface FlightInformationArrivalOperations { - @summary("フライト到着情報の取得") - @get - getFlightInformationArrivals( - @query @doc("開発者サイトにて提供されるアクセストークン") `acl:consumerKey`: ConsumerKey, - @query @doc("データに付与された固有識別子の別名") `owl:sameAs`?: `odpt.url`, - @query @doc("空港事業者または航空事業者を示すID") `odpt:operator`?: url, - @query @doc("エアラインの運行会社を示すID") `odpt:airline`?: url, - @query @doc("フライト状況を示すID") `odpt:flightStatus`?: url, - @query @doc("到着空港を示すID") `odpt:arrivalAirport`?: url, - @query @doc("到着空港ターミナルを示すID") `odpt:arrivalAirportTerminal`?: url, - @query @doc("到着空港ゲート番号") `odpt:arrivalGate`?: string, - @query @doc("出発地の空港を示すID") `odpt:originAirport`?: url, - ): FlightInformationArrival[] | Common.Error; -} - -@route("/odpt:FlightInformationDeparture") -interface FlightInformationDepartureOperations { - @summary("フライト出発情報の取得") - @get - getFlightInformationDepartures( - @query @doc("開発者サイトにて提供されるアクセストークン") `acl:consumerKey`: ConsumerKey, - @query @doc("データに付与された固有識別子の別名") `owl:sameAs`?: `odpt.url`, - @query @doc("空港事業者または航空事業者を示すID") `odpt:operator`?: url, - @query @doc("エアラインの運行会社を示すID") `odpt:airline`?: url, - @query @doc("フライト状況を示すID") `odpt:flightStatus`?: url, - @query @doc("出発空港を示すID") `odpt:departureAirport`?: url, - @query @doc("出発空港ターミナルを示すID") `odpt:departureAirportTerminal`?: url, - @query @doc("出発空港ゲート番号") `odpt:departureGate`?: string, - @query @doc("目的地の空港を示すID") `odpt:destinationAirport`?: url, - ): FlightInformationDeparture[] | Common.Error; -} - -@route("/odpt:FlightSchedule") -interface FlightScheduleOperations { - @summary("フライト時刻表の取得") - @get - getFlightSchedules( - @query @doc("開発者サイトにて提供されるアクセストークン") `acl:consumerKey`: ConsumerKey, - @query @doc("データに付与された固有識別子") `@id`?: URN, - @query @doc("データに付与された固有識別子の別名") `owl:sameAs`?: `odpt.url`, - @query @doc("空港事業者または航空事業者を示すID") `odpt:operator`?: url, - @query @doc("運行日を示すID") `odpt:calendar`?: url, - @query @doc("出発地の空港を示すID") `odpt:originAirport`?: url, - @query @doc("目的地の空港を示すID") `odpt:destinationAirport`?: url, - ): FlightSchedule[] | Common.Error; -} - -@route("/odpt:FlightStatus") -interface FlightStatusOperations { - @summary("フライト状況定義の取得") - @get - getFlightStatuses( - @query @doc("開発者サイトにて提供されるアクセストークン") `acl:consumerKey`: ConsumerKey, - @query @doc("データに付与された固有識別子") `@id`?: URN, - @query @doc("データに付与された固有識別子の別名") `owl:sameAs`?: `odpt.url`, - ): FlightStatus[] | Common.Error; -} diff --git a/src/bus/index.tsp b/src/models/bus.tsp similarity index 77% rename from src/bus/index.tsp rename to src/models/bus.tsp index 73eecc9..30caaff 100644 --- a/src/bus/index.tsp +++ b/src/models/bus.tsp @@ -1,18 +1,4 @@ -import "@typespec/http"; -import "@typespec/rest"; import "../common/class.tsp"; -import "../common/error.tsp"; - -@service({ - title: "ODPT Bus API", -}) -@server("https://api.odpt.org/api/v4", "API サーバー") -@doc("バスに関連するデータを提供するAPI") -@useAuth(ApiKeyAuth) -namespace BusAPI; - -using TypeSpec.Http; -using TypeSpec.Rest; enum BusDoorStatus { @doc("開いている") @@ -62,7 +48,7 @@ model Bus { @doc("固有識別子") @example("urn:ucode:_00001C00000000000001000003533B23") - `@id`: URN; + `@id`: `odpt.urn`; @doc("バス運行情報のクラス名") @example("odpt:Bus") @@ -157,7 +143,7 @@ model BusTimetable { @doc("固有識別子(ucode)") @example("urn:ucode:_00001C00000000000001000003A69FCCz") - `@id`: URN; + `@id`: `odpt.urn`; @doc("バス時刻表のクラス名、\"odpt:BusTimetable\"が入る") @example("odpt:BusTimetable") @@ -271,7 +257,7 @@ model BusroutePattern { @doc("固有識別子 (ucode)") @example("urn:ucode:_00001C0000000000000100000387F25A") - `@id`: URN; + `@id`: `odpt.urn`; @doc("バス路線情報のクラス名、\"odpt:BusroutePattern\"が入る") @example("odpt:BusroutePattern") @@ -374,7 +360,7 @@ model BusroutePatternFare { @doc("固有識別子(ucode)") @example("urn:ucode:_00001C00000000000001000003A7A364") - `@id`: URN; + `@id`: `odpt.urn`; @doc("バス運賃のクラス名、\"odpt:BusroutePatternFare\"が入る") @example("odpt:BusroutePatternFare") @@ -449,7 +435,7 @@ model BusstopPole { @doc("固有識別子(ucode)") @example("urn:ucode:_00001C0000000000000100000315AB88") - `@id`: URN; + `@id`: `odpt.urn`; @doc("バス停 (標柱) のクラス名、\"odpt:BusstopPole\"が入る") @example("odpt:BusstopPole") @@ -521,7 +507,7 @@ model BusstopPoleTimetable { @doc("固有識別子(ucode)") @example("urn:ucode:_00001C00000000000001000003A67D78") - `@id`: URN; + `@id`: `odpt.urn`; @doc("バス停(標柱)時刻表のクラス名、\"odpt:BusstopPoleTimetable\"が入る") @example("odpt:BusstopPoleTimetable") @@ -633,233 +619,3 @@ model BusstopPoleTimetableObject { @example("南大沢駅行") `odpt:note`?: string; } - -@route("/odpt:Bus") -interface BusOperation { - @summary("バス車両の運行情報") - @get - getBuses( - @query - @doc("開発者サイトにて提供されるアクセストークン") - `acl:consumerKey`: ConsumerKey, - - @query - @doc("データに付与された固有識別子") - `@id`?: URN, - - @query - @doc("データに付与された固有識別子の別名") - `owl:sameAs`?: `odpt.url`, - - @query - @doc("バス車両の運行系統のID") - `odpt:busroutePattern`?: `odpt.url`, - - @query - @doc("事業者のID") - `odpt:operator`?: `odpt.url`, - - @query - @doc("直近に通過した、あるいは停車中のバス停のID") - `odpt:fromBusstopPole`?: `odpt.url`, - - @query - @doc("次に到着するバス停のID") - `odpt:toBusstopPole`?: `odpt.url`, - ): Bus[] | Common.Error; -} - -@route("/odpt:BusTimetable") -interface BusTimetableOperations { - @summary("バスの便の時刻表") - @get - getBusTimetables( - @query - @doc("開発者サイトにて提供されるアクセストークン") - `acl:consumerKey`: ConsumerKey, - - @query - @doc("データに付与された固有識別子") - `@id`?: URN, - - @query - @doc("データに付与された固有識別子の別名") - `owl:sameAs`?: `odpt.url`, - - @query - @doc("事業者のID") - `odpt:operator`: `odpt.url`, - - @query - @doc("対応する系統のID") - `odpt:busroutePattern`?: `odpt.url`, - - @query - @doc("バス路線名称") - `dc:title`?: string, - - @query - @doc("カレンダーのID") - `odpt:calendar`?: `odpt.url`, - ): BusTimetable[] | Common.Error; -} - -@route("/odpt:BusroutePattern") -interface BusroutePatternOperations { - @summary("運行系統情報") - @get - getBusroutePatterns( - @query - @doc("開発者サイトにて提供されるアクセストークン") - `acl:consumerKey`: ConsumerKey, - - @query - @doc("データに付与された固有識別子") - `@id`?: URN, - - @query - @doc("データに付与された固有識別子の別名") - `owl:sameAs`?: `odpt.url`, - - @query - @doc("路線・系統名称") - `dc:title`?: string, - - @query - @doc("事業者のID") - `odpt:operator`?: `odpt.url`, - - @query - @doc("路線のID") - `odpt:busroute`?: string, - ): BusroutePattern[] | Common.Error; -} - -@route("/odpt:BusroutePatternFare") -interface BusroutePatternFareOperations { - @summary("運賃情報") - @get - getBusroutePatternFares( - @query - @doc("開発者サイトにて提供されるアクセストークン") - `acl:consumerKey`: ConsumerKey, - - @query - @doc("データに付与された固有識別子") - `@id`?: URN, - - @query - @doc("データに付与された固有識別子の別名") - `owl:sameAs`?: `odpt.url`, - - @query - @doc("事業者のID") - `odpt:operator`?: `odpt.url`, - - @query - @doc("乗車バス停(標柱)のID") - `odpt:fromBusstopPole`?: `odpt.url`, - - @query - @doc("降車バス停(標柱)のID") - `odpt:toBusstopPole`?: `odpt.url`, - - @query - @doc("切符利用時の運賃") - `odpt:ticketFare`?: integer, - - @query - @doc("切符利用時の子供運賃") - `odpt:childTicketFare`?: integer, - - @query - @doc("ICカード利用時の運賃") - `odpt:icCardFare`?: integer, - - @query - @doc("ICカード利用時の子供運賃") - `odpt:childIcCardFare`?: integer, - ): BusroutePatternFare[] | Common.Error; -} - -@route("/odpt:BusstopPole") -interface BusstopPoleOperations { - @summary("バス停情報") - @get - getBusstopPoles( - @query - @doc("開発者サイトにて提供されるアクセストークン") - `acl:consumerKey`: ConsumerKey, - - @query - @doc("データに付与された固有識別子") - `@id`?: URN, - - @query - @doc("データに付与された固有識別子の別名") - `owl:sameAs`?: `odpt.url`, - - @query - @doc("バス停名") - `dc:title`?: string, - - @query - @doc("標柱番号") - `odpt:busstopPoleNumber`?: string, - - @query - @doc("のりば番号") - `odpt:platformNumber`?: string, - - @query - @doc("標柱で発着する系統のID") - `odpt:busroutePattern`?: `odpt.url`, - - @query - @doc("事業者のID") - `odpt:operator`?: `odpt.url`, - ): BusstopPole[] | Common.Error; -} - -@route("/odpt:BusstopPoleTimetable") -interface BusstopPoleTimetableOperations { - @summary("バス停(標柱)時刻表") - @get - getBusstopPoleTimetables( - @query - @doc("開発者サイトにて提供されるアクセストークン") - `acl:consumerKey`: ConsumerKey, - - @query - @doc("データに付与された固有識別子") - `@id`?: URN, - - @query - @doc("データに付与された固有識別子の別名") - `owl:sameAs`?: `odpt.url`, - - @query - @doc("バス停(標柱)のID") - `odpt:busstopPole`?: `odpt.url`, - - @query - @doc("方面のID") - `odpt:busDirection`?: string, - - @query - @doc("路線のID") - `odpt:busroute`?: string, - - @query - @doc("事業者のID") - `odpt:operator`?: `odpt.url`, - - @query - @doc("カレンダーのID") - `odpt:calendar`?: `odpt.url`, - - @query - @doc("データ生成日付") - `dc:date`?: DateTime, - ): BusstopPoleTimetable[] | Common.Error; -} diff --git a/src/models/file.tsp b/src/models/file.tsp new file mode 100644 index 0000000..c9a8830 --- /dev/null +++ b/src/models/file.tsp @@ -0,0 +1,8 @@ +import "../common/class.tsp"; + +using TypeSpec.Http; + +@doc("ファイルリンクへのリダイレクト") +model FileRedirect { + @statusCode _: 302; +} diff --git a/src/search/index.tsp b/src/models/search.tsp similarity index 78% rename from src/search/index.tsp rename to src/models/search.tsp index 4c8924e..54a2a14 100644 --- a/src/search/index.tsp +++ b/src/models/search.tsp @@ -1,18 +1,4 @@ -import "@typespec/http"; -import "@typespec/rest"; import "../common/class.tsp"; -import "../common/error.tsp"; - -@service({ - title: "ODPT Search API", -}) -@server("https://api.odpt.org/api/v4", "API サーバー") -@doc("ODPTの各種データ検索のためのAPI") -@useAuth(ApiKeyAuth) -namespace SearchAPI; - -using TypeSpec.Http; -using TypeSpec.Rest; @doc("データ検索APIのレスポンス") model DataSearchResponse { @@ -22,7 +8,7 @@ model DataSearchResponse { @doc("固有識別子(ucode)") @example("urn:ucode:_00001C000000000000010000030FD5D6") - `@id`: URN; + `@id`: `odpt.urn`; @doc("クラス名") @example("odpt:Train") @@ -93,13 +79,13 @@ model DumpResponse { @doc("固有識別子(ucode)") @example("urn:ucode:_00001C000000000000010000031028E6") - `@id`: URN; + `@id`: `odpt.urn`; @doc("クラス名") @example("odpt:Station") `@type`: string; - @doc("駅名(日本語)") + @doc("駅名(日本語)") @example("東京") `dc:title`: string; @@ -116,7 +102,7 @@ model RetrieveResponse { @doc("固有識別子(ucode)") @example("urn:ucode:_00001C000000000000010000030C46CA") - `@id`: URN; + `@id`: `odpt.urn`; @doc("クラス名") @example("odpt:Station") @@ -126,7 +112,7 @@ model RetrieveResponse { @example("2024-06-27T08:00:00+09:00") `dc:date`: DateTime; - @doc("駅名(日本語)") + @doc("駅名(日本語)") @example("上野") `dc:title`: string; @@ -190,7 +176,7 @@ model PlaceSearchResponse { @doc("固有識別子(ucode)") @example("urn:ucode:_00001C00000000000001000003102C88") - `@id`: URN; + `@id`: `odpt.urn`; @doc("クラス名") @example("odpt:Station") @@ -200,7 +186,7 @@ model PlaceSearchResponse { @example("2024-03-27T09:00:00+09:00") `dc:date`: DateTime; - @doc("駅名(日本語)") + @doc("駅名(日本語)") @example("日本橋") `dc:title`: string; @@ -323,52 +309,3 @@ enum PlaceRDFType { @doc("バス停標柱情報") `odpt:BusstopPole`, } - -@route("/{RDF_TYPE}") -interface DataSearchOperations { - @summary("データ検索API") - @get - search( - @path - @doc("取得するデータの種別 odpt:クラス名") - RDF_TYPE: `odpt.url`, - - @query - @doc("rdf:typeで指定したクラスの持つプロパティを指定して、フィルタリングを行う") - PREDICATE?: string, - ): DataSearchResponse[] | Common.Error; -} - -@route("/{RDF_TYPE}.json") -interface DataDumpOperations { - @summary("データダンプAPI") - @get - dump( - @path @doc("取得するデータの種別 odpt:クラス名") RDF_TYPE: DumpRDFType, - ): DumpResponse[] | Common.Error; -} - -@route("/datapoints/{DATA_URI}") -interface DataRetrieveOperations { - @summary("データ取得API") - @get - retrieve( - @path @doc("取得するデータのURI") DATA_URI: URN | `odpt.url`, - ): RetrieveResponse[] | Common.Error; -} - -@route("/places/{RDF_TYPE}") -interface PlaceSearchOperations { - @summary("地物情報検索API") - @get - search( - @path @doc("取得するデータの種別") RDF_TYPE: PlaceRDFType, - @query @doc("取得する範囲の中心緯度、10進数表記、測地系はWGS84") lat: float, - @query @doc("取得する範囲の中心経度、10進数表記、測地系はWGS84") lon: float, - @query @doc("取得する範囲の半径をメートルで指定、0-4000mの範囲") radius: integer, - - @query - @doc("rdf:typeで指定したクラスの持つプロパティを指定して、フィルタリングを行う") - PREDICATE?: string, - ): PlaceSearchResponse[] | Common.Error; -} diff --git a/src/train/index.tsp b/src/models/train.tsp similarity index 74% rename from src/train/index.tsp rename to src/models/train.tsp index 213ce11..b46d7a4 100644 --- a/src/train/index.tsp +++ b/src/models/train.tsp @@ -1,18 +1,4 @@ -import "@typespec/http"; -import "@typespec/rest"; import "../common/class.tsp"; -import "../common/error.tsp"; - -@service({ - title: "ODPT Train API", -}) -@server("https://api.odpt.org/api/v4", "API サーバー") -@doc("鉄道に関連するデータを提供するAPI") -@useAuth(ApiKeyAuth) -namespace TrainAPI; - -using TypeSpec.Http; -using TypeSpec.Rest; @doc("駅の乗降人員数または乗車人員数") model PassengerSurvey { @@ -22,7 +8,7 @@ model PassengerSurvey { @doc("固有識別子(ucode)") @example("urn:ucode:_00001C000000000000010000030FD7E5") - `@id`: URN; + `@id`: `odpt.urn`; @doc("クラス名") @example("odpt:PassengerSurvey") @@ -76,7 +62,7 @@ model RailDirection { @doc("固有識別子(ucode)") @example("urn:ucode:_00001C000000000000010000030FD7E5") - `@id`: URN; + `@id`: `odpt.urn`; @doc("クラス名") @example("odpt:RailDirection") @@ -90,16 +76,16 @@ model RailDirection { @example("odpt.RailDirection:Inbound") `owl:sameAs`: `odpt.url`; - @doc("進行方向(日本語)") + @doc("進行方向(日本語)") @example("上り") `dc:title`?: string; - @doc("進行方向(多言語対応)") + @doc("進行方向(多言語対応)") @example(#{ ja: "上り", en: "Inbound" }) `odpt:railDirectionTitle`?: MultilingualTitle; } -@doc("鉄道路線(運行系統)の情報") +@doc("鉄道路線(運行系統)の情報") model Railway { @doc("JSON-LD仕様に基づく @context のURL") @example("http://vocab.odpt.org/context_odpt.jsonld") @@ -107,7 +93,7 @@ model Railway { @doc("固有識別子(ucode)") @example("urn:ucode:_00001C000000000000010000030FD7E5") - `@id`: URN; + `@id`: `odpt.urn`; @doc("クラス名") @example("odpt:Railway") @@ -121,15 +107,15 @@ model Railway { @example("odpt.Railway:JR-East.Yamanote") `owl:sameAs`: `odpt.url`; - @doc("路線名(日本語)") + @doc("路線名(日本語)") @example("山手線") `dc:title`: string; - @doc("路線名(多言語対応)") + @doc("路線名(多言語対応)") @example(#{ ja: "山手線", en: "Yamanote Line" }) `odpt:railwayTitle`?: MultilingualTitle; - @doc("路線名のよみがな(ひらがな表記)") + @doc("路線名のよみがな(ひらがな表記)") @example("やまのてせん") `odpt:kana`?: string; @@ -167,7 +153,7 @@ model StationOrder { @example("odpt.Station:TokyoMetro.Marunouchi.Tokyo") `odpt:station`: `odpt.url`; - @doc("駅名(多言語対応)") + @doc("駅名(多言語対応)") @example(#{ ja: "東京", en: "Tokyo" }) `odpt:stationTitle`?: MultilingualTitle; @@ -184,7 +170,7 @@ model RailwayFare { @doc("固有識別子(ucode)") @example("urn:ucode:_00001C000000000000010000030FD7E5") - `@id`: URN; + `@id`: `odpt.urn`; @doc("クラス名") @example("odpt:RailwayFare") @@ -259,7 +245,7 @@ model Station { @doc("固有識別子(ucode)") @example("urn:ucode:_00001C000000000000010000030FD7E5") - `@id`: URN; + `@id`: `odpt.urn`; @doc("クラス名") @example("odpt:Station") @@ -273,11 +259,11 @@ model Station { @example("odpt.Station:JR-East.Yamanote.Tokyo") `owl:sameAs`: `odpt.url`; - @doc("駅名(日本語)") + @doc("駅名(日本語)") @example("東京") `dc:title`?: string; - @doc("駅名(多言語対応)") + @doc("駅名(多言語対応)") @example(#{ ja: "東京", en: "Tokyo" }) `odpt:stationTitle`?: MultilingualTitle; @@ -333,7 +319,7 @@ model StationTimetable { @doc("固有識別子(ucode)") @example("urn:ucode:_00001C000000000000010000030FD7E5") - `@id`: URN; + `@id`: `odpt.urn`; @doc("クラス名") @example("odpt:StationTimetable") @@ -363,7 +349,7 @@ model StationTimetable { @example("odpt.Railway:JR-East.ChuoRapid") `odpt:railway`: `odpt.url`; - @doc("路線名(多言語対応)") + @doc("路線名(多言語対応)") @example(#{ ja: "中央線快速", en: "Chuo Rapid" }) `odpt:railwayTitle`?: MultilingualTitle; @@ -371,7 +357,7 @@ model StationTimetable { @example("odpt.Station:JR-East.ChuoRapid.Tokyo") `odpt:station`?: `odpt.url`; - @doc("駅名(多言語対応)") + @doc("駅名(多言語対応)") @example(#{ ja: "東京", en: "Tokyo" }) `odpt:stationTitle`?: MultilingualTitle; @@ -383,11 +369,11 @@ model StationTimetable { @example("odpt.Calendar:Weekday") `odpt:calendar`?: `odpt.url`; - @doc("出発時刻、終着(行先)駅等の組のリスト") + @doc("出発時刻、終着(行先)駅等の組のリスト") @example(#[#{ `odpt:departureTime`: "06:00" }, #{ `odpt:departureTime`: "07:00" }]) `odpt:stationTimetableObject`: StationTimetableObject[]; - @doc("注釈情報(多言語対応)") + @doc("注釈情報(多言語対応)") @example(#{ ja: "日本語での注釈情報", en: "Note in English" }) `odpt:note`?: MultilingualTitle; } @@ -470,7 +456,7 @@ model Train { @doc("固有識別子(ucode又はuuid)") @example("urn:ucode:_00001C000000000000010000030FD7E5") - `@id`: URN; + `@id`: `odpt.urn`; @doc("クラス名") @example("odpt:Train") @@ -544,7 +530,7 @@ model Train { @example(1) `odpt:index`?: integer; - @doc("遅延時間(秒)") + @doc("遅延時間(秒)") @example(60) `odpt:delay`?: integer; @@ -565,7 +551,7 @@ model TrainInformation { @doc("固有識別子(ucode又はuuid)") @example("urn:ucode:_00001C000000000000010000030FD7E5") - `@id`: URN; + `@id`: `odpt.urn`; @doc("クラス名") @example("odpt:TrainInformation") @@ -648,7 +634,7 @@ model TrainTimetable { @doc("固有識別子(ucode)") @example("urn:ucode:_00001C000000000000010000030FD7E5") - `@id`: URN; + `@id`: `odpt.urn`; @doc("クラス名") @example("odpt:TrainTimetable") @@ -788,7 +774,7 @@ model TrainType { @doc("固有識別子(ucode)") @example("urn:ucode:_00001C000000000000010000030FD7E5") - `@id`: URN; + `@id`: `odpt.urn`; @doc("クラス名") @example("odpt:TrainType") @@ -806,149 +792,11 @@ model TrainType { @example("odpt.Operator:JR-East") `odpt:operator`: `odpt.url`; - @doc("列車種別(日本語)") + @doc("列車種別(日本語)") @example("普通") `dc:title`?: string; - @doc("列車種別(多言語対応)") + @doc("列車種別(多言語対応)") @example(#{ ja: "普通", en: "Local" }) `odpt:trainTypeTitle`?: MultilingualTitle; } - -@route("/odpt:PassengerSurvey") -interface PassengerSurveyOperations { - @summary("駅の乗降人員数を取得する") - @get - getPassengerSurveys( - @query @doc("開発者サイトにて提供されるアクセストークン") `acl:consumerKey`: ConsumerKey, - @query @doc("データに付与された固有識別子") `@id`?: URN, - @query @doc("データに付与された固有識別子の別名") `owl:sameAs`?: `odpt.url`, - @query @doc("事業者を表すID") `odpt:operator`?: `odpt.url`, - @query @doc("駅を表すID") `odpt:station`?: `odpt.url`, - @query @doc("路線を表すID") `odpt:railway`?: `odpt.url`, - ): PassengerSurvey[] | Common.Error; -} - -@route("/odpt:RailDirection") -interface RailDirectionOperations { - @summary("進行方向の定義を取得する") - @get - getRailDirections( - @query @doc("開発者サイトにて提供されるアクセストークン") `acl:consumerKey`: ConsumerKey, - @query @doc("データに付与された固有識別子") `@id`?: URN, - @query @doc("データに付与された固有識別子の別名") `owl:sameAs`?: `odpt.url`, - ): RailDirection[] | Common.Error; -} - -@route("/odpt:Railway") -interface RailwayOperations { - @summary("路線情報を取得する") - @get - getRailways( - @query @doc("開発者サイトにて提供されるアクセストークン") `acl:consumerKey`: ConsumerKey, - @query @doc("データに付与された固有識別子") `@id`?: URN, - @query @doc("データに付与された固有識別子の別名") `owl:sameAs`?: `odpt.url`, - @query @doc("路線名") `dc:title`?: string, - @query @doc("事業者を表すID") `odpt:operator`?: `odpt.url`, - @query @doc("路線コード、路線シンボル表記") `odpt:lineCode`?: string, - ): Railway[] | Common.Error; -} - -@route("/odpt:RailwayFare") -interface RailwayFareOperations { - @summary("2駅間の運賃を取得する") - @get - getRailwayFares( - @query @doc("開発者サイトにて提供されるアクセストークン") `acl:consumerKey`: ConsumerKey, - @query @doc("データに付与された固有識別子") `@id`?: URN, - @query @doc("データに付与された固有識別子の別名") `owl:sameAs`?: `odpt.url`, - @query @doc("事業者を表すID") `odpt:operator`?: `odpt.url`, - @query @doc("出発駅のID") `odpt:fromStation`?: `odpt.url`, - @query @doc("到着駅のID") `odpt:toStation`?: `odpt.url`, - ): RailwayFare[] | Common.Error; -} - -@route("/odpt:Station") -interface StationOperations { - @summary("駅情報を取得する") - @get - getStations( - @query @doc("開発者サイトにて提供されるアクセストークン") `acl:consumerKey`: ConsumerKey, - @query @doc("データに付与された固有識別子") `@id`?: URN, - @query @doc("データに付与された固有識別子の別名") `owl:sameAs`?: `odpt.url`, - @query @doc("駅名") `dc:title`?: string, - @query @doc("事業者を表すID") `odpt:operator`?: `odpt.url`, - @query @doc("駅が存在する路線ID") `odpt:railway`?: `odpt.url`, - @query @doc("駅ナンバリング") `odpt:stationCode`?: string, - ): Station[] | Common.Error; -} - -@route("/odpt:StationTimetable") -interface StationTimetableOperations { - @summary("駅時刻表を取得する") - @get - getStationTimetables( - @query @doc("開発者サイトにて提供されるアクセストークン") `acl:consumerKey`: ConsumerKey, - @query @doc("データに付与された固有識別子") `@id`?: URN, - @query @doc("データに付与された固有識別子の別名") `owl:sameAs`?: `odpt.url`, - @query @doc("駅を表すID") `odpt:station`?: `odpt.url`, - @query @doc("路線を表すID") `odpt:railway`?: `odpt.url`, - @query @doc("事業者を表すID") `odpt:operator`?: `odpt.url`, - @query @doc("進行方向を表すID") `odpt:railDirection`?: `odpt.url`, - @query @doc("実施日を表すID") `odpt:calendar`?: `odpt.url`, - @query @doc("特定日付の時刻表を取得") `dc:date`?: DateTime, - ): StationTimetable[] | Common.Error; -} - -@route("/odpt:Train") -interface TrainOperations { - @summary("列車情報(列車の位置情報)を取得する") - @get - getTrains( - @query @doc("開発者サイトにて提供されるアクセストークン") `acl:consumerKey`: ConsumerKey, - @query @doc("データに付与された固有識別子の別名") `owl:sameAs`?: `odpt.url`, - @query @doc("列車情報を配信する事業者のID") `odpt:operator`?: `odpt.url`, - @query @doc("当該列車が運行している路線のID") `odpt:railway`?: `odpt.url`, - ): Train[] | Common.Error; -} - -@route("/odpt:TrainInformation") -interface TrainInformationOperations { - @summary("列車運行情報を取得する") - @get - getTrainInformation( - @query @doc("開発者サイトにて提供されるアクセストークン") `acl:consumerKey`: ConsumerKey, - @query @doc("データに付与された固有識別子の別名") `owl:sameAs`?: `odpt.url`, - @query @doc("運行情報を配信する事業者のID") `odpt:operator`?: `odpt.url`, - @query @doc("運行情報が発生した路線のID") `odpt:railway`?: `odpt.url`, - ): TrainInformation[] | Common.Error; -} - -@route("/odpt:TrainTimetable") -interface TrainTimetableOperations { - @summary("列車時刻表を取得する") - @get - getTrainTimetables( - @query @doc("開発者サイトにて提供されるアクセストークン") `acl:consumerKey`: ConsumerKey, - @query @doc("固有識別子") `@id`?: URN, - @query @doc("固有識別子別名") `owl:sameAs`?: `odpt.url`, - @query @doc("列車番号") `odpt:trainNumber`?: string, - @query @doc("路線のID") `odpt:railway`?: `odpt.url`, - @query @doc("運行事業者のID") `odpt:operator`?: `odpt.url`, - @query @doc("列車種別ID") `odpt:trainType`?: `odpt.url`, - @query @doc("該当する列車ID") `odpt:train`?: `odpt.url`, - @query @doc("特定のカレンダー情報ID") `odpt:calendar`?: `odpt.url`, - ): TrainTimetable[] | Common.Error; -} - -@route("/odpt:TrainType") -interface TrainTypeOperations { - @summary("列車種別の定義を取得する") - @get - getTrainTypes( - @query @doc("開発者サイトにて提供されるアクセストークン") `acl:consumerKey`: ConsumerKey, - @query @doc("データに付与された固有識別子") `@id`?: URN, - @query @doc("データに付与された固有識別子の別名") `owl:sameAs`?: `odpt.url`, - @query @doc("事業者を表すID") `odpt:operator`?: `odpt.url`, - ): TrainType[] | Common.Error; -} diff --git a/src/routes/airplane.tsp b/src/routes/airplane.tsp new file mode 100644 index 0000000..6c3f076 --- /dev/null +++ b/src/routes/airplane.tsp @@ -0,0 +1,88 @@ +import "../models/airplane.tsp"; + +using TypeSpec.Http; + +namespace OdptAPI; + +@route("/odpt:Airport") +interface AirportOperations { + @summary("空港情報の取得") + @get + getAirports( + @query @doc("開発者サイトにて提供されるアクセストークン") `acl:consumerKey`: ConsumerKey, + @query @doc("データに付与された固有識別子") `@id`?: `odpt.urn`, + @query @doc("データに付与された固有識別子の別名") `owl:sameAs`?: `odpt.url`, + ): Airport[] | Common.Error; +} + +@route("/odpt:AirportTerminal") +interface AirportTerminalOperations { + @summary("空港ターミナル情報の取得") + @get + getAirportTerminals( + @query @doc("開発者サイトにて提供されるアクセストークン") `acl:consumerKey`: ConsumerKey, + @query @doc("データに付与された固有識別子") `@id`?: `odpt.urn`, + @query @doc("データに付与された固有識別子の別名") `owl:sameAs`?: `odpt.url`, + @query @doc("空港を示すID") `odpt:airport`?: url, + ): AirportTerminal[] | Common.Error; +} + +@route("/odpt:FlightInformationArrival") +interface FlightInformationArrivalOperations { + @summary("フライト到着情報の取得") + @get + getFlightInformationArrivals( + @query @doc("開発者サイトにて提供されるアクセストークン") `acl:consumerKey`: ConsumerKey, + @query @doc("データに付与された固有識別子の別名") `owl:sameAs`?: `odpt.url`, + @query @doc("空港事業者または航空事業者を示すID") `odpt:operator`?: url, + @query @doc("エアラインの運行会社を示すID") `odpt:airline`?: url, + @query @doc("フライト状況を示すID") `odpt:flightStatus`?: url, + @query @doc("到着空港を示すID") `odpt:arrivalAirport`?: url, + @query @doc("到着空港ターミナルを示すID") `odpt:arrivalAirportTerminal`?: url, + @query @doc("到着空港ゲート番号") `odpt:arrivalGate`?: string, + @query @doc("出発地の空港を示すID") `odpt:originAirport`?: url, + ): FlightInformationArrival[] | Common.Error; +} + +@route("/odpt:FlightInformationDeparture") +interface FlightInformationDepartureOperations { + @summary("フライト出発情報の取得") + @get + getFlightInformationDepartures( + @query @doc("開発者サイトにて提供されるアクセストークン") `acl:consumerKey`: ConsumerKey, + @query @doc("データに付与された固有識別子の別名") `owl:sameAs`?: `odpt.url`, + @query @doc("空港事業者または航空事業者を示すID") `odpt:operator`?: url, + @query @doc("エアラインの運行会社を示すID") `odpt:airline`?: url, + @query @doc("フライト状況を示すID") `odpt:flightStatus`?: url, + @query @doc("出発空港を示すID") `odpt:departureAirport`?: url, + @query @doc("出発空港ターミナルを示すID") `odpt:departureAirportTerminal`?: url, + @query @doc("出発空港ゲート番号") `odpt:departureGate`?: string, + @query @doc("目的地の空港を示すID") `odpt:destinationAirport`?: url, + ): FlightInformationDeparture[] | Common.Error; +} + +@route("/odpt:FlightSchedule") +interface FlightScheduleOperations { + @summary("フライト時刻表の取得") + @get + getFlightSchedules( + @query @doc("開発者サイトにて提供されるアクセストークン") `acl:consumerKey`: ConsumerKey, + @query @doc("データに付与された固有識別子") `@id`?: `odpt.urn`, + @query @doc("データに付与された固有識別子の別名") `owl:sameAs`?: `odpt.url`, + @query @doc("空港事業者または航空事業者を示すID") `odpt:operator`?: url, + @query @doc("運行日を示すID") `odpt:calendar`?: url, + @query @doc("出発地の空港を示すID") `odpt:originAirport`?: url, + @query @doc("目的地の空港を示すID") `odpt:destinationAirport`?: url, + ): FlightSchedule[] | Common.Error; +} + +@route("/odpt:FlightStatus") +interface FlightStatusOperations { + @summary("フライト状況定義の取得") + @get + getFlightStatuses( + @query @doc("開発者サイトにて提供されるアクセストークン") `acl:consumerKey`: ConsumerKey, + @query @doc("データに付与された固有識別子") `@id`?: `odpt.urn`, + @query @doc("データに付与された固有識別子の別名") `owl:sameAs`?: `odpt.url`, + ): FlightStatus[] | Common.Error; +} diff --git a/src/routes/bus.tsp b/src/routes/bus.tsp new file mode 100644 index 0000000..6194c0c --- /dev/null +++ b/src/routes/bus.tsp @@ -0,0 +1,235 @@ +import "../models/bus.tsp"; + +using TypeSpec.Http; + +namespace OdptAPI; + +@route("/odpt:Bus") +interface BusOperation { + @summary("バス車両の運行情報") + @get + getBuses( + @query + @doc("開発者サイトにて提供されるアクセストークン") + `acl:consumerKey`: ConsumerKey, + + @query + @doc("データに付与された固有識別子") + `@id`?: `odpt.urn`, + + @query + @doc("データに付与された固有識別子の別名") + `owl:sameAs`?: `odpt.url`, + + @query + @doc("バス車両の運行系統のID") + `odpt:busroutePattern`?: `odpt.url`, + + @query + @doc("事業者のID") + `odpt:operator`?: `odpt.url`, + + @query + @doc("直近に通過した、あるいは停車中のバス停のID") + `odpt:fromBusstopPole`?: `odpt.url`, + + @query + @doc("次に到着するバス停のID") + `odpt:toBusstopPole`?: `odpt.url`, + ): Bus[] | Common.Error; +} + +@route("/odpt:BusTimetable") +interface BusTimetableOperations { + @summary("バスの便の時刻表") + @get + getBusTimetables( + @query + @doc("開発者サイトにて提供されるアクセストークン") + `acl:consumerKey`: ConsumerKey, + + @query + @doc("データに付与された固有識別子") + `@id`?: `odpt.urn`, + + @query + @doc("データに付与された固有識別子の別名") + `owl:sameAs`?: `odpt.url`, + + @query + @doc("事業者のID") + `odpt:operator`: `odpt.url`, + + @query + @doc("対応する系統のID") + `odpt:busroutePattern`?: `odpt.url`, + + @query + @doc("バス路線名称") + `dc:title`?: string, + + @query + @doc("カレンダーのID") + `odpt:calendar`?: `odpt.url`, + ): BusTimetable[] | Common.Error; +} + +@route("/odpt:BusroutePattern") +interface BusroutePatternOperations { + @summary("運行系統情報") + @get + getBusroutePatterns( + @query + @doc("開発者サイトにて提供されるアクセストークン") + `acl:consumerKey`: ConsumerKey, + + @query + @doc("データに付与された固有識別子") + `@id`?: `odpt.urn`, + + @query + @doc("データに付与された固有識別子の別名") + `owl:sameAs`?: `odpt.url`, + + @query + @doc("路線・系統名称") + `dc:title`?: string, + + @query + @doc("事業者のID") + `odpt:operator`?: `odpt.url`, + + @query + @doc("路線のID") + `odpt:busroute`?: string, + ): BusroutePattern[] | Common.Error; +} + +@route("/odpt:BusroutePatternFare") +interface BusroutePatternFareOperations { + @summary("運賃情報") + @get + getBusroutePatternFares( + @query + @doc("開発者サイトにて提供されるアクセストークン") + `acl:consumerKey`: ConsumerKey, + + @query + @doc("データに付与された固有識別子") + `@id`?: `odpt.urn`, + + @query + @doc("データに付与された固有識別子の別名") + `owl:sameAs`?: `odpt.url`, + + @query + @doc("事業者のID") + `odpt:operator`?: `odpt.url`, + + @query + @doc("乗車バス停(標柱)のID") + `odpt:fromBusstopPole`?: `odpt.url`, + + @query + @doc("降車バス停(標柱)のID") + `odpt:toBusstopPole`?: `odpt.url`, + + @query + @doc("切符利用時の運賃") + `odpt:ticketFare`?: integer, + + @query + @doc("切符利用時の子供運賃") + `odpt:childTicketFare`?: integer, + + @query + @doc("ICカード利用時の運賃") + `odpt:icCardFare`?: integer, + + @query + @doc("ICカード利用時の子供運賃") + `odpt:childIcCardFare`?: integer, + ): BusroutePatternFare[] | Common.Error; +} + +@route("/odpt:BusstopPole") +interface BusstopPoleOperations { + @summary("バス停情報") + @get + getBusstopPoles( + @query + @doc("開発者サイトにて提供されるアクセストークン") + `acl:consumerKey`: ConsumerKey, + + @query + @doc("データに付与された固有識別子") + `@id`?: `odpt.urn`, + + @query + @doc("データに付与された固有識別子の別名") + `owl:sameAs`?: `odpt.url`, + + @query + @doc("バス停名") + `dc:title`?: string, + + @query + @doc("標柱番号") + `odpt:busstopPoleNumber`?: string, + + @query + @doc("のりば番号") + `odpt:platformNumber`?: string, + + @query + @doc("標柱で発着する系統のID") + `odpt:busroutePattern`?: `odpt.url`, + + @query + @doc("事業者のID") + `odpt:operator`?: `odpt.url`, + ): BusstopPole[] | Common.Error; +} + +@route("/odpt:BusstopPoleTimetable") +interface BusstopPoleTimetableOperations { + @summary("バス停(標柱)時刻表") + @get + getBusstopPoleTimetables( + @query + @doc("開発者サイトにて提供されるアクセストークン") + `acl:consumerKey`: ConsumerKey, + + @query + @doc("データに付与された固有識別子") + `@id`?: `odpt.urn`, + + @query + @doc("データに付与された固有識別子の別名") + `owl:sameAs`?: `odpt.url`, + + @query + @doc("バス停(標柱)のID") + `odpt:busstopPole`?: `odpt.url`, + + @query + @doc("方面のID") + `odpt:busDirection`?: string, + + @query + @doc("路線のID") + `odpt:busroute`?: string, + + @query + @doc("事業者のID") + `odpt:operator`?: `odpt.url`, + + @query + @doc("カレンダーのID") + `odpt:calendar`?: `odpt.url`, + + @query + @doc("データ生成日付") + `dc:date`?: DateTime, + ): BusstopPoleTimetable[] | Common.Error; +} diff --git a/src/routes/file.tsp b/src/routes/file.tsp new file mode 100644 index 0000000..d4a39d7 --- /dev/null +++ b/src/routes/file.tsp @@ -0,0 +1,17 @@ +import "../models/file.tsp"; +import "../common/error.tsp"; + +using TypeSpec.Http; + +namespace OdptAPI; + +@doc("各社提供ファイル取得用API") +@route("/files/{filePath}") +interface FilesOperations { + @summary("ファイルを取得する") + @get + getFiles( + @query @doc("開発者サイトにて提供されるアクセストークン") `acl:consumerKey`: ConsumerKey, + @path @doc("ファイルパス") filePath: string, + ): FileRedirect | Common.Error; +} diff --git a/src/routes/index.tsp b/src/routes/index.tsp new file mode 100644 index 0000000..526e493 --- /dev/null +++ b/src/routes/index.tsp @@ -0,0 +1,35 @@ +import "@typespec/http"; +import "../common/class.tsp"; +import "../common/error.tsp"; + +import "./train.tsp"; +import "./bus.tsp"; +import "./airplane.tsp"; +import "./file.tsp"; +import "./search.tsp"; + +using TypeSpec.Http; + +namespace OdptAPI; + +@route("/odpt/Calendar") +interface CalendarOperations { + @summary("曜日・日付区分(odpt:Calendar)の内容を取得する") + @get + getCalendars( + @query @doc("開発者サイトにて提供されるアクセストークン") `acl:consumerKey`: ConsumerKey, + @query @doc("データに付与された固有識別子") `@id`?: `odpt.urn`, + @query @doc("データに付与された固有識別子の別名") `owl:sameAs`?: url, + ): Calendar[] | Common.Error; +} + +@route("/Operator") +interface OperatorOperations { + @summary("公共交通機関の事業者(odpt:Operator)の内容を取得する") + @get + getOperators( + @query @doc("開発者サイトにて提供されるアクセストークン") `acl:consumerKey`: ConsumerKey, + @query @doc("データに付与された固有識別子") `@id`?: `odpt.urn`, + @query @doc("データに付与された固有識別子の別名") `owl:sameAs`?: url, + ): Operator[] | Common.Error; +} diff --git a/src/routes/search.tsp b/src/routes/search.tsp new file mode 100644 index 0000000..fe01a6f --- /dev/null +++ b/src/routes/search.tsp @@ -0,0 +1,55 @@ +import "../models/search.tsp"; +import "../common/error.tsp"; + +using TypeSpec.Http; + +namespace OdptAPI; + +@route("/{RDF_TYPE}") +interface DataSearchOperations { + @summary("データ検索API") + @get + search( + @path + @doc("取得するデータの種別 odpt:クラス名") + RDF_TYPE: `odpt.url`, + + @query + @doc("rdf:typeで指定したクラスの持つプロパティを指定して、フィルタリングを行う") + PREDICATE?: string, + ): DataSearchResponse[] | Common.Error; +} + +@route("/{RDF_TYPE}.json") +interface DataDumpOperations { + @summary("データダンプAPI") + @get + dump( + @path @doc("取得するデータの種別 odpt:クラス名") RDF_TYPE: DumpRDFType, + ): DumpResponse[] | Common.Error; +} + +@route("/datapoints/{DATA_URI}") +interface DataRetrieveOperations { + @summary("データ取得API") + @get + retrieve( + @path @doc("取得するデータのURI") DATA_URI: `odpt.urn` | `odpt.url`, + ): RetrieveResponse[] | Common.Error; +} + +@route("/places/{RDF_TYPE}") +interface PlaceSearchOperations { + @summary("地物情報検索API") + @get + search( + @path @doc("取得するデータの種別") RDF_TYPE: PlaceRDFType, + @query @doc("取得する範囲の中心緯度、10進数表記、測地系はWGS84") lat: float, + @query @doc("取得する範囲の中心経度、10進数表記、測地系はWGS84") lon: float, + @query @doc("取得する範囲の半径をメートルで指定、0-4000mの範囲") radius: integer, + + @query + @doc("rdf:typeで指定したクラスの持つプロパティを指定して、フィルタリングを行う") + PREDICATE?: string, + ): PlaceSearchResponse[] | Common.Error; +} diff --git a/src/routes/train.tsp b/src/routes/train.tsp new file mode 100644 index 0000000..9c7cce8 --- /dev/null +++ b/src/routes/train.tsp @@ -0,0 +1,143 @@ +import "../models/train.tsp"; + +using TypeSpec.Http; + +namespace OdptAPI; + +@route("/odpt:PassengerSurvey") +interface PassengerSurveyOperations { + @summary("駅の乗降人員数を取得する") + @get + getPassengerSurveys( + @query @doc("開発者サイトにて提供されるアクセストークン") `acl:consumerKey`: ConsumerKey, + @query @doc("データに付与された固有識別子") `@id`?: `odpt.urn`, + @query @doc("データに付与された固有識別子の別名") `owl:sameAs`?: `odpt.url`, + @query @doc("事業者を表すID") `odpt:operator`?: `odpt.url`, + @query @doc("駅を表すID") `odpt:station`?: `odpt.url`, + @query @doc("路線を表すID") `odpt:railway`?: `odpt.url`, + ): PassengerSurvey[] | Common.Error; +} + +@route("/odpt:RailDirection") +interface RailDirectionOperations { + @summary("進行方向の定義を取得する") + @get + getRailDirections( + @query @doc("開発者サイトにて提供されるアクセストークン") `acl:consumerKey`: ConsumerKey, + @query @doc("データに付与された固有識別子") `@id`?: `odpt.urn`, + @query @doc("データに付与された固有識別子の別名") `owl:sameAs`?: `odpt.url`, + ): RailDirection[] | Common.Error; +} + +@route("/odpt:Railway") +interface RailwayOperations { + @summary("路線情報を取得する") + @get + getRailways( + @query @doc("開発者サイトにて提供されるアクセストークン") `acl:consumerKey`: ConsumerKey, + @query @doc("データに付与された固有識別子") `@id`?: `odpt.urn`, + @query @doc("データに付与された固有識別子の別名") `owl:sameAs`?: `odpt.url`, + @query @doc("路線名") `dc:title`?: string, + @query @doc("事業者を表すID") `odpt:operator`?: `odpt.url`, + @query @doc("路線コード、路線シンボル表記") `odpt:lineCode`?: string, + ): Railway[] | Common.Error; +} + +@route("/odpt:RailwayFare") +interface RailwayFareOperations { + @summary("2駅間の運賃を取得する") + @get + getRailwayFares( + @query @doc("開発者サイトにて提供されるアクセストークン") `acl:consumerKey`: ConsumerKey, + @query @doc("データに付与された固有識別子") `@id`?: `odpt.urn`, + @query @doc("データに付与された固有識別子の別名") `owl:sameAs`?: `odpt.url`, + @query @doc("事業者を表すID") `odpt:operator`?: `odpt.url`, + @query @doc("出発駅のID") `odpt:fromStation`?: `odpt.url`, + @query @doc("到着駅のID") `odpt:toStation`?: `odpt.url`, + ): RailwayFare[] | Common.Error; +} + +@route("/odpt:Station") +interface StationOperations { + @summary("駅情報を取得する") + @get + getStations( + @query @doc("開発者サイトにて提供されるアクセストークン") `acl:consumerKey`: ConsumerKey, + @query @doc("データに付与された固有識別子") `@id`?: `odpt.urn`, + @query @doc("データに付与された固有識別子の別名") `owl:sameAs`?: `odpt.url`, + @query @doc("駅名") `dc:title`?: string, + @query @doc("事業者を表すID") `odpt:operator`?: `odpt.url`, + @query @doc("駅が存在する路線ID") `odpt:railway`?: `odpt.url`, + @query @doc("駅ナンバリング") `odpt:stationCode`?: string, + ): Station[] | Common.Error; +} + +@route("/odpt:StationTimetable") +interface StationTimetableOperations { + @summary("駅時刻表を取得する") + @get + getStationTimetables( + @query @doc("開発者サイトにて提供されるアクセストークン") `acl:consumerKey`: ConsumerKey, + @query @doc("データに付与された固有識別子") `@id`?: `odpt.urn`, + @query @doc("データに付与された固有識別子の別名") `owl:sameAs`?: `odpt.url`, + @query @doc("駅を表すID") `odpt:station`?: `odpt.url`, + @query @doc("路線を表すID") `odpt:railway`?: `odpt.url`, + @query @doc("事業者を表すID") `odpt:operator`?: `odpt.url`, + @query @doc("進行方向を表すID") `odpt:railDirection`?: `odpt.url`, + @query @doc("実施日を表すID") `odpt:calendar`?: `odpt.url`, + @query @doc("特定日付の時刻表を取得") `dc:date`?: DateTime, + ): StationTimetable[] | Common.Error; +} + +@route("/odpt:Train") +interface TrainOperations { + @summary("列車情報(列車の位置情報)を取得する") + @get + getTrains( + @query @doc("開発者サイトにて提供されるアクセストークン") `acl:consumerKey`: ConsumerKey, + @query @doc("データに付与された固有識別子の別名") `owl:sameAs`?: `odpt.url`, + @query @doc("列車情報を配信する事業者のID") `odpt:operator`?: `odpt.url`, + @query @doc("当該列車が運行している路線のID") `odpt:railway`?: `odpt.url`, + ): Train[] | Common.Error; +} + +@route("/odpt:TrainInformation") +interface TrainInformationOperations { + @summary("列車運行情報を取得する") + @get + getTrainInformation( + @query @doc("開発者サイトにて提供されるアクセストークン") `acl:consumerKey`: ConsumerKey, + @query @doc("データに付与された固有識別子の別名") `owl:sameAs`?: `odpt.url`, + @query @doc("運行情報を配信する事業者のID") `odpt:operator`?: `odpt.url`, + @query @doc("運行情報が発生した路線のID") `odpt:railway`?: `odpt.url`, + ): TrainInformation[] | Common.Error; +} + +@route("/odpt:TrainTimetable") +interface TrainTimetableOperations { + @summary("列車時刻表を取得する") + @get + getTrainTimetables( + @query @doc("開発者サイトにて提供されるアクセストークン") `acl:consumerKey`: ConsumerKey, + @query @doc("固有識別子") `@id`?: `odpt.urn`, + @query @doc("固有識別子別名") `owl:sameAs`?: `odpt.url`, + @query @doc("列車番号") `odpt:trainNumber`?: string, + @query @doc("路線のID") `odpt:railway`?: `odpt.url`, + @query @doc("運行事業者のID") `odpt:operator`?: `odpt.url`, + @query @doc("列車種別ID") `odpt:trainType`?: `odpt.url`, + @query @doc("該当する列車ID") `odpt:train`?: `odpt.url`, + @query @doc("特定のカレンダー情報ID") `odpt:calendar`?: `odpt.url`, + ): TrainTimetable[] | Common.Error; +} + +@route("/odpt:TrainType") +interface TrainTypeOperations { + @summary("列車種別の定義を取得する") + @get + getTrainTypes( + @query @doc("開発者サイトにて提供されるアクセストークン") `acl:consumerKey`: ConsumerKey, + @query @doc("データに付与された固有識別子") `@id`?: `odpt.urn`, + @query @doc("データに付与された固有識別子の別名") `owl:sameAs`?: `odpt.url`, + @query @doc("事業者を表すID") `odpt:operator`?: `odpt.url`, + ): TrainType[] | Common.Error; +} diff --git a/tspconfig.yaml b/tspconfig.yaml index a3fe48f..964c067 100644 --- a/tspconfig.yaml +++ b/tspconfig.yaml @@ -1,2 +1,8 @@ emit: - "@typespec/openapi3" + +options: + "@typespec/openapi3": + emitter-output-dir: "{output-dir}/openapi" + +output-dir: "{cwd}/dist"