Skip to content

Commit

Permalink
Merge pull request #133 from AntaOtk/vacancy
Browse files Browse the repository at this point in the history
исправить на хранение полной вакансии#122
  • Loading branch information
AntaOtk authored Nov 15, 2023
2 parents 9722ee6 + ba934c0 commit e3fc33e
Show file tree
Hide file tree
Showing 14 changed files with 117 additions and 74 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ val interactorModule = module {
single<SearchInteractor> { SearchInteractorImpl(get(),get()) }
single<FilterInteractor> { FilterInteractorImpl(get(), get()) }
single<SimilarInteractor> { SimilarInteractorImpl(get()) }
single<DetailInteractor> { DetailInteractorImpl(get(), get()) }
single<DetailInteractor> { DetailInteractorImpl(get(), get(), get()) }
single<FavouriteInteractor> { FavouriteInteractorImpl(get()) }
single { SalaryPresenter(androidContext()) }
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -24,5 +25,6 @@ val repositoryModule = module {
single<FilterRepository> { FilterRepositoryImpl(get()) }
single<FavouriteRepository> { FavouriteRepositoryImpl(get(), get()) }
single { VacancyMapper() }
single { VacancyEntityMapper(get()) }
single { FiltersMapper() }
}
Original file line number Diff line number Diff line change
@@ -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<Boolean> = flow {
Expand All @@ -30,38 +25,12 @@ class FavouriteRepositoryImpl(private val dao: VacancyDao, private val gson: Gso

override fun getFavouriteVacancies(): Flow<List<Vacancy>> = 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<VacancyEntity>): List<Vacancy> {
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<Salary>() {}.type
return if (!json.isNullOrEmpty()) gson.fromJson(json, myClassObject) else null
}
}
Original file line number Diff line number Diff line change
@@ -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<VacancyEntity>): List<Vacancy> {
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<Salary>() {}.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<ArrayList<Phone>?>() {}.type
val phones: List<Phone> = if (!vacancy.contactPhones.isNullOrEmpty()) gson.fromJson(vacancy.contactPhones, listOfMyClassObject) else mutableListOf()
return Contact(
vacancy.contactName,
vacancy.contactEmail,
phones
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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?

}
Original file line number Diff line number Diff line change
Expand Up @@ -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?,
)
Empty file.

This file was deleted.

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ interface FavouriteRepository {
fun getFavouriteStatus(vacancyId: String): Flow<Boolean>

fun getFavouriteVacancies(): Flow<List<Vacancy>>
suspend fun getFullVacancy(id:String): FullVacancy?


}
Original file line number Diff line number Diff line change
Expand Up @@ -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 {

Expand All @@ -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)
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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?,
)
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,12 @@ package ru.practicum.android.diploma.util
import android.text.SpannableString
import android.text.style.BulletSpan

fun List<String>.toBulletedList(): CharSequence {
fun List<String>.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()
}

0 comments on commit e3fc33e

Please sign in to comment.