blob: 8d1288ad00c2232ecd3cf0b61359010bdb9e3eac (
plain) (
tree)
|
|
package xyz.driver.pdsuidomain.services
import xyz.driver.core.rest.AuthorizedServiceRequestContext
import xyz.driver.entities.users.AuthUserInfo
import xyz.driver.pdsuicommon.db.{Pagination, SearchFilterExpr, Sorting}
import xyz.driver.pdsuicommon.domain.{LongId, UuidId}
import xyz.driver.pdsuicommon.error.DomainError
import xyz.driver.pdsuicommon.logging._
import xyz.driver.pdsuidomain.entities.{Trial, _}
import xyz.driver.pdsuidomain.services.PatientCriterionService.RichPatientCriterion
import scala.concurrent.Future
object PatientEligibleTrialService {
trait DefaultNotFoundError {
def userMessage: String = "Patient eligible trial not found"
}
trait DefaultPatientNotFoundError {
def userMessage: String = "Patient not found"
}
trait DefaultAccessDeniedError {
def userMessage: String = "Access denied"
}
final case class RichPatientEligibleTrial(trial: Trial,
group: PatientTrialArmGroupView,
arms: List[PatientCriterionArm])
object RichPatientEligibleTrial {
implicit def toPhiString(x: RichPatientEligibleTrial): PhiString = {
phi"RichPatientEligibleTrial(group=${x.group}, trial=${x.trial}, arms=${x.arms})"
}
}
sealed trait GetListReply
object GetListReply {
final case class EntityList(xs: Seq[RichPatientEligibleTrial], totalFound: Int) extends GetListReply
case object AuthorizationError
extends GetListReply with DomainError.AuthorizationError with DefaultAccessDeniedError
case object PatientNotFoundError
extends GetListReply with DefaultPatientNotFoundError with DomainError.NotFoundError
final case class CommonError(userMessage: String) extends GetListReply with DomainError
}
sealed trait GetByIdReply
object GetByIdReply {
final case class Entity(x: RichPatientEligibleTrial) extends GetByIdReply
type Error = GetByIdReply with DomainError
case object NotFoundError extends GetByIdReply with DefaultNotFoundError with DomainError.NotFoundError
case object PatientNotFoundError
extends GetByIdReply with DefaultPatientNotFoundError with DomainError.NotFoundError
case object AuthorizationError
extends GetByIdReply with DomainError.AuthorizationError with DefaultAccessDeniedError
final case class CommonError(userMessage: String) extends GetByIdReply with DomainError
implicit def toPhiString(reply: GetByIdReply): PhiString = reply match {
case x: DomainError => phi"GetByIdReply.Error($x)"
case Entity(x) => phi"GetByIdReply.Entity($x)"
}
}
sealed trait GetCriterionListOfGroupReply
object GetCriterionListOfGroupReply {
final case class EntityList(xs: Seq[RichPatientCriterion], totalFound: Int) extends GetCriterionListOfGroupReply
type Error = GetCriterionListOfGroupReply with DomainError
case object AuthorizationError
extends GetCriterionListOfGroupReply with DomainError.AuthorizationError with DefaultAccessDeniedError
case object NotFoundError
extends GetCriterionListOfGroupReply with DefaultNotFoundError with DomainError.NotFoundError
case object PatientNotFoundError
extends GetCriterionListOfGroupReply with DefaultPatientNotFoundError with DomainError.NotFoundError
final case class CommonError(userMessage: String) extends GetCriterionListOfGroupReply with DomainError
}
sealed trait UpdateReply
object UpdateReply {
type Error = UpdateReply with DomainError
final case class Updated(updated: RichPatientEligibleTrial) extends UpdateReply
case object NotFoundError extends UpdateReply with DefaultNotFoundError with DomainError.NotFoundError
case object PatientNotFoundError extends UpdateReply with DefaultPatientNotFoundError with DomainError.NotFoundError
case object AuthorizationError extends UpdateReply with DomainError.AuthorizationError with DefaultAccessDeniedError
final case class CommonError(userMessage: String) extends UpdateReply with DomainError
implicit def toPhiString(reply: UpdateReply): PhiString = reply match {
case Updated(x) => phi"Updated($x)"
case x: Error => DomainError.toPhiString(x)
}
}
}
trait PatientEligibleTrialService {
import PatientEligibleTrialService._
def getAll(patientId: UuidId[Patient],
filter: SearchFilterExpr = SearchFilterExpr.Empty,
sorting: Option[Sorting] = None,
pagination: Option[Pagination] = None)(
implicit requestContext: AuthorizedServiceRequestContext[AuthUserInfo]): Future[GetListReply]
def getById(patientId: UuidId[Patient], id: LongId[PatientTrialArmGroup])(
implicit requestContext: AuthorizedServiceRequestContext[AuthUserInfo]): Future[GetByIdReply]
def getCriterionListByGroupId(patientId: UuidId[Patient], id: LongId[PatientTrialArmGroup])(
implicit requestContext: AuthorizedServiceRequestContext[AuthUserInfo]): Future[GetCriterionListOfGroupReply]
def update(origEligibleTrialWithTrial: RichPatientEligibleTrial, draftPatientTrialArmGroup: PatientTrialArmGroupView)(
implicit requestContext: AuthorizedServiceRequestContext[AuthUserInfo]): Future[UpdateReply]
}
|