Skip to content

Instantly share code, notes, and snippets.

@orekyuu
Created May 5, 2019 12:56
Show Gist options
  • Save orekyuu/8e356742f29c8726a3a6ed28c8f0c5a2 to your computer and use it in GitHub Desktop.
Save orekyuu/8e356742f29c8726a3a6ed28c8f0c5a2 to your computer and use it in GitHub Desktop.
package net.orekyuu.ktmapperdomasample.infrastructure.datasource
import net.orekyuu.ktmapper.mapping
import net.orekyuu.ktmapperdomasample.domain.identity.User
import net.orekyuu.ktmapperdomasample.domain.identity.UserId
import net.orekyuu.ktmapperdomasample.domain.identity.UserName
import net.orekyuu.ktmapperdomasample.domain.item.Item
import net.orekyuu.ktmapperdomasample.domain.item.ItemId
import net.orekyuu.ktmapperdomasample.domain.item.ItemName
import net.orekyuu.ktmapperdomasample.domain.item.Price
import net.orekyuu.ktmapperdomasample.domain.receipt.*
import org.seasar.doma.Column
import org.seasar.doma.Dao
import org.seasar.doma.Entity
import org.seasar.doma.Select
import org.seasar.doma.boot.ConfigAutowireable
import org.seasar.doma.experimental.Sql
import org.springframework.stereotype.Repository
@Entity(immutable = true)
data class ReceiptEntity(
@Column(name = "receipts.id")
val id: ReceiptId,
@Column(name = "receipts.settlement_at")
val settlementTime: SettlementTime,
@Column(name = "buyer.id")
val buyerId: UserId,
@Column(name = "buyer.name")
val buyerName: UserName,
@Column(name = "seller.id")
val sellerId: UserId,
@Column(name = "seller.name")
val sellerName: UserName,
@Column(name = "line_items.item_id")
val liItemId: ItemId,
@Column(name = "line_items.receipts_id")
val liReceiptId: ReceiptId,
@Column(name = "line_items.quantity")
val quantity: ItemQuantity,
@Column(name = "items.price")
val price: Price,
@Column(name = "items.name")
val itemName: ItemName
)
val receiptMapper = mapping<ReceiptEntity, Receipt> {
primaryKey { it.id }
val buyerRef = hasOne<User> {
attribute { User(it.buyerId, it.buyerName) }
}
val sellerRef = hasOne<User> {
attribute { User(it.sellerId, it.sellerName) }
}
val lineItemRef = hasMany<LineItem> {
primaryKey { Pair(it.liItemId, it.liReceiptId) }
val itemRef = hasOne<Item> {
attribute { Item(it.liItemId, it.price, it.itemName) }
}
attribute { LineItem(findOne(itemRef, it)!!, it.quantity) }
}
attribute {
Receipt(it.id, it.settlementTime, findChild(lineItemRef, it), findOne(buyerRef, it)!!, findOne(sellerRef, it)!!)
}
}
@Dao
@ConfigAutowireable
interface ReceiptDao {
@Sql("""
select /*%expand*/* from receipts
join line_items on receipts.id = line_items.receipt_id
join items on line_items.item_id = items.id
join users buyer on receipts.buyer = buyer.id
join users seller on receipts.seller = seller.id
where buyer = /*buyerId*/1
""")
@Select
fun findByBuyer(buyerId: UserId): List<ReceiptEntity>
}
@Repository
class ReceiptDataSource(val dao: ReceiptDao) : ReceiptRepository{
override fun findByBuyer(buyerId: UserId): List<Receipt> {
return receiptMapper.toList(dao.findByBuyer(buyerId))
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment