All Downloads are FREE. Search and download functionalities are using the official Maven repository.

commonMain.com.harmony.kotlin.data.repository.RepositoryMapper.kt Maven / Gradle / Ivy

package com.harmony.kotlin.data.repository

import com.harmony.kotlin.data.mapper.Mapper
import com.harmony.kotlin.data.mapper.map
import com.harmony.kotlin.data.operation.Operation
import com.harmony.kotlin.data.query.Query

/**
 * This repository uses mappers to map objects and redirects them to the contained repository, acting as a simple "translator".
 *
 * @param getRepository Repository with get operations
 * @param putRepository Repository with put operations
 * @param deleteRepository Repository with delete operations
 * @param toOutMapper Mapper to map data objects to domain objects
 * @param toInMapper Mapper to map domain objects to data objects
 */
class RepositoryMapper(
  private val getRepository: GetRepository,
  private val putRepository: PutRepository,
  private val deleteRepository: DeleteRepository,
  private val toOutMapper: Mapper,
  private val toInMapper: Mapper
) : GetRepository, PutRepository, DeleteRepository {

  override suspend fun get(query: Query, operation: Operation): Out = get(getRepository, toOutMapper, query, operation)

  @Deprecated("Use get instead")
  override suspend fun getAll(query: Query, operation: Operation): List = getAll(getRepository, toOutMapper, query, operation)

  override suspend fun put(query: Query, value: Out?, operation: Operation): Out = put(putRepository, toOutMapper, toInMapper, value, query, operation)

  @Deprecated("Use put instead")
  override suspend fun putAll(query: Query, value: List?, operation: Operation): List = putAll(
    putRepository, toOutMapper, toInMapper, value, query,
    operation
  )

  override suspend fun delete(query: Query, operation: Operation) = deleteRepository.delete(query, operation)
}

class GetRepositoryMapper(
  private val getRepository: GetRepository,
  private val toOutMapper: Mapper
) : GetRepository {

  override suspend fun get(query: Query, operation: Operation): Out = get(getRepository, toOutMapper, query, operation)

  @Deprecated("Use get instead")
  override suspend fun getAll(query: Query, operation: Operation): List = getAll(getRepository, toOutMapper, query, operation)
}

class PutRepositoryMapper(
  private val putRepository: PutRepository,
  private val toOutMapper: Mapper,
  private val toInMapper: Mapper
) : PutRepository {

  override suspend fun put(query: Query, value: Out?, operation: Operation): Out = put(putRepository, toOutMapper, toInMapper, value, query, operation)

  @Deprecated("Use put instead")
  override suspend fun putAll(query: Query, value: List?, operation: Operation): List = putAll(
    putRepository, toOutMapper, toInMapper, value,
    query, operation
  )
}

private suspend fun  get(
  getRepository: GetRepository,
  toOutMapper: Mapper,
  query: Query,
  operation: Operation
): Out = getRepository.get(query, operation).let { toOutMapper.map(it) }

private suspend fun  getAll(
  getRepository: GetRepository,
  toOutMapper: Mapper,
  query: Query,
  operation: Operation
) = getRepository.getAll(query, operation).map { toOutMapper.map(it) }

private suspend fun  put(
  putRepository: PutRepository,
  toOutMapper: Mapper,
  toInMapper: Mapper,
  value: Out?,
  query: Query,
  operation: Operation
): Out {
  val mapped = value?.let { toInMapper.map(it) }
  return putRepository.put(query, mapped, operation).let {
    toOutMapper.map(it)
  }
}

private suspend fun  putAll(
  putRepository: PutRepository,
  toOutMapper: Mapper,
  toInMapper: Mapper,
  value: List?,
  query: Query,
  operation: Operation
): List {
  val mapped = value?.let { toInMapper.map(it) }
  return putRepository.putAll(query, mapped, operation).map { toOutMapper.map(it) }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy