Initial commit

- Retrofit used to call API
This commit is contained in:
2024-07-18 17:04:56 +01:00
commit 982b4e8d5d
20 changed files with 534 additions and 0 deletions

View File

@@ -0,0 +1,37 @@
package api
import okhttp3.OkHttpClient
import java.util.concurrent.TimeUnit
import okhttp3.logging.HttpLoggingInterceptor
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
class BookerApi {
private val baseUrl = "https://restful-booker.herokuapp.com/"
private val loggingInterceptor = HttpLoggingInterceptor().apply {
level = HttpLoggingInterceptor.Level.BODY
}
private fun buildOkHttpClient(timeoutSeconds: Long = 30L): OkHttpClient {
val builder = OkHttpClient.Builder()
builder
.addInterceptor(loggingInterceptor)
.connectTimeout(timeoutSeconds, TimeUnit.SECONDS)
.writeTimeout(timeoutSeconds, TimeUnit.SECONDS)
.readTimeout(timeoutSeconds, TimeUnit.SECONDS)
return builder.build()
}
fun invoke(): RestfulBookerApi {
val okHttpClient = buildOkHttpClient()
return Retrofit.Builder()
.client(okHttpClient)
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.build()
.create(RestfulBookerApi::class.java)
}
}

View File

@@ -0,0 +1,61 @@
package api
import model.*
import retrofit2.Response
import retrofit2.http.*
interface RestfulBookerApi {
@Headers("Content-Type:application/json")
@POST("auth")
suspend fun createAuthToken(
@Field("username") username: String,
@Field("password") password: String,
): Response<AuthResponse>
@GET("booking")
suspend fun getBookingIds(
@Field("firstname") firstname: String? = null,
@Field("lastname") lastname: String? = null,
@Field("checkin") checkin: String? = null,
@Field("checkout") checkout: String? = null,
): Response<List<BookingIdResponse>>
@GET("booking/{id}")
suspend fun getSingleBooking(
@Path("id") id: String
): Response<BookingResponse>
@Headers("Content-Type:application/json")
@POST("booking")
suspend fun createBooking(
@Body booking: BookingRequest,
): Response<CreateBookingResponse>
@Headers("Content-Type:application/json", "Accept: application/json")
@PUT("booking/{id}")
suspend fun updateBooking(
@Path("id") id: String,
@Body booking: BookingRequest,
@Header("Authorization") token: String
): Response<BookingResponse>
@Headers("Content-Type:application/json", "Accept: application/json")
@PATCH("booking/{id}")
suspend fun partialUpdateBooking(
@Path("id") id: String,
@Header("Authorization") token: String,
@Field("firstname") firstname: String? = null,
@Field("lastname") lastname: String? = null,
@Field("totalprice") totalprice: Float? = null,
@Field("depositpaid") depositpaid: Boolean? = null,
@Field("checkin") checkin: String? = null,
@Field("checkout") checkout: String? = null,
@Field("additionalneeds") additionalneeds: String? = null
): Response<BookingResponse>
@DELETE("booking/{id}")
suspend fun deleteBooking(
@Path("id") id: String
): Response<Any>
}

View File

@@ -0,0 +1,5 @@
package model
class AuthResponse {
var token: String? = null
}

View File

@@ -0,0 +1,5 @@
package model
class BookingIdResponse {
var bookingid = 0
}

View File

@@ -0,0 +1,12 @@
package model
data class BookingRequest (
var firstname: String? = null,
var lastname: String? = null,
var totalprice: Int = 0,
var depositpaid: Boolean = false,
var bookingdates: Bookingdates? = null,
var additionalneeds: String? = null,
)

View File

@@ -0,0 +1,11 @@
package model
data class BookingResponse (
var firstname: String? = null,
var lastname: String? = null,
var totalprice: Int = 0,
var depositpaid: Boolean = false,
var bookingdates: Bookingdates? = null,
var additionalneeds: String? = null
)

View File

@@ -0,0 +1,6 @@
package model
data class Bookingdates (
var checkin: String? = null,
var checkout: String? = null,
)

View File

@@ -0,0 +1,6 @@
package model
class CreateBookingResponse {
var bookingid = 0
var booking: BookingResponse? = null
}