Initial commit of basic cloudflare integration

This commit is contained in:
nathan 2019-06-21 19:16:57 +02:00
parent 5eb10b0802
commit f695333664
34 changed files with 2948 additions and 0 deletions

126
src/dorkbox/Kloudflare.kt Normal file
View File

@ -0,0 +1,126 @@
/*
* Copyright 2019 dorkbox, llc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package dorkbox
import com.squareup.moshi.Moshi
import com.squareup.moshi.Types
import dorkbox.api.CloudflareActions
import dorkbox.api.core.CfErrorResponse
import dorkbox.api.core.CfResponse
import dorkbox.api.core.Error
import dorkbox.api.core.ISO8601Adapter
import dorkbox.api.dns.DnsRecord
import dorkbox.api.dns.DnsRecordTypeAdapter
import dorkbox.api.user.BillingHistory
import dorkbox.api.user.BillingProfile
import dorkbox.api.user.User
import dorkbox.api.zone.RatePlan
import dorkbox.api.zone.Zone
import dorkbox.api.zone.settings.ZoneSetting
import okhttp3.OkHttpClient
import okhttp3.ResponseBody
import okhttp3.logging.HttpLoggingInterceptor
import org.slf4j.LoggerFactory
import retrofit2.Call
import retrofit2.Converter
import retrofit2.Retrofit
import retrofit2.converter.moshi.MoshiConverterFactory
import java.io.IOException
class Kloudflare(private val xAuthEmail: String, private val xAuthKey: String) {
private val logger = LoggerFactory.getLogger(Kloudflare::class.java)
companion object {
private const val API_BASE_URL = "https://api.cloudflare.com/client/v4/"
val errorConverter: Converter<ResponseBody, CfErrorResponse>
val cloudflare: CloudflareActions
init {
// JSON mapping to java classes
val httpClient = OkHttpClient.Builder()
val interceptor = HttpLoggingInterceptor()
interceptor.level = HttpLoggingInterceptor.Level.BODY
val client = httpClient
// .addInterceptor(interceptor) // this is the raw HTTP interceptor
.build()
val moshi = Moshi.Builder()
.add(ISO8601Adapter())
.add(DnsRecordTypeAdapter())
.build()
val adapter = moshi.adapter<List<String>>(Types.newParameterizedType(List::class.java, String::class.java))
val retrofit = Retrofit.Builder()
.baseUrl(API_BASE_URL)
.addConverterFactory(MoshiConverterFactory.create(moshi))
.client(client)
.build()
errorConverter = retrofit.responseBodyConverter<CfErrorResponse>(CfErrorResponse::class.java, CfErrorResponse::class.annotations.toTypedArray())
cloudflare = retrofit.create(CloudflareActions::class.java)
}
fun <T> wrap(call: Call<CfResponse<T>>): T {
val response = call.execute()
val body = response.body()
if (response.isSuccessful && body != null && body.success) {
return body.result!!
}
val errorResponse = errorConverter.convert(response.errorBody()!!)
throw IOException("HTTP call failed: " + errorResponse?.errors?.joinToString { error: Error -> "[${error.code} : ${error.message}]" })
}
}
fun getUser() : User {
return wrap(cloudflare.getUser(xAuthEmail, xAuthKey))
}
fun getUserBillingProfile(): BillingProfile {
return wrap(cloudflare.getUserBillingProfile(xAuthEmail, xAuthKey))
}
fun getUserBillingHistory(): BillingHistory {
return wrap(cloudflare.getUserBillingHistory(xAuthEmail, xAuthKey))
}
fun listZones(options: Map<String, String> = emptyMap()): List<Zone> {
return wrap(cloudflare.listZones(xAuthEmail, xAuthKey, options))
}
fun getZoneRatePlans(zoneIdentifier: String): RatePlan {
return wrap(cloudflare.getZoneRatePlans(xAuthEmail, xAuthKey, zoneIdentifier))
}
fun getZoneSettings(zoneIdentifier: String): ZoneSetting {
return wrap(cloudflare.getZoneSettings(xAuthEmail, xAuthKey, zoneIdentifier))
}
fun listDnsRecords(zoneIdentifier: String): List<DnsRecord> {
return wrap(cloudflare.listDnsRecords(xAuthEmail, xAuthKey, zoneIdentifier))
}
}

View File

@ -0,0 +1,85 @@
/*
* Copyright 2019 dorkbox, llc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package dorkbox.api
import dorkbox.api.core.CfResponse
import dorkbox.api.dns.DnsRecord
import dorkbox.api.user.BillingHistory
import dorkbox.api.user.BillingProfile
import dorkbox.api.user.User
import dorkbox.api.zone.RatePlan
import dorkbox.api.zone.Zone
import dorkbox.api.zone.settings.ZoneSetting
import retrofit2.Call
import retrofit2.http.*
interface CloudflareActions {
@Headers("Content-Type: application/json")
@GET("user")
fun getUser(
@Header("X-Auth-Email") email: String,
@Header("X-Auth-Key") key: String
): Call<CfResponse<User>>
@Headers("Content-Type: application/json")
@GET("user/billing/profile")
fun getUserBillingProfile(
@Header("X-Auth-Email") email: String,
@Header("X-Auth-Key") key: String
): Call<CfResponse<BillingProfile>>
@Headers("Content-Type: application/json")
@GET("user/billing/history")
fun getUserBillingHistory(
@Header("X-Auth-Email") email: String,
@Header("X-Auth-Key") key: String
): Call<CfResponse<BillingHistory>>
@Headers("Content-Type: application/json")
@GET("zones")
fun listZones(
@Header("X-Auth-Email") email: String,
@Header("X-Auth-Key") key: String,
@QueryMap options: Map<String, String>
): Call<CfResponse<List<Zone>>>
@Headers("Content-Type: application/json")
@GET("zones/{zone_identifier}/available_rate_plans")
fun getZoneRatePlans(
@Header("X-Auth-Email") email: String,
@Header("X-Auth-Key") key: String,
@Path("zone_identifier") zoneIdentifier: String
): Call<CfResponse<RatePlan>>
@Headers("Content-Type: application/json")
@GET("zones/{zone_identifier}/settings")
fun getZoneSettings(
@Header("X-Auth-Email") email: String,
@Header("X-Auth-Key") key: String,
@Path("zone_identifier") zoneIdentifier: String
): Call<CfResponse<ZoneSetting>>
@Headers("Content-Type: application/json")
@GET("zones/{zone_identifier}/dns_records")
fun listDnsRecords(
@Header("X-Auth-Email") email: String,
@Header("X-Auth-Key") key: String,
@Path("zone_identifier") zoneIdentifier: String
): Call<CfResponse<List<DnsRecord>>>
}

View File

@ -0,0 +1,49 @@
/*
* Copyright 2019 dorkbox, llc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package dorkbox.api.core
import com.squareup.moshi.Json
/**
* Date fields will always be in UTC ISO-8601 format, including microseconds.
*/
open class CfErrorResponse {
// HTTP response codes
//200 OK request successful
//304 Not Modified
//400 Bad Request request was invalid
//401 Unauthorized user does not have permission
//403 Forbidden request not authenticated
//429 Too many requests client is rate limited
//405 Method Not Allowed incorrect HTTP method provided
//415 Unsupported Media Type response is not valid JSON
@field:[Json(name = "success")]
val success = false
@field:[Json(name = "errors")]
val errors = listOf<Error>()
@field:[Json(name = "messages")]
val messages = listOf<String>()
@field:[Json(name = "result_info")]
val resultInfo: ResultInfo? = null
override fun toString(): String {
return "Response(success=$success, errors=$errors, messages=$messages, resultInfo=$resultInfo)"
}
}

View File

@ -0,0 +1,55 @@
/*
* Copyright 2019 dorkbox, llc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package dorkbox.api.core
import com.squareup.moshi.Json
/**
* Date fields will always be in UTC ISO-8601 format, including microseconds.
*/
open class CfResponse<T> {
// HTTP response codes
//200 OK request successful
//304 Not Modified
//400 Bad Request request was invalid
//401 Unauthorized user does not have permission
//403 Forbidden request not authenticated
//429 Too many requests client is rate limited
//405 Method Not Allowed incorrect HTTP method provided
//415 Unsupported Media Type response is not valid JSON
/**
* The data requested is wrapped in the result tag. If you have a response, it will always be within the result field
*/
@field:[Json(name = "result")]
val result: T? = null
@field:[Json(name = "success")]
val success = false
@field:[Json(name = "errors")]
val errors = listOf<Error>()
@field:[Json(name = "messages")]
val messages = listOf<String>()
@field:[Json(name = "result_info")]
val resultInfo: ResultInfo? = null
override fun toString(): String {
return "Response(result=$result, success=$success, errors=$errors, messages=$messages, resultInfo=$resultInfo)"
}
}

View File

@ -0,0 +1,26 @@
/*
* Copyright 2019 dorkbox, llc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package dorkbox.api.core
import com.squareup.moshi.Json
class Error {
@field:[Json(name = "code")]
val code = 0
@field:[Json(name = "message")]
val message = ""
}

View File

@ -0,0 +1,52 @@
/*
* Copyright 2019 dorkbox, llc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package dorkbox.api.core
import com.squareup.moshi.FromJson
import com.squareup.moshi.JsonQualifier
import com.squareup.moshi.ToJson
import java.time.LocalDateTime
import java.time.format.DateTimeFormatter
@Retention(AnnotationRetention.RUNTIME)
@JsonQualifier
annotation class ISO8601
/** Converts byte arrays to base64 (so it looks better as a string...) */
internal class ISO8601Adapter {
companion object {
// 2014-05-28T18:46:18.764425Z
private val format: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
}
@ToJson
fun toJson(@ISO8601 date: LocalDateTime): String {
return format.format(date)
}
@FromJson
@ISO8601
fun fromJson(dateString: String): LocalDateTime {
return try {
return LocalDateTime.parse(dateString, format)
}
catch (ignored: Exception) {
// if there is an error, return epoc
LocalDateTime.now()
}
}
}

View File

@ -0,0 +1,56 @@
/*
* Copyright 2019 dorkbox, llc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package dorkbox.api.core
/**
* https://api.cloudflare.com/#getting-started-requests
*/
class Pagination {
enum class Direction { ASC, DESC }
/**
* Which page of results to return
*/
var page = 0
/**
* How many results to return per page
*/
var perPage = 1
/**
* Attribute name to order the responses by
*/
var order = ""
/**
* Either ASC or DESC
*/
var direction = Direction.ASC
override fun toString(): String {
return "ResultInfo(page=$page, per_page=$perPage, order=$order, direction=$direction)"
}
fun getAsQueryStringsMap(): Map<String, Any> {
return mapOf(
"page" to page,
"per_page" to perPage,
"order" to order,
"direction" to direction.name
)
}
}

View File

@ -0,0 +1,36 @@
/*
* Copyright 2019 dorkbox, llc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package dorkbox.api.core
import com.squareup.moshi.Json
class ResultInfo {
@field:[Json(name = "page")]
val page = 1
@field:[Json(name = "per_page")]
val perPage = 20
@field:[Json(name = "count")]
val count = 1
@field:[Json(name = "total_count")]
val totalCount = 200
override fun toString(): String {
return "ResultInfo(page=$page, perPage=$perPage, count=$count, totalCount=$totalCount)"
}
}

View File

@ -0,0 +1,21 @@
/*
* Copyright 2019 dorkbox, llc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package dorkbox.api.dns
class ARecord : DnsRecord() {
val asd = ""
}

View File

@ -0,0 +1,103 @@
/*
* Copyright 2019 dorkbox, llc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package dorkbox.api.dns
import com.squareup.moshi.Json
import dorkbox.api.core.ISO8601
import java.time.LocalDateTime
/**
* https://api.cloudflare.com/#dns-records-for-a-zone-properties
*/
open class DnsRecord {
/**
* DNS record identifier tag
*/
@field:[Json(name = "id")]
var id = ""
/**
* Record type
* A, AAAA, CNAME, TXT, SRV, LOC, MX, NS, SPF, CERT, DNSKEY, DS, NAPTR, SMIMEA, SSHFP, TLSA, URI
*/
@field:[Json(name = "type") DnsType]
var type = RecordType.A
/**
* DNS record name
*/
@field:[Json(name = "name")]
var name= ""
/**
* A valid IPv4 address
*/
@field:[Json(name = "content")]
var content = ""
/**
* Whether the record can be proxied by Cloudflare or not
*/
@field:[Json(name = "proxiable")]
var proxiable = true
/**
* Whether the record is receiving the performance and security benefits of Cloudflare
*/
@field:[Json(name = "proxied")]
var proxied = false
/**
* Time to live for DNS record. Value of 1 is 'automatic'
*/
@field:[Json(name = "ttl")]
var ttl = 1
/**
* Whether this record can be modified/deleted (true means it's managed by Cloudflare)
*/
@field:[Json(name = "locked")]
var locked = false
/**
* Zone identifier tag
*/
@field:[Json(name = "zone_id")]
var zoneId = ""
@field:[Json(name = "zone_name")]
var zoneName = ""
/**
* When the record was last modified
*/
@field:[Json(name = "modified_on") ISO8601]
var modifiedOn = LocalDateTime.now()
/**
* When the record was created
*/
@field:[Json(name = "created_on") ISO8601]
var createdOn = LocalDateTime.now()
@field:[Json(name = "meta")]
var meta = Meta()
/**
* Metadata about the record
*/
var data: String? = null
}

View File

@ -0,0 +1,38 @@
/*
* Copyright 2019 dorkbox, llc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package dorkbox.api.dns
import com.squareup.moshi.FromJson
import com.squareup.moshi.JsonQualifier
import com.squareup.moshi.ToJson
@Retention(AnnotationRetention.RUNTIME)
@JsonQualifier
annotation class DnsType
/** Converts byte arrays to base64 (so it looks better as a string...) */
internal class DnsRecordTypeAdapter {
@ToJson
fun toJson(@DnsType recordType: RecordType): String {
return recordType.name
}
@FromJson
@DnsType
fun fromJson(recordType: String): RecordType {
return RecordType.valueOf(recordType)
}
}

View File

@ -0,0 +1,34 @@
/*
* Copyright 2019 dorkbox, llc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package dorkbox.api.dns
import com.squareup.moshi.Json
/**
* https://api.cloudflare.com/#dns-records-for-a-zone-properties
*/
class Meta {
/**
* Will exist if Cloudflare automatically added this DNS record during initial setup.
*/
@field:[Json(name = "auto_added")]
val autoAdded = false
@field:[Json(name = "managed_by_apps")]
val managedByApps = false
}

View File

@ -0,0 +1,20 @@
/*
* Copyright 2019 dorkbox, llc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package dorkbox.api.dns
enum class RecordType {
A, AAAA, CNAME, TXT, SRV, LOC, MX, NS, SPF, CERT, DNSKEY, DS, NAPTR, SMIMEA, SSHFP, TLSA, URI
}

View File

@ -0,0 +1,79 @@
/*
* Copyright 2019 dorkbox, llc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package dorkbox.api.user
import com.squareup.moshi.Json
import dorkbox.api.core.ISO8601
import dorkbox.api.zone.Zone
import java.time.LocalDateTime
/**
* https://api.cloudflare.com/#user-billing-history-billing-history
*/
class BillingHistory {
/**
* Billing item identifier tag
*/
@field:[Json(name = "id")]
val id = ""
/**
* The billing item type
*/
@field:[Json(name = "type")]
val type = "charge"
/**
* The billing item action
*/
@field:[Json(name = "action")]
val action = "subscription"
/**
* The billing item description
*/
@field:[Json(name = "description")]
val description = "The billing item description"
/**
* When the billing item was created
*/
@field:[Json(name = "occurred_at") ISO8601]
val occurredAt= LocalDateTime.now()
/**
* The amount associated with this billing item
*/
@field:[Json(name = "amount")]
val amount: Double = 20.99
/**
* The monetary unit in which pricing information is displayed
*/
@field:[Json(name = "currency")]
val currency = "USD"
/**
*
*/
@field:[Json(name = "zone")]
val zone = Zone()
override fun toString(): String {
return "BillingHistory(id='$id', type='$type', action='$action', description='$description', occurredAt=$occurredAt, amount=$amount, currency='$currency', zone=$zone)"
}
}

View File

@ -0,0 +1,157 @@
/*
* Copyright 2019 dorkbox, llc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package dorkbox.api.user
import com.squareup.moshi.Json
import dorkbox.api.core.ISO8601
import java.time.LocalDateTime
/**
* https://api.cloudflare.com/#user-billing-profile-billing-profile
*/
class BillingProfile {
/**
* The email address associated with this payment type
*/
@field:[Json(name = "payment_email")]
val paymentEmail = ""
/**
* Billing profile identifier tag
*/
@field:[Json(name = "id")]
val id = ""
/**
* The first name on the billing profile
*/
@field:[Json(name = "first_name")]
val firstName = ""
/**
* The last name on the billing profile
*/
@field:[Json(name = "last_name")]
val lastName = ""
/**
* Street address on the billing profile
*/
@field:[Json(name = "address")]
val address = ""
/**
* Street address continued, apartment/suite, etc (optional)
*/
@field:[Json(name = "address2")]
val address2 = ""
/**
* The company name on the billing profile
*/
@field:[Json(name = "company")]
val company = ""
/**
* The city on the billing profile
*/
@field:[Json(name = "city")]
val city = ""
/**
* the state/province on the billing profile
*/
@field:[Json(name = "state")]
val state = ""
/**
* The zipcode on the billing profile
*/
@field:[Json(name = "zipCode")]
val zipcode = ""
/**
* the country of the address on the billing profile
*/
@field:[Json(name = "country")]
val country = ""
/**
* The telephone associated with the billing profile
*/
@field:[Json(name = "telephone")]
val telephone = ""
/**
* The last four digits of the credit card on file
*/
@field:[Json(name = "card_number")]
val cardNumber = ""
/**
* The month number (1-12) of when the credit card on file expires
*/
@field:[Json(name = "card_expiry_month")]
val cardExpiryMonth = 1
/**
* The year when the credit card on file expires
*/
@field:[Json(name = "card_expiry_year")]
val cardExpiryYear = 2020
/**
* Value Added Tax ID
*/
@field:[Json(name = "vat")]
val vat = ""
/**
* Information about a customer's device collected by client SDK
*/
@field:[Json(name = "device_data")]
val deviceData = ""
/**
* The gateway which was used to tokenize the payment method
* braintree, paypal
*/
@field:[Json(name = "payment_gateway")]
val paymentGateway = ""
/**
* The string returned by the client SDK to represent a payment method
*/
@field:[Json(name = "payment_nonce")]
val paymentNonce = ""
/**
* When the profile was last modified
*/
@field:[Json(name = "edited_on") ISO8601]
val editedOn = LocalDateTime.now()
/**
* When the profile was created
*/
@field:[Json(name = "created_on") ISO8601]
val createdOn = LocalDateTime.now()
override fun toString(): String {
return "BillingProfile(paymentEmail='$paymentEmail', id='$id', firstName='$firstName', lastName='$lastName', address='$address', address2='$address2', company='$company', city='$city', state='$state', zipcode='$zipcode', country='$country', telephone='$telephone', cardNumber='$cardNumber', cardExpiryMonth=$cardExpiryMonth, cardExpiryYear=$cardExpiryYear, vat='$vat', deviceData='$deviceData', paymentGateway='$paymentGateway', paymentNonce='$paymentNonce', editedOn=$editedOn, createdOn=$createdOn)"
}
}

View File

@ -0,0 +1,114 @@
/*
* Copyright 2019 dorkbox, llc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package dorkbox.api.user
import com.squareup.moshi.Json
import dorkbox.api.core.ISO8601
import java.time.LocalDateTime
/**
* https://api.cloudflare.com/#user-properties
*/
class User {
/**
* A list of betas the user is currently participating in. If a beta is zone-specific, the beta will apply to all zones.
*/
@field:[Json(name = "betas")]
val betas = listOf<String>()
/**
* A list of the organizations the user is a member of (or invited to) and the permissions granted to them.
*/
@field:[Json(name = "organizations")]
val organizations = listOf<UserOrganization>()
/**
* User's telephone number
*/
@field:[Json(name = "telephone")]
val telephone: String? = null
/**
* The zipcode or postal code where the user lives.
*/
@field:[Json(name = "zipcode")]
val zipcode: String? = null
/**
* User's last name
*/
@field:[Json(name = "last_name")]
val lastName: String? = null
/**
* Last time the user was modified
*/
@field:[Json(name = "modified_on") ISO8601]
val modifiedOn= LocalDateTime.now()
/**
* A username used to access other cloudflare services, like support
*/
@field:[Json(name = "username")]
val userName = ""
/**
* When the user signed up.
*/
@field:[Json(name = "created_on") ISO8601]
val createdOn= LocalDateTime.now()
/**
* The country in which the user lives.
*/
@field:[Json(name = "country")]
val country: String? = null
/**
* Whether two-factor authentication is enabled for the user account. This does not apply to API authentication
*/
@field:[Json(name = "two_factor_authentication_enabled")]
val twoFactorAuthenticationEnabled = false
/**
* User's first name
*/
@field:[Json(name = "first_name")]
val firstName: String? = null
/**
* User identifier tag
*/
@field:[Json(name = "id")]
val id = ""
/**
* Indicates whether the user is prevented from performing certain actions within their account
*/
@field:[Json(name = "suspended")]
val suspended = false
/**
* Your contact email address
*/
@field:[Json(name = "email")]
val email = ""
override fun toString(): String {
return "User(betas=$betas, organizations=$organizations, telephone=$telephone, zipcode=$zipcode, lastName=$lastName, modifiedOn=$modifiedOn, userName='$userName', createdOn=$createdOn, country=$country, twoFactorAuthenticationEnabled=$twoFactorAuthenticationEnabled, firstName=$firstName, id='$id', suspended=$suspended, email='$email')"
}
}

View File

@ -0,0 +1,58 @@
/*
* Copyright 2019 dorkbox, llc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package dorkbox.api.user
import com.squareup.moshi.Json
/**
* https://api.cloudflare.com/#user-s-organizations-list-organizations
*/
class UserOrganization {
/**
* Organization identifier tag
*/
@field:[Json(name = "id")]
val id = ""
/**
* Organization Name
*/
@field:[Json(name = "name")]
val name = ""
/**
* Whether or not the user is a member of the organization or has an inivitation pending
*/
@field:[Json(name = "status")]
val status = ""
/**
* Access permissions for this User
*/
@field:[Json(name = "permissions")]
val permissions = listOf<String>()
/**
* List of role names for the User at the Organization
*/
@field:[Json(name = "roles")]
val roles= listOf<String>()
override fun toString(): String {
return "UserOrganization(id='$id', name='$name', status='$status', permissions=$permissions, roles=$roles)"
}
}

View File

@ -0,0 +1,91 @@
/*
* Copyright 2019 dorkbox, llc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package dorkbox.api.user.invite
import com.squareup.moshi.Json
import dorkbox.api.core.ISO8601
import java.time.LocalDateTime
/**
* https://api.cloudflare.com/#user-s-invites-properties
*/
class Invite {
/**
* When the invite was sent
*/
@field:[Json(name = "invited_on") ISO8601]
val invitedOn= LocalDateTime.now()
/**
* ID of the Organization the user will be added to
*/
@field:[Json(name = "organization_id")]
val organizationId: String? = null
/**
* When the invite is no longer active
*/
@field:[Json(name = "expires_on")]
val expiresOn: String? = null
/**
* Current status of the invitation
* pending, accepted, rejected, expired
*/
@field:[Json(name = "status")]
val status = "pending"
/**
* Organization Name
*/
@field:[Json(name = "organization_name")]
val organizationName = "Cloudflare, Inc."
/**
* The email address of the user who created the invite
*/
@field:[Json(name = "invited_by")]
val invitedBy: String? = null
/**
* Email address of the user to be added to the Organization
*/
@field:[Json(name = "invited_member_email")]
val invitedMemberEmail: String? = null
/**
* Invite identifier tag
*/
@field:[Json(name = "id")]
val id = ""
/**
* Id of the user to be added to the Organization
*/
@field:[Json(name = "invited_member_id")]
val invitedMemberId: String? = null
/**
* Roles to be assigned to this Member
*/
@field:[Json(name = "roles")]
val roles = listOf<Role>()
override fun toString(): String {
return "Invite(invitedOn=$invitedOn, organizationId=$organizationId, expiresOn=$expiresOn, status='$status', organizationName='$organizationName', invitedBy=$invitedBy, invitedMemberEmail=$invitedMemberEmail, id='$id', invitedMemberId=$invitedMemberId, roles=$roles)"
}
}

View File

@ -0,0 +1,54 @@
/*
* Copyright 2019 dorkbox, llc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package dorkbox.api.user.invite
import com.squareup.moshi.Json
/**
* https://api.cloudflare.com/#user-s-invites-properties
*/
class Role {
/**
* Role identifier tag
*/
@field:[Json(name = "id")]
val id = ""
/**
* Role Name
*/
@field:[Json(name = "name")]
val name: String? = null
/**
* Description of role's permissions
*/
@field:[Json(name = "description")]
val description: String? = null
/**
* Access permissions for this User
*/
@field:[Json(name = "permissions")]
val permissions = listOf<String>()
override fun toString(): String {
return "Role(id='$id', name=$name, description=$description, permissions=$permissions)"
}
}

View File

@ -0,0 +1,27 @@
/*
* Copyright 2019 dorkbox, llc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package dorkbox.api.user.subscription
import com.squareup.moshi.Json
class App {
/**
* app install id
*/
@field:[Json(name = "install_id")]
val installId = ""
}

View File

@ -0,0 +1,48 @@
/*
* Copyright 2019 dorkbox, llc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package dorkbox.api.user.subscription
import com.squareup.moshi.Json
/**
* https://api.cloudflare.com/#user-subscription-properties
*/
class ComponentValue {
/**
* The name of the component_value
*/
@field:[Json(name = "name")]
val name = ""
/**
* The amount of the component value assigned
*/
@field:[Json(name = "value")]
val value = 0
/**
* The default amount assigned.
*/
@field:[Json(name = "default")]
val default = 0
/**
* The unit price for the component value
*/
@field:[Json(name = "price")]
val price = 0
}

View File

@ -0,0 +1,70 @@
/*
* Copyright 2019 dorkbox, llc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package dorkbox.api.user.subscription
import com.squareup.moshi.Json
/**
* https://api.cloudflare.com/#user-subscription-properties
*/
class RatePlan {
/**
* The ID of the rate_plan
*/
@field:[Json(name = "id")]
val id = ""
/**
* The full name of the rate plan
*/
@field:[Json(name = "public_name")]
val publicName = ""
/**
* The currency applied to the rate_plan subscription
*/
@field:[Json(name = "currency")]
val currency = ""
/**
* The scope that this rate_plan applies to
*/
@field:[Json(name = "scope")]
val scope = ""
/**
* The list of sets this rate_plan applies to
*/
@field:[Json(name = "sets")]
val sets = listOf<String>()
/**
* Whether or not a rate_plan is enterprise-based (or newly adopted term contract)
*/
@field:[Json(name = "is_contract")]
val isContract = false
/**
* Whether this rate_plan is managed externally from Cloudflare
*/
@field:[Json(name = "externally_managed")]
val externallyManaged = false
override fun toString(): String {
return "RatePlan(id='$id', publicName='$publicName', currency='$currency', scope='$scope', sets=$sets, isContract=$isContract, externallyManaged=$externallyManaged)"
}
}

View File

@ -0,0 +1,101 @@
/*
* Copyright 2019 dorkbox, llc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package dorkbox.api.user.subscription
import com.squareup.moshi.Json
import dorkbox.api.core.ISO8601
import dorkbox.api.zone.Zone
import java.time.LocalDateTime
/**
* https://api.cloudflare.com/#user-subscription-properties
*/
class Subscription {
/**
* The end of the current period, and also when the next billing is due
*/
@field:[Json(name = "app")]
val app = App()
/**
* The end of the current period, and also when the next billing is due
*/
@field:[Json(name = "current_period_end") ISO8601]
val currentPeriodEnd= LocalDateTime.now()
/**
* The list of add-ons subscribed to
*/
@field:[Json(name = "component_values")]
val componentValues = listOf<ComponentValue>()
/**
* The rate plan applied to the subscription
*/
@field:[Json(name = "rate_plan")]
val ratePlan = RatePlan()
/**
* The price of the subscription that will be billed, in US dollars
*/
@field:[Json(name = "price")]
val price = 0
/**
* When the current billing period started, may be the same as InitialPeriodStart if this is the first period
*/
@field:[Json(name = "current_period_start") ISO8601]
val currentPeriodStart = LocalDateTime.now()
/**
* A simple zone object. May have null properties if not a zone subscription.
*/
@field:[Json(name = "zone")]
val zone = Zone()
/**
* The monetary unit in which pricing information is displayed
*/
@field:[Json(name = "currency")]
val currency = "USD"
/**
* The state that the subscription is in
*
* Trial, Provisioned, Paid, AwaitingPayment, Cancelled, Failed, Expired
*/
@field:[Json(name = "state")]
val state = "Expired"
/**
* Subscription identifier tag
*/
@field:[Json(name = "id")]
val id = ""
/**
* How often the subscription is renewed automatically
*
* weekly, monthly, quarterly, yearly
*/
@field:[Json(name = "frequency")]
val frequency = "weekly"
override fun toString(): String {
return "Subscription(app=$app, currentPeriodEnd=$currentPeriodEnd, componentValues=$componentValues, ratePlan=$ratePlan, price=$price, currentPeriodStart=$currentPeriodStart, zone=$zone, currency='$currency', state='$state', id='$id', frequency='$frequency')"
}
}

View File

@ -0,0 +1,40 @@
/*
* Copyright 2019 dorkbox, llc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package dorkbox.api.zone
import com.squareup.moshi.Json
/**
* https://api.cloudflare.com/#zone-properties
*/
class Account {
/**
* Account identifier tag
*/
@field:[Json(name = "id")]
val id = ""
/**
* Account name
*/
@field:[Json(name = "name")]
val name = ""
override fun toString(): String {
return "Account(id='$id', name='$name')"
}
}

View File

@ -0,0 +1,47 @@
/*
* Copyright 2019 dorkbox, llc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package dorkbox.api.zone
import com.squareup.moshi.Json
/**
* https://api.cloudflare.com/#zone-properties
*/
class Component {
/**
* The unique component
* zones, page_rules, dedicated_certificates, dedicated_certificates_custom
*/
@field:[Json(name = "name")]
val name: String? = null
/**
* The default amount allocated
*/
@field:[Json(name = "default")]
val default = 5
/**
* The unit price of the addon
*/
@field:[Json(name = "unit_price")]
val unitPrice = 0
override fun toString(): String {
return "Components(name=$name, default=$default, unitPrice=$unitPrice)"
}
}

View File

@ -0,0 +1,40 @@
/*
* Copyright 2019 dorkbox, llc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package dorkbox.api.zone
import com.squareup.moshi.Json
/**
* https://api.cloudflare.com/#zone-properties
*/
class Owner {
@field:[Json(name = "id")]
val id = ""
/**
* The type of owner of the zone
*/
@field:[Json(name = "email")]
val email = ""
@field:[Json(name = "owner_type")]
val ownerType = "user"
override fun toString(): String {
return "Owner(id='$id', email='$email', ownerType='$ownerType')"
}
}

View File

@ -0,0 +1,78 @@
/*
* Copyright 2019 dorkbox, llc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package dorkbox.api.zone
import com.squareup.moshi.Json
/**
* https://api.cloudflare.com/#zone-properties
*/
class Plan {
/**
* Plan identifier tag
*/
@field:[Json(name = "id")]
val id = ""
/**
* The plan name
*/
@field:[Json(name = "name")]
val name: String? = null
/**
* The price of the subscription that will be billed, in US dollars
*/
@field:[Json(name = "price")]
val price = 0
/**
* The monetary unit in which pricing information is displayed
*/
@field:[Json(name = "currency")]
val currency = "USD"
/**
* The frequency at which you will be billed for this plan
* weekly, monthly, quarterly, yearly
*/
@field:[Json(name = "frequency")]
val frequency = "weekly"
/**
* A 'friendly' identifier to indicate to the UI what plan the object is
* free, pro, business, enterprise
*/
@field:[Json(name = "legacy_id")]
val legacyId = "free"
/**
* If the zone is subscribed to this plan
*/
@field:[Json(name = "is_subscribed")]
val isSubscribed = false
/**
* If the zone is allowed to subscribe to this plan
*/
@field:[Json(name = "can_subscribe")]
val canSubscribe = false
override fun toString(): String {
return "Plan(id='$id', name=$name, price=$price, currency='$currency', frequency='$frequency', legacyId='$legacyId', isSubscribed=$isSubscribed, canSubscribe=$canSubscribe)"
}
}

View File

@ -0,0 +1,78 @@
/*
* Copyright 2019 dorkbox, llc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package dorkbox.api.zone
import com.squareup.moshi.Json
/**
* https://api.cloudflare.com/#zone-properties
*/
class PlanPending {
/**
* Plan identifier tag
*/
@field:[Json(name = "id")]
val id = ""
/**
* The plan name
*/
@field:[Json(name = "name")]
val name = ""
/**
* The price of the subscription that will be billed, in US dollars
*/
@field:[Json(name = "price")]
val price = 0
/**
* The monetary unit in which pricing information is displayed
*/
@field:[Json(name = "currency")]
val currency = "USD"
/**
* The frequency at which you will be billed for this plan
* weekly, monthly, quarterly, yearly
*/
@field:[Json(name = "frequency")]
val frequency = "weekly"
/**
* A 'friendly' identifier to indicate to the UI what plan the object is
* free, pro, business, enterprise
*/
@field:[Json(name = "legacy_id")]
val legacyId = "free"
/**
* If the zone is subscribed to this plan
*/
@field:[Json(name = "is_subscribed")]
val isSubscribed = false
/**
* If the zone is allowed to subscribe to this plan
*/
@field:[Json(name = "can_subscribe")]
val canSubscribe = false
override fun toString(): String {
return "PlanPending(id='$id', name='$name', price=$price, currency='$currency', frequency='$frequency', legacyId='$legacyId', isSubscribed=$isSubscribed, canSubscribe=$canSubscribe)"
}
}

View File

@ -0,0 +1,65 @@
/*
* Copyright 2019 dorkbox, llc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package dorkbox.api.zone
import com.squareup.moshi.Json
/**
* https://api.cloudflare.com/#zone-properties
*/
class RatePlan {
/**
* Plan identifier tag
*/
@field:[Json(name = "id")]
val id = "free"
/**
* The plan name
*/
@field:[Json(name = "name")]
val name = "Free Plan"
/**
* The monetary unit in which pricing information is displayed
*/
@field:[Json(name = "currency")]
val currency = "USD"
/**
* The duration of the plan subscription
*/
@field:[Json(name = "duration")]
val duration = 1
/**
* The frequency at which you will be billed for this plan
* weekly, monthly, quarterly, yearly
*/
@field:[Json(name = "frequency")]
val frequency = "monthly"
/**
* Array of available components values for the plan
*/
@field:[Json(name = "components")]
val components = listOf<Component>()
override fun toString(): String {
return "RatePlan(id='$id', name='$name', currency='$currency', duration=$duration, frequency='$frequency', components=$components)"
}
}

View File

@ -0,0 +1,139 @@
/*
* Copyright 2019 dorkbox, llc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package dorkbox.api.zone
import com.squareup.moshi.Json
import dorkbox.api.core.ISO8601
import java.time.LocalDateTime
/**
* https://api.cloudflare.com/#zone-properties
*/
class Zone {
@field:[Json(name = "id")]
val id: String = ""
/**
* The domain name
*/
@field:[Json(name = "name")]
val name = "example.com"
/**
* The interval (in seconds) from when development mode expires (positive integer) or last expired (negative integer) for the domain. If development mode has never been enabled, this value is 0.
*/
@field:[Json(name = "development_mode")]
val developmentMode = 0
/**
* Original name servers before moving to Cloudflare
*/
@field:[Json(name = "original_name_servers")]
val originalNameServers: List<String>? = null
/**
* Registrar for the domain at the time of switching to Cloudflare
*/
@field:[Json(name = "original_registrar")]
val originalRegistrar: String? = null
/**
* DNS host at the time of switching to Cloudflare
*/
@field:[Json(name = "original_dnshost")]
val originalDnshost: String? = null
/**
* When the zone was created
*/
@field:[Json(name = "created_on") ISO8601]
val createdOn = LocalDateTime.now()
/**
* When the zone was last modified
*/
@field:[Json(name = "modified_on") ISO8601]
val modifiedOn = LocalDateTime.now()
/**
* Cloudflare-assigned name servers. This is only populated for zones that use Cloudflare DNS
*/
@field:[Json(name = "name_servers")]
val nameServers = listOf<String>()
/**
* Information about the owner of the zone
*/
@field:[Json(name = "owner")]
val owner = Owner()
/**
* Information about the account the zone belongs to
*/
@field:[Json(name = "account")]
val account = Account()
/**
* Available permissions on the zone for the current user requesting the item
*/
@field:[Json(name = "permissions")]
val permissions = listOf<String>()
/**
* A zone plan
*/
@field:[Json(name = "plan")]
val plan = Plan()
/**
* A zone plan
*/
@field:[Json(name = "plan_pending")]
val planPending = PlanPending()
/**
* Status of the zone
* active, pending, initializing, moved, deleted, deactivated
*/
@field:[Json(name = "status")]
val status = "active"
/**
* The last time proof of ownership was detected and the zone was made active
*/
@field:[Json(name = "activated_on") ISO8601]
val activatedOn: LocalDateTime? = null
/**
* Indicates if the zone is only using Cloudflare DNS services. A true value means the zone will not receive security or performance benefits.
*/
@field:[Json(name = "paused")]
val paused = false
/**
* A full zone implies that DNS is hosted with Cloudflare. A partial zone is typically a partner-hosted zone or a CNAME setup.
* full, partial
*/
@field:[Json(name = "type")]
val type = "full"
override fun toString(): String {
return "Zone(id=$id, name='$name', developmentMode=$developmentMode, originalNameServers=$originalNameServers, originalRegistrar=$originalRegistrar, originalDnshost=$originalDnshost, createdOn=$createdOn, modifiedOn=$modifiedOn, nameServers=$nameServers, owner=$owner, account=$account, permissions=$permissions, plan=$plan, planPending=$planPending, status='$status', activatedOn=$activatedOn, paused=$paused, type='$type')"
}
}

View File

@ -0,0 +1,45 @@
/*
* Copyright 2019 dorkbox, llc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package dorkbox.api.zone.settings
import com.squareup.moshi.Json
class MinifyAssetsSetting {
/**
* Account identifier tag
* on, off
*/
@field:[Json(name = "css")]
val css = ""
/**
* Account identifier tag
* on, off
*/
@field:[Json(name = "html")]
val html = ""
/**
* Account identifier tag
* on, off
*/
@field:[Json(name = "js")]
val js = ""
override fun toString(): String {
return "MinifyAssets(css='$css', html='$html', js='$js')"
}
}

View File

@ -0,0 +1,46 @@
/*
* Copyright 2019 dorkbox, llc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package dorkbox.api.zone.settings
import com.squareup.moshi.Json
class MobileRedirectSetting {
/**
* Whether or not the mobile redirection is enabled
* on, off
*/
@field:[Json(name = "status")]
val status = ""
/**
* Which subdomain prefix you wish to redirect visitors on mobile devices to (subdomain must already exist).
*/
@field:[Json(name = "mobile_subdomain")]
val mobileSubdomain: String? = null
/**
* Whether to drop the current page path and redirect to the mobile subdomain URL root or to keep the path and redirect to the same page on the mobile subdomain
* on, off
*/
@field:[Json(name = "strip_uri")]
val strip_uri = false
override fun toString(): String {
return "MobileRedirectSetting(status='$status', mobileSubdomain=$mobileSubdomain, strip_uri=$strip_uri)"
}
}

View File

@ -0,0 +1,48 @@
/*
* Copyright 2019 dorkbox, llc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package dorkbox.api.zone.settings
import com.squareup.moshi.Json
class SecurityHeadingSetting {
/**
* Whether or not strict transport security is enabled
*/
@field:[Json(name = "enabled")]
val enabled = false
/**
* Max age in seconds of the strict transport security
*/
@field:[Json(name = "max_age")]
val maxAge = 1234
/**
* Include all subdomains for strict transport security
*/
@field:[Json(name = "include_subdomains")]
val includeSubdomains = true
/**
* Whether or not to include 'X-Content-Type-Options: nosniff' header
*/
@field:[Json(name = "nosniff")]
val noSniff = true
override fun toString(): String {
return "SecurityHeadingSetting(enabled=$enabled, maxAge=$maxAge, includeSubdomains=$includeSubdomains, noSniff=$noSniff)"
}
}

View File

@ -0,0 +1,822 @@
/*
* Copyright 2019 dorkbox, llc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package dorkbox.api.zone.settings
import com.squareup.moshi.Json
import dorkbox.api.core.ISO8601
import java.time.LocalDateTime
/**
* Always Online Mode
*/
class AlwaysOnline : ZoneSetting() {
/**
* Value of the zone setting
* on, off
*/
@field:[Json(name = "value")]
val value = "on"
override fun toString(): String {
return "AlwaysOnline(value='$value')" + super.toString()
}
}
/**
* Advanced DDoS Protection
*/
class AdvancedDDos : ZoneSetting() {
/**
* Value of the zone setting
* notes: Defaults to on for Business+ plans
* on, off
*/
@field:[Json(name = "value")]
val value = "off"
override fun toString(): String {
return "AdvancedDDos(value='$value')" + super.toString()
}
}
/**
* Brotli Compression
*/
class Brotli : ZoneSetting() {
/**
* Value of the zone setting
* on, off
*/
@field:[Json(name = "value")]
val value = "on"
override fun toString(): String {
return "Brotli(value='$value')" + super.toString()
}
}
/**
* Browser Cache TTL
*/
class BrowserCacheTtl : ZoneSetting() {
/**
* Value of the zone setting
*
* valid values: 30, 60, 300, 1200, 1800, 3600, 7200, 10800, 14400, 18000, 28800, 43200, 57600, 72000, 86400,
* 172800, 259200, 345600, 432000, 691200, 1382400, 2073600, 2678400, 5356800, 16070400, 31536000
*
* notes: The minimum TTL available depends on the plan level of the zone. (Enterprise = 30, Business = 1800, Pro = 1800, Free = 1800)
*/
@field:[Json(name = "value")]
val value = 14400
override fun toString(): String {
return "BrowserCacheTtl(value=$value)" + super.toString()
}
}
/**
* Browser Check
*/
class BrowserCheck : ZoneSetting() {
/**
* Value of the zone setting
* on, off
*/
@field:[Json(name = "value")]
val value = "on"
override fun toString(): String {
return "BrowserCheck(value='$value')" + super.toString()
}
}
/**
* Cloudflare CNAME Flattening
*/
class FlattenAtRoot: ZoneSetting() {
/**
* Value of the zone setting
* flatten_at_root, flatten_all
*/
@field:[Json(name = "value")]
val value = "flatten_at_root"
override fun toString(): String {
return "FlattenAtRoot(value='$value')" + super.toString()
}
}
/**
* Cloudflare Cache Level
*/
class CacheLevel: ZoneSetting() {
/**
* Value of the zone setting
* aggressive, basic, simplified
*/
@field:[Json(name = "value")]
val value = "aggressive"
override fun toString(): String {
return "CacheLevel(value='$value')" + super.toString()
}
}
/**
* Challenge Page TTL
*/
class ChallengePageTtl: ZoneSetting() {
/**
* Value of the zone setting
*
* valid values: 300, 900, 1800, 2700, 3600, 7200, 10800, 14400, 28800, 57600, 86400, 604800, 2592000, 31536000
*/
@field:[Json(name = "value")]
val value = 1800
override fun toString(): String {
return "ChallengePageTtl(value=$value)" + super.toString()
}
}
/**
* Development Mode
*/
class DevelopmentMode: ZoneSetting() {
/**
* Value of the zone setting
* on, off
*/
@field:[Json(name = "value")]
val value = "on"
/**
* Value of the zone setting
*
* The interval (in seconds) from when development mode expires (positive integer) or last expired (negative integer)
* for the domain. If development mode has never been enabled, this value is false.
*/
@field:[Json(name = "time_remaining")]
val timeRemaining = 0
override fun toString(): String {
return "DevelopmentMode(value='$value', timeRemaining=$timeRemaining)" + super.toString()
}
}
/**
* Edge Cache TTL
*/
class EdgeCacheTtl: ZoneSetting() {
/**
* Value of the zone setting
*
* valid values: 30, 60, 300, 1200, 1800, 3600, 7200, 10800, 14400, 18000, 28800, 43200, 57600, 72000, 86400, 172800, 259200, 345600, 432000, 518400, 604800
*
* notes: The minimum TTL available depends on the plan level of the zone. (Enterprise = 30, Business = 1800, Pro = 3600, Free = 7200)
*/
@field:[Json(name = "value")]
val value = 1800
override fun toString(): String {
return "EdgeCacheTtl(value=$value)" + super.toString()
}
}
/**
* Error Pages On
*/
class ErrorPagesOn: ZoneSetting() {
/**
* Value of the zone setting
* on, off
*/
@field:[Json(name = "value")]
val value = "on"
override fun toString(): String {
return "ErrorPagesOn(value='$value')" + super.toString()
}
}
/**
* Get String Sort
*/
class StringSort: ZoneSetting() {
/**
* Value of the zone setting
* on, off
*/
@field:[Json(name = "value")]
val value = "on"
override fun toString(): String {
return "StringSort(value='$value')" + super.toString()
}
}
/**
* Email Obfuscation
*/
class EmailObfuscation: ZoneSetting() {
/**
* Value of the zone setting
* on, off
*/
@field:[Json(name = "value")]
val value = "on"
override fun toString(): String {
return "EmailObfuscation(value='$value')" + super.toString()
}
}
/**
* Hotlink Protection
*/
class HotlinkProtection: ZoneSetting() {
/**
* Value of the zone setting
* on, off
*/
@field:[Json(name = "value")]
val value = "on"
override fun toString(): String {
return "HotlinkProtection(value='$value')" + super.toString()
}
}
/**
* IP Geolocation
*/
class IpGeolocation: ZoneSetting() {
/**
* Value of the zone setting
* on, off
*/
@field:[Json(name = "value")]
val value = "on"
override fun toString(): String {
return "IpGeolocation(value='$value')" + super.toString()
}
}
/**
* IPv6
*/
class IPv6: ZoneSetting() {
/**
* Value of the zone setting
* on, off
*/
@field:[Json(name = "value")]
val value = "on"
override fun toString(): String {
return "IPv6(value='$value')" + super.toString()
}
}
/**
* WebSockets
*/
class Websockets: ZoneSetting() {
/**
* Value of the zone setting
* on, off
*/
@field:[Json(name = "value")]
val value = "on"
override fun toString(): String {
return "Websockets(value='$value')" + super.toString()
}
}
/**
* Toggle SHA1 support
*/
class ToggleSha1: ZoneSetting() {
/**
* Value of the zone setting
* on, off
*/
@field:[Json(name = "value")]
val value = "on"
override fun toString(): String {
return "ToggleSha1(value='$value')" + super.toString()
}
}
/**
* TLS1.2 Only
*/
class Tls1_2Only: ZoneSetting() {
/**
* Value of the zone setting
* on, off
*/
@field:[Json(name = "value")]
val value = "on"
override fun toString(): String {
return "Tls1_2Only(value='$value')" + super.toString()
}
}
/**
* Auto-Minify Assets
*/
class AutoMinify: ZoneSetting() {
/**
* Value of the zone setting
* on, off
*/
@field:[Json(name = "value")]
val value = MinifyAssetsSetting()
override fun toString(): String {
return "AutoMinify(value=$value)" + super.toString()
}
}
/**
* Max Upload
*/
class MaxUpload: ZoneSetting() {
/**
* Value of the zone setting
* valid values: 100, 200, 500
*
* notes: The size depends on the plan level of the zone. (Enterprise = 500, Business = 200, Pro = 100, Free = 100)
*/
@field:[Json(name = "value")]
val value = 100
override fun toString(): String {
return "MaxUpload(value=$value)" + super.toString()
}
}
/**
* Mobile Redirect
*/
class MobileRedirect: ZoneSetting() {
/**
* Value of the zone setting
* on, off
*/
@field:[Json(name = "value")]
val value = MobileRedirectSetting()
override fun toString(): String {
return "MobileRedirect(value=$value)" + super.toString()
}
}
/**
* Mirage Image Optimization
*/
class Mirage: ZoneSetting() {
/**
* Value of the zone setting
* on, off
*/
@field:[Json(name = "value")]
val value = "on"
override fun toString(): String {
return "Mirage(value='$value')" + super.toString()
}
}
/**
* Polish Image Optimization
*/
class PolishImage: ZoneSetting() {
/**
* Value of the zone setting
* off, lossless, lossy
*/
@field:[Json(name = "value")]
val value = "off"
override fun toString(): String {
return "PolishImage(value='$value')" + super.toString()
}
}
/**
* Polish WebP Conversion
*/
class PolishWebP: ZoneSetting() {
/**
* Value of the zone setting
* on, off
*/
@field:[Json(name = "value")]
val value = "on"
override fun toString(): String {
return "PolishWebP(value='$value')" + super.toString()
}
}
/**
* Prefetch Preload
*/
class PrefetchPreload: ZoneSetting() {
/**
* Value of the zone setting
* on, off
*/
@field:[Json(name = "value")]
val value = "on"
override fun toString(): String {
return "PrefetchPreload(value='$value')" + super.toString()
}
}
/**
* Privacy Pass
*/
class PrivatePass: ZoneSetting() {
/**
* Value of the zone setting
* on, off
*/
@field:[Json(name = "value")]
val value = "on"
override fun toString(): String {
return "PrivatePass(value='$value')" + super.toString()
}
}
/**
* Response Buffering
*/
class ReponseBuffering: ZoneSetting() {
/**
* Value of the zone setting
* on, off
*/
@field:[Json(name = "value")]
val value = "on"
override fun toString(): String {
return "ReponseBuffering(value='$value')" + super.toString()
}
}
/**
* Rocket Loader
*/
class RocketLoader: ZoneSetting() {
/**
* Value of the zone setting
* on, off
*/
@field:[Json(name = "value")]
val value = "on"
override fun toString(): String {
return "RocketLoader(value='$value')" + super.toString()
}
}
/**
* Security Header
*/
class SecurityHeader: ZoneSetting() {
/**
* Current value of the zone setting
*/
@field:[Json(name = "value")]
val value = SecurityHeadingSetting()
override fun toString(): String {
return "SecurityHeader(value=$value)" + super.toString()
}
}
/**
* Security Level
*/
class SecurityLevel: ZoneSetting() {
/**
* Value of the zone setting
* on, off
*/
@field:[Json(name = "value")]
val value = SecurityHeadingSetting()
override fun toString(): String {
return "SecurityLevel(value=$value)" + super.toString()
}
}
/**
* Server Side Exclude
*/
class ServerSideExclude: ZoneSetting() {
/**
* Value of the zone setting
* on, off
*/
@field:[Json(name = "value")]
val value = "on"
override fun toString(): String {
return "ServerSideExclude(value='$value')" + super.toString()
}
}
/**
* SSL
*/
class SSL: ZoneSetting() {
/**
* Value of the zone setting
* off, flexible, full, strict
*
* notes: Depends on the zone's plan level
*/
@field:[Json(name = "value")]
val value = "off"
override fun toString(): String {
return "SSL(value='$value')" + super.toString()
}
}
/**
* TLS Client Authentication
*/
class TlsClientAuth: ZoneSetting() {
/**
* Value of the zone setting
* off, flexible, full, strict
*
* notes: Depends on the zone's plan level
*/
@field:[Json(name = "value")]
val value = "off"
override fun toString(): String {
return "TlsClientAuth(value='$value')" + super.toString()
}
}
/**
* True Client IP Header
*/
class TrueClientIPHeader: ZoneSetting() {
/**
* Value of the zone setting
* off, flexible, full, strict
*
* notes: Depends on the zone's plan level
*/
@field:[Json(name = "value")]
val value = "off"
override fun toString(): String {
return "TrueClientIPHeader(value='$value')" + super.toString()
}
}
/**
* Web Application Firewall
*/
class WebApplicationFirewall: ZoneSetting() {
/**
* Value of the zone setting
* on, off
*/
@field:[Json(name = "value")]
val value = "on"
override fun toString(): String {
return "WebApplicationFirewall(value='$value')" + super.toString()
}
}
/**
* Zone Minimum TLS Version Value
*/
class ZoneMinimumTLSVersionValue: ZoneSetting() {
/**
* Value of the zone setting
* 1.0, 1.1, 1.2, 1.3
*/
@field:[Json(name = "value")]
val value = 1.0
override fun toString(): String {
return "ZoneMinimumTLSVersionValue(value=$value)" + super.toString()
}
}
/**
* Zone Enable TLS 1.3
*/
class ZoneEnableTLS1_3: ZoneSetting() {
/**
* Value of the zone setting
* on, off, zrt
*/
@field:[Json(name = "value")]
val value = "on"
override fun toString(): String {
return "ZoneEnableTLS1_3(value='$value')" + super.toString()
}
}
/**
* Zone Enable Opportunistic Encryption
*/
class ZoneEnableOpportunisticEncryption : ZoneSetting() {
/**
* Value of the zone setting
* on, off, zrt
*/
@field:[Json(name = "value")]
val value = "on"
override fun toString(): String {
return "ZoneEnableOpportunisticEncryption(value='$value')" + super.toString()
}
}
/**
* Zone Enable Automatic HTTPS Rewrites
*/
class ZoneEnableAutomaticHTTPSRewrites : ZoneSetting() {
/**
* Value of the zone setting
* on, off, zrt
*/
@field:[Json(name = "value")]
val value = "on"
override fun toString(): String {
return "ZoneEnableAutomaticHTTPSRewrites(value='$value')" + super.toString()
}
}
/**
* HTTP2
*/
class HTTP2 : ZoneSetting() {
/**
* Value of the zone setting
* on, off, zrt
*/
@field:[Json(name = "value")]
val value = "on"
override fun toString(): String {
return "HTTP2(value='$value')" + super.toString()
}
}
/**
* Pseudo IPv4 Value
*/
class PseudoIPv4 : ZoneSetting() {
/**
* Value of the zone setting
* off, add_header, overwrite_header
*/
@field:[Json(name = "value")]
val value = "on"
override fun toString(): String {
return "PseudoIPv4(value='$value')" + super.toString()
}
}
/**
* Zone Enable Always Use HTTPS
*/
class ZoneEnableAlwaysUseHTTPS : ZoneSetting() {
/**
* Value of the zone setting
* on, off
*/
@field:[Json(name = "value")]
val value = "on"
override fun toString(): String {
return "ZoneEnableAlwaysUseHTTPS(value='$value')" + super.toString()
}
}
/**
* Zone Enable Onion Routing
*/
class ZoneEnableOnionRouting : ZoneSetting() {
/**
* Value of the zone setting
* on, off
*/
@field:[Json(name = "value")]
val value = "on"
override fun toString(): String {
return "ZoneEnableOnionRouting(value='$value')" + super.toString()
}
}
/**
* Image Resizing
*/
class ImageResizing : ZoneSetting() {
/**
* Value of the zone setting
*on, off
*/
@field:[Json(name = "value")]
val value = "on"
override fun toString(): String {
return "ImageResizing(value='$value')" + super.toString()
}
}
/**
* HTTP/2 Edge Prioritization
*/
class HTTP2EdgePrioritization : ZoneSetting() {
/**
* Value of the zone setting
* on, off, custom
*/
@field:[Json(name = "value")]
val value = "on"
override fun toString(): String {
return "HTTP2EdgePrioritization(value='$value')" + super.toString()
}
}
/**
* @see [https://api.cloudflare.com](https://api.cloudflare.com/#zone-properties)
*/
open class ZoneSetting {
/**
* ID of the zone setting
* always_online, advanced_ddos, brotli, browser_cache_ttl, browser_check, flatten_at_root, cache_level, challenge_ttl,
* development_mode, edge_cache_ttl, origin_error_page_pass_thru, sort_query_string_for_cache, email_obfuscation,
* hotlink_protection, ip_geolocation, ipv6, websockets, sha1_support, tls_1_2_only, minify, max_upload, mobile_redirect,
* mirage, polish, webp, prefetch_preload, privacy_pass, response_buffering, rocket_loader, security_header, security_level,
* server_side_exclude, ssl, tls_client_auth, true_client_ip_header, waf, min_tls_version, tls_1_3, opportunistic_encryption,
* automatic_https_rewrites, http2, , pseudo_ipv4, always_use_https, opportunistic_onion, image_resizing, h2_prioritization
*/
@field:[Json(name = "id")]
val id = ""
/**
* Whether or not this setting can be modified for this zone (based on your Cloudflare plan level)
*/
@field:[Json(name = "editable")]
val editable = true
/**
* last time this setting was modified
*/
@field:[Json(name = "modified_on") ISO8601]
val modifiedOn: LocalDateTime? = null
override fun toString(): String {
return "ZoneSetting(id='$id', editable=$editable, modifiedOn=$modifiedOn)"
}
}