replace all retrofit post call bodies with @field

This commit is contained in:
Owen LeJeune
2023-07-25 22:26:09 -04:00
parent 8abd40a0c2
commit 1dd6462311
23 changed files with 72 additions and 122 deletions

View File

@@ -1,6 +1,7 @@
package com.owenlejeune.tvtime.api.tmdb.api.v3
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.*
import com.owenlejeune.tvtime.utils.types.MediaViewType
import retrofit2.Response
import retrofit2.http.*
@@ -9,16 +10,22 @@ interface AccountApi {
@GET("account")
suspend fun getAccountDetails(): Response<AccountDetails>
@FormUrlEncoded
@POST("account/{id}/favorite")
suspend fun markAsFavorite(
@Path("id") id: Int,
@Body body: MarkAsFavoriteBody
@Field("media_type") mediaType: MediaViewType,
@Field("media_id") mediaId: Int,
@Field("favorite") isFavorite: Boolean
): Response<StatusResponse>
@FormUrlEncoded
@POST("account/{id}/watchlist")
suspend fun addToWatchlist(
@Path("id") id: Int,
@Body body: WatchlistBody
@Field("media_type") mediaType: MediaViewType,
@Field("media_id") mediaId: Int,
@Field("watchlist") onWatchlist: Boolean
): Response<StatusResponse>
}

View File

@@ -2,8 +2,7 @@ package com.owenlejeune.tvtime.api.tmdb.api.v3
import android.util.Log
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.AccountDetails
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.MarkAsFavoriteBody
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.WatchlistBody
import com.owenlejeune.tvtime.utils.types.MediaViewType
import org.koin.core.component.KoinComponent
import org.koin.core.component.inject
import retrofit2.Response
@@ -18,8 +17,13 @@ class AccountService: KoinComponent {
return accountService.getAccountDetails()
}
suspend fun markAsFavorite(accountId: Int, body: MarkAsFavoriteBody) {
val response = accountService.markAsFavorite(accountId, body)
suspend fun markAsFavorite(
accountId: Int,
mediaType: MediaViewType,
mediaId: Int,
isFavorite: Boolean
) {
val response = accountService.markAsFavorite(accountId, mediaType, mediaId, isFavorite)
if (response.isSuccessful) {
Log.d(TAG, "Successfully marked as favourite")
} else {
@@ -27,8 +31,13 @@ class AccountService: KoinComponent {
}
}
suspend fun addToWatchlist(accountId: Int, body: WatchlistBody) {
val response = accountService.addToWatchlist(accountId, body)
suspend fun addToWatchlist(
accountId: Int,
mediaType: MediaViewType,
mediaId: Int,
onWatchlist: Boolean
) {
val response = accountService.addToWatchlist(accountId, mediaType, mediaId, onWatchlist)
if (response.isSuccessful) {
Log.d(TAG, "Successfully added to watchlist")
} else {

View File

@@ -3,12 +3,15 @@ package com.owenlejeune.tvtime.api.tmdb.api.v3
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.*
import retrofit2.Response
import retrofit2.http.Body
import retrofit2.http.Field
import retrofit2.http.FormUrlEncoded
import retrofit2.http.GET
import retrofit2.http.HTTP
import retrofit2.http.POST
interface AuthenticationApi {
@FormUrlEncoded
@POST("authentication/session/convert/4")
suspend fun createSessionFromV4Token(@Body body: V4TokenBody): Response<CreateSessionResponse>
suspend fun createSessionFromV4Token(@Field("access_token") accessToken: String): Response<CreateSessionResponse>
}

View File

@@ -8,7 +8,7 @@ class AuthenticationService {
private val service by lazy { TmdbClient().createAuthenticationService() }
suspend fun createSessionFromV4Token(body: V4TokenBody): Response<CreateSessionResponse> {
return service.createSessionFromV4Token(body)
suspend fun createSessionFromV4Token(accessToken: String): Response<CreateSessionResponse> {
return service.createSessionFromV4Token(accessToken)
}
}

View File

@@ -17,7 +17,7 @@ interface DetailService {
suspend fun getReviews(id: Int, refreshing: Boolean)
suspend fun postRating(id: Int, ratingBody: RatingBody)
suspend fun postRating(id: Int, rating: Float)
suspend fun deleteRating(id: Int)

View File

@@ -43,11 +43,12 @@ interface MoviesApi {
@GET("movie/{id}/keywords")
suspend fun getKeywords(@Path("id") id: Int): Response<KeywordsResponse>
@FormUrlEncoded
@POST("movie/{id}/rating")
suspend fun postMovieRatingAsUser(
@Path("id") id: Int,
@Query("session_id") sessionId: String,
@Body ratingBody: RatingBody
@Field("value") rating: Float
): Response<StatusResponse>
@DELETE("movie/{id}/rating")

View File

@@ -4,11 +4,8 @@ import android.util.Log
import androidx.compose.runtime.mutableStateMapOf
import androidx.compose.runtime.mutableStateOf
import androidx.paging.PagingData
import androidx.paging.PagingSource
import androidx.paging.PagingState
import com.owenlejeune.tvtime.api.LoadingState
import com.owenlejeune.tvtime.api.loadRemoteData
import com.owenlejeune.tvtime.api.storedIn
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.AccountStates
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.CastMember
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.CrewMember
@@ -18,14 +15,9 @@ import com.owenlejeune.tvtime.api.tmdb.api.v3.model.HomePageResponse
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.ImageCollection
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.Keyword
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.MovieReleaseResults
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.RatingBody
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.Review
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.SearchResult
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.SearchResultMedia
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.SearchResultMovie
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.Searchable
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.SortableSearchResult
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.StatusResponse
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.TmdbItem
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.Video
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.WatchProviders
@@ -168,9 +160,9 @@ class MoviesService: KoinComponent, DetailService, HomePageService {
)
}
override suspend fun postRating(id: Int, ratingBody: RatingBody) {
override suspend fun postRating(id: Int, rating: Float) {
val session = SessionManager.currentSession.value ?: throw Exception("Session must not be null")
val response = movieService.postMovieRatingAsUser(id, session.sessionId, ratingBody)
val response = movieService.postMovieRatingAsUser(id, session.sessionId, rating)
if (response.isSuccessful) {
Log.d(TAG, "Successfully rated")
getAccountStates(id)

View File

@@ -43,11 +43,12 @@ interface TvApi {
@GET("tv/{id}/keywords")
suspend fun getKeywords(@Path("id") id: Int): Response<KeywordsResponse>
@FormUrlEncoded
@POST("tv/{id}/rating")
suspend fun postTvRatingAsUser(
@Path("id") id: Int,
@Query("session_id") sessionId: String,
@Body ratingBody: RatingBody
@Field("value") rating: Float
): Response<StatusResponse>
@DELETE("tv/{id}/rating")

View File

@@ -4,39 +4,26 @@ import android.util.Log
import androidx.compose.runtime.mutableStateMapOf
import androidx.compose.runtime.mutableStateOf
import androidx.paging.PagingData
import androidx.paging.PagingSource
import androidx.paging.PagingState
import com.owenlejeune.tvtime.api.LoadingState
import com.owenlejeune.tvtime.api.loadRemoteData
import com.owenlejeune.tvtime.api.storedIn
import com.owenlejeune.tvtime.api.tmdb.TmdbClient
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.AccountStates
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.CastAndCrew
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.CastMember
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.CrewMember
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.DetailedItem
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.DetailedTv
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.ExternalIds
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.HomePageResponse
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.ImageCollection
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.Keyword
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.KeywordsResponse
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.RatingBody
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.Review
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.ReviewResponse
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.SearchResult
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.SearchResultMedia
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.Season
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.SeasonAccountStates
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.StatusResponse
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.TmdbItem
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.TvCastAndCrew
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.TvCastMember
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.TvContentRatings
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.TvCrewMember
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.Video
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.VideoResponse
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.WatchProviderResponse
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.WatchProviders
import com.owenlejeune.tvtime.utils.SessionManager
import com.owenlejeune.tvtime.utils.types.TimeWindow
@@ -304,9 +291,9 @@ class TvService: KoinComponent, DetailService, HomePageService {
)
}
override suspend fun postRating(id: Int, ratingBody: RatingBody) {
override suspend fun postRating(id: Int, rating: Float) {
val session = SessionManager.currentSession.value ?: throw Exception("Session must not be null")
val response = service.postTvRatingAsUser(id, session.sessionId, ratingBody)
val response = service.postTvRatingAsUser(id, session.sessionId, rating)
if (response.isSuccessful) {
Log.d(TAG, "Successfully posted rating")
} else {

View File

@@ -1,10 +0,0 @@
package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName
import com.owenlejeune.tvtime.utils.types.MediaViewType
class MarkAsFavoriteBody(
@SerializedName("media_type") val mediaType: MediaViewType,
@SerializedName("media_id") val mediaId: Int,
@SerializedName("favorite") val isFavorite: Boolean
)

View File

@@ -1,7 +0,0 @@
package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName
class RatingBody(
@SerializedName("value") val rating: Float
)

View File

@@ -1,7 +0,0 @@
package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName
class V4TokenBody(
@SerializedName("access_token") val accessToken: String
)

View File

@@ -1,10 +0,0 @@
package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName
import com.owenlejeune.tvtime.utils.types.MediaViewType
class WatchlistBody(
@SerializedName("media_type") val mediaType: MediaViewType,
@SerializedName("media_id") val mediaId: Int,
@SerializedName("watchlist") val onWatchlist: Boolean
)

View File

@@ -5,16 +5,20 @@ import com.owenlejeune.tvtime.api.tmdb.api.v4.model.*
import retrofit2.Response
import retrofit2.http.Body
import retrofit2.http.DELETE
import retrofit2.http.Field
import retrofit2.http.FormUrlEncoded
import retrofit2.http.HTTP
import retrofit2.http.POST
interface AuthenticationV4Api {
@FormUrlEncoded
@POST("auth/request_token")
suspend fun createRequestToken(@Body body: AuthRequestBody): Response<AuthResponse>
suspend fun createRequestToken(@Field("redirect_to") redirect: String): Response<AuthResponse>
@FormUrlEncoded
@POST("auth/access_token")
suspend fun createAccessToken(@Body body: AuthAccessBody): Response<AccessResponse>
suspend fun createAccessToken(@Field("request_token") requestToken: String): Response<AccessResponse>
// @DELETE("auth/access_token")
@HTTP(method = "DELETE", path = "auth/access_token", hasBody = true)

View File

@@ -9,12 +9,12 @@ class AuthenticationV4Service {
private val service by lazy { TmdbClient().createV4AuthenticationService() }
suspend fun createRequestToken(body: AuthRequestBody): Response<AuthResponse> {
return service.createRequestToken(body)
suspend fun createRequestToken(redirect: String): Response<AuthResponse> {
return service.createRequestToken(redirect)
}
suspend fun createAccessToken(body: AuthAccessBody): Response<AccessResponse> {
return service.createAccessToken(body)
suspend fun createAccessToken(requestToken: String): Response<AccessResponse> {
return service.createAccessToken(requestToken)
}
suspend fun deleteAccessToken(body: AuthDeleteBody): Response<StatusResponse> {

View File

@@ -9,8 +9,15 @@ interface ListV4Api {
@GET("list/{id}")
suspend fun getList(@Path("id") listId: Int): Response<MediaList>
@FormUrlEncoded
@POST("list")
suspend fun createList(@Body body: CreateListBody): Response<CreateListResponse>
suspend fun createList(
@Field("name") name: String,
@Field("iso_639_1") language: String,
@Field("description") description: String,
@Field("public") isPublic: Boolean,
@Field("iso_3166_1") localeCode: String
): Response<CreateListResponse>
@PUT("list/{id}")
suspend fun updateList(@Path("id") listId: Int, @Body body: ListUpdateBody): Response<StatusResponse>

View File

@@ -4,9 +4,7 @@ import android.content.Context
import android.util.Log
import android.widget.Toast
import androidx.compose.runtime.mutableStateMapOf
import androidx.compose.runtime.mutableStateOf
import com.owenlejeune.tvtime.api.tmdb.api.v4.model.AddToListBody
import com.owenlejeune.tvtime.api.tmdb.api.v4.model.CreateListBody
import com.owenlejeune.tvtime.api.tmdb.api.v4.model.DeleteListItemsBody
import com.owenlejeune.tvtime.api.tmdb.api.v4.model.ListUpdateBody
import com.owenlejeune.tvtime.api.tmdb.api.v4.model.MediaList
@@ -34,8 +32,14 @@ class ListV4Service: KoinComponent {
}
}
suspend fun createList(body: CreateListBody) {//}: Response<CreateListResponse> {
service.createList(body)
suspend fun createList(
name: String,
language: String,
description: String,
isPublic: Boolean,
localeCode: String
) {
service.createList(name, language, description, isPublic, localeCode)
}
suspend fun updateList(listId: Int, body: ListUpdateBody) {

View File

@@ -1,7 +0,0 @@
package com.owenlejeune.tvtime.api.tmdb.api.v4.model
import com.google.gson.annotations.SerializedName
class AuthAccessBody(
@SerializedName("request_token") val requestToken: String
)

View File

@@ -1,7 +0,0 @@
package com.owenlejeune.tvtime.api.tmdb.api.v4.model
import com.google.gson.annotations.SerializedName
class AuthRequestBody(
@SerializedName("redirect_to") val redirect: String
)

View File

@@ -1,11 +0,0 @@
package com.owenlejeune.tvtime.api.tmdb.api.v4.model
import com.google.gson.annotations.SerializedName
class CreateListBody(
@SerializedName("name") val name: String,
@SerializedName("iso_639_1") val language: String,
@SerializedName("description") val description: String,
@SerializedName("public") val isPublic: Boolean,
@SerializedName("iso_3166_1") val localeCode: String
)

View File

@@ -4,8 +4,6 @@ import androidx.lifecycle.ViewModel
import androidx.paging.PagingData
import com.owenlejeune.tvtime.api.tmdb.api.createPagingFlow
import com.owenlejeune.tvtime.api.tmdb.api.v3.AccountService
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.MarkAsFavoriteBody
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.WatchlistBody
import com.owenlejeune.tvtime.api.tmdb.api.v4.AccountV4Service
import com.owenlejeune.tvtime.api.tmdb.api.v4.ListV4Service
import com.owenlejeune.tvtime.api.tmdb.api.v4.model.AddToListBody
@@ -139,12 +137,12 @@ class AccountViewModel: ViewModel(), KoinComponent {
suspend fun addToFavourites(type: MediaViewType, itemId: Int, favourited: Boolean) {
val accountId = SessionManager.currentSession.value?.accountDetails?.value?.id ?: throw Exception("Session must not be null")
accountService.markAsFavorite(accountId, MarkAsFavoriteBody(type, itemId, favourited))
accountService.markAsFavorite(accountId, type, itemId, favourited)
}
suspend fun addToWatchlist(type: MediaViewType, itemId: Int, watchlisted: Boolean) {
val accountId = SessionManager.currentSession.value?.accountDetails?.value?.id ?: throw Exception("Session must not be null")
accountService.addToWatchlist(accountId, WatchlistBody(type, itemId, watchlisted))
accountService.addToWatchlist(accountId, type, itemId, watchlisted)
}
}

View File

@@ -18,13 +18,11 @@ import com.owenlejeune.tvtime.api.tmdb.api.v3.model.DetailedItem
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.ExternalIds
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.ImageCollection
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.Keyword
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.RatingBody
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.Review
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.SearchResultMedia
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.TmdbItem
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.Video
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.WatchProviders
import com.owenlejeune.tvtime.extensions.anyOf
import com.owenlejeune.tvtime.ui.screens.tabs.MediaTabNavItem
import com.owenlejeune.tvtime.utils.types.MediaViewType
import com.owenlejeune.tvtime.utils.types.TimeWindow
@@ -398,8 +396,8 @@ class MainViewModel: ViewModel(), KoinComponent {
suspend fun postRating(id: Int, rating: Float, type: MediaViewType) {
when (type) {
MediaViewType.MOVIE -> movieService.postRating(id, RatingBody(rating))
MediaViewType.TV -> tvService.postRating(id, RatingBody(rating))
MediaViewType.MOVIE -> movieService.postRating(id, rating)
MediaViewType.TV -> tvService.postRating(id, rating)
else -> {}
}
}

View File

@@ -9,9 +9,7 @@ import com.owenlejeune.tvtime.api.tmdb.api.v3.AccountService
import com.owenlejeune.tvtime.api.tmdb.api.v3.AuthenticationService
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.*
import com.owenlejeune.tvtime.api.tmdb.api.v4.AuthenticationV4Service
import com.owenlejeune.tvtime.api.tmdb.api.v4.model.AuthAccessBody
import com.owenlejeune.tvtime.api.tmdb.api.v4.model.AuthDeleteBody
import com.owenlejeune.tvtime.api.tmdb.api.v4.model.AuthRequestBody
import com.owenlejeune.tvtime.preferences.AppPreferences
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
@@ -74,7 +72,7 @@ object SessionManager: KoinComponent {
onRedirect: (url: String) -> Unit
) {
val service = AuthenticationV4Service()
val requestTokenResponse = service.createRequestToken(AuthRequestBody(redirect = "app://tvtime.auth.return"))
val requestTokenResponse = service.createRequestToken(redirect = "app://tvtime.auth.return")
if (requestTokenResponse.isSuccessful) {
requestTokenResponse.body()?.let { ctr ->
val url = context.getString(R.string.tmdb_auth_url, ctr.requestToken)
@@ -92,11 +90,11 @@ object SessionManager: KoinComponent {
) {
if (currentSession.value is InProgressSession) {
val requestToken = currentSession.value!!.sessionId
val authResponse = authenticationV4Service.createAccessToken(AuthAccessBody(requestToken))
val authResponse = authenticationV4Service.createAccessToken(requestToken)
if (authResponse.isSuccessful) {
authResponse.body()?.let { ar ->
if (ar.success) {
val sessionResponse = authenticationService.createSessionFromV4Token(V4TokenBody(ar.accessToken))
val sessionResponse = authenticationService.createSessionFromV4Token(ar.accessToken)
if (sessionResponse.isSuccessful) {
sessionResponse.body()?.let { sr ->
preferences.authorizedSessionValues = AuthorizedSessionValues(