OP.GG 짭 1-2
데이터는 출처에 따라 API, DB 폴더로 분리하였고, Repository를 통해 캡슐화 하였습니다.
interface LeagueOfLegendAPI {
@GET("summoner/v4/summoners/by-name/{summonerName}")
suspend fun getSummoner(
@Path("summonerName") summonerName: String,
@Query("api_key") api_key: String
): Response<Summoner>
@GET("league/v4/entries/by-summoner/{encryptedSummonerId}")
suspend fun getLeague(
@Path("encryptedSummonerId") encryptedSummonerId: String?,
@Query("api_key") api_key: String
): Response<Set<LeagueEntryDTO>>
@GET("spectator/v4/active-games/by-summoner/{encryptedSummonerId}")
suspend fun getSpectator(
@Path("encryptedSummonerId") encryptedSummonerId: String?,
@Query("api_key") api_key: String
): Response<CurrentGameInfo>
}
Retrofit Interface로 사용할 api의 endPoint를 지정합니다.
@Database(entities = [SummonerEntity::class, SearchEntity::class, ProfileEntity::class], version = 1)
@TypeConverters(
value = [
MiniSeriesTypeConverter::class
]
)
abstract class AppDatabase: RoomDatabase() {
abstract fun LoLDao(): LoLDao
}
DataBase에서는 총 세 가지의 Entity를 사용하였고 Dao는 다음과 같이
@Dao
interface LoLDao {
@Query("SELECT * FROM SummonerEntity")
fun getSummoner(): LiveData<List<SummonerEntity>>
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertSummoner(summonerEntity: SummonerEntity)
@Update
suspend fun updateSummoner(summonerEntity: SummonerEntity)
@Delete
suspend fun deleteSummoner(summonerEntity: SummonerEntity)
@Query("DELETE FROM SummonerEntity")
suspend fun deleteSummonerAll()
//Search
@Query("SELECT * FROM SearchEntity")
fun getSearch(): LiveData<List<SearchEntity>>
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertSearch(searchEntity: SearchEntity)
@Delete
suspend fun deleteSearch(searchEntity: SearchEntity)
@Query("DELETE FROM SearchEntity")
suspend fun deleteSearchAll()
@Query("SELECT * FROM ProfileEntity")
fun getProfile(): LiveData<ProfileEntity>
@Insert
suspend fun insertProfile(profileEntity: ProfileEntity)
@Update
suspend fun updateProfile(profileEntity: ProfileEntity)
@Query("DELETE FROM ProfileEntity")
suspend fun deleteProfile()
}
검색화연에 띄울 데이터와 메인화면에 띄울 데이터를 분리하여 구현 하였습니다.
class AppRepository constructor(private val dao: LoLDao, private val api: LeagueOfLegendAPI) {
suspend fun searchSummoner(name: String, apiKey: String): Response<Summoner> = api.getSummoner(name,apiKey)
suspend fun searchLeague(summonerId:String?, apiKey: String): Response<Set<LeagueEntryDTO>> = api.getLeague(summonerId,apiKey)
suspend fun searchSpectator(summonerId:String?, apiKey: String): Response<CurrentGameInfo> = api.getSpectator(summonerId,apiKey)
// Room Main
fun getSummoner() = dao.getSummoner()
suspend fun insertSummoner(summonerEntity: SummonerEntity){
dao.insertSummoner(summonerEntity)
}
suspend fun updateSummoner(summonerEntity: SummonerEntity){
dao.updateSummoner(summonerEntity)
}
suspend fun deleteSummoner(summonerEntity: SummonerEntity){
dao.deleteSummoner(summonerEntity)
}
suspend fun deleteSummonerAll(){
dao.deleteSummonerAll()
}
// Search
fun getSearch() = dao.getSearch()
suspend fun insertSearch(searchEntity: SearchEntity){
dao.insertSearch(searchEntity)
}
suspend fun deleteSearch(searchEntity: SearchEntity){
dao.deleteSearch(searchEntity)
}
suspend fun deleteSearchAll(){
dao.deleteSearchAll()
}
// API KEY
fun getApikey() = LoLApp.pref.getApikey()
fun setApikey(value: String) {
LoLApp.pref.setApikey(value)
}
fun delApikey() {
LoLApp.pref.delApikey()
}
// Search
fun getProfile() = dao.getProfile()
suspend fun insertProfile(profileEntity: ProfileEntity){
dao.insertProfile(profileEntity)
}
suspend fun updateProfile(profileEntity: ProfileEntity){
dao.updateProfile(profileEntity)
}
suspend fun deleteProfile(){
dao.deleteProfile()
}
}
위에서 선언한 API와 Dao를 Repository에 모아 캡슐화 하였습니다.