fix pdns api clients (retry 10x)

This commit is contained in:
dalbodeule 2024-06-07 10:39:11 +09:00
parent ccb02f0f50
commit f0f9bd4760
No known key found for this signature in database
GPG Key ID: EFA860D069C9FA65
3 changed files with 74 additions and 44 deletions

View File

@ -6,7 +6,6 @@ import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.RequestBody.Companion.toRequestBody
import okhttp3.Response
import okhttp3.internal.concat
import org.springframework.beans.factory.annotation.Value
import org.springframework.stereotype.Service
@ -39,8 +38,7 @@ class PowerDNSAPIClient() {
val response = client.newCall(request).execute()
if(!response.isSuccessful) {
val error = gson.fromJson(response.body?.string(), Error::class.java)
throw RuntimeException("Unexpected code ${error.error}, ${error.errors.concat(", ")}")
throw gson.fromJson(response.body?.string(), Error::class.java)
}
return response
}
@ -56,8 +54,7 @@ class PowerDNSAPIClient() {
val response = client.newCall(request).execute()
if(!response.isSuccessful) {
val error = gson.fromJson(response.body?.string(), Error::class.java)
throw RuntimeException("Unexpected code ${error.error}, ${error.errors.concat(", ")}")
throw gson.fromJson(response.body?.string(), Error::class.java)
}
return response
}
@ -78,8 +75,7 @@ class PowerDNSAPIClient() {
val response = client.newCall(request).execute()
if(!response.isSuccessful) {
val error = gson.fromJson(response.body?.string(), Error::class.java)
throw RuntimeException("Unexpected code ${error.error}, ${error.errors.concat(", ")}")
throw gson.fromJson(response.body?.string(), Error::class.java)
}
return response
}
@ -98,8 +94,7 @@ class PowerDNSAPIClient() {
val response = client.newCall(request).execute()
if(!response.isSuccessful) {
val error = gson.fromJson(response.body?.string(), Error::class.java)
throw RuntimeException("Unexpected code ${error.error}, ${error.errors.concat(", ")}")
throw gson.fromJson(response.body?.string(), Error::class.java)
}
return response
}
@ -115,11 +110,10 @@ class PowerDNSAPIClient() {
val response = client.newCall(request).execute()
if(!response.isSuccessful) {
val error = gson.fromJson(response.body?.string(), Error::class.java)
throw RuntimeException("Unexpected code ${error.error}, ${error.errors.concat(", ")}")
throw gson.fromJson(response.body?.string(), Error::class.java)
}
return response
}
}
data class Error(val error: String, val errors: Array<String>)
data class PowerDNSAPIError(val error: String, val errors: List<String>): RuntimeException(error)

View File

@ -7,12 +7,9 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse
import io.swagger.v3.oas.annotations.responses.ApiResponses
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.web.bind.annotation.*
import space.mori.dnsapi.PowerDNSAPIError
import space.mori.dnsapi.db.Domain
import space.mori.dnsapi.dto.ApiResponseDTO
import space.mori.dnsapi.dto.DeleteResponseWithId
import space.mori.dnsapi.dto.DomainRequestDTO
import space.mori.dnsapi.dto.DomainResponseDTO
import space.mori.dnsapi.filter.getCurrentUser
import space.mori.dnsapi.dto.*
import space.mori.dnsapi.service.DomainService
@ -30,7 +27,13 @@ class DomainController(
content = [Content(schema = Schema(implementation = ApiResponseDTO::class))])
])
fun allDomains(): ApiResponseDTO<List<DomainResponseDTO?>> {
try {
return ApiResponseDTO(result = domainService.getAllDomains().map { it.toDTO() })
} catch(e : PowerDNSAPIError) {
val errors = mutableListOf(e.error)
errors.addAll(e.errors)
return ApiResponseDTO(false, errors = errors.map { ErrorOrMessage(1, it) })
}
}
@Operation(summary = "Get domain", tags = ["domain"])
@ -43,7 +46,13 @@ class DomainController(
fun getDomainByCfid(
@PathVariable cfid: String?
): ApiResponseDTO<DomainResponseDTO> {
try {
return ApiResponseDTO(result = domainService.getDomainById(cfid!!).toDTO())
} catch(e : PowerDNSAPIError) {
val errors = mutableListOf(e.error)
errors.addAll(e.errors)
return ApiResponseDTO(false, errors = errors.map { ErrorOrMessage(1, it) })
}
}
@Operation(summary = "Create domain", tags = ["domain"])
@ -54,7 +63,13 @@ class DomainController(
])
@PostMapping
fun createDomain(@RequestBody domain: DomainRequestDTO): ApiResponseDTO<DomainResponseDTO> {
try {
return ApiResponseDTO(result = domainService.createDomain(domain).toDTO())
} catch(e : PowerDNSAPIError) {
val errors = mutableListOf(e.error)
errors.addAll(e.errors)
return ApiResponseDTO(false, errors = errors.map { ErrorOrMessage(1, it) })
}
}
@Operation(summary = "Delete domain", tags = ["domain"])
@ -65,9 +80,15 @@ class DomainController(
])
@DeleteMapping("/{domain_id}")
fun deleteDomain(@PathVariable domain_id: String?): ApiResponseDTO<DeleteResponseWithId> {
try {
domainService.deleteDomain(domain_id!!)
return ApiResponseDTO(result = DeleteResponseWithId(domain_id))
} catch(e : PowerDNSAPIError) {
val errors = mutableListOf(e.error)
errors.addAll(e.errors)
return ApiResponseDTO(false, errors = errors.map { ErrorOrMessage(1, it) })
}
}
private fun Domain.toDTO() = DomainResponseDTO(id = cfid, name = name)

View File

@ -7,9 +7,8 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse
import io.swagger.v3.oas.annotations.responses.ApiResponses
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.web.bind.annotation.*
import space.mori.dnsapi.PowerDNSAPIError
import space.mori.dnsapi.dto.*
import space.mori.dnsapi.db.Record as DomainRecord
import space.mori.dnsapi.getISOFormat
import space.mori.dnsapi.service.RecordService
@RestController
@ -26,7 +25,13 @@ class RecordController(
content = [Content(schema = Schema(implementation = ApiResponseDTO::class))]),
])
fun allRecords(@PathVariable zone_id: String): ApiResponseDTO<List<RecordResponseDTO>> {
try {
return ApiResponseDTO(result = recordService.getRecordsByDomain(zone_id)?.map{ it } ?: listOf())
} catch(e : PowerDNSAPIError) {
val errors = mutableListOf(e.error)
errors.addAll(e.errors)
return ApiResponseDTO(false, errors = errors.map { ErrorOrMessage(1, it) })
}
}
@GetMapping("{zone_id}/dns_records/{dns_record_id}")
@ -37,7 +42,13 @@ class RecordController(
content = [Content(schema = Schema(implementation = ApiResponseDTO::class))]),
])
fun getRecordByCfid(@PathVariable zone_id: String, @PathVariable dns_record_id: String): ApiResponseDTO<RecordResponseDTO> {
try {
return ApiResponseDTO(result = recordService.getRecord(zone_id, dns_record_id))
} catch(e : PowerDNSAPIError) {
val errors = mutableListOf(e.error)
errors.addAll(e.errors)
return ApiResponseDTO(false, errors = errors.map { ErrorOrMessage(1, it) })
}
}
@PostMapping("{zone_id}/dns_records")
@ -48,7 +59,13 @@ class RecordController(
content = [Content(schema = Schema(implementation = ApiResponseDTO::class))]),
])
fun createRecord(@PathVariable zone_id: String, @RequestBody record: RecordRequestDTO): ApiResponseDTO<RecordResponseDTO> {
try {
return ApiResponseDTO(result = recordService.createRecord(zone_id, record))
} catch(e : PowerDNSAPIError) {
val errors = mutableListOf(e.error)
errors.addAll(e.errors)
return ApiResponseDTO(false, errors = errors.map { ErrorOrMessage(1, it) })
}
}
@DeleteMapping("{zone_id}/dns_records/{dns_record_id}")
@ -59,8 +76,14 @@ class RecordController(
content = [Content(schema = Schema(implementation = ApiResponseDTO::class))]),
])
fun deleteRecord(@PathVariable zone_id: String, @PathVariable dns_record_id: String): ApiResponseDTO<DeleteResponseWithId> {
try {
val record_id = recordService.deleteRecord(zone_id, dns_record_id)
return ApiResponseDTO(result = DeleteResponseWithId(record_id))
} catch(e : PowerDNSAPIError) {
val errors = mutableListOf(e.error)
errors.addAll(e.errors)
return ApiResponseDTO(false, errors = errors.map { ErrorOrMessage(1, it) })
}
}
@PatchMapping("{zone_id}/dns_records/{dns_record_id}")
@ -71,20 +94,12 @@ class RecordController(
content = [Content(schema = Schema(implementation = ApiResponseDTO::class))]),
])
fun updateRecord(@PathVariable zone_id: String, @PathVariable dns_record_id: String, @RequestBody record: RecordRequestDTO): ApiResponseDTO<RecordResponseDTO> {
try {
return ApiResponseDTO(result = recordService.updateRecord(zone_id, dns_record_id, record))
} catch(e : PowerDNSAPIError) {
val errors = mutableListOf(e.error)
errors.addAll(e.errors)
return ApiResponseDTO(false, errors = errors.map { ErrorOrMessage(1, it) })
}
}
private fun DomainRecord.toDTO() = RecordResponseDTO(
id = cfid,
type = type,
name = name,
content = content,
zoneId = domain.cfid,
zoneName = domain.name,
priority = prio,
ttl = ttl,
createdOn = createdOn.getISOFormat(),
modifiedOn = modifiedOn.getISOFormat(),
comment = comment
)
}