Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ plugins {
alias(libs.plugins.kotlin.android)
alias(libs.plugins.kotlin.compose)
id("com.google.gms.google-services")
alias(libs.plugins.ksp)
}

android {
Expand Down Expand Up @@ -49,6 +50,11 @@ android {

dependencies {

//Room
implementation(libs.room.runtime)
implementation(libs.room.ktx)
ksp(libs.room.compiler)

//DataStore
implementation(libs.data.store)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,10 @@ import kotlinx.coroutines.flow.Flow

interface AuthLocalDataSource {
fun getUID(): Flow<String?>
fun getUserName(): Flow<String?>
suspend fun saveUID(uid: String)

suspend fun saveUserName(name: String)

suspend fun clearUID()
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,19 +14,33 @@ class AuthLocalDataSourceImpl(private val context: Context) : AuthLocalDataSourc

private object PreferencesKeys {
val UID_KEY = stringPreferencesKey("uid")
val NAME_KEY = stringPreferencesKey("name")
}

override fun getUID(): Flow<String?> =
context.dataStore.data.map { prefs ->
prefs[PreferencesKeys.UID_KEY]
}

override fun getUserName(): Flow<String?> =
context.dataStore.data.map { prefs ->
prefs[PreferencesKeys.NAME_KEY]
}


override suspend fun saveUID(uid: String) {
Log.i("AuthLocalDataSourceImpl", "saveUser: $uid")
context.dataStore.edit { prefs ->
prefs[PreferencesKeys.UID_KEY] = uid
}

}

override suspend fun saveUserName(userName: String) {
Log.i("AuthLocalDataSourceImpl", "saveName: $userName")
context.dataStore.edit { prefs ->
prefs[PreferencesKeys.NAME_KEY] = userName
}
}

override suspend fun clearUID() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.delecrode.devhub.data.local.database

import androidx.room.Database
import androidx.room.RoomDatabase
import com.delecrode.devhub.data.local.database.dao.RepoDao
import com.delecrode.devhub.data.model.entity.RepoEntity

@Database(
entities = [RepoEntity::class],
version = 1
)
abstract class AppDatabase : RoomDatabase() {
abstract fun repoDao(): RepoDao
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.delecrode.devhub.data.local.database.dao

import androidx.room.Dao
import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.Query
import com.delecrode.devhub.data.model.entity.RepoEntity
import kotlinx.coroutines.flow.Flow

@Dao
interface RepoDao {

@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insert(repo: RepoEntity)

@Query("SELECT * FROM repositories")
fun getAll(): Flow<List<RepoEntity>>

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.delecrode.devhub.data.local.database.data

import com.delecrode.devhub.data.model.entity.RepoEntity
import kotlinx.coroutines.flow.Flow

interface RepoLocalDataSource {

suspend fun save(repo: RepoEntity)

fun getAll(): Flow<List<RepoEntity>>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.delecrode.devhub.data.local.database.data

import com.delecrode.devhub.data.local.database.dao.RepoDao
import com.delecrode.devhub.data.model.entity.RepoEntity
import kotlinx.coroutines.flow.Flow

class RepoLocalDataSourceImpl(
private val dao: RepoDao
) : RepoLocalDataSource {

override suspend fun save(repo: RepoEntity) {
dao.insert(repo)
}

override fun getAll(): Flow<List<RepoEntity>> =
dao.getAll()
}
31 changes: 27 additions & 4 deletions app/src/main/java/com/delecrode/devhub/data/mapper/ReposMapper.kt
Original file line number Diff line number Diff line change
@@ -1,19 +1,41 @@
package com.delecrode.devhub.data.mapper

import com.delecrode.devhub.data.model.LanguagesDto
import com.delecrode.devhub.data.model.RepoDetailDto
import com.delecrode.devhub.data.model.ReposDto
import com.delecrode.devhub.data.model.dto.LanguagesDto
import com.delecrode.devhub.data.model.dto.RepoDetailDto
import com.delecrode.devhub.data.model.dto.ReposDto
import com.delecrode.devhub.data.model.entity.RepoEntity
import com.delecrode.devhub.domain.model.Languages
import com.delecrode.devhub.domain.model.RepoDetail
import com.delecrode.devhub.domain.model.RepoFav
import com.delecrode.devhub.domain.model.Repos


//Repositorios favoritos
fun RepoFav.toEntity(): RepoEntity =
RepoEntity(
id = id,
name = name,
userName = userName,
description = description,
url = url
)

fun RepoEntity.toDomain(): RepoFav =
RepoFav(
id = id,
name = name,
userName = userName,
description = description,
url = url
)

fun LanguagesDto.toLanguagesDomain(): Languages {
return Languages(
languages = this.keys.toList()
)
}



fun ReposDto.toReposDomain(): Repos {
return Repos(
id = id,
Expand All @@ -32,6 +54,7 @@ fun ReposDto.toReposDomain(): Repos {

fun RepoDetailDto.toRepoDetailDomain(): RepoDetail {
return RepoDetail(
id = id,
name = name,
html_url = html_url,
description = description ?: "",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.delecrode.devhub.data.mapper

import com.delecrode.devhub.data.model.UserForFirebaseDto
import com.delecrode.devhub.data.model.UserForGitDto
import com.delecrode.devhub.data.model.dto.UserForFirebaseDto
import com.delecrode.devhub.data.model.dto.UserForGitDto
import com.delecrode.devhub.domain.model.UserForFirebase
import com.delecrode.devhub.domain.model.UserForGit

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.delecrode.devhub.data.model
package com.delecrode.devhub.data.model.dto

data class ReposDto(
val id: Int,
Expand All @@ -16,6 +16,7 @@ data class ReposDto(


data class RepoDetailDto(
val id: Int,
val name: String,
val html_url: String,
val description: String?,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.delecrode.devhub.data.model
package com.delecrode.devhub.data.model.dto

data class UserForGitDto(
val login: String ?,
Expand Down
16 changes: 16 additions & 0 deletions app/src/main/java/com/delecrode/devhub/data/model/entity/Repo.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.delecrode.devhub.data.model.entity

import androidx.room.Entity
import androidx.room.PrimaryKey


@Entity(tableName = "repositories")
data class RepoEntity(
@PrimaryKey(autoGenerate = true)
val idLocal: Long = 0,
val id: Int,
val name: String,
val userName: String,
val description: String,
val url: String,
)
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.delecrode.devhub.data.remote.webApi.service

import com.delecrode.devhub.data.model.LanguagesDto
import com.delecrode.devhub.data.model.RepoDetailDto
import com.delecrode.devhub.data.model.dto.LanguagesDto
import com.delecrode.devhub.data.model.dto.RepoDetailDto
import retrofit2.Response
import retrofit2.http.GET
import retrofit2.http.Path
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.delecrode.devhub.data.remote.webApi.service

import com.delecrode.devhub.data.model.ReposDto
import com.delecrode.devhub.data.model.UserForGitDto
import com.delecrode.devhub.data.model.dto.ReposDto
import com.delecrode.devhub.data.model.dto.UserForGitDto
import retrofit2.Response
import retrofit2.http.GET
import retrofit2.http.Path
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,31 @@
package com.delecrode.devhub.data.repository

import com.delecrode.devhub.data.local.dataStore.AuthLocalDataSource
import com.delecrode.devhub.data.local.database.data.RepoLocalDataSource
import com.delecrode.devhub.data.mapper.toDomain
import com.delecrode.devhub.data.mapper.toEntity
import com.delecrode.devhub.data.mapper.toLanguagesDomain
import com.delecrode.devhub.data.mapper.toRepoDetailDomain
import com.delecrode.devhub.data.remote.webApi.service.RepoApiService
import com.delecrode.devhub.domain.model.Languages
import com.delecrode.devhub.domain.model.RepoDetail
import com.delecrode.devhub.domain.model.RepoFav
import com.delecrode.devhub.domain.repository.RepoRepository
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map

class RepoRepositoryImpl(val repoApi: RepoApiService) : RepoRepository {
class RepoRepositoryImpl(val repoApi: RepoApiService, private val localDataSource: RepoLocalDataSource, private val authLocalDataSource: AuthLocalDataSource) : RepoRepository {

override suspend fun save(repo: RepoFav) {
localDataSource.save(repo.toEntity())
}

override fun getAll(): Flow<List<RepoFav>> =
localDataSource.getAll()
.map { list -> list.map { it.toDomain() } }

override fun getUserName(): Flow<String?> =
authLocalDataSource.getUserName()

override suspend fun getRepoDetail(owner: String, repo: String): RepoDetail {
try {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import android.util.Log
import com.delecrode.devhub.data.local.dataStore.AuthLocalDataSource
import com.delecrode.devhub.data.mapper.toReposDomain
import com.delecrode.devhub.data.mapper.toUserDomain
import com.delecrode.devhub.data.model.UserForFirebaseDto
import com.delecrode.devhub.data.model.dto.UserForFirebaseDto
import com.delecrode.devhub.data.remote.firebase.UserExtraData
import com.delecrode.devhub.data.remote.webApi.service.UserApiService
import com.delecrode.devhub.domain.model.Repos
Expand All @@ -13,7 +13,11 @@ import com.delecrode.devhub.domain.model.UserForGit
import com.delecrode.devhub.domain.repository.UserRepository
import kotlinx.coroutines.flow.first

class UserRepositoryImpl(private val userApi: UserApiService, private val userExtraData: UserExtraData, private val authLocalDataSource: AuthLocalDataSource) : UserRepository {
class UserRepositoryImpl(
private val userApi: UserApiService,
private val userExtraData: UserExtraData,
private val authLocalDataSource: AuthLocalDataSource
) : UserRepository {

override suspend fun getUserForGitHub(userName: String): UserForGit {
try {
Expand All @@ -38,23 +42,26 @@ class UserRepositoryImpl(private val userApi: UserApiService, private val userEx
try {
val uid = authLocalDataSource.getUID().first()
Log.i("UserRepositoryImpl", "getUserForFirebase (UID Real): $uid")
if(uid != null){
if (uid != null) {
val response = userExtraData.getUser(uid)
if (response.exists()) {
val body = response.toObject(UserForFirebaseDto::class.java)?.toUserDomain()
val userName = body?.username
if (userName != null) {
authLocalDataSource.saveUserName(userName)
}
if (body != null) {
return body
} else {
throw Exception("Resposta vazia do servidor")
}
}else{
} else {
throw Exception("Usuário não encontrado")
}
}
else{
} else {
return UserForFirebase()
}
}catch (e: Exception){
} catch (e: Exception) {
throw e
}
}
Expand Down
Loading