From ba934c0a55e6579c2f8e25b31535c33349850326 Mon Sep 17 00:00:00 2001 From: Anta Date: Wed, 15 Nov 2023 10:51:08 +0100 Subject: [PATCH] entity changes --- .../diploma/core/di/InteractorModule.kt | 2 +- .../diploma/core/di/RepositoryModule.kt | 2 + .../diploma/data/FavouriteRepositoryImpl.kt | 45 ++-------- .../diploma/data/VacancyEntityMapper.kt | 86 +++++++++++++++++++ .../android/diploma/data/db/VacancyDao.kt | 3 + .../diploma/data/db/entity/VacancyEntity.kt | 9 ++ .../android/diploma/domain/api/.gitkeep | 0 .../diploma/domain/detail/DetailInteractor.kt | 9 -- .../diploma/domain/detail/DetailRepository.kt | 7 -- .../detail/impl/DetailInteractorImpl.kt | 13 --- .../domain/favorite/FavouriteRepository.kt | 1 + .../domain/impl/DetailInteractorImpl.kt | 6 +- .../domain/models/detail/FullVacancy.kt | 4 +- .../android/diploma/util/bulletedlist.kt | 4 +- 14 files changed, 117 insertions(+), 74 deletions(-) create mode 100644 app/src/main/java/ru/practicum/android/diploma/data/VacancyEntityMapper.kt delete mode 100644 app/src/main/java/ru/practicum/android/diploma/domain/api/.gitkeep delete mode 100644 app/src/main/java/ru/practicum/android/diploma/domain/detail/DetailInteractor.kt delete mode 100644 app/src/main/java/ru/practicum/android/diploma/domain/detail/DetailRepository.kt delete mode 100644 app/src/main/java/ru/practicum/android/diploma/domain/detail/impl/DetailInteractorImpl.kt diff --git a/app/src/main/java/ru/practicum/android/diploma/core/di/InteractorModule.kt b/app/src/main/java/ru/practicum/android/diploma/core/di/InteractorModule.kt index 3f7e3f5e4a..e71791097d 100644 --- a/app/src/main/java/ru/practicum/android/diploma/core/di/InteractorModule.kt +++ b/app/src/main/java/ru/practicum/android/diploma/core/di/InteractorModule.kt @@ -19,7 +19,7 @@ val interactorModule = module { single { SearchInteractorImpl(get(),get()) } single { FilterInteractorImpl(get(), get()) } single { SimilarInteractorImpl(get()) } - single { DetailInteractorImpl(get(), get()) } + single { DetailInteractorImpl(get(), get(), get()) } single { FavouriteInteractorImpl(get()) } single { SalaryPresenter(androidContext()) } } diff --git a/app/src/main/java/ru/practicum/android/diploma/core/di/RepositoryModule.kt b/app/src/main/java/ru/practicum/android/diploma/core/di/RepositoryModule.kt index 77139a8f00..6dd5aa85b5 100644 --- a/app/src/main/java/ru/practicum/android/diploma/core/di/RepositoryModule.kt +++ b/app/src/main/java/ru/practicum/android/diploma/core/di/RepositoryModule.kt @@ -5,6 +5,7 @@ import ru.practicum.android.diploma.data.DetailRepositoryImpl import ru.practicum.android.diploma.data.FavouriteRepositoryImpl import ru.practicum.android.diploma.data.SearchRepositoryImpl import ru.practicum.android.diploma.data.SimilarRepositoryImpl +import ru.practicum.android.diploma.data.VacancyEntityMapper import ru.practicum.android.diploma.data.VacancyMapper import ru.practicum.android.diploma.data.filter.DirectoryRepositoryImpl import ru.practicum.android.diploma.data.filter.FilterRepositoryImpl @@ -24,5 +25,6 @@ val repositoryModule = module { single { FilterRepositoryImpl(get()) } single { FavouriteRepositoryImpl(get(), get()) } single { VacancyMapper() } + single { VacancyEntityMapper(get()) } single { FiltersMapper() } } \ No newline at end of file diff --git a/app/src/main/java/ru/practicum/android/diploma/data/FavouriteRepositoryImpl.kt b/app/src/main/java/ru/practicum/android/diploma/data/FavouriteRepositoryImpl.kt index 21c5080487..9eaa1c3b6b 100644 --- a/app/src/main/java/ru/practicum/android/diploma/data/FavouriteRepositoryImpl.kt +++ b/app/src/main/java/ru/practicum/android/diploma/data/FavouriteRepositoryImpl.kt @@ -1,26 +1,21 @@ package ru.practicum.android.diploma.data -import com.google.gson.Gson -import com.google.gson.reflect.TypeToken import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flow import ru.practicum.android.diploma.data.db.VacancyDao -import ru.practicum.android.diploma.data.db.entity.VacancyEntity import ru.practicum.android.diploma.domain.favorite.FavouriteRepository -import ru.practicum.android.diploma.domain.models.Salary import ru.practicum.android.diploma.domain.models.Vacancy import ru.practicum.android.diploma.domain.models.detail.FullVacancy -import java.lang.reflect.Type -class FavouriteRepositoryImpl(private val dao: VacancyDao, private val gson: Gson) : +class FavouriteRepositoryImpl(private val dao: VacancyDao, private val mapper: VacancyEntityMapper,) : FavouriteRepository { override suspend fun addToFavourite(fullVacancy: FullVacancy) { - val vacancyEntity = toVacancyEntity(fullVacancy) + val vacancyEntity = mapper.toVacancyEntity(fullVacancy) dao.addVacancy(vacancyEntity) } override suspend fun deleteFromFavourite(fullVacancy: FullVacancy) { - val vacancyEntity = toVacancyEntity(fullVacancy) + val vacancyEntity = mapper.toVacancyEntity(fullVacancy) dao.delete(vacancyEntity) } override fun getFavouriteStatus(vacancyId: String): Flow = flow { @@ -30,38 +25,12 @@ class FavouriteRepositoryImpl(private val dao: VacancyDao, private val gson: Gso override fun getFavouriteVacancies(): Flow> = flow { val favouriteVacancies = dao.getFavoriteVacancies() - emit(fromVacancyEntity(favouriteVacancies)) + emit(mapper.fromVacancyEntityToList(favouriteVacancies)) } - private fun toVacancyEntity(fullVacancy: FullVacancy): VacancyEntity { - return VacancyEntity( - fullVacancy.id, - fullVacancy.name, - fullVacancy.city, - fullVacancy.employerName, - fullVacancy.employerLogoUrl ?: "", - gson.toJson(fullVacancy.salary), - ) + override suspend fun getFullVacancy(id:String): FullVacancy? { + val favouriteVacancy = dao.getFavoriteVacancy(id) + return if(favouriteVacancy != null) mapper.fromVacancyEntityToFullVacancy(favouriteVacancy) else null } - private fun fromVacancyEntity(vacancies: List): List { - return vacancies.map { vacancy -> mapFromEntity(vacancy) } - } - - private fun mapFromEntity(vacancyEntity: VacancyEntity): Vacancy { - return Vacancy( - vacancyEntity.id, - vacancyEntity.name, - vacancyEntity.city, - vacancyEntity.employerName, - 0, - vacancyEntity.employerLogoUrl, - convertToSalary(vacancyEntity.salary), - ) - } - - private fun convertToSalary(json: String?): Salary? { - val myClassObject: Type = object : TypeToken() {}.type - return if (!json.isNullOrEmpty()) gson.fromJson(json, myClassObject) else null - } } diff --git a/app/src/main/java/ru/practicum/android/diploma/data/VacancyEntityMapper.kt b/app/src/main/java/ru/practicum/android/diploma/data/VacancyEntityMapper.kt new file mode 100644 index 0000000000..3a772fa981 --- /dev/null +++ b/app/src/main/java/ru/practicum/android/diploma/data/VacancyEntityMapper.kt @@ -0,0 +1,86 @@ +package ru.practicum.android.diploma.data + +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import ru.practicum.android.diploma.data.db.entity.VacancyEntity +import ru.practicum.android.diploma.domain.models.Contact +import ru.practicum.android.diploma.domain.models.Phone +import ru.practicum.android.diploma.domain.models.Salary +import ru.practicum.android.diploma.domain.models.Vacancy +import ru.practicum.android.diploma.domain.models.detail.FullVacancy +import java.lang.reflect.Type + +class VacancyEntityMapper(private val gson: Gson) { + fun toVacancyEntity(fullVacancy: FullVacancy): VacancyEntity { + return VacancyEntity( + fullVacancy.id, + fullVacancy.name, + fullVacancy.city, + fullVacancy.employerName, + fullVacancy.employerLogoUrl ?: "", + gson.toJson(fullVacancy.salary), + fullVacancy.alternate_url, + fullVacancy.brandedDescription, + fullVacancy.contacts?.name, + fullVacancy.contacts?.email, + gson.toJson(fullVacancy.contacts?.phones), + fullVacancy.description, + fullVacancy.experience, + fullVacancy.employment, + fullVacancy.skills + ) + } + fun fromVacancyEntityToList(vacancies: List): List { + return vacancies.map { vacancy -> mapFromEntity(vacancy) } + } + + private fun mapFromEntity(vacancyEntity: VacancyEntity): Vacancy { + return Vacancy( + vacancyEntity.id, + vacancyEntity.name, + vacancyEntity.city, + vacancyEntity.employerName, + 0, + vacancyEntity.employerLogoUrl, + convertToSalary(vacancyEntity.salary), + ) + } + + private fun convertToSalary(json: String?): Salary? { + val myClassObject: Type = object : TypeToken() {}.type + return if (!json.isNullOrEmpty()) gson.fromJson(json, myClassObject) else null + } + + fun fromVacancyEntityToFullVacancy(vacancy: VacancyEntity): FullVacancy { + return FullVacancy( + vacancy.id, + vacancy.name, + vacancy.city, + vacancy.employerName, + vacancy.employerLogoUrl, + mapToSalary(vacancy.salary), + vacancy.alternate_url, + vacancy.brandedDescription, + mapToContacts(vacancy), + vacancy.description, + vacancy.experience, + vacancy.employment, + vacancy.skills + ) + + } + + private fun mapToSalary(json: String?): Salary? { + return gson.fromJson(json,Salary::class.java) + } + + private fun mapToContacts(vacancy: VacancyEntity): Contact { + val listOfMyClassObject: Type = object : TypeToken?>() {}.type + val phones: List = if (!vacancy.contactPhones.isNullOrEmpty()) gson.fromJson(vacancy.contactPhones, listOfMyClassObject) else mutableListOf() + return Contact( + vacancy.contactName, + vacancy.contactEmail, + phones + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/ru/practicum/android/diploma/data/db/VacancyDao.kt b/app/src/main/java/ru/practicum/android/diploma/data/db/VacancyDao.kt index 9648225f82..4e5b7fdef6 100644 --- a/app/src/main/java/ru/practicum/android/diploma/data/db/VacancyDao.kt +++ b/app/src/main/java/ru/practicum/android/diploma/data/db/VacancyDao.kt @@ -20,4 +20,7 @@ interface VacancyDao { @Delete suspend fun delete(vacancyEntity: VacancyEntity) + @Query("SELECT * FROM vacancy_table WHERE id = :id") + suspend fun getFavoriteVacancy(id: String): VacancyEntity? + } \ No newline at end of file diff --git a/app/src/main/java/ru/practicum/android/diploma/data/db/entity/VacancyEntity.kt b/app/src/main/java/ru/practicum/android/diploma/data/db/entity/VacancyEntity.kt index 9bbc14cf0c..478dcc3bdb 100644 --- a/app/src/main/java/ru/practicum/android/diploma/data/db/entity/VacancyEntity.kt +++ b/app/src/main/java/ru/practicum/android/diploma/data/db/entity/VacancyEntity.kt @@ -12,4 +12,13 @@ data class VacancyEntity( val employerName: String, val employerLogoUrl: String, val salary: String?, + val alternate_url: String?, + val brandedDescription: String?, + val contactName: String?, + val contactEmail: String?, + val contactPhones: String?, + val description: String?, + val experience: String?, + val employment: String, + val skills: String?, ) diff --git a/app/src/main/java/ru/practicum/android/diploma/domain/api/.gitkeep b/app/src/main/java/ru/practicum/android/diploma/domain/api/.gitkeep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/app/src/main/java/ru/practicum/android/diploma/domain/detail/DetailInteractor.kt b/app/src/main/java/ru/practicum/android/diploma/domain/detail/DetailInteractor.kt deleted file mode 100644 index 9241b6dcbc..0000000000 --- a/app/src/main/java/ru/practicum/android/diploma/domain/detail/DetailInteractor.kt +++ /dev/null @@ -1,9 +0,0 @@ -package ru.practicum.android.diploma.domain.detail - -import ru.practicum.android.diploma.domain.models.detail.FullVacancy - -interface DetailInteractor { -fun getVacancy(): FullVacancy - - -} diff --git a/app/src/main/java/ru/practicum/android/diploma/domain/detail/DetailRepository.kt b/app/src/main/java/ru/practicum/android/diploma/domain/detail/DetailRepository.kt deleted file mode 100644 index ac82c71ad6..0000000000 --- a/app/src/main/java/ru/practicum/android/diploma/domain/detail/DetailRepository.kt +++ /dev/null @@ -1,7 +0,0 @@ -package ru.practicum.android.diploma.domain.detail - -import ru.practicum.android.diploma.domain.models.detail.FullVacancy - -interface DetailRepository { - fun getVavancy(): FullVacancy -} \ No newline at end of file diff --git a/app/src/main/java/ru/practicum/android/diploma/domain/detail/impl/DetailInteractorImpl.kt b/app/src/main/java/ru/practicum/android/diploma/domain/detail/impl/DetailInteractorImpl.kt deleted file mode 100644 index 7de084f2be..0000000000 --- a/app/src/main/java/ru/practicum/android/diploma/domain/detail/impl/DetailInteractorImpl.kt +++ /dev/null @@ -1,13 +0,0 @@ -package ru.practicum.android.diploma.domain.detail.impl - -import ru.practicum.android.diploma.domain.detail.DetailInteractor -import ru.practicum.android.diploma.domain.detail.DetailRepository -import ru.practicum.android.diploma.domain.models.detail.FullVacancy - -class DetailInteractorImpl(val repository: DetailRepository) : DetailInteractor { - override fun getVacancy(): FullVacancy { - return repository.getVavancy() - } - - -} \ No newline at end of file diff --git a/app/src/main/java/ru/practicum/android/diploma/domain/favorite/FavouriteRepository.kt b/app/src/main/java/ru/practicum/android/diploma/domain/favorite/FavouriteRepository.kt index 4452179a27..ae0bd815e4 100644 --- a/app/src/main/java/ru/practicum/android/diploma/domain/favorite/FavouriteRepository.kt +++ b/app/src/main/java/ru/practicum/android/diploma/domain/favorite/FavouriteRepository.kt @@ -11,6 +11,7 @@ interface FavouriteRepository { fun getFavouriteStatus(vacancyId: String): Flow fun getFavouriteVacancies(): Flow> + suspend fun getFullVacancy(id:String): FullVacancy? } \ No newline at end of file diff --git a/app/src/main/java/ru/practicum/android/diploma/domain/impl/DetailInteractorImpl.kt b/app/src/main/java/ru/practicum/android/diploma/domain/impl/DetailInteractorImpl.kt index 3eba33f168..c972ee2ba3 100644 --- a/app/src/main/java/ru/practicum/android/diploma/domain/impl/DetailInteractorImpl.kt +++ b/app/src/main/java/ru/practicum/android/diploma/domain/impl/DetailInteractorImpl.kt @@ -5,12 +5,14 @@ import kotlinx.coroutines.flow.map import ru.practicum.android.diploma.domain.DetailInteractor import ru.practicum.android.diploma.domain.ExternalNavigator import ru.practicum.android.diploma.domain.api.DetailRepository +import ru.practicum.android.diploma.domain.favorite.FavouriteRepository import ru.practicum.android.diploma.domain.models.Phone import ru.practicum.android.diploma.domain.models.detail.FullVacancy import ru.practicum.android.diploma.util.Resource class DetailInteractorImpl( val repository: DetailRepository, + val favouriteRepository: FavouriteRepository, private val navigator: ExternalNavigator ) : DetailInteractor { @@ -20,9 +22,9 @@ class DetailInteractorImpl( is Resource.Success<*> -> { Pair(result.data, null) } - is Resource.Error<*> -> { - Pair(null, result.message) + val favouriteVacancy =favouriteRepository.getFullVacancy(id) + if (favouriteVacancy != null) Pair(favouriteVacancy, null) else Pair(null, result.message) } } } diff --git a/app/src/main/java/ru/practicum/android/diploma/domain/models/detail/FullVacancy.kt b/app/src/main/java/ru/practicum/android/diploma/domain/models/detail/FullVacancy.kt index fecc18e1fc..e602957eba 100644 --- a/app/src/main/java/ru/practicum/android/diploma/domain/models/detail/FullVacancy.kt +++ b/app/src/main/java/ru/practicum/android/diploma/domain/models/detail/FullVacancy.kt @@ -15,6 +15,6 @@ data class FullVacancy( val contacts: Contact?, val description: String?, val experience: String?, - val employment: CharSequence, - val skills: CharSequence?, + val employment: String, + val skills: String?, ) diff --git a/app/src/main/java/ru/practicum/android/diploma/util/bulletedlist.kt b/app/src/main/java/ru/practicum/android/diploma/util/bulletedlist.kt index eb32a32e84..3dca3c37c4 100644 --- a/app/src/main/java/ru/practicum/android/diploma/util/bulletedlist.kt +++ b/app/src/main/java/ru/practicum/android/diploma/util/bulletedlist.kt @@ -3,12 +3,12 @@ package ru.practicum.android.diploma.util import android.text.SpannableString import android.text.style.BulletSpan -fun List.toBulletedList(): CharSequence { +fun List.toBulletedList(): String { return SpannableString(this.joinToString("\n")).apply { this@toBulletedList.foldIndexed(0) { index, acc, span -> val end = acc + span.length + if (index != this@toBulletedList.size - 1) 1 else 0 this.setSpan(BulletSpan(16), acc, end, 0) end } - } + }.toString() } \ No newline at end of file