From 395399a09069b2111f1b50fdf5a758c6392c9dcc Mon Sep 17 00:00:00 2001 From: Go Shibata Date: Wed, 30 Sep 2020 18:50:00 +0900 Subject: [PATCH] =?UTF-8?q?=E8=87=AA=E5=8B=95=E7=94=9F=E6=88=90=E3=81=95?= =?UTF-8?q?=E3=82=8C=E3=81=9F=E3=83=95=E3=82=A1=E3=82=A4=E3=83=AB=E3=81=AE?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../infrastructure/ApiClient.kt | 40 +++++++++ .../infrastructure/ByteArrayAdapter.kt | 12 +++ .../infrastructure/CollectionFormats.kt | 56 ++++++++++++ .../infrastructure/LocalDateAdapter.kt | 19 ++++ .../infrastructure/LocalDateTimeAdapter.kt | 19 ++++ .../infrastructure/OffsetDateTimeAdapter.kt | 19 ++++ .../infrastructure/Serializer.kt | 23 +++++ .../infrastructure/UUIDAdapter.kt | 13 +++ .../sp/api/ItemApi.kt | 16 ++++ .../sp/api/UserApi.kt | 19 ++++ .../sp/model/Group.kt | 46 ++++++++++ .../openapigenerationtestapi/sp/model/Item.kt | 87 +++++++++++++++++++ .../openapigenerationtestapi/sp/model/Tag.kt | 38 ++++++++ .../openapigenerationtestapi/sp/model/User.kt | 86 ++++++++++++++++++ 14 files changed, 493 insertions(+) create mode 100644 api/src/main/java/com/example/openapigenerationtestapi/infrastructure/ApiClient.kt create mode 100644 api/src/main/java/com/example/openapigenerationtestapi/infrastructure/ByteArrayAdapter.kt create mode 100644 api/src/main/java/com/example/openapigenerationtestapi/infrastructure/CollectionFormats.kt create mode 100644 api/src/main/java/com/example/openapigenerationtestapi/infrastructure/LocalDateAdapter.kt create mode 100644 api/src/main/java/com/example/openapigenerationtestapi/infrastructure/LocalDateTimeAdapter.kt create mode 100644 api/src/main/java/com/example/openapigenerationtestapi/infrastructure/OffsetDateTimeAdapter.kt create mode 100644 api/src/main/java/com/example/openapigenerationtestapi/infrastructure/Serializer.kt create mode 100644 api/src/main/java/com/example/openapigenerationtestapi/infrastructure/UUIDAdapter.kt create mode 100644 api/src/main/java/com/example/openapigenerationtestapi/sp/api/ItemApi.kt create mode 100644 api/src/main/java/com/example/openapigenerationtestapi/sp/api/UserApi.kt create mode 100644 api/src/main/java/com/example/openapigenerationtestapi/sp/model/Group.kt create mode 100644 api/src/main/java/com/example/openapigenerationtestapi/sp/model/Item.kt create mode 100644 api/src/main/java/com/example/openapigenerationtestapi/sp/model/Tag.kt create mode 100644 api/src/main/java/com/example/openapigenerationtestapi/sp/model/User.kt diff --git a/api/src/main/java/com/example/openapigenerationtestapi/infrastructure/ApiClient.kt b/api/src/main/java/com/example/openapigenerationtestapi/infrastructure/ApiClient.kt new file mode 100644 index 0000000..8fb72ae --- /dev/null +++ b/api/src/main/java/com/example/openapigenerationtestapi/infrastructure/ApiClient.kt @@ -0,0 +1,40 @@ +package com.example.openapigenerationtestapi.infrastructure + +import okhttp3.OkHttpClient +import retrofit2.Retrofit +import retrofit2.converter.scalars.ScalarsConverterFactory +import retrofit2.converter.moshi.MoshiConverterFactory + +class ApiClient( + private var baseUrl: String = defaultBasePath, + private var okHttpClient: OkHttpClient +) { + companion object { + @JvmStatic + val defaultBasePath: String by lazy { + System.getProperties().getProperty("com.example.openapigenerationtestapi.baseUrl", "https://qiita.com/api/v2") + } + } + + init { + normalizeBaseUrl() + } + + val retrofitBuilder: Retrofit.Builder by lazy { + + Retrofit.Builder() + .baseUrl(baseUrl) + .addConverterFactory(ScalarsConverterFactory.create()) + .addConverterFactory(MoshiConverterFactory.create(Serializer.moshi)) + } + + fun createService(serviceClass: Class): S { + return retrofitBuilder.client(okHttpClient).build().create(serviceClass) + } + + private fun normalizeBaseUrl() { + if (!baseUrl.endsWith("/")) { + baseUrl += "/" + } + } +} \ No newline at end of file diff --git a/api/src/main/java/com/example/openapigenerationtestapi/infrastructure/ByteArrayAdapter.kt b/api/src/main/java/com/example/openapigenerationtestapi/infrastructure/ByteArrayAdapter.kt new file mode 100644 index 0000000..8c6095c --- /dev/null +++ b/api/src/main/java/com/example/openapigenerationtestapi/infrastructure/ByteArrayAdapter.kt @@ -0,0 +1,12 @@ +package com.example.openapigenerationtestapi.infrastructure + +import com.squareup.moshi.FromJson +import com.squareup.moshi.ToJson + +class ByteArrayAdapter { + @ToJson + fun toJson(data: ByteArray): String = String(data) + + @FromJson + fun fromJson(data: String): ByteArray = data.toByteArray() +} diff --git a/api/src/main/java/com/example/openapigenerationtestapi/infrastructure/CollectionFormats.kt b/api/src/main/java/com/example/openapigenerationtestapi/infrastructure/CollectionFormats.kt new file mode 100644 index 0000000..1645709 --- /dev/null +++ b/api/src/main/java/com/example/openapigenerationtestapi/infrastructure/CollectionFormats.kt @@ -0,0 +1,56 @@ +package com.example.openapigenerationtestapi.infrastructure + +class CollectionFormats { + + open class CSVParams { + + var params: List + + constructor(params: List) { + this.params = params + } + + constructor(vararg params: String) { + this.params = listOf(*params) + } + + override fun toString(): String { + return params.joinToString(",") + } + } + + open class SSVParams : CSVParams { + + constructor(params: List) : super(params) + + constructor(vararg params: String) : super(*params) + + override fun toString(): String { + return params.joinToString(" ") + } + } + + class TSVParams : CSVParams { + + constructor(params: List) : super(params) + + constructor(vararg params: String) : super(*params) + + override fun toString(): String { + return params.joinToString("\t") + } + } + + class PIPESParams : CSVParams { + + constructor(params: List) : super(params) + + constructor(vararg params: String) : super(*params) + + override fun toString(): String { + return params.joinToString("|") + } + } + + class SPACEParams : SSVParams() +} \ No newline at end of file diff --git a/api/src/main/java/com/example/openapigenerationtestapi/infrastructure/LocalDateAdapter.kt b/api/src/main/java/com/example/openapigenerationtestapi/infrastructure/LocalDateAdapter.kt new file mode 100644 index 0000000..f442920 --- /dev/null +++ b/api/src/main/java/com/example/openapigenerationtestapi/infrastructure/LocalDateAdapter.kt @@ -0,0 +1,19 @@ +package com.example.openapigenerationtestapi.infrastructure + +import com.squareup.moshi.FromJson +import com.squareup.moshi.ToJson +import java.time.LocalDate +import java.time.format.DateTimeFormatter + +class LocalDateAdapter { + @ToJson + fun toJson(value: LocalDate): String { + return DateTimeFormatter.ISO_LOCAL_DATE.format(value) + } + + @FromJson + fun fromJson(value: String): LocalDate { + return LocalDate.parse(value, DateTimeFormatter.ISO_LOCAL_DATE) + } + +} diff --git a/api/src/main/java/com/example/openapigenerationtestapi/infrastructure/LocalDateTimeAdapter.kt b/api/src/main/java/com/example/openapigenerationtestapi/infrastructure/LocalDateTimeAdapter.kt new file mode 100644 index 0000000..4133aca --- /dev/null +++ b/api/src/main/java/com/example/openapigenerationtestapi/infrastructure/LocalDateTimeAdapter.kt @@ -0,0 +1,19 @@ +package com.example.openapigenerationtestapi.infrastructure + +import com.squareup.moshi.FromJson +import com.squareup.moshi.ToJson +import java.time.LocalDateTime +import java.time.format.DateTimeFormatter + +class LocalDateTimeAdapter { + @ToJson + fun toJson(value: LocalDateTime): String { + return DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(value) + } + + @FromJson + fun fromJson(value: String): LocalDateTime { + return LocalDateTime.parse(value, DateTimeFormatter.ISO_LOCAL_DATE_TIME) + } + +} diff --git a/api/src/main/java/com/example/openapigenerationtestapi/infrastructure/OffsetDateTimeAdapter.kt b/api/src/main/java/com/example/openapigenerationtestapi/infrastructure/OffsetDateTimeAdapter.kt new file mode 100644 index 0000000..280cb05 --- /dev/null +++ b/api/src/main/java/com/example/openapigenerationtestapi/infrastructure/OffsetDateTimeAdapter.kt @@ -0,0 +1,19 @@ +package com.example.openapigenerationtestapi.infrastructure + +import com.squareup.moshi.FromJson +import com.squareup.moshi.ToJson +import java.time.OffsetDateTime +import java.time.format.DateTimeFormatter + +class OffsetDateTimeAdapter { + @ToJson + fun toJson(value: OffsetDateTime): String { + return DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(value) + } + + @FromJson + fun fromJson(value: String): OffsetDateTime { + return OffsetDateTime.parse(value, DateTimeFormatter.ISO_OFFSET_DATE_TIME) + } + +} diff --git a/api/src/main/java/com/example/openapigenerationtestapi/infrastructure/Serializer.kt b/api/src/main/java/com/example/openapigenerationtestapi/infrastructure/Serializer.kt new file mode 100644 index 0000000..5862ee3 --- /dev/null +++ b/api/src/main/java/com/example/openapigenerationtestapi/infrastructure/Serializer.kt @@ -0,0 +1,23 @@ +package com.example.openapigenerationtestapi.infrastructure + +import com.squareup.moshi.Moshi +import com.squareup.moshi.adapters.Rfc3339DateJsonAdapter +import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory +import java.util.Date + +object Serializer { + @JvmStatic + val moshiBuilder: Moshi.Builder = Moshi.Builder() + .add(Date::class.java, Rfc3339DateJsonAdapter().nullSafe()) + .add(OffsetDateTimeAdapter()) + .add(LocalDateTimeAdapter()) + .add(LocalDateAdapter()) + .add(UUIDAdapter()) + .add(ByteArrayAdapter()) + .add(KotlinJsonAdapterFactory()) + + @JvmStatic + val moshi: Moshi by lazy { + moshiBuilder.build() + } +} diff --git a/api/src/main/java/com/example/openapigenerationtestapi/infrastructure/UUIDAdapter.kt b/api/src/main/java/com/example/openapigenerationtestapi/infrastructure/UUIDAdapter.kt new file mode 100644 index 0000000..30554b0 --- /dev/null +++ b/api/src/main/java/com/example/openapigenerationtestapi/infrastructure/UUIDAdapter.kt @@ -0,0 +1,13 @@ +package com.example.openapigenerationtestapi.infrastructure + +import com.squareup.moshi.FromJson +import com.squareup.moshi.ToJson +import java.util.UUID + +class UUIDAdapter { + @ToJson + fun toJson(uuid: UUID) = uuid.toString() + + @FromJson + fun fromJson(s: String) = UUID.fromString(s) +} diff --git a/api/src/main/java/com/example/openapigenerationtestapi/sp/api/ItemApi.kt b/api/src/main/java/com/example/openapigenerationtestapi/sp/api/ItemApi.kt new file mode 100644 index 0000000..91fe79d --- /dev/null +++ b/api/src/main/java/com/example/openapigenerationtestapi/sp/api/ItemApi.kt @@ -0,0 +1,16 @@ +package com.example.openapigenerationtestapi.sp.api + +import com.example.openapigenerationtestapi.infrastructure.CollectionFormats.* +import retrofit2.http.* +import retrofit2.Call +import okhttp3.RequestBody +import okhttp3.ResponseBody +import okhttp3.MultipartBody + +import com.example.openapigenerationtestapi.sp.model.Item + +interface ItemApi { + @GET("/api/v2/items") + fun getAllItems(@Query("page") page: kotlin.String, @Query("per_page") perPage: kotlin.String, @Query("query") query: kotlin.String): Call> + +} diff --git a/api/src/main/java/com/example/openapigenerationtestapi/sp/api/UserApi.kt b/api/src/main/java/com/example/openapigenerationtestapi/sp/api/UserApi.kt new file mode 100644 index 0000000..7c9849e --- /dev/null +++ b/api/src/main/java/com/example/openapigenerationtestapi/sp/api/UserApi.kt @@ -0,0 +1,19 @@ +package com.example.openapigenerationtestapi.sp.api + +import com.example.openapigenerationtestapi.infrastructure.CollectionFormats.* +import retrofit2.http.* +import retrofit2.Call +import okhttp3.RequestBody +import okhttp3.ResponseBody +import okhttp3.MultipartBody + +import com.example.openapigenerationtestapi.sp.model.User + +interface UserApi { + @GET("/api/v2/users") + fun getAllUser(@Query("page") page: kotlin.String, @Query("per_page") perPage: kotlin.String): Call> + + @GET("/api/v2/users/{user_id}") + fun getUser(@Path("user_id") userId: kotlin.String): Call + +} diff --git a/api/src/main/java/com/example/openapigenerationtestapi/sp/model/Group.kt b/api/src/main/java/com/example/openapigenerationtestapi/sp/model/Group.kt new file mode 100644 index 0000000..fdacb6d --- /dev/null +++ b/api/src/main/java/com/example/openapigenerationtestapi/sp/model/Group.kt @@ -0,0 +1,46 @@ +/** +* OpenAPI Generator test with Qiita API +* Qiita API を用いたOpenAPI Generator のテストです。 +* +* The version of the OpenAPI document: 0.0.0 +* +* +* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). +* https://openapi-generator.tech +* Do not edit the class manually. +*/ +package com.example.openapigenerationtestapi.sp.model + + +import com.squareup.moshi.Json +/** + * Qiita Teamのグループを表します。 + * @param createdAt データが作成された日時 + * @param id グループの一意なIDを表します。 + * @param name グループに付けられた表示用の名前を表します。 + * @param private 非公開グループかどうかを表します。 + * @param updatedAt データが最後に更新された日時 + * @param urlName グループのチーム上での一意な名前を表します。 + */ + +data class Group ( + /* データが作成された日時 */ + @Json(name = "created_at") + val createdAt: java.time.OffsetDateTime? = null, + /* グループの一意なIDを表します。 */ + @Json(name = "id") + val id: kotlin.Int? = null, + /* グループに付けられた表示用の名前を表します。 */ + @Json(name = "name") + val name: kotlin.String? = null, + /* 非公開グループかどうかを表します。 */ + @Json(name = "private") + val private: kotlin.Boolean? = null, + /* データが最後に更新された日時 */ + @Json(name = "updated_at") + val updatedAt: java.time.OffsetDateTime? = null, + /* グループのチーム上での一意な名前を表します。 */ + @Json(name = "url_name") + val urlName: kotlin.String? = null +) + diff --git a/api/src/main/java/com/example/openapigenerationtestapi/sp/model/Item.kt b/api/src/main/java/com/example/openapigenerationtestapi/sp/model/Item.kt new file mode 100644 index 0000000..497ca5c --- /dev/null +++ b/api/src/main/java/com/example/openapigenerationtestapi/sp/model/Item.kt @@ -0,0 +1,87 @@ +/** +* OpenAPI Generator test with Qiita API +* Qiita API を用いたOpenAPI Generator のテストです。 +* +* The version of the OpenAPI document: 0.0.0 +* +* +* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). +* https://openapi-generator.tech +* Do not edit the class manually. +*/ +package com.example.openapigenerationtestapi.sp.model + +import com.example.openapigenerationtestapi.sp.model.Group +import com.example.openapigenerationtestapi.sp.model.Tag +import com.example.openapigenerationtestapi.sp.model.User + +import com.squareup.moshi.Json +/** + * ユーザからの投稿を表します。 + * @param renderedBody HTML形式の本文 + * @param body Markdown形式の本文 + * @param coediting この記事が共同更新状態かどうか (Qiita Teamでのみ有効) + * @param commentsCount この記事へのコメントの数 + * @param createdAt データが作成された日時 + * @param group + * @param id 記事の一意なID + * @param likesCount この記事への「LGTM!」の数(Qiitaでのみ有効) + * @param private 限定共有状態かどうかを表すフラグ (Qiita Teamでは無効) + * @param reactionsCount 絵文字リアクションの数(Qiita Teamでのみ有効) + * @param tags 記事に付いたタグ一覧 + * @param title 記事のタイトル + * @param updatedAt データが最後に更新された日時 + * @param url 記事のURL + * @param user + * @param pageViewsCount 閲覧数 + */ + +data class Item ( + /* HTML形式の本文 */ + @Json(name = "rendered_body") + val renderedBody: kotlin.String? = null, + /* Markdown形式の本文 */ + @Json(name = "body") + val body: kotlin.String? = null, + /* この記事が共同更新状態かどうか (Qiita Teamでのみ有効) */ + @Json(name = "coediting") + val coediting: kotlin.Boolean? = null, + /* この記事へのコメントの数 */ + @Json(name = "comments_count") + val commentsCount: kotlin.Int? = null, + /* データが作成された日時 */ + @Json(name = "created_at") + val createdAt: java.time.OffsetDateTime? = null, + @Json(name = "group") + val group: Group? = null, + /* 記事の一意なID */ + @Json(name = "id") + val id: kotlin.String? = null, + /* この記事への「LGTM!」の数(Qiitaでのみ有効) */ + @Json(name = "likes_count") + val likesCount: kotlin.Int? = null, + /* 限定共有状態かどうかを表すフラグ (Qiita Teamでは無効) */ + @Json(name = "private") + val private: kotlin.Boolean? = null, + /* 絵文字リアクションの数(Qiita Teamでのみ有効) */ + @Json(name = "reactions_count") + val reactionsCount: kotlin.Int? = null, + /* 記事に付いたタグ一覧 */ + @Json(name = "tags") + val tags: kotlin.Array? = null, + /* 記事のタイトル */ + @Json(name = "title") + val title: kotlin.String? = null, + /* データが最後に更新された日時 */ + @Json(name = "updated_at") + val updatedAt: java.time.OffsetDateTime? = null, + /* 記事のURL */ + @Json(name = "url") + val url: kotlin.String? = null, + @Json(name = "user") + val user: User? = null, + /* 閲覧数 */ + @Json(name = "page_views_count") + val pageViewsCount: kotlin.Int? = null +) + diff --git a/api/src/main/java/com/example/openapigenerationtestapi/sp/model/Tag.kt b/api/src/main/java/com/example/openapigenerationtestapi/sp/model/Tag.kt new file mode 100644 index 0000000..94d81ff --- /dev/null +++ b/api/src/main/java/com/example/openapigenerationtestapi/sp/model/Tag.kt @@ -0,0 +1,38 @@ +/** +* OpenAPI Generator test with Qiita API +* Qiita API を用いたOpenAPI Generator のテストです。 +* +* The version of the OpenAPI document: 0.0.0 +* +* +* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). +* https://openapi-generator.tech +* Do not edit the class manually. +*/ +package com.example.openapigenerationtestapi.sp.model + + +import com.squareup.moshi.Json +/** + * 記事に付けられた個々のタグを表します。 + * @param followersCount このタグをフォローしているユーザの数 + * @param iconUrl このタグに設定されたアイコン画像のURL + * @param id タグを特定するための一意な名前 + * @param itemsCount このタグが付けられた記事の数 + */ + +data class Tag ( + /* このタグをフォローしているユーザの数 */ + @Json(name = "followers_count") + val followersCount: kotlin.Int? = null, + /* このタグに設定されたアイコン画像のURL */ + @Json(name = "icon_url") + val iconUrl: kotlin.String? = null, + /* タグを特定するための一意な名前 */ + @Json(name = "id") + val id: kotlin.String? = null, + /* このタグが付けられた記事の数 */ + @Json(name = "items_count") + val itemsCount: kotlin.Int? = null +) + diff --git a/api/src/main/java/com/example/openapigenerationtestapi/sp/model/User.kt b/api/src/main/java/com/example/openapigenerationtestapi/sp/model/User.kt new file mode 100644 index 0000000..63d9ae0 --- /dev/null +++ b/api/src/main/java/com/example/openapigenerationtestapi/sp/model/User.kt @@ -0,0 +1,86 @@ +/** +* OpenAPI Generator test with Qiita API +* Qiita API を用いたOpenAPI Generator のテストです。 +* +* The version of the OpenAPI document: 0.0.0 +* +* +* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). +* https://openapi-generator.tech +* Do not edit the class manually. +*/ +package com.example.openapigenerationtestapi.sp.model + + +import com.squareup.moshi.Json +/** + * Qiita上のユーザを表します。 + * @param description 自己紹介文 + * @param facebookId Facebook ID + * @param followeesCount このユーザがフォローしているユーザの数 + * @param followersCount このユーザをフォローしているユーザの数 + * @param githubLoginName GitHub ID + * @param id ユーザID + * @param itemsCount このユーザが qiita.com 上で公開している記事の数 (Qiita Teamでの記事数は含まれません) + * @param linkedinId LinkedIn ID + * @param location 居住地 + * @param name 設定している名前 + * @param organization 所属している組織 + * @param permanentId ユーザごとに割り当てられる整数のID + * @param profileImageUrl 設定しているプロフィール画像のURL + * @param teamOnly Qiita Team専用モードに設定されているかどうか + * @param twitterScreenName Twitterのスクリーンネーム + * @param websiteUrl 設定しているWebサイトのURL + */ + +data class User ( + /* 自己紹介文 */ + @Json(name = "description") + val description: kotlin.String? = null, + /* Facebook ID */ + @Json(name = "facebook_id") + val facebookId: kotlin.String? = null, + /* このユーザがフォローしているユーザの数 */ + @Json(name = "followees_count") + val followeesCount: kotlin.Int? = null, + /* このユーザをフォローしているユーザの数 */ + @Json(name = "followers_count") + val followersCount: kotlin.Int? = null, + /* GitHub ID */ + @Json(name = "github_login_name") + val githubLoginName: kotlin.String? = null, + /* ユーザID */ + @Json(name = "id") + val id: kotlin.String? = null, + /* このユーザが qiita.com 上で公開している記事の数 (Qiita Teamでの記事数は含まれません) */ + @Json(name = "items_count") + val itemsCount: kotlin.Int? = null, + /* LinkedIn ID */ + @Json(name = "linkedin_id") + val linkedinId: kotlin.String? = null, + /* 居住地 */ + @Json(name = "location") + val location: kotlin.String? = null, + /* 設定している名前 */ + @Json(name = "name") + val name: kotlin.String? = null, + /* 所属している組織 */ + @Json(name = "organization") + val organization: kotlin.String? = null, + /* ユーザごとに割り当てられる整数のID */ + @Json(name = "permanent_id") + val permanentId: kotlin.Int? = null, + /* 設定しているプロフィール画像のURL */ + @Json(name = "profile_image_url") + val profileImageUrl: kotlin.String? = null, + /* Qiita Team専用モードに設定されているかどうか */ + @Json(name = "team_only") + val teamOnly: kotlin.Boolean? = null, + /* Twitterのスクリーンネーム */ + @Json(name = "twitter_screen_name") + val twitterScreenName: kotlin.String? = null, + /* 設定しているWebサイトのURL */ + @Json(name = "website_url") + val websiteUrl: kotlin.String? = null +) +