package xyz.driver.pdsuidomain.services import akka.NotUsed import akka.stream.scaladsl.Source import akka.util.ByteString import java.time.LocalDateTime import xyz.driver.core.rest.AuthorizedServiceRequestContext import xyz.driver.entities.users.AuthUserInfo import xyz.driver.pdsuicommon.db._ import xyz.driver.pdsuicommon.domain.LongId import xyz.driver.pdsuicommon.error._ import xyz.driver.pdsuidomain.entities.MedicalRecord.PdfSource import xyz.driver.pdsuidomain.entities._ import scala.concurrent.Future object MedicalRecordService { type PdfSourceFetcher = (String, String) => Future[PdfSource] trait DefaultNotFoundError { def userMessage: String = "Medical record hasn't been found" } trait DefaultAccessDeniedError { def userMessage: String = "Access denied" } sealed trait GetByIdReply object GetByIdReply { final case class Entity(x: MedicalRecord) extends GetByIdReply type Error = GetByIdReply with DomainError case object NotFoundError extends GetByIdReply with DomainError.NotFoundError with DefaultNotFoundError final case class CommonError(userMessage: String) extends GetByIdReply with DomainError case object AuthorizationError extends GetByIdReply with DomainError.AuthorizationError with DefaultAccessDeniedError } sealed trait GetListReply object GetListReply { final case class EntityList(xs: Seq[MedicalRecord], totalFound: Int, lastUpdate: Option[LocalDateTime]) extends GetListReply type Error = GetListReply with DomainError case object AuthorizationError extends GetListReply with DomainError.AuthorizationError with DefaultAccessDeniedError case object NotFoundError extends GetListReply with DomainError.NotFoundError { def userMessage: String = "Patient wasn't found" } } sealed trait CreateReply object CreateReply { type Error = CreateReply with DomainError final case class Created(x: MedicalRecord) extends CreateReply final case class CommonError(userMessage: String) extends CreateReply with DomainError } sealed trait UpdateReply object UpdateReply { type Error = UpdateReply with DomainError final case class Updated(updated: MedicalRecord) extends UpdateReply case object NotFoundError extends UpdateReply with DefaultNotFoundError with DomainError.NotFoundError case object AuthorizationError extends UpdateReply with DefaultAccessDeniedError with DomainError.AuthorizationError final case class CommonError(userMessage: String) extends UpdateReply with DomainError } final case class Settings(pdfSourceBucket: String) } trait MedicalRecordService { import MedicalRecordService._ def getById(recordId: LongId[MedicalRecord])( implicit requestContext: AuthorizedServiceRequestContext[AuthUserInfo]): Future[GetByIdReply] def getPdfSource(recordId: LongId[MedicalRecord])( implicit requestContext: AuthorizedServiceRequestContext[AuthUserInfo]): Future[Source[ByteString, NotUsed]] def getAll(filter: SearchFilterExpr = SearchFilterExpr.Empty, sorting: Option[Sorting] = None, pagination: Option[Pagination] = None)( implicit requestContext: AuthorizedServiceRequestContext[AuthUserInfo]): Future[GetListReply] def create(draft: MedicalRecord)( implicit requestContext: AuthorizedServiceRequestContext[AuthUserInfo]): Future[CreateReply] def update(origRecord: MedicalRecord, draftRecord: MedicalRecord)( implicit requestContext: AuthorizedServiceRequestContext[AuthUserInfo]): Future[UpdateReply] def start(orig: MedicalRecord)( implicit requestContext: AuthorizedServiceRequestContext[AuthUserInfo]): Future[UpdateReply] def submit(orig: MedicalRecord)( implicit requestContext: AuthorizedServiceRequestContext[AuthUserInfo]): Future[UpdateReply] def restart(orig: MedicalRecord)( implicit requestContext: AuthorizedServiceRequestContext[AuthUserInfo]): Future[UpdateReply] def flag(orig: MedicalRecord)( implicit requestContext: AuthorizedServiceRequestContext[AuthUserInfo]): Future[UpdateReply] def resolve(orig: MedicalRecord)( implicit requestContext: AuthorizedServiceRequestContext[AuthUserInfo]): Future[UpdateReply] def unassign(orig: MedicalRecord)( implicit requestContext: AuthorizedServiceRequestContext[AuthUserInfo]): Future[UpdateReply] def archive(orig: MedicalRecord)( implicit requestContext: AuthorizedServiceRequestContext[AuthUserInfo]): Future[UpdateReply] }