aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/xyz/driver/pdsuidomain/services/MedicalRecordService.scala
blob: 46e91565bd2f65767d3a4d50dd75d2a710733510 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
package xyz.driver.pdsuidomain.services

import java.time.LocalDateTime

import xyz.driver.pdsuicommon.auth.AuthenticatedRequestContext
import xyz.driver.pdsuicommon.db._
import xyz.driver.pdsuicommon.domain.{LongId, UuidId}
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 GetPdfSourceReply
  object GetPdfSourceReply {
    type Error = GetPdfSourceReply with DomainError

    final case class Entity(x: PdfSource.Channel) extends GetPdfSourceReply

    case object AuthorizationError
        extends GetPdfSourceReply with DomainError.AuthorizationError with DefaultAccessDeniedError

    case object NotFoundError extends GetPdfSourceReply with DomainError.NotFoundError {
      def userMessage: String = "Medical record PDF hasn't been found"
    }

    case object RecordNotFoundError extends GetPdfSourceReply with DomainError.NotFoundError with DefaultNotFoundError

    final case class CommonError(userMessage: String) extends GetPdfSourceReply with DomainError
  }

  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 {
    final case class Created(x: MedicalRecord) extends CreateReply
  }

  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: AuthenticatedRequestContext): Future[GetByIdReply]

  def getPatientRecords(patientId: UuidId[Patient])(
          implicit requestContext: AuthenticatedRequestContext): Future[GetListReply]

  def getPdfSource(recordId: LongId[MedicalRecord])(
          implicit requestContext: AuthenticatedRequestContext): Future[GetPdfSourceReply]

  def getAll(filter: SearchFilterExpr = SearchFilterExpr.Empty,
             sorting: Option[Sorting] = None,
             pagination: Option[Pagination] = None)(
          implicit requestContext: AuthenticatedRequestContext): Future[GetListReply]

  def create(draft: MedicalRecord): Future[CreateReply]

  def update(origRecord: MedicalRecord, draftRecord: MedicalRecord)(
          implicit requestContext: AuthenticatedRequestContext): Future[UpdateReply]

  def start(orig: MedicalRecord)(implicit requestContext: AuthenticatedRequestContext): Future[UpdateReply]

  def submit(orig: MedicalRecord)(implicit requestContext: AuthenticatedRequestContext): Future[UpdateReply]

  def restart(orig: MedicalRecord)(implicit requestContext: AuthenticatedRequestContext): Future[UpdateReply]

  def flag(orig: MedicalRecord)(implicit requestContext: AuthenticatedRequestContext): Future[UpdateReply]

  def resolve(orig: MedicalRecord)(implicit requestContext: AuthenticatedRequestContext): Future[UpdateReply]

  def unassign(orig: MedicalRecord)(implicit requestContext: AuthenticatedRequestContext): Future[UpdateReply]

  def archive(orig: MedicalRecord)(implicit requestContext: AuthenticatedRequestContext): Future[UpdateReply]
}