Skip to content

Commit

Permalink
Merge pull request #7 from Devdroid-Android/development_movie
Browse files Browse the repository at this point in the history
Development movie screen
  • Loading branch information
dev-satyamthakur committed Jun 13, 2023
2 parents 720cf92 + d1c10f3 commit ae05213
Show file tree
Hide file tree
Showing 23 changed files with 751 additions and 40 deletions.
4 changes: 2 additions & 2 deletions .idea/deploymentTargetDropDown.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package com.satyamthakur.silver.data.model.cast
import com.google.gson.annotations.SerializedName

data class ActorDTO(
@SerializedName("adult")
val adult: Boolean,

@SerializedName("also_known_as")
val alsoKnownAs: List<String>,

@SerializedName("biography")
val biography: String,

@SerializedName("birthday")
val birthday: String,

@SerializedName("deathday")
val deathDay: String?,

@SerializedName("gender")
val gender: Int,

@SerializedName("homepage")
val homepage: String?,

@SerializedName("id")
val id: Int,

@SerializedName("imdb_id")
val imdbId: String,

@SerializedName("known_for_department")
val knownForDepartment: String,

@SerializedName("name")
val actorName: String,

@SerializedName("place_of_birth")
val placeOfBirth: String,

@SerializedName("popularity")
val popularity: Double,

@SerializedName("profile_path")
val profilePath: String,

)
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package com.satyamthakur.silver.data.model.cast

import com.google.gson.annotations.SerializedName

data class CastDTO(

@SerializedName("adult")
val adult: Boolean,

@SerializedName("cast_id")
val castId: Int,

@SerializedName("character")
val character: String,

@SerializedName("credit_id")
val creditId: String,

@SerializedName("gender")
val gender: Int,

@SerializedName("id")
val actorId: Int,

@SerializedName("known_for_department")
val knownForDepartment: String,

@SerializedName("name")
val name: String,

@SerializedName("order")
val order: Int,

@SerializedName("original_name")
val originalName: String,

@SerializedName("popularity")
val popularity: Double,

@SerializedName("profile_path")
val profilePath: String
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.satyamthakur.silver.data.model.cast

import com.google.gson.annotations.SerializedName

data class CreditsDTO(
@SerializedName("cast")
val cast: List<CastDTO>,

@SerializedName("crew")
val crew: List<CrewDTO>,

@SerializedName("id")
val movieId: Int
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.satyamthakur.silver.data.model.cast

import com.google.gson.annotations.SerializedName

data class CrewDTO(

@SerializedName("adult")
val adult: Boolean,

@SerializedName("credit_id")
val creditId: String,

@SerializedName("department")
val department: String,

@SerializedName("gender")
val gender: Int,

@SerializedName("id")
val crewId: Int,

@SerializedName("job")
val job: String,

@SerializedName("known_for_department")
val knownForDepartment: String,

@SerializedName("name")
val name: String,

@SerializedName("original_name")
val originalName: String,

@SerializedName("popularity")
val popularity: Double,

@SerializedName("profile_path")
val profilePath: String
)
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
package com.satyamthakur.silver.data.remote

import com.satyamthakur.silver.data.model.cast.ActorDTO
import com.satyamthakur.silver.data.model.GenericResultDTO
import com.satyamthakur.silver.data.model.MovieDTO
import com.satyamthakur.silver.data.model.cast.CreditsDTO
import retrofit2.http.GET
import retrofit2.http.Path
import retrofit2.http.Query

interface MovieEndpoint {

@GET("movie/now_playing")
@GET("movie/now_playing")
suspend fun getNowShowingMovies(
@Query("page") page: Int = 1,
@Query("language") language: String = "en-US"
Expand All @@ -18,4 +21,15 @@ interface MovieEndpoint {
@Query("page") page: Int = 1,
@Query("language") language: String = "en-US"
): GenericResultDTO<List<MovieDTO>>

@GET("person/{id}")
suspend fun getCastMovie(
@Path(value = "id") id: Int,
@Query("language") language: String = "en-Us"
): ActorDTO

@GET("movie/{movie_id}")
suspend fun getCreditsMovie(
@Path(value = "movie_id") movieId: Int
): CreditsDTO
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,15 @@
package com.satyamthakur.silver.data.repository

import com.satyamthakur.silver.domain.model.Movie
import com.satyamthakur.silver.domain.model.cast.Actor
import com.satyamthakur.silver.domain.model.cast.Credits
import com.satyamthakur.silver.utility.Resource
import kotlinx.coroutines.flow.Flow

interface IMovieRepository {
fun getNowShowingMovies(): Flow<Resource<List<Movie>>>
fun getPopularMovies(): Flow<Resource<List<Movie>>>
fun getActor(actorId: Int): Flow<Resource<Actor>>
fun getCredits(movieId: Int): Flow<Resource<Credits>>
}

Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,11 @@ package com.satyamthakur.silver.data.repository
import com.satyamthakur.silver.data.model.MovieDTO
import com.satyamthakur.silver.data.remote.MovieEndpoint
import com.satyamthakur.silver.domain.mapper.asMovie
import com.satyamthakur.silver.domain.mapper.asActor
import com.satyamthakur.silver.domain.mapper.asCredits
import com.satyamthakur.silver.domain.model.Movie
import com.satyamthakur.silver.domain.model.cast.Actor
import com.satyamthakur.silver.domain.model.cast.Credits
import com.satyamthakur.silver.utility.ErrorParser
import com.satyamthakur.silver.utility.Resource
import kotlinx.coroutines.Dispatchers
Expand Down Expand Up @@ -53,4 +57,46 @@ class MovieRepository(
emit(Resource.Loading)
}.flowOn(ioDispatcher)
}

override fun getActor(actorId: Int): Flow<Resource<Actor>> {
return flow<Resource<Actor>> {
val apiResult = movieApiService.getCastMovie(actorId)
emit(
Resource.Success(
data = apiResult.asActor()
)
)
}.catch { t ->
Timber.w(t)
emit(
Resource.Error(
data = null,
message = errorParser(t)
)
)
}.onStart {
emit(Resource.Loading)
}.flowOn(ioDispatcher)
}

override fun getCredits(movieId: Int): Flow<Resource<Credits>> {
return flow<Resource<Credits>> {
val apiResult = movieApiService.getCreditsMovie(movieId)
emit(
Resource.Success(
data = apiResult.asCredits()
)
)
}.catch { t ->
Timber.w(t)
emit(
Resource.Error(
data = null,
message = errorParser(t)
)
)
}.onStart {
emit(Resource.Loading)
}.flowOn(ioDispatcher)
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,15 @@
package com.satyamthakur.silver.domain.mapper

import com.satyamthakur.silver.data.model.MovieDTO
import com.satyamthakur.silver.data.model.cast.ActorDTO
import com.satyamthakur.silver.data.model.cast.CastDTO
import com.satyamthakur.silver.data.model.cast.CreditsDTO
import com.satyamthakur.silver.data.model.cast.CrewDTO
import com.satyamthakur.silver.domain.model.Movie
import com.satyamthakur.silver.domain.model.cast.Actor
import com.satyamthakur.silver.domain.model.cast.Cast
import com.satyamthakur.silver.domain.model.cast.Credits
import com.satyamthakur.silver.domain.model.cast.Crew

fun MovieDTO.asMovie() = Movie(
adult = adult,
Expand All @@ -19,3 +27,68 @@ fun MovieDTO.asMovie() = Movie(
voteAverage = voteAverage,
voteCount = voteCount
)

fun ActorDTO.asActor() = Actor(
adult = adult,
also_known_as = alsoKnownAs,
biography = biography,
birthday = birthday,
deathday = deathDay,
gender = gender,
homepage = homepage,
id = id,
imdb_id = imdbId,
known_for_department = knownForDepartment,
name = actorName,
place_of_birth = placeOfBirth,
popularity = popularity,
profile_path = profilePath
)

fun CrewDTO.asCrew() = Crew(
adult = adult,
creditId = creditId,
department = department,
gender = gender,
crewId = crewId,
job = job,
knownForDepartment = knownForDepartment,
name = name,
originalName = originalName,
popularity = popularity,
profilePath = profilePath
)

fun CastDTO.asCast() = Cast(
adult = adult,
castId = castId,
character = character,
creditId = creditId,
gender = gender,
actorId = actorId,
knownForDepartment = knownForDepartment,
name = name,
order = order,
originalName = originalName,
popularity = popularity,
profilePath = profilePath
)

fun CreditsDTO.asCredits(): Credits {
val listCrew = mutableListOf<Crew>()
val listCast = mutableListOf<Cast>()

crew.forEach {
listCrew.add(it.asCrew())
}

cast.forEach {
listCast.add(it.asCast())
}

return Credits(
cast = listCast,
crew = listCrew,
movieId = movieId
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.satyamthakur.silver.domain.model.cast

data class Actor(
val adult: Boolean,
val also_known_as: List<String>,
val biography: String,
val birthday: String,
val deathday: String?,
val gender: Int,
val homepage: String?,
val id: Int,
val imdb_id: String,
val known_for_department: String,
val name: String,
val place_of_birth: String,
val popularity: Double,
val profile_path: String
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.satyamthakur.silver.domain.model.cast

data class Cast(
val adult: Boolean,
val castId: Int,
val character: String,
val creditId: String,
val gender: Int,
val actorId: Int,
val knownForDepartment: String,
val name: String,
val order: Int,
val originalName: String,
val popularity: Double,
val profilePath: String
)
Loading

0 comments on commit ae05213

Please sign in to comment.