Skip to content

Commit

Permalink
#7 [back] added endpoint to add transfer atom
Browse files Browse the repository at this point in the history
  • Loading branch information
vityaman committed Jan 22, 2024
1 parent 93d5a36 commit 835b94a
Show file tree
Hide file tree
Showing 8 changed files with 74 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import zio.http.Method.{GET, POST}
import zio.http._
import zio.json._

import ru.vityaman.mylogistics.api.http.request.CreateAtomRequest
import ru.vityaman.mylogistics.api.http.request.CreateTransferRequest
import ru.vityaman.mylogistics.api.http.view.DetailedTransactionView
import ru.vityaman.mylogistics.api.http.view.EquippedTransferView
Expand Down Expand Up @@ -39,6 +40,16 @@ class TransactionApi(service: TransactionService) {
.map(_.asModel)
.flatMap(service.create(_))
.mapBoth(Response.fromThrowable(_), id => Response.text(id.toString))
},
POST / "api" / "transfer" / int("transferId") / "atom" ->
handler { (transferId: Int, request: Request) =>
request.body.asString
.map(_.fromJson[CreateAtomRequest])
.flatMap(ZIO.fromEither(_))
.mapError(_ => new IllegalArgumentException("invalid"))
.map(_.asModel)
.flatMap(service.addAtom(transferId, _))
.mapBoth(Response.fromThrowable(_), _ => Response.ok)
}
)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package ru.vityaman.mylogistics.api.http.request

import zio.json.DeriveJsonDecoder
import zio.json.DeriveJsonEncoder
import zio.json.JsonDecoder
import zio.json.JsonEncoder

import ru.vityaman.mylogistics.logic.model.Amount
import ru.vityaman.mylogistics.logic.model.Atom

final case class CreateAtomRequest(
itemKindId: Int,
amount: Int
) {
def asModel: Atom =
Atom(
itemKind = itemKindId,
amount = Amount(amount)
)
}

object CreateAtomRequest {
implicit val decoder: JsonDecoder[CreateAtomRequest] =
DeriveJsonDecoder.gen[CreateAtomRequest]
implicit val encoder: JsonEncoder[CreateAtomRequest] =
DeriveJsonEncoder.gen[CreateAtomRequest]
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,12 @@ package ru.vityaman.mylogistics.data
import zio._

import ru.vityaman.mylogistics.logic.model.DetailedTransaction
import ru.vityaman.mylogistics.logic.model.Atom
import ru.vityaman.mylogistics.logic.model.Transfer

trait TransactionRepository {
def getAll(): Task[List[DetailedTransaction]]
def getTransfers(): Task[List[Transfer.Equipped]]
def create(transfer: Transfer.Request): Task[Transfer.Id]
def addAtom(id: Transfer.Id, atom: Atom): Task[Unit]
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import ru.vityaman.mylogistics.data.TransactionRepository
import ru.vityaman.mylogistics.data.jdbc.row.DetailedTransactionRow
import ru.vityaman.mylogistics.data.jdbc.row.DetailedTransferRow
import ru.vityaman.mylogistics.logic.model.Amount
import ru.vityaman.mylogistics.logic.model.Atom
import ru.vityaman.mylogistics.logic.model.DetailedTransaction
import ru.vityaman.mylogistics.logic.model.ItemKind
import ru.vityaman.mylogistics.logic.model.Pack
Expand Down Expand Up @@ -79,6 +80,7 @@ private class JdbcTransactionRepository(xa: Transactor[Task])
.toList
)
.map { case (info, packs) => Transfer.Equipped(info, packs) }
.sortBy(_.info.withdrawMoment)
}

override def create(transfer: Transfer.Request): Task[Transfer.Id] =
Expand All @@ -95,6 +97,19 @@ private class JdbcTransactionRepository(xa: Transactor[Task])
.unique
.transact(xa)

def addAtom(id: Transfer.Id, atom: Atom): Task[Unit] =
sql"""
SELECT transfer_atom_create(
${id},
${atom.itemKind},
${atom.amount.value}
)
"""
.query[Int]
.unique
.transact(xa)
.map(_ => ())

private def asTransfer(row: DetailedTransferRow): Transfer.Detailed =
Transfer.Detailed(
id = row.transferId,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package ru.vityaman.mylogistics.logic.model

final case class Atom(
itemKind: ItemKind.Id,
amount: Amount
)

Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,11 @@ import zio.Task

import ru.vityaman.mylogistics.logic.model.DetailedTransaction
import ru.vityaman.mylogistics.logic.model.Transfer
import ru.vityaman.mylogistics.logic.model.Atom

trait TransactionService {
def getAll(): Task[List[DetailedTransaction]]
def getTransfers(): Task[List[Transfer.Equipped]]
def create(transfer: Transfer.Request): Task[Transfer.Id]
def addAtom(id: Transfer.Id, atom: Atom): Task[Unit]
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package ru.vityaman.mylogistics.logic.service.basic
import zio._

import ru.vityaman.mylogistics.data.TransactionRepository
import ru.vityaman.mylogistics.logic.model.Atom
import ru.vityaman.mylogistics.logic.model.DetailedTransaction
import ru.vityaman.mylogistics.logic.model.Transfer
import ru.vityaman.mylogistics.logic.service.TransactionService
Expand All @@ -17,6 +18,9 @@ class BasicTransactionService(repository: TransactionRepository)

override def create(transfer: Transfer.Request): Task[Transfer.Id] =
repository.create(transfer)

override def addAtom(id: Transfer.Id, atom: Atom): Task[Unit] =
repository.addAtom(id, atom)
}

object BasicTransactionService {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import zio.Task
import zio.ZIO
import zio.ZLayer

import ru.vityaman.mylogistics.logic.model.Atom
import ru.vityaman.mylogistics.logic.model.DetailedTransaction
import ru.vityaman.mylogistics.logic.model.Transfer
import ru.vityaman.mylogistics.logic.service.TransactionService
Expand All @@ -24,6 +25,11 @@ final class LoggedTransactionService(origin: TransactionService)
origin
.create(transfer)
.tapErrorCause(ZIO.logCause(_))

override def addAtom(id: Transfer.Id, atom: Atom): Task[Unit] =
origin
.addAtom(id, atom)
.tapErrorCause(ZIO.logCause(_))
}

object LoggedTransactionService {
Expand Down

0 comments on commit 835b94a

Please sign in to comment.