diff --git a/.circleci/config.yml b/.circleci/config.yml index 337c3ebff7..65b21b366e 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -19,27 +19,6 @@ executors: docker-python-executor: docker: - image: cimg/python:3.9.19 - docker-postgres-elasticsearch-executor: - docker: - - image: cimg/node:18.20.3-browsers - environment: - DATABASE_URL: postgresql://postgres@localhost/ttasmarthub - - image: cimg/postgres:15.6 - environment: - POSTGRES_USER: postgres - POSTGRES_PASSWORD: secretpass - POSTGRES_DB: ttasmarthub - - image: opensearchproject/opensearch:1.3.2 - name: opensearch - environment: - transport.host: 0.0.0.0 - network.host: 0.0.0.0 - http.port: 9200 - cluster.name: opensearch-cluster - node.name: opensearch-node1 - discovery.type: single-node - DISABLE_SECURITY_PLUGIN: true - ES_JAVA_OPTS: "-Xms256m -Xmx256m" machine-executor: machine: image: ubuntu-2204:current @@ -427,7 +406,7 @@ parameters: default: "al-ttahub-2939-add-fei-root-cause-to-goal-card" type: string sandbox_git_branch: # change to feature branch to test deployment - default: "jp/3005/ipd-courses-widget" + default: "jp/3112/rm-elasticsearch" type: string prod_new_relic_app_id: default: "877570491" @@ -536,11 +515,8 @@ jobs: - similarity_api resource_class: large test_backend: - executor: docker-postgres-elasticsearch-executor + executor: docker-postgres-executor environment: - AWS_ELASTICSEARCH_ENDPOINT: http://opensearch:9200 - AWS_ELASTICSEARCH_ACCESS_KEY: admin - AWS_ELASTICSEARCH_SECRET_KEY: admin SFTP_EXPOSED_PORT: 2222 steps: - attach_workspace: @@ -636,11 +612,7 @@ jobs: path: frontend/coverage/ resource_class: large test_e2e: - executor: docker-postgres-elasticsearch-executor - environment: - AWS_ELASTICSEARCH_ENDPOINT: http://opensearch:9200 - AWS_ELASTICSEARCH_ACCESS_KEY: admin - AWS_ELASTICSEARCH_SECRET_KEY: admin + executor: docker-postgres-executor steps: - attach_workspace: at: . @@ -677,11 +649,7 @@ jobs: path: playwright/e2e resource_class: large test_api: - executor: docker-postgres-elasticsearch-executor - environment: - AWS_ELASTICSEARCH_ENDPOINT: http://opensearch:9200 - AWS_ELASTICSEARCH_ACCESS_KEY: admin - AWS_ELASTICSEARCH_SECRET_KEY: admin + executor: docker-postgres-executor steps: - attach_workspace: at: . @@ -718,11 +686,7 @@ jobs: path: playwright/api resource_class: large test_utils: - executor: docker-postgres-elasticsearch-executor - environment: - AWS_ELASTICSEARCH_ENDPOINT: http://opensearch:9200 - AWS_ELASTICSEARCH_ACCESS_KEY: admin - AWS_ELASTICSEARCH_SECRET_KEY: admin + executor: docker-postgres-executor steps: - attach_workspace: at: . diff --git a/.env.example b/.env.example index 691172d9e0..f8a3f9ff1d 100644 --- a/.env.example +++ b/.env.example @@ -52,11 +52,6 @@ CLAMAV_ENDPOINT=https://clamav-rest:9443 # CLAMAV_ENDPOINT=http://localhost:8081 REDIS_PASS=SUPERSECUREPASSWORD -# Vars for AWS OpenSearch (ES) local docker image -AWS_ELASTICSEARCH_ENDPOINT=http://localhost:9200 -AWS_ELASTICSEARCH_ACCESS_KEY=admin -AWS_ELASTICSEARCH_SECRET_KEY=admin - # Email Address that notifications should come from FROM_EMAIL_ADDRESS=ttasmarthub@test.gov diff --git a/README.md b/README.md index 45ba42b7e5..4d8a777981 100644 --- a/README.md +++ b/README.md @@ -47,11 +47,6 @@ The frontend [proxies requests](https://create-react-app.dev/docs/proxying-api-r Api documentation uses [Redoc](https://github.com/Redocly/redoc) to serve documentation files. These files can be found in the `docs/openapi` folder. Api documentation should be split into separate files when appropriate to prevent huge hard to grasp yaml files. -We use an AWS OpenSearch docker image (Elasticsearch fork) and require that the following variables get added to the env file. -* `AWS_ELASTICSEARCH_ENDPOINT=http://opensearch-node1:9200` -* `AWS_ELASTICSEARCH_ACCESS_KEY=admin` -* `AWS_ELASTICSEARCH_SECRET_KEY=admin` - #### Apple Silicon & Chromium On a Mac with Apple Silicon, puppeteer install fails with the message: ```"The chromium binary is not available for arm64"``` @@ -73,11 +68,6 @@ You can also run build commands directly on your host (without docker). Make sur You must also install and run minio locally to use the file upload functionality. Please comment out `S3_ENDPOINT=http://minio:9000` and uncomment `S3_ENDPOINT=http://localhost:9000` in your .env file. -We use an AWS OpensSearch docker image (Elasticsearch fork) and require that the following variables get added to the env file. -* `AWS_ELASTICSEARCH_ENDPOINT=http://localhost:9200` -* `AWS_ELASTICSEARCH_ACCESS_KEY=admin` -* `AWS_ELASTICSEARCH_SECRET_KEY=admin` - #### Precommit hooks Our CI will fail if code is committed that doesn't pass our linter (eslint). This repository contains a pre-commit hook that runs eslint's built in "fix" command on all staged javascript files so that any autofixable errors will be fixed. The precommit hook, in .gihooks/pre-commit, also contains code to auto-format our terraform files, which you can read more about [here](https://github.com/adhocteam/Head-Start-TTADP/tree/main/terraform#set-up). @@ -97,12 +87,12 @@ If you are already using git hooks, add the .githooks/pre-commit contents to you ### Building Tests #### Helpful notes on writing (backend) tests -It's important that our tests fully clean up after themselves if they interact with the database. This way, tests do not conflict when run on the CI and remain as deterministic as possible.The best way to do this is to run them locally in an isolated environment and confirm that they are sanitary. +It's important that our tests fully clean up after themselves if they interact with the database. This way, tests do not conflict when run on the CI and remain as deterministic as possible.The best way to do this is to run them locally in an isolated environment and confirm that they are sanitary. With that in mind, there a few "gotchas" to remember to help write sanitary tests. - ```Grant.destroy``` needs to run with ```individualHooks: true``` or the related GrantNumberLink model prevents delete. - When you call ```Model.destroy``` you should be adding ```individualHooks: true``` to the Sequelize options. Often this is required for proper cleanup. There may be times when this is undesirable; this should be indicated with a comment. -- Be aware of paranoid models. For those models: force: true gets around the soft delete. If they are already soft-deleted though, you need to remove the default scopes paranoid: true does it, as well as Model.unscoped() +- Be aware of paranoid models. For those models: force: true gets around the soft delete. If they are already soft-deleted though, you need to remove the default scopes paranoid: true does it, as well as Model.unscoped() - There are excellent helpers for creating and destroying common Model mocks in ```testUtils.js```. Be aware that they take a scorched earth approach to cleanup. For example, when debugging a flaky test, it was discovered that ```destroyReport``` was removing a commonly used region. - The next section details additional tools, found in `src/lib/programmaticTransaction.ts`, which make maintaining a clean database state when writing tests a breeze. @@ -627,4 +617,3 @@ ex: [backend]:http://localhost:8080 [API documentation]:http://localhost:5003 [minio]:http://localhost:3000 -[elasticsearch]:http://localhost:9200 diff --git a/docker-compose.yml b/docker-compose.yml index 63631a8b36..5fa3c630ad 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -59,20 +59,6 @@ services: ports: - "1025:1025" - "1080:1080" - opensearch-node1: - image: opensearchproject/opensearch:1.3.2 - env_file: .env - container_name: opensearch-node1 - environment: - - cluster.name=opensearch-cluster - - node.name=opensearch-node1 - - "DISABLE_SECURITY_PLUGIN=true" # disables security plugin entirely in OpenSearch by setting plugins.security.disabled: true in opensearch.yml - - "discovery.type=single-node" # disables bootstrap checks that are enabled when network.host is set to a non-loopback address - volumes: - - opensearch-data1:/usr/share/opensearch/data - ports: - - 9200:9200 - - 9600:9600 # required for Performance Analyzer testingonly: build: context: . @@ -97,4 +83,3 @@ services: volumes: dbdata: {} minio-data: {} - opensearch-data1: {} diff --git a/docs/boundary_diagram.md b/docs/boundary_diagram.md index d3c88ca309..f08ba226fb 100644 --- a/docs/boundary_diagram.md +++ b/docs/boundary_diagram.md @@ -30,7 +30,6 @@ Boundary(aws, "AWS GovCloud") { ContainerDb(www_db, "PostgreSQL Database", "AWS RDS", "Contains content and configuration for the TTA Hub") ContainerDb(www_s3, "AWS S3 bucket", "AWS S3", "Stores static file assets") ContainerDb(www_redis, "Redis Database", "AWS Elasticache", "Queue of background jobs to work on") - Container(Elasticache, "Elasticache", "AWS Elasticache", "Elasticache for search results") } } } diff --git a/docs/logical_data_model.encoded b/docs/logical_data_model.encoded index 35eeebc64c..3155528ec8 100644 --- a/docs/logical_data_model.encoded +++ b/docs/logical_data_model.encoded @@ -1 +1 @@ -xLrjSzmsalxENy7IVaZY6czjaijLdMhlQcLPJbndoof9pjOcbL919CH1p05c0L2Eaij_lmB05m04IO3ao7Q2JzAGG7VpGQFHwCRBFnW7b5UxCadJpr9mJr2UxYcvBU6EfUyHtwO05oNCquoIzoozWv0dQShU8Rm75EpI4c787_Om9PHlYV4gAm5ZwMz9cgRfCq9pI4z9IMZwbw-__i-J__gRzlnwYx9t63AMVfMawUzIb5DH6x8ahUcSP1pT8_vm2JEqHn1pzbkIFabHdXwd27DOG9eUftyl88OKS9Z_Jv8M563-qYnmUVRYxFBi_FJiAZtwLhndHtz5UP8IleNq37F47qPgl6bB8LXNV9A2Lh8zeMFyJeo2RVsCGY7m2K-FKuvsa76msolinS_qLu9XUfnYylxpBqJvQf_xb_yzIMpy1FEJ_PwIUqYdGLp-VHM3TAJMMmRfus2Hvh24KwMJ51Ckwd3u2qzInW6lM7gSGbpjXj0y9MK9RWa5dFov41t0umKguMFWS8TAE59BYX62W-_t3tttjmIKBn0iyql8zWIp6I084jv0YCBj1nO4bDTmjoy1XrA82qfs-r7xvwvn6CXIMcDITwqVVnf3yH8oKj7iKG6aDS-HsgrOXu584PTDqPWS1PFuJ_wy6O7gngZ-Mv9Yi5Euo-U9v7H7nSEQf3-rl__VqwTZpJJSajCjI2Wg40RbHCiPRRNKSXG1lDPjuwma35vLR0znVagmw0hjOAE_kuI04TmCF2d4-NCWnoN194aHary6ouUp774eFkMMa182KUKEb4oMkUGSx45BH2X4DxB9bclVjGFTFQ3P5j3Fl_hccoyqdMdg3NJQDxS_GodGAQde7CFN4l1kpBP6rrAIzmY1MhWFEJQsKiyR9DU0wMCRDbi9vrlzDM3v1Er_7xdU8A2RVrwAFnnSK7AFSfWFZ0DJL1s3GR_AH5DVaptAFamxSy5wfBuIxODq0F_1qWU8_gSl7JR9BAw7dTG1-aR440nvlfmzphPVUAg4_WvIs8sjWyCag_O2g6iH2Mb8oVxMyjIwtSHGEjyAXZVe9sZpXatTsUch_prjNxzbC4zIaEU88u91UKwu22TbIXV4D1-xAhJsqcqR_KtYX2MSRjqICFvMOVZimM-w7n8OeB1018ysl2ZmIBtuIIgYKKZsn4wShn9Dm-kuNzt7pFvdDNFRwu2ASqqwvQ3CAZ4Dpg-CU4-ZBPtb420GUadAhf_di4Jta3wyXdnByfveUKK1Ln-MmmpjGFdvrvillt2fQpSrxllxEw4qiiZFZE1ReHwug41XOo4gbx00cL8PKnQdpcjSSRMxXVJDtGMW76LeB-AZNOCawHuKK204Qp744wEaBScUaeA2dMWprslQ6D_-YtzNa76f19Qb5V5g0nfMtUuG4xfZDPvymJaqaUI05f1VaBreSA7W3lRIHN2-uC2XV-BDFQAy0kNpMXbSMjhQUprUA5GftDBh5BojlX6cRCq06PqCIF4EwmlfOab5cKHZ1_RicepCyYo2ZVpte4JvYr74lg-BpBLwzHJRrDadeX_iGG4uV8DVGrf0OxhEQGKF5CpMGDxjAemogVAlIE4x-yoiUgEJQxFeHpJVx8dcyUMq6N16XyWc6NMeqBmebmCEEhiV_kr-0Pd9JhKeT6A4dfwaUp7OCyxUuBVxaW1d-Egm7UBi7cAkxE85Aebdh991ET2CjF2LAg5HRZ63z-FQP8iqArePalGyL7UpF-GSAD_i568EgUm37XqGMbJc88SDpYCKJ14V9TDcodRk7ZX2lMWXi8lKODlu3GAwjw5vXCBnyVxmqxUNbsVdrpVNBr-VNLsVlBvmsJRo7fk8kwSg0T0usFQTwJt9x0zh4VCUAZtxaXWEhz2lqFoQT_31qVnDk4V8CA0XPeOwkAyAun6Qlyui1slKAHZmnK9isgUsWg14-DqpaBrhzSj0EpX376J-FrWMcE2JPh9zgKVCv1lhoUACSMYEE0J2GyR4t23fFey9LgWtv1LFMverdieJEpF3uk4Lsg4IKCGVlgMaslkvNE7wRx6Pg6gLFb2O4_wIbLKEyvTtvuIVv3k47Oty-mXOqq3TXIRHvyrmriL56VVl07k9vUmS3EIoUz512omv29vk0IvMjmS7zG7X-ojtHk595nnh9arh-OBrAndQSKIox9WdANEtZ4OBk8OGpuPegdeEKk56b-QYQvZ-rbwAgA5hfckybtE0gWxkgdftulEDDD0MOGtBVHDoR4AkjTRNJsLGrObhbpbjO3WmkiHcw9Fpczr6uKvhmohK3PYBnoUHAdC2CpN4w-FwHELsVE-LSpNDT9CS8WdLbaC4jpcPPdAq1MohT_fQqdCpFAK_VaroT8TMQqIPrQkpBXCjFMflFPQ_prPs5Ggy01HY_kq7ZpqTtcUk9VaU0Jsfvp7Hww_AUq79xce7A6TR2Far1nSbmFhaPtnH7kNkrGnB5-j9vCzbTkyLmk_MtJlXtvH59qRmI1iMtbNozJvJUZFV1dnRg84wd4zjk8qDXCl2XG3Z2fGlAfmZNBmcc6zx9BCSkNfMtHYkLrsV66vBgGVG7T6IxwxsC4EWH8oVxG0gfmev2I4iSwPo79YKI2ziBGcgSzXJ8lMAEONIqzSZzb_as4z9xgm_wecBgU872UTDpRIDkVKVAA0d0nbkO-FmFuEiQXYc1_Aq_M8F_kojHA2VxKViehejKMQinDi22lD_8ccqpDrPBsLy_pdWm3Tshp82ByOJrI_RGi6W6q7wz3ZzxENpi_FhbozUdZt_xFZuIBhVbjGtgiwHFqeopuxlI9VMCBnT2ZD2yrDIgQKwTH6MRU4Ez1LR-rYFo9D_WbyXFOboU9ASlCSYatp2XVEkBrjAZzE_rJF-338sNC2_aUOs4D-_66qZ2_qr-rqExn16Ufn1vjiW1hSb7CY_t_7z5UGSuSAeOtLXeK5vDIDs8jJcDM3lsefxmFjGl0QeXDHSj74hicBSlKXA6xdjLLDpCvVjs0B5o2yNITX1ioVfp-JMiUBkYLY59e8ZYvqr2bbLydRX7QioeSsQHTGHmnnYW3Fe0nkdg2WWRLUPjgNqNcdHR7iduB0Wz463VCQg5ZdbrcDc_kF2bOBXhYgTI12CEA485t8x-LMrsm6AeFTGRKnLN6ErDgKw-kkHLkT8JGRk4Np_CdSJw8IxbEKQAasjew01HauGJuDAl_MDq7jkR0ECKK9sRsW1CFhLNlJwpUO_lFqjk2DgRSILMbVV8sCCR0WpJgjil0QL5g1PdZdjWKk4dWVDERi6VO7abChRBxnJvQSrfIRSg4fRxwXLMGYdgNoh2XfgA-eTTQFWo03TaqPb1nfgJVsZi3KHab8TE6-64IjOzp7eE65mUdgR4KgXrCVd4EIl48RB8nkr0djmRsD5-ZxFXPhy7MBYjvSlk5oLmrLGoVSmeecFQ8ll39bQbX-72lifMmuvf3k4WP7SCleZ1bHiRBZlDCsHPrjH-VJ6NT4lxklQeKAIuz_bvPGSecFCdBX_AfgyYWQkhNIsaNmqbRlY0EU0ve_dbB2QevVIDk9fYbfN_iISuKVKpJ-SMJoeFOo6S57RFAhTYDEGE0rnp5XNj7BsZFdmDavDB-hFyOv3BPxKVsBHB5Nk6ktW1n_fdpq4wqPJRbB-np3SMckis74iNNYiVlF7yNNqxrdRrUbX5JsTu9Rnso6ys22ksgfYtNQzlA1fiZ_QZCbUS6T5f3Hr9HNFYBwoJfrxopd8jZiJfi3KW6f0mqSCqBZ-0HOE7JJcmUjQkjva_F2sBYJei6gu076Ht3O_TKal-VWc0eYR4Lg_NbHKA1UPt5dwg-yDQHjxtWxlZsrtTlZoA4kmfOSi37pd8TTMTPy2V-5N7Ev3zbFWkivOqzL5Fgrz53qm-die27VjePYeAFTFzChOJV0O9xzvwvH-6hhwUJrdgKP6TdjXNfmZdtPwxEClNPrtgE4VPmdhZ9rb7yksdMjhpvxn_0DitEbZwhTDns-3ZRujPyxvdsliw5jmJqPeBpZqlf-EryopGcTl6xf3bF7JsY3wb7s9ByJk0hbwTRhqEU5NOfBX9qVzRLxwxocpAEejiYZiBR4ex2lmu5wgeSrJcYtfEhAkoIlDn3pEYvjtqlY5MBCXZv_o2r-46N6MaT41zagy_uZlABbG6tGk86K4OrWkTTPjUiOXoz0yy2Jq2tiRHUe5x89XxtGaTHZfijN5yEvEsVl9y0TqxdvIXiUbpB9_krxiARn3lpYEKhvpFMwwftlVKzqMhWr_XzYMEjzPwm9OriciReJQqrD7Dv8vtlmB0XgwUMpaQgqFPTh6DXhIqHE1AuYiPs97nsV7n-8toCJHilU0FY1Sw00KdhOJZnsnTgaEhpsZr9Z436rQM7ToktEVGapsi3s6s7nJ7xNxZEGFxNByvkGbvqFdliIAeX4y_2CA_jjzTW3XEQavMhQrf3UXJevHtzHg-mvoO1vDrppn2-3jq0uwrTBjPOYZMBnlH0WviVTZkEl0zuHZN-w8TNjipL5sWSNnTjshidIEPhQpq7s_yeiEu3lca6KKxPszUcNFid-ggU_Eof2zWQp7PTv1guVHupx3Ugy9maMNL_gpO-9zikkSurpNF6bqzl6XtSUZtLL6A9H7Q89ikwgL4s6XBoq_be3oA_jarDe7kh6zDIOawzqv4Do-YCEJ4lfjHJr4EiRdD8adwGuofgv2Q7Dpwe3LPYTlanbiz_5s7tOZYZR9U8-p6UQU56QTqteFA0BI7JJthdkx0O59eKCEYiDZtzlcdBcL_PeFd_aJBEhDqM_k8QKeXsltaQfZCL6bsQLzg3CQxq5PmNxcG6Vjex6oKbyL0xQmWsuBzEtmgSdXBVbzUmgVcWzy86l7oJleykMuQohXstpjkPe1U4m3i2KxU7dWAuIsJDvGGmTCc9Y-lIA5cWQk7wbnnxbAK7H9u_GuFRcyFFdNZpyruue4xqQMEXBd0eXFEAdubb0PGNQS7D1yfEkw7cTGQ4imF7SU06Mai3L9HBuQu7jvO0LY76MiMKD-8toAcvsuakI6r6OiIVzTWHBnXnl0M4N5Gf6R7B3jBG6qFH4BbAggze9JW332nOrQJyMqTqrsN9T9fiBbWqRnchjNbWPcbzxXWfZoFTsffHcBBERUKV73oVDwYkS1IZSV9BGNOFZXv0KgEQH-AVLgXvrpNBcSQlHsWHzENftO5tPvXC24RtwZbP3FTkKDOBr7jm-zHnsG4-E7AFkBP5DLIZNa8tqvGuUXvL5Z-Fw6alStvZI2bBdZQJrdks6eSBJ4AtD5Hftaf16cKPW6LeP4gFfGMQ6P254Veh5x629URhmSOVm8bHkg2D4eHCENnKUqHj2ATjqVgsYiml2omuuHh16m8awZECM-vmLJXCU2P-HQv0YG3P1rKt84I04qUijn1Ca5KWIe1r2SbJXWUVxybGSaUS27vTQ7YSl60SvlE2XwiMTHM8BOVjhWDwjzBZSeXtAVIdyjf7hlJAgfuz1ld9cN2NmcRfIEIkG2QNJZS8JC1La4o08eZl8EK4RkTOu0DG355C0KGd4kFmBE-7t64QS1d296BepSDnX7W1g0nYyOZZZPE8qTwn3Hij6Auvm7I14S1pWH51kKmRjc8pujFX6L7Yh3DvT6X5g4el8CGXDHiL0Pl0OrmjF14w4PX2R2Oi4ISXNfdmwPa2j7_tJmJDv36d4oSHguGJF2v8J9SJrZH6e4AVTTWX6oQSYYYatY5RNA1oN7fG0HgI6aegqAmYeQgKcW8aA32BdlceiecIWDNMGNSNBX59N90wGuq0L25VlT54uHe4601kuOYp2vOOeGMH35bVk144LuR7Y6RnoB0Ea0HM0iOARk2uie6IZ5zNjJ24LaR6JSznv5S0GupdkM8ZGIci5BbY8-6ZvHRonSuccXmyWKqT2uO8cJ1ZSmZhk48Z8DCX4K2nJxTgA8YaHbwhwZ29CRfeahaI9iRjWYH3P48tShHOGKGlshcI8o0fde_RXGSLp5585fW1c-oIbYP64KiN5WCtn_LCIemIY2Oe7Il-yeuY9mSLzx5B5HsDWNEVsfSKa-IqyO8ncIjfSbIIBdwUdHbqVfqwS__kMs1DcxpRu426_u5cNlC6Jilx_wwUbJMKJR0YpaQdzjv1MzYTfzvalCFlSYFKuByMYZ_dHlacJaQYEBcxX33UOMkz_Iz0WVfRtpijDZSNkN-MoJWa5cYUFcaW3-KrVgfCSMRr5autXcLbjTgZPKx2rGMoCPkW5Wja3stISzcTe2cw4NTSq3ojRqY539PBq3oZNSajEoFKQRgfdd3E5KHKkoUG8rURIU53hpfj0g78rRx5nictUhSJCjvjY7zagl9eExZsnIshrTZPUoWLFVAKkjnbFh5rECkwAhSH_kwJRpeNuTmhjTQ9SUfsmFCmHAn7ZxTDFTiwuzCyL8UfSpp1p9LTtZ-f9J-yr6Fdz1oQvNPv44lUE2XVTYFTiOteNWi8nbxyGdwJ5P3rTcwbuvc1xNXy9RBvpChTiJWfhPSJs5TDhCvvlU4sLE6fTXHTyZa_zDkXhXd3iMdS8gLerYYrz9xt3p01RE0_V5h4CytwW_zkjL6JgMm0-pTnHU98mZYIIib_wKrL8u9qNX8zsTd1dfuziokZrtKsTW-PIXd8QwccBXxbwXF0QIn5qho9_rN78vSMTgLJ1pFMzci8xJbmD71TSXr_NWOBtQk1woPEZmtdLdcdj9jD6URZAv0lS9VYvEeUIT4YgGcrURckKwZFfhmtliYj7YgqYXUtd3p3iFRmdFXWSpYIVBumiDvKrAg0YYWN8ehY0zIS0OAZ3C7OI2XHaQ0fKuxX4mbCUGQxZfEOZpQFUwbY9kTgnGehPcAM5DJLhH4ZfDttouUoPR35ojNWrQsM0s-fdpxPSm_Uaikj8-0Wfn7M3BjgZCvw5Xp49R7xtkmy7K-gjAnFWfdhp1SAF-ktvF57NvI9gAzoJf1NVzcGuT_YPSuu5N_P3nAlpDCniC_kQh0VwB0r9rFDmHXmgcFsZv58i1qnVAnQ9QpAIYAXoBr8RwlmPu3gds4E1cjhoGehrZG_asngEbj5b7KvCpr1ST31Ti-b43DfE-YUn61pZHaqN-PAr3UAqq4pBVrZp2wPkqDneFbbXdSuPO3glcSSefAWf8OVxiOTFzI3oEsPjbiEpZ3GsJrJiUQzD_sTPy717RG_9SWbf5ce5McbVt8N9B16er-QuZw02erktr-O-sMNXhBPQdFSTXG8VKouqErm6aS7AVuhgIYhOQmSPwp912h2J4M0Vnwnah2JBK4axM-f5WgpH1qH7qQOF5_0CylvsBQ-8yq6fj9xWZlHbqZLUKPDHIkMKPCLHBfPbi8biMiyBgahX4O1kdLCd8ILuB973Q2lFLG7zTKue179nyZJELrXgjHirrMt1LATo3PVFKWjqwvMRrV0esdlebLkRBv2S3FY3FBlbxRd5jCcbM-QHBNuUdlFL06QwVRTh_ke2P8s2yOkIPs0ydmy-Bv1cCAlNaIDPS7cHmwwB5qyk3HkB6sjgBMQ9E9yGtxjpuKdvTa53xVXafr3z9FuPaQVI9jCGUd36ekSpCzjMPTAgLzC8iYo8qZIMuw4LgbEMmdoTj96QDmD2c5o5ADA3d9sa5VkrActwMbitZCX1GrnWv0-hpU3KElavTUVEpwBa3rlL3VLrIKXyJCTj8AQ453TiAiHcqpKHTHratwhFeTlZM11jmGoavXw66AkcFD-4Sj5E2DDBxxkaCceq_Kec_ctHBTb0HIRfnVAsbqhJ-Vto1z7A-pjMzGymTotcNI-33U1c_OMoBnMWE9THD7lra-XnUBg-nuzFt6jMsX6LR6YXHItQiDy6qkuDHMgAqVHHChTrEM_V6UhE5e9YeCpLccmecgfkMmhNOQtckh5wcD9GjMyPqSdLKivnNNoorEi_1HLDE6PobarffrjiTmCK_Kti1WhaQ-bspq1HSty8RgEVsxcY9dtoqaRfllq_KCBN6NW91lbdKrJvVID-UwUWyp1dECZvoxNh5js8TSGaOVxlFnUuyaJgZjMSLoi3bCJSi-kvoA7M_U8o2ooSA4yhVjT98SUklD9f3srxlqj4steJJTgMcQ-Bzp7GezR5Mm2kWFXW1K2m69l-XNCmXJf7MHxXGUjtn9s8LEuLgkJvhdmOJj0VqJJUipwBbC9eTsSKMqtNeGClXtdgHD3lD5sv9kQ_9zBT5p6BHLcdYdT-tz9luHlDaOiiiFaf_rtWIpXqycp6oSV-O-Ha3-qxzIJjSOkQpHKiFetbpitTmiDww-LNOwClc3yJ22xTrMPfU4WlPphOCkIK4hJNCTenc0M4ZARqgwO4u-pyHtvAgMH5jFkyzN5KU8yAh1slHkeoybDgvOs-kFcG-sm43TAAEaah_PNNoW_cNTTaOqRBhBILLiUtvc1lpTSzVCz-xdIM7u0FiHafExtmS5SArCt6kjIh5xC6nEMskSjgJXON4ROEbaMztSNbJ6zr7nzhGW3HELyDRhKH9P_J0lGLhBfBCVtVLN1O3suoMsZupzB-ITrNecmhcsGLxLVTy6rdd8eARs1P7DMnlES5SUdXujS1I-9k0hvaBdYkebYrjCoF-tLZ5NElegVIu2fLa8UKovv3gqUQvtwQ8D87XkLJKjoN9Fo3EgrsP_3y0 \ No newline at end of file +xLrjSzmsalxENy7IVaZY6czjaijLdMhlQcLPJbndoof9pjOcbL919CH1p05c0L2Eaij_lmB05m04IO3ao7Q2JzAGG7VpGQFHwCRBFnW7b5UxCadJpr9mJr2UxYcvBU6EfUyHtwO05oNCquoIzoozWv0dQShU8Rm75EpI4c787_Om9PHlYV4gAm5ZwMz9cgRfCq9pI4z9IMZwbw-__i-J__gRzlnwYx9t63AMVfMawUzIb5DH6x8ahUcSP1pT8_vm2JEqHn1pzbkIFabHdXwd27DOG9eUftyl88OKS9Z_Jv8M563-qYnmUVRYxFBi_FJiAZtwLhndHtz5UP8IleNq37F47qPgl6bB8LXNV9A2Lh8zeMFyJeo2RVsCGY7m2K-FKuvsa76msolinS_qLu9XUfnYylxpBqJvQf_xb_yzIMpy1FEJ_PwIUqYdGLp-VHM3TAJMMmRfus2Hvh24KwMJ51Ckwd3u2qzInW6lM7gSGbpjXj0y9MK9RWa5dFov41t0umKguMFWS8TAE59BYX62W-_t3tttjmIKBn0iyql8zWIp6I084jv0YCBj1nO4bDTmjoy1XrA82qfs-r7xvwvn6CXIMcDITwqVVnf3yH8oKj7iKG6aDS-HsgrOXu584PTDqPWS1PFuJ_wy6O7gngZ-Mv9Yi5Euo-U9v7H7nSEQf3-rl__VqwTZpJJSajCjI2Wg40RbHCiPRRNKSXG1lDPjuwma35vLR0znVagmw0hjOAE_kuI04TmCF2d4-NCWnoN194aHary6ouUp774eFkMMa182KUKEb4oMkUGSx45BH2X4DxB9bclVjGFTFQ3P5j3Fl_hccoyqdMdg3NJQDxS_GodGAQde7CFN4l1kpBP6rrAIzmY1MhWFEJQsKiyR9DU0wMCRDbi9vrlzDM3v1Er_7xdU8A2RVrwAFnnSK7AFSfWFZ0DJL1s3GR_AH5DVaptAFamxSy5wfBuIxODq0F_1qWU8_gSl7JR9BAw7dTG1-aR440nvlfmzphPVUAg4_WvIs8sjWyCag_O2g6iH2Mb8oVxMyjIwtSHGEjyAXZVe9sZpXatTsUch_prjNxzbC4zIaEU88u91UKwu22TbIXV4D1-xAhJsqcqR_KtYX2MSRjqICFvMOVZimM-w7n8OeB1018ysl2ZmIBtuIIgYKKZsn4wShn9Dm-kuNzt7pFvdDNFRwu2ASqqwvQ3CAZ4Dpg-CU4-ZBPtb420GUadAhf_di4Jta3wyXdnByfveUKK1Ln-MmmpjGFdvrvillt2fQpSrxllxEw4qiiZFZE1ReHwug41XOo4gbx00cL8PKnQdpcjSSRMxXVJDtGMW76LeB-AZNOCawHuKK204Qp744wEaBScUaeA2dMWprslQ6D_-YtzNa76f19Qb5V5g0nfMtUuG4xfZDPvymJaqaUI05f1VaBreSA7W3lRIHN2-uC2XV-BDFQAy0kNpMXbSMjhQUprUA5GftDBh5BojlX6cRCq06PqCIF4EwmlfOab5cKHZ1_RicepCyYo2ZVpte4JvYr74lg-BpBLwzHJRrDadeX_iGG4uV8DVGrf0OxhEQGKF5CpMGDxjAemogVAlIE4x-yoiUgEJQxFeHpJVx8dcyUMq6N16XyWc6NMeqBmebmCEEhiV_kr-0Pd9JhKeT6A4dfwaUp7OCyxUuBVxaW1d-Egm7UBi7cAkxE85Aebdh991ET2CjF2LAg5HRZ63z-FQP8iqArePalGyL7UpF-GSAD_i568EgUm37XqGMbJc88SDpYCKJ14V9TDcodRk7ZX2lMWXi8lKODlu3GAwjw5vXCBnyVxmqxUNbsVdrpVNBr-VNLsVlBvmsJRo7fk8kwSg0T0usFQTwJt9x0zh4VCUAZtxaXWEhz2lqFoQT_31qVnDk4V8CA0XPeOwkAyAun6Qlyui1slKAHZmnK9isgUsWg14-DqpaBrhzSj0EpX376J-FrWMcE2JPh9zgKVCv1lhoUACSMYEE0J2GyR4t23fFey9LgWtv1LFMverdieJEpF3uk4Lsg4IKCGVlgMaslkvNE7wRx6Pg6gLFb2O4_wIbLKEyvTtvuIVv3k47Oty-mXOqq3TXIRHvyrmriL56VVl07k9vUmS3EIoUz512omv29vk0Iuyx478UBBsIe7vOuyTYyJm_PKx6q7AVE1D6t1J98QyHVb2XdxwaIu3TzV0uTcZcwgUGrEugQMvw12cbxMN8ceJKJD9uxs80rHrI5VLknEVRoH_jWXtRCY-2JGsWTPQr-kdCfJgnBNBbpOm71XTOZFqoVJDRgDmLxLX5JhupyNZaqYGEO6P6jZrqNoYSZkgzygvccQwIGwHUchB8OBRJ4mp9Te2jjKxVItfkHcKqX-_9ZcwGwireipbrRcMYPOUdBdxkKlpbLq502y0XPX_-y4ZJeVtb6j9laT0J-LvJE_wQ_5UKBAxsW7AsHP2Vit1HGcmFkKPNuf7kNiDmz8bUXBvSvdJUuNmktLtJFWtPT694JpIXWLrbNozpvGUqRS1tnPge0xdIHi1mmR2PK52W745oXSLpX4kNXFCjpsIMOvSFQjk3DUhhayCjwNK0-YEOybtLtkO8L0Ynizs09LJXPo449QPKZaEJ4ga5xOM0jMPwocHUiMSGkb9wn7xBpBhfoHtrdVqV4tjIRN_846ygVcrCQF-0uNnPFZ2RMmS_cUGLGt3z42Ujb_4mP-zbVxpi_s8NLIt9SgCzNTRG67-JoIDbhadwwMCwZy77FX6x5KUuCLuUlfbMoWOT2CqdnwddxryVdP-_VB5oxFddnqV7qdtsvBwHjKvyaT9PjVn7UcI6OQtIs56Q7vAAhL0fox2iYtSWRvYQn_h4M_oJ-ihf2TH3a-Da_TOv8zFk73UzSLAwN7wjth6dq76XWluDzBS1kBx5wDjPA6_Ph_BuHt2I8ypo2mRnE2sX0DPzpk-luAS8rmOTQmkB3GehsR4JeJQl0RiNLjn3tWVYjS0bP2QIpLkHIwCkvT6QIEtlLPgRhwo7LkW6FdbqWXxqTUJz6TowrXdzqIiFHF1aSNE6eMiAdcxt8vLcT1cpIBgY64ECS0Pz86DKrGKaBPhIzjIUg-qQBQz4t1O4FgWGJvZBOkSSkinC_znuKh1S5ULJYG8HfnGX0kvYVogskq0HT1xg3QcAgwnMfjI7VtrIAjpf2O3zmY-Vvcx2NJ2NSfo3PMcrb7G02CdYAT1fT_wnkKzjxC1nYWXkpUq01ZzQYzr_MRp7zx-5jmHjIBYIgscxv4n1ZQ46QTLDbw3IWlGBCgSzi0bGi-3vfnTWxv0SahbxHVUgVBJcb8JRbIbhNVKgYo4qrI-LGKDjHNrZhfHS6I0xacZCWmDjQR-KTXA24cf3fmtmuWLhFiOT9mmE3szpGYbKEhZSmZoLmZ3vP6DMe4zkBUn8drtvq9D_WunyTlB5rokok4ggEHx6D74HxJ5TuPCBSkFGuNzb2s77D8Tmi18RXdz4GCgjZFSTvhcoBEjg7nwuwxe5_TrxL0XoV7lyd9A3j4nPaxSFnLDNaK3rrOwsqW-cifTSO1pGFF7SqfOpT5BQHlnD4MjAtzYpl0ZwkOVpYmUr1v6GxYeRHxLRiHfI9o6E6QiArevUyPyU1kdfXVrvtZ7eHPFwZ-nQ9OgTursy8EFzCyUWdMZAJSf_sCORgqrLkmubYuyLh_vu_Ww-lUixUhqi8gUJd3B-EqBNcmGLsrLiIgyNbxGDDaVRSPaBxYp8bAQkfAAPqHVMQTEk-KSPDkT2LDWQa0reE4Z1cXS_zWAXmuQy-1rBLrlCdvuMnSIT5WrN82uI6wRdxgabtny4m74pGYjNoygAfIBJEui_TLtdhIDFMzVzyUs9pjyUPGbsDAZ5GQ-yv1hgxfFWR_mAmxt8VifS5rdhEdg8f_MFeeU6Fqz58Ixzb1CL9Jx9tfbx2PuZFFUl7LAFmDT_RoUirGZ8xkzC2_EaKyxC_RnbwxEEyhmZxE4TSREiezbsywrjMVFUFu1DkxqCVNRfkEtmKRVbZFdrCyrTlGjk1qZj1SSUj-FjfzstWcXixSDtI7A-6bj47tAliGNOdU1NBqwNVgSy2inoV2Je_usB_ttb5aKzHPP5FQMM1Js5NXmBzNGvYdDbdGTMTVabMPY7gV4pJjV_4AisP27Jlc5ByACECl8w01x9Tv_n3UJNAWDEXUGCe8nB9SwwpOzusXbQ1vp4lg5lOqYzG9smR1t9f8wWdJPwc9uTwVi_MJu0pftFod3ur9csRzTB_OKtg5V70SetxaUDztJlU-fRWlNXhz3R4kTxwnr0IphF5OtGksPgQCRoHnl_WK13TqyDdAXreSoRMCR3UdeES0LHDOpiQFZi-DZyHjaua3PUq0V42vq00fFsud73bQxL4VMdb5gJ6A6DYsiExdTkSyU9dlO7Zvi7mGYfNr6yeTsENvptfBpeNDVOaNH21x-4GN_xJuxWF2Sr1mjsrhIcr3dnQXlQhLz1pam3wHhdlW5y7Pe1vrgwVOon04htlSWX9pJ-p7SSE1xhh4lTyIwFRRcABl0udYxxbLPEaSpsrdelb_vHGVm7NF8CehspbwzicVPFylKTsTboDv0rkCoxtZLm-Xnds6zrmJXeiih_TanyJxFTSuXhckUBphxqD3kuz7kAYCKoeCpGRPTrSg9iD2NbXzBGFcLVHvgxGFTsDuQ4vBrRXe8Rb_4uKa9_RQY7Y8TutEQn9Dq1nbJ5o2qkJbrh6gpaxV93BRxUBiFkn55csIynzaCSqyAiqvdlGSK0UaEcdlNlTs0mAJG8GV5uR7lRNDwtCf-pOVF_0aMzUReD_UGKfJ3jVj8rR6OgDBiqZxKoOpteAnWFtEWi_RHM5cfhue1MzX1jmNwTlYivF2M_BuzXK_D1pwGjUFa7NJvSjmrbV1jllOqpG0yfW7OaXsyFF35GLicxwMX0oPCJDzUaK9D0zUFrBZZN2KekgHnUfoUN5wU_El7dvfnHO9t8qiTYNC1n2USL7nBg8mWEquEQ3xITKcFCoYq9HYUEm-0CbBOcYGYNmtmlJom0Z6ECjQi8RyHFiNDJbn4SaDgCvQa_wv0YVZ33M2iecAXo4qEsFQM0DgUY0LALLLxmIb06E7YHgsdOjgx9ZkkooHJuV91etZDZIjB0xDBRsv1JFcUxjJIZ4KMSs-c-E7aUJt5ym2bcmyIsWim_73o0fKSKh-KUhN3pZckN4urUgV03oUlJknhkZn2OC8tlz5Ao6UxyWQmtgFRXzwZ3iY9yKEK_KMogIgb6lAHlfoXmz3og35yVqF9-njp6a7AtF6qdhFTC5GuMkALkIAZJdBI2DCeJ0ChGo9KVQYiq4o4g0_HsEqB4IytNeumVeJA3LM4Q1IYuIlY8reZQ4MxxezLD5PXUDbXnmZM25WHfr6SOj_pWYd2Oy4pSXbo1CW6oBeVEGAa01gzspY2v08f0jG3ACvA7B0yV_xA0v8yuCDowyF45UC0vpSS5BtOioWiGMm_RV2RrJwN6vH3kK-blnPIlNScrTHnw3VEpCi4FXFtI4SbSe4qkd4uGkQ2B09a0HH7UGSe8xSvHu0QW68AO0gXE9SV0MVy5kE8qm1E4ICNHkvxYoD03K3Z5mn7d6oSnevrY6ZPQCLnpWEa28u3d0YA3ShWNRCHdnQVY4eFbU6RIoD2BK9HUGQXYQXOg0nUWnhXwU29q0n24s6nO0cvYlHFXqp8bQD_EdWcxo6DE9au3ToW6M5omkIudZ4YDOAK-ox12DaqP5759l6AMkM3akDIW8ZK45BHLWLX5OtK950HeK64t7VDHPHCb8OkieiukN2AokG1KXpe0g6A_MuAfmZG8403Tun5cDmmHOWiYEBA_K288ZmsFCCtZaM0T80YC1OmK_U5HPGCbEBwlIc48Z8sCkvxZo8u0XpdFKiH6WdDu2LB4HyDdwWt5YxnjD1XP8feQ5omn4c36nZ7NK8HcGQP28e5YdqxKKH5eZ9rtr64oGtJn9L84JOtR14Y6wAHkvKYGWgX_jLC4Hc1JFH-NAWuhcAAm3J03D_a536oC8hOEB0PlZygOjHW546nGEdVTnHn4RYuhpsAs2Xix8kS_jIu99-b9uoH34dRov8aaVFqzEZBe_Jfqn__Sbk2xDrcNmA4DtoBidSOClRVN_tqzAaiecq15dArlpRoYjv4xJxp9MQVUv4UfuLuj55_kZT9CdAraSLDtA46SulTRsbwX8_ItddPwR6ulSjyjad18BF4SND90F-fAtNIOuktAB9nF3EhhIvL6ohs5gYjaGpT031R8FlkavvCRO7Dq8kwvW5bQtf4g6IotW7b6cx9QTaUeqtLp7E6SAgY9TayWPeyMayAdNbJQ1MEnYrsBhRDkzMucHPpx4DxfLUJmTr7DYdjtgx6Izd0gU-KfLRZgVMBASPTqTMu3_Tqc_bGlmxXtIwqIuzJjeSP0YLYl7swwUvPrvwPOYIzonbcZkIgxd5zoQdzPYEVlw1arwkpI8BUSS72Ux6URGplGd1Onh9tufFqcAo7ApDrhnnCZ-j3uQqNJkRMxGb1pUouda8wRURpJU-9CYUDox2Yxv79_oPTZN3E7OjEOHMhHh75hwHtk7a02-U1-sBM8Pvlr1_xzQeC7KlWXzax2YyInf544jPBVyfgAPoJel2HxaxEZFJnRHdTdhkfCx1yob1EGrrDiN1thr0U0qdYhXNaptekkPouCxKgcBcUDpDOn-dBWQE2wv3hUd2mNcrS3raoT7ZlkZFDlIJQQ4ytcLo1-mG_5wTGyau95SZDgqtDSXr6_RNXFNR5QF5LfD2zl67cdOUtX6V3Wvd4a-NnXORo9YLK1D50EHHNa9uaO0mL6EOEGi7230s1IXpt21ZAOyWrtFGSn7cqUrrB4JSxLYXHMxEKiAOchMW9dQPlFjmzaoq6hbQl1griC1lzpFdsIvZ-T1PTQHy1XRWEi6LRLERpq31ceQsFNlVXO6hzLILY_1HFtc2uKVzTloUAkdmaJSLxalI2k_vCXmv_4wxnmAj-o7WL_kQP3GP_yzK0_yK1gJeUxeX31TCVj7oAnO3f2-LYKIrcKb4LZaLgG_rV0po7L7i8S3DRNaZHth6XV1lZqLBQhAEfoHdgYmw62pRzg06RITz4TgC3dEZ98d-orY6yLfe9cMzh7k7qJTeRZGTBhBCvGoo7LVCuvHGL1QGmV_QmwNua7iVipJ9Ozl66Xidg7O-rwRziQpwEYEqXUIv1hIBDG2lDg_iGkIK2jPfyrn5q05JhzlhyHziilBKMozEUup2WG-hbHeVh058ukKznNKb5MurWOprcI25M4cAiW_ZrZ9K46Me99slzIB1Lcg3e2FgqmMB-0PxVpiKrSHvejROJt97U3Bh6AqeoQgdSiemOggNIJ3QHBOjPONL9N2AmZLEgPEGahmKIE6s5-MgWlwufnG0EJhx6cKfhZLQZvhejkAeKxi6oUMh1Rfroite-1HjF_H8hysNoam4Va6UN_3stk3QPDAjyqgMlmrFUUg0CryysxNzTmCmHC5unyapiXvFXvqNo34QLUd8aQouFChXrqUBfvK4ZSMDjxSKiKQSJuXjtRdmflov8g7s_Z1JgdwGVGx8q-aHQOW_E6DHSPcRxwamwrKfwOPP54Ph64bpq8ZNASjZFapOIiqPWQDEB42KQqFEJj0A_TgLDFqlBvd4P2AXhZ9m1zNcy6WTVfwwy-Ldqt07h-g6-BYcfZucORQIKq8A6RONO3DfcegwZh1lrMNGxV6k23RYXb9p3K4ELzCURS0xQAK4QwNttT0RDnX-fnDzDkYKxg8WatJY-rb9fMly_la1wEL_dwjuXvexblCiby66yZDymjiLYD8SIwYQFVZ9z3Y-NrzZnwNkDQbl2iYqDbAWbEzQRODhTmIWjKTe-2gRMRgUjUsEzsK9GJDIP6hDD1HFLJKlXMkorF5TMBrCQofOjOpgvEgfPpgilbbgTv-2YAQSCpj99hJJhxGxWuf-flG31N0tzhbbe2gvluGtKStjtjCHFFjf8tRVV9sgOMcClWI3VBEfgdo-aRyzqT1xc36SP7xbslU9RiOwu18o_tUTYTvv8dT7QimfbuFAO6nPzTpcKkbyyHi7b4uK9vUzQQQIuzLSQpQ5jhtVfQ1jlmccxKjCryNvcEfJwM2lW5L0VZ00e5WEJ_r0kvX2dIEiZN2YzxlWJiOgTGhLSdxLFWmdQ0_gc6zPdqN8OpOxiOelfEdIWvN1llKYQdUOBjwJSrsJwso9ciMYhDF7ExrlwJNoZUJAnPHOVfRzhF0dd3fxD6DcuVypyZ85zf_wa7IunyzcYfOVHlBdPEpXORztyAcpqPVC7Ok65sxeiJI-9XMndMuRS4eBM6cOxHhE0i96KNfNqG9pzduXlITMiY3QVznwkAeyHuTM3jMXTHbvAxTonDrSVCf_jW04wKKT9fV-oEld1_CkwR8nesVMMaghOzdpCZVcwvw-PxztEaaFm0NOZ9QTtFeuAuTgPEDTQbMBsuDYSDbSvxSd2GkAsmTB8jxkulAcDxgDZRMX06gUhuQrMegGpUk3UWZKNIUQ_ksekYu5jHajjdndwNycxAlHD1VFiWhsgUxwDh7CHmKriYwCQjhUSO2uzFBnQO2dyJS3Np0NF5LJBbhQP4Vzkh6AkTVHKUbo5IhAGSfbpIFLeyznlKqIQmF1SAkhRakGV4EVLhap-7m00 \ No newline at end of file diff --git a/docs/logical_data_model.puml b/docs/logical_data_model.puml index f1ddcce74e..776be9f5b1 100644 --- a/docs/logical_data_model.puml +++ b/docs/logical_data_model.puml @@ -351,16 +351,16 @@ class GoalSimilarityGroups{ class GoalStatusChanges{ * id : integer : + userId : integer : REFERENCES "Users".id * goalId : integer : REFERENCES "Goals".id - * userId : integer : REFERENCES "Users".id * createdAt : timestamp with time zone : now() - * newStatus : varchar(255) - * reason : text * updatedAt : timestamp with time zone : now() - * userName : varchar(255) - * userRoles : varchar(255)[] context : text + newStatus : varchar(255) oldStatus : varchar(255) + reason : text + userName : varchar(255) + userRoles : varchar(255)[] } class GoalTemplateFieldPrompts{ diff --git a/docs/openapi/paths/index.yaml b/docs/openapi/paths/index.yaml index d03fc2d19c..cc10942cd8 100644 --- a/docs/openapi/paths/index.yaml +++ b/docs/openapi/paths/index.yaml @@ -64,8 +64,6 @@ $ref: './widgets/reasonList.yaml' '/widgets/topicAndFrequencyGraph': $ref: './widgets/topicAndFrequencyGraph.yaml' -'/search': - $ref: './search/search.yaml' '/settings': $ref: './settings/index.yaml' '/settings/email': diff --git a/docs/openapi/paths/search/search.yaml b/docs/openapi/paths/search/search.yaml deleted file mode 100644 index 6a17e86306..0000000000 --- a/docs/openapi/paths/search/search.yaml +++ /dev/null @@ -1,43 +0,0 @@ -get: - tags: - - search - summary: Search aws elasticsearch - requestBody: - description: Provide index, fields, and query to search. - required: true - content: - application/json: - schema: - type: object - properties: - hits: - type: array - description: | - Search result matches. - parameters: - - name: index - in: query - description: Name of the index to search - required: true - style: form - schema: - type: string - - name: fields - in: query - description: Array of fields to search. - required: true - style: form - schema: - type: array - minItems: 1 - items: - type: string - - name: query - in: query - description: Search query. - required: true - style: form - schema: - type: string - - diff --git a/frontend/package.json b/frontend/package.json index bc4e507bfd..d35ee731bc 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -9,8 +9,8 @@ "@fortawesome/free-solid-svg-icons": "^6.4.2", "@fortawesome/react-fontawesome": "^0.2.0", "@hookform/error-message": "^0.0.5", - "@silevis/reactgrid": "3.1", "@react-hook/resize-observer": "^1.2.6", + "@silevis/reactgrid": "3.1", "@trussworks/react-uswds": "4.1.1", "@ttahub/common": "^2.1.5", "@use-it/interval": "^1.0.0", @@ -213,4 +213,4 @@ } } } -} \ No newline at end of file +} diff --git a/frontend/src/components/Header.js b/frontend/src/components/Header.js index 5d0f4c3b7c..516a791283 100644 --- a/frontend/src/components/Header.js +++ b/frontend/src/components/Header.js @@ -1,4 +1,4 @@ -import React from 'react'; +import React, { useContext } from 'react'; import PropTypes from 'prop-types'; import HeaderUserMenu from './HeaderUserMenu'; @@ -6,6 +6,7 @@ import logo1x from '../images/eclkc-blocks-logo-43x56.png'; import logo2x from '../images/eclkc-blocks-logo-86x111.png'; import ReadOnlyEditor from './ReadOnlyEditor'; import SiteAlert from './SiteAlert'; +import SomethingWentWrongContext from '../SomethingWentWrongContext'; function Header({ authenticated, @@ -13,6 +14,7 @@ function Header({ areThereUnreadNotifications, setAreThereUnreadNotifications, }) { + const { errorResponseCode, showingNotFound } = useContext(SomethingWentWrongContext); const headerClassNames = [ 'smart-hub-header', 'pin-top', @@ -49,12 +51,14 @@ function Header({

Office of Head Start TTA Hub

+ { !errorResponseCode && !showingNotFound && (
+ )} ); diff --git a/frontend/src/components/SomethingWentWrong.js b/frontend/src/components/SomethingWentWrong.js index d579905a6c..d7f3c033ea 100644 --- a/frontend/src/components/SomethingWentWrong.js +++ b/frontend/src/components/SomethingWentWrong.js @@ -38,7 +38,7 @@ function SomethingWentWrong({ passedErrorResponseCode }) { message: '403 error - forbidden', title: 'Restricted access.', body: ( -

+

Sorry, but it looks like you're trying to access a restricted area. Here's what you can do: