Skip to content

Health Service

In order to help you build your own Solution, find below an example of a complete and functional YAML model. It contains all sections that can serve as the foundation for your project.

This model example reflects a real use case for the Health Care Service, which is intended to perform certain registration operations (CRUD) and customized queries to the database.

The features of this solution are:

  • Patient registration;
  • Doctor registration;
  • Unit Care registration;
  • Patient care record registration;
  • OData Query Controllers for customized data queries;
  • User interface project/application for specified CRUD services

YAML Example:

  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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
Name: HealthSample # Solution name
RootNamespace: Sample.HealthSample # Solution root namespace

# Business entities

Entities:
- Name: Patient
  KeyType: Guid
  Properties:
  - Name: BirthDate
    Type: DateTimeOffset
  - Name: Name
    Type: string
  - Name: Cpf
    Type: string
  - Name: CareRecords
    Type: '[CareRecord]' # Determines a relationship OneToMany with CareRecord

- Name: CareUnit
  KeyType: Guid
  Properties:
  - Name: Name
    Type: string
  - Name: Phone
    Type: string
  - Name: CareRecords
    Type: '[CareRecord]'

- Name: Doctor
  KeyType: Guid
  Properties:
  - Name: Name
    Type: string
  - Name: Specialty
    Type: string
  - Name: Crm
    Type: string
  - Name: CareRecords
    Type: '[CareRecord]'

- Name: CareRecord
  KeyType: Guid
  Properties:
  - Name: Patient
    Type: Patient # Determines a relationship OneToOne with Patient
  - Name: PatientId
    Type: Guid
  - Name: CareUnit
    Type: CareUnit
  - Name: CareUnitId
    Type: Guid
  - Name: Doctor
    Type: Doctor
  - Name: DoctorId
    Type: Guid
  - Name: EntryDate
    Type: DateTimeOffset
  - Name: CareRecordNotes
    Type: '[CareRecordNote]'
  - Name: CareRecordTags
    Type: '[CareRecordTag]'

- Name: CareRecordTag
  Properties:
  - Name: Name
    Type: string
  - Name: Area
    Type: string

- Name: CareRecordNote
  KeyType: Guid
  Properties:
  - Name: CareRecord
    Type: CareRecord
  - Name: CareRecordId
    Type: Guid
  - Name: Note
    Type: string
  - Name: Date
    Type: DateTimeOffset

# Database instance types

DbInstances:
- Name: BaseInstance
  Type: PostgreSql

# One database for Identity Server and one database for services

Databases:
- Name: RegisterDb
  DbInstanceName: BaseInstance

- Name: IdentityDb
  DbInstanceName: BaseInstance

# Identity Server configuration section

IdentityConfig:
  DatabaseName: IdentityDb

# Database data contexts

DbContexts:
- Name: RegisterContext
  DatabaseName: RegisterDb
  DbMappings: # Mapping between Entity and Database Tables
  - Name: PatientMapping
    EntityName: Patient
    Relationships:
    - ChildEntityName: CareRecord
      ParentPropertyName: CareRecords
      ChildPropertyName: Patient
      IsRequired: true
      Type: OneToMany
      ForeignKeyProperty: PatientId

  - Name: CareUnitMapping
    EntityName: CareUnit
    Relationships:
    - ChildEntityName: CareRecord
      ParentPropertyName: CareRecords
      ChildPropertyName: CareUnit
      IsRequired: true
      Type: OneToMany
      ForeignKeyProperty: CareUnitId

  - Name: DoctorMapping
    EntityName: Doctor
    Relationships:
    - ChildEntityName: CareRecord
      ParentPropertyName: CareRecords
      ChildPropertyName: Doctor
      IsRequired: true
      Type: OneToMany
      ForeignKeyProperty: DoctorId

  - Name: CareRecordMapping
    EntityName: CareRecord
    Relationships:
    - ChildEntityName: CareRecordNote
      ParentPropertyName: CareRecordNotes
      ChildPropertyName: CareRecord
      IsRequired: true
      Type: OneToMany
      ForeignKeyProperty: CareRecordId

  - Name: CareRecordNoteMapping
    EntityName: CareRecordNote

# Data access repository pattern

Repositories:
- Name: PatientRepo
  DbContextName: RegisterContext
  EntityName: Patient

- Name: CareUnitRepo
  DbContextName: RegisterContext
  EntityName: CareUnit

- Name: DoctorRepo
  DbContextName: RegisterContext
  EntityName: Doctor

- Name: CareRecordRepo
  DbContextName: RegisterContext
  EntityName: CareRecord

- Name: CareRecordNoteRepo
  DbContextName: RegisterContext
  EntityName: CareRecordNote

# Validations rules for the business entity

EntityValidations:
- Name: CareRecordTagValidation
  Type: PropertyValidation
  EntityName: CareRecordTag
  PropertyValidationParams:
  - PropertyName: Name
    Rules:
    - Type: IsNotEmpty
      Message: 'Tag Name is required.'

  - PropertyName: Area
    Rules: # Pre-defined types that run sequentially
    - Type: IsNotEmpty
      Message: 'Tag Area is required.'
    - Type: IsNotEqual
      Expressions:
      - Value(@ConstString::UTI) # Expression to get the string "UTI" as constant
      Message: 'Tag Area must not be equal to UTI.'

- Name: CareRecordValidation
  Type: PropertyValidation
  EntityName: CareRecord
  PropertyValidationParams:
  - PropertyName: CareRecordTags
    Rules:
    - Type: IsNotEmpty
      Message: 'At Least one tag must be informed.'

  - PropertyName: CareRecordTags
    ForEachRule: true
    Rules:
    - Type: IsValidation
      Expressions:
      - ValInstance(@ConstString::CareRecordTagValidation) # Expression to get an instance of another validation

# Services and Controllers (CRUD and QUERY)

Services:
- Name: Register
  Type: WebAPI
  Controllers:
  - Name: Patient # Patient registration
    Type: CRUD
    RepositoryName: PatientRepo
    EntityName: Patient
    Contexts:
    - Context: Create
      Rules: # Business rules performed only for the "Create" context
      - Name: AddInRepository
        Type: WriteOperationRule # Executes a business rule for persisting data in the database
        Order: 1

    - Context: Update
      Rules:
      - Name: UpdateInRepository
        Type: WriteOperationRule
        Order: 1

    - Context: UpdatePartial
      Rules:
      - Name: UpdateInRepository
        Type: WriteOperationRule
        Order: 1

    - Context: Delete
      Rules:
      - Name: DeleteInRepository
        Type: WriteOperationRule
        Order: 1

    - Context: ReadAll
      Rules:
      - Name: ReadInRepository
        Type: ReadOperationRule # Executes a business rule for reading data from the database
        Order: 1

    - Context: ReadByKey
      Rules:
      - Name: ReadInRepository
        Type: ReadOperationRule
        Order: 1

  - Name: PatientQuery
    Type: Query # OData Query pattern for custom queries
    RepositoryName: PatientRepo
    EntityName: Patient

  - Name: Doctor # Doctor registration
    Type: CRUD
    RepositoryName: DoctorRepo
    EntityName: Doctor
    Contexts:
    - Context: Create
      Rules:
      - Name: AddInRepository
        Type: WriteOperationRule
        Order: 1

    - Context: Update
      Rules:
      - Name: UpdateInRepository
        Type: WriteOperationRule
        Order: 1

    - Context: UpdatePartial
      Rules:
      - Name: UpdateInRepository
        Type: WriteOperationRule
        Order: 1

    - Context: Delete
      Rules:
      - Name: DeleteInRepository
        Type: WriteOperationRule
        Order: 1

    - Context: ReadAll
      Rules:
      - Name: ReadInRepository
        Type: ReadOperationRule
        Order: 1

    - Context: ReadByKey
      Rules:
      - Name: ReadInRepository
        Type: ReadOperationRule
        Order: 1

  - Name: DoctorQuery
    Type: Query
    RepositoryName: DoctorRepo
    EntityName: Doctor

  - Name: CareUnit # Unit Care registration
    Type: CRUD
    RepositoryName: CareUnitRepo
    EntityName: CareUnit
    Contexts:
    - Context: Create
      Rules:
      - Name: AddInRepository
        Type: WriteOperationRule
        Order: 1

    - Context: Update
      Rules:
      - Name: UpdateInRepository
        Type: WriteOperationRule
        Order: 1

    - Context: UpdatePartial
      Rules:
      - Name: UpdateInRepository
        Type: WriteOperationRule
        Order: 1

    - Context: Delete
      Rules:
      - Name: DeleteInRepository
        Type: WriteOperationRule
        Order: 1

    - Context: ReadAll
      Rules:
      - Name: ReadInRepository
        Type: ReadOperationRule
        Order: 1

    - Context: ReadByKey
      Rules:
      - Name: ReadInRepository
        Type: ReadOperationRule
        Order: 1

  - Name: CareUnitQuery
    Type: Query
    RepositoryName: CareUnitRepo
    EntityName: CareUnit

  Metadata:
    Version: v1
    Title: RegisterService API
    Description: Basic Register Services for Health Care Operations
    TermsOfServiceUrl: https://example.com/terms
    Contact:
      ContactName: HealthCare Api Team
      ContactEmail: health@sample.com
      ContactUrl: https://example.com/contact
    License:
      LicenseInfo: Use under LICX
      LicenseUrl: https://example.com/license

- Name: Operation
  Type: WebAPI
  Controllers:
  - Name: CareRecord # Patient care record
    Type: CRUD
    RepositoryName: CareRecordRepo
    EntityName: CareRecord
    Contexts:
    - Context: Create
      Validations: # Validations performed only for the "Create" context
      - Name: CareRecordValidation
        Type: EntityValidation
        Order: 1
        ExecValidationName: CareRecordValidation # Executes an EntityValidation type
      Rules:
      - Name: AddInRepository
        Type: WriteOperationRule
        Order: 1

    - Context: Update
      Rules:
      - Name: UpdateInRepository
        Type: WriteOperationRule
        Order: 1

    - Context: UpdatePartial
      Rules:
      - Name: UpdateInRepository
        Type: WriteOperationRule
        Order: 1

    - Context: Delete
      Rules:
      - Name: DeleteInRepository
        Type: WriteOperationRule
        Order: 1

    - Context: ReadAll
      Rules:
      - Name: ReadInRepository
        Type: ReadOperationRule
        Order: 1

    - Context: ReadByKey
      Rules:
      - Name: ReadInRepository
        Type: ReadOperationRule
        Order: 1

  - Name: CareRecordQuery
    Type: Query
    RepositoryName: CareRecordRepo
    EntityName: CareRecord

  - Name: CareRecordNote
    Type: CRUD
    RepositoryName: CareRecordNoteRepo
    EntityName: CareRecordNote
    Contexts:
    - Context: Create
      Rules:
      - Name: AddInRepository
        Type: WriteOperationRule
        Order: 1

    - Context: Update
      Rules:
      - Name: UpdateInRepository
        Type: WriteOperationRule
        Order: 1

    - Context: UpdatePartial
      Rules:
      - Name: UpdateInRepository
        Type: WriteOperationRule
        Order: 1

    - Context: Delete
      Rules:
      - Name: DeleteInRepository
        Type: WriteOperationRule
        Order: 1

    - Context: ReadAll
      Rules:
      - Name: ReadInRepository
        Type: ReadOperationRule
        Order: 1

    - Context: ReadByKey
      Rules:
      - Name: ReadInRepository
        Type: ReadOperationRule
        Order: 1
  Metadata:
    Version: v1
    Title: OperationService API
    Description: Basic Operation Services for Health Care Operations
    TermsOfServiceUrl: https://example.com/terms
    Contact:
      ContactName: HealthCare Api Team
      ContactEmail: health@sample.com
      ContactUrl: https://example.com/contact
    License:
      LicenseInfo: Use under LICX
      LicenseUrl: https://example.com/license

OData Example

1
2
3
4
  - Name: CareRecordQuery
    Type: Query
    RepositoryName: CareRecordRepo
    EntityName: CareRecord

Filter Request Example

1
https://loadbalancer.bea.internal:44300/operation/odata/CareRecordQueryQuery?$expand=Patient,Doctor,CareUnit

Response Example

 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
{
    "@odata.context": "https://loadbalancer.bea.internal:44300/operation/odata/$metadata#CareRecordQueryQuery(Patient(),Doctor(),CareUnit())",
    "value": [
        {
            "Id": "76597f93-b9e2-482e-9f6e-94a16af5b1e1",
            "PatientId": "7cb84c60-999e-4f1e-93b7-c2483381ad91",
            "CareUnitId": "c6248b7e-70f5-41c5-8e39-1616958b5b73",
            "DoctorId": "584ad11f-9a2c-4b4f-8e91-61e9744c746d",
            "EntryDate": "2020-04-06T00:00:00Z",
            "CareRecordTags": [
                {
                    "Name": "Ansiedade",
                    "Area": "Consultorio2"
                },
                {
                    "Name": "Urgencia",
                    "Area": "Recepção"
                },
                {
                    "Name": "Medicado",
                    "Area": "Enfermaria"
                }
            ],
            "Patient": {
                "Id": "7cb84c60-999e-4f1e-93b7-c2483381ad91",
                "BirthDate": "2000-01-01T00:00:00Z",
                "Name": "paciente 1",
                "Cpf": "09736285022"
            },
            "Doctor": {
                "Id": "584ad11f-9a2c-4b4f-8e91-61e9744c746d",
                "Name": "Max Costa",
                "Specialty": "Cardiologista",
                "Crm": "123124"
            },
            "CareUnit": {
                "Id": "c6248b7e-70f5-41c5-8e39-1616958b5b73",
                "Name": "Hospital Teste",
                "Phone": "4565-0909"
            }
        }
    ]
}

Back to top