Skip to content
This repository has been archived by the owner on Jan 11, 2024. It is now read-only.

Domain layer #5

Open
wants to merge 11 commits into
base: gsoc-2021
Choose a base branch
from
134 changes: 134 additions & 0 deletions core/src/main/java/org/mifos/core/domain/mappers/Mappers.kt
@@ -0,0 +1,134 @@
package org.mifos.core.domain.mappers

/* ktlint-disable no-wildcard-imports */
import org.mifos.core.data.network.entity.auth.LoginResponseEntity
import org.mifos.core.data.network.entity.customer.*
import org.mifos.core.data.network.entity.deposit.CurrencyEntity
import org.mifos.core.data.network.entity.deposit.DepositAccountEntity
import org.mifos.core.data.network.entity.deposit.DepositAccountPayloadEntity
import org.mifos.core.data.network.entity.deposit.ProductEntity
import org.mifos.core.data.network.entity.journal.AccountEntity
import org.mifos.core.data.network.entity.journal.JournalEntryEntity
import org.mifos.core.domain.model.LoginResponse
import org.mifos.core.domain.model.customer.*
import org.mifos.core.domain.model.deposit.Currency
import org.mifos.core.domain.model.deposit.DepositAccount
import org.mifos.core.domain.model.deposit.DepositAccountPayload
import org.mifos.core.domain.model.deposit.Product
import org.mifos.core.domain.model.journal.Account
import org.mifos.core.domain.model.journal.JournalEntry
import org.mifos.core.utils.EntityModelMapper
/* ktlint-enable no-wildcard-imports */

object Mappers {

// Model<->Entity mappers starts
val loginResponseMapper by lazy {
EntityModelMapper<LoginResponseEntity, LoginResponse>()
}

private val addressEntityMapper by lazy { EntityModelMapper<Address, AddressEntity>() }
private val contactDetailTypeEntityMapper by lazy {
EntityModelMapper<ContactDetail.Type, ContactDetailEntity.Type>()
}
private val contactDetailGroupEntityMapper by lazy {
EntityModelMapper<ContactDetail.Group, ContactDetailEntity.Group>()
}
private val contactDetailEntityMapper by lazy {
EntityModelMapper<ContactDetail, ContactDetailEntity>()
.register("type", contactDetailTypeEntityMapper)
.register("group", contactDetailGroupEntityMapper)
}
private val dateOfBirthEntityMapper by lazy {
EntityModelMapper<DateOfBirth, DateOfBirthEntity>()
}
private val customerTypeEntityMapper by lazy {
EntityModelMapper<Customer.Type, CustomerEntity.Type>()
}
private val customerStateEntityMapper by lazy {
EntityModelMapper<Customer.State, CustomerEntity.State>()
}
val customerEntityMapper by lazy {
EntityModelMapper<Customer, CustomerEntity>()
.register("type", customerTypeEntityMapper)
.register("currentState", customerStateEntityMapper)
.register("dateOfBirth", dateOfBirthEntityMapper)
.register("address", addressEntityMapper)
.register(
"contactDetails",
EntityModelMapper.listMapper(contactDetailEntityMapper)
)
}

private val addressMapper by lazy { EntityModelMapper<AddressEntity, Address>() }
private val contactDetailTypeMapper by lazy {
EntityModelMapper<ContactDetailEntity.Type, ContactDetail.Type>()
}
private val contactDetailGroupMapper by lazy {
EntityModelMapper<ContactDetailEntity.Group, ContactDetail.Group>()
}
private val contactDetailMapper by lazy {
EntityModelMapper<ContactDetailEntity, ContactDetail>()
.register("type", contactDetailTypeMapper)
.register("group", contactDetailGroupMapper)
}
private val dateOfBirthMapper by lazy {
EntityModelMapper<DateOfBirthEntity, DateOfBirth>()
}
private val customerTypeMapper by lazy {
EntityModelMapper<CustomerEntity.Type, Customer.Type>()
}
private val customerStateMapper by lazy {
EntityModelMapper<CustomerEntity.State, Customer.State>()
}
val customerMapper by lazy {
EntityModelMapper<CustomerEntity, Customer>()
.register("type", customerTypeMapper)
.register("currentState", customerStateMapper)
.register("dateOfBirth", dateOfBirthMapper)
.register("address", addressMapper)
.register(
"contactDetails",
EntityModelMapper.listMapper(contactDetailMapper)
)
}
val customerPageMapper by lazy {
EntityModelMapper<CustomerPageEntity, CustomerPage>().register(
"customers", EntityModelMapper.listMapper(customerMapper)
)
}

private val depositAccountStateMapper by lazy {
EntityModelMapper<DepositAccountEntity.State, DepositAccount.State>()
}
val depositAccountMapper by lazy {
EntityModelMapper<DepositAccountEntity, DepositAccount>()
.register("state", depositAccountStateMapper)
}
val depositAccountListMapper by lazy {
EntityModelMapper.listMapper(depositAccountMapper)
}
val depositAccountPayloadEntityMapper by lazy {
EntityModelMapper<DepositAccountPayload, DepositAccountPayloadEntity>()
}
private val currencyMapper by lazy { EntityModelMapper<CurrencyEntity, Currency>() }
val productMapper by lazy {
EntityModelMapper<ProductEntity, Product>().register(
"currency",
currencyMapper
)
}

private val accountMapper by lazy { EntityModelMapper<AccountEntity, Account>() }
private val journalEntryStateMapper by lazy {
EntityModelMapper<JournalEntryEntity.State, JournalEntry.State>()
}
val journalEntryMapper by lazy {
EntityModelMapper<JournalEntryEntity, JournalEntry>()
.register("debtors", EntityModelMapper.listMapper(accountMapper))
.register("creditors", EntityModelMapper.listMapper(accountMapper))
.register("state", journalEntryStateMapper)
}
val journalEntryListMapper by lazy { EntityModelMapper.listMapper(journalEntryMapper) }
// Model<->Entity mappers ends
}
@@ -0,0 +1,9 @@
package org.mifos.core.domain.model

data class LoginResponse(
val tokenType: String? = null,
val accessToken: String,
val accessTokenExpiration: String,
val refreshTokenExpiration: String,
val passwordExpiration: String
)
10 changes: 10 additions & 0 deletions core/src/main/java/org/mifos/core/domain/model/customer/Address.kt
@@ -0,0 +1,10 @@
package org.mifos.core.domain.model.customer

data class Address(
val street: String? = null,
val city: String? = null,
val region: String? = null,
val postalCode: String? = null,
val countryCode: String? = null,
val country: String? = null
)
@@ -0,0 +1,24 @@
package org.mifos.core.domain.model.customer

data class ContactDetail(
val type: Type? = null,
val group: Group? = null,
val value: String? = null,
val preferenceLevel: Int? = null,
val isValidated: Boolean? = null
) {

enum class Type {
EMAIL,

PHONE,

MOBILE
}

enum class Group {
BUSINESS,

PRIVATE
}
}
@@ -0,0 +1,41 @@
package org.mifos.core.domain.model.customer

data class Customer(
val customerIdentifier: String? = null,
val type: Type? = null,
val firstName: String? = null,
val middleName: String? = null,
val LastName: String? = null,
val dateOfBirth: DateOfBirth? = null,
val isMember: Boolean? = null,
val accountBeneficiary: String? = null,
val referenceCustomer: String? = null,
val assignedOffice: String? = null,
val assignedEmployee: String? = null,
val address: Address? = null,
val contactDetails: List<ContactDetail>? = null,
val currentState: State? = null,
val applicationDate: String? = null,
val customValues: List<String>? = null,
val createdBy: String? = null,
val createdOn: String? = null,
val lastModifiedBy: String? = null,
val lastModifiedOn: String? = null
) {

enum class Type {
PERSON,

BUSINESS
}

enum class State {
PENDING,

ACTIVE,

LOCKED,

CLOSED
}
}
@@ -0,0 +1,7 @@
package org.mifos.core.domain.model.customer

data class CustomerPage(
val customers: List<Customer>? = null,
val totalPages: Int? = null,
val totalElements: Long? = null
)
@@ -0,0 +1,7 @@
package org.mifos.core.domain.model.customer

data class DateOfBirth(
val year: Int? = null,
val month: Int? = null,
val day: Int? = null
)
@@ -0,0 +1,8 @@
package org.mifos.core.domain.model.deposit

data class Currency(
val code: String? = null,
val name: String? = null,
val sign: String? = null,
val scale: Int? = null
)
@@ -0,0 +1,25 @@
package org.mifos.core.domain.model.deposit

data class DepositAccount(
val customerIdentifier: String? = null,
val productIdentifier: String? = null,
val accountIdentifier: String? = null,
val beneficiaries: List<String> = ArrayList(),
val state: State? = null,
val balance: Double? = null
) {

enum class State {
CREATED,

PENDING,

APPROVED,

ACTIVE,

LOCKED,

CLOSED
}
}
@@ -0,0 +1,7 @@
package org.mifos.core.domain.model.deposit

data class DepositAccountPayload(
val customerIdentifier: String? = null,
val productIdentifier: String? = null,
val beneficiaries: List<String> = ArrayList()
)
10 changes: 10 additions & 0 deletions core/src/main/java/org/mifos/core/domain/model/deposit/Product.kt
@@ -0,0 +1,10 @@
package org.mifos.core.domain.model.deposit

data class Product(
val type: String? = null,
val identifier: String? = null,
val name: String? = null,
val description: String? = null,
val currency: Currency? = null,
val minimumBalance: Double? = null
)
@@ -0,0 +1,6 @@
package org.mifos.core.domain.model.journal

data class Account(
val accountNumber: String? = null,
val amount: String? = null
)
@@ -0,0 +1,20 @@
package org.mifos.core.domain.model.journal

data class JournalEntry(
val transactionIdentifier: String? = null,
val transactionDate: String? = null,
val transactionType: String? = null,
val clerk: String? = null,
val note: String? = null,
val debtors: List<Account>? = null,
val creditors: List<Account>? = null,
val state: State? = null,
val message: String? = null
) {

enum class State {
PENDING,

PROCESSED
}
}
@@ -0,0 +1,55 @@
package org.mifos.core.domain.repository

/* ktlint-disable no-wildcard-imports */
import io.ktor.client.statement.*
import org.mifos.core.data.network.entity.auth.LoginResponseEntity
import org.mifos.core.data.network.entity.customer.CustomerEntity
import org.mifos.core.data.network.entity.customer.CustomerPageEntity
import org.mifos.core.data.network.entity.deposit.DepositAccountEntity
import org.mifos.core.data.network.entity.deposit.DepositAccountPayloadEntity
import org.mifos.core.data.network.entity.deposit.ProductEntity
import org.mifos.core.data.network.entity.journal.JournalEntryEntity
/* ktlint-enable no-wildcard-imports */

interface WalletRepository {

suspend fun loginUser(
userName: String,
password: String
): LoginResponseEntity

suspend fun createCustomer(customerPayload: CustomerEntity): HttpResponse

suspend fun fetchCustomerDetails(identifier: String): CustomerEntity

suspend fun fetchCustomers(
pageIndex: Int?,
size: Int?
): CustomerPageEntity

suspend fun updateCustomer(
identifier: String,
customer: CustomerEntity
): HttpResponse

suspend fun searchCustomer(
pageIndex: Int?,
size: Int?,
term: String?
): CustomerPageEntity

suspend fun fetchCustomerDepositAccounts(customerIdentifier: String): List<DepositAccountEntity>

suspend fun fetchDepositAccountDetails(accountIdentifier: String): DepositAccountEntity

suspend fun fetchProductDetails(productIdentifier: String): ProductEntity

suspend fun createDepositAccount(depositAccountPayload: DepositAccountPayloadEntity): HttpResponse

suspend fun fetchJournalEntries(
dateRange: String,
accountIdentifier: String
): List<JournalEntryEntity>

suspend fun fetchJournalEntry(entryIdentifier: String): JournalEntryEntity
}
@@ -0,0 +1,22 @@
package org.mifos.core.domain.usecases.auth

import org.mifos.core.domain.mappers.Mappers.loginResponseMapper
import org.mifos.core.domain.model.LoginResponse
import org.mifos.core.domain.repository.WalletRepository
import org.mifos.core.utils.Result

class AuthenticateUser(private val repository: WalletRepository) {

suspend fun execute(
userName: String,
password: String
): Result<LoginResponse> {
return try {
val loginResponse =
loginResponseMapper(repository.loginUser(userName, password))
Result.success(loginResponse)
} catch (e: Exception) {
Result.error(e)
}
}
}