From 15ae283a5d8c16bf34cbbb9e2b4c9ea1949cac16 Mon Sep 17 00:00:00 2001 From: Landon Shumway Date: Fri, 27 Feb 2026 17:04:51 -0600 Subject: [PATCH 01/36] WIP - public search with OpenSearch --- .../data_model/schema/provider/api.py | 23 ++++++++- .../cosmetology-app/pipeline/backend_stage.py | 25 +++++----- .../api_lambda_stack/public_lookup_api.py | 5 ++ .../stacks/api_stack/__init__.py | 3 ++ .../cosmetology-app/stacks/api_stack/api.py | 3 ++ .../stacks/api_stack/v1_api/api.py | 3 ++ .../stacks/api_stack/v1_api/api_model.py | 40 +++++++++++++++- .../api_stack/v1_api/public_lookup_api.py | 13 ++--- .../search_persistent_stack/search_handler.py | 47 +++++++++++++++++++ .../rollback_license_upload_smoke_tests.py | 1 - 10 files changed, 140 insertions(+), 23 deletions(-) diff --git a/backend/cosmetology-app/lambdas/python/common/cc_common/data_model/schema/provider/api.py b/backend/cosmetology-app/lambdas/python/common/cc_common/data_model/schema/provider/api.py index 76721b20c..a59efae3a 100644 --- a/backend/cosmetology-app/lambdas/python/common/cc_common/data_model/schema/provider/api.py +++ b/backend/cosmetology-app/lambdas/python/common/cc_common/data_model/schema/provider/api.py @@ -1,5 +1,5 @@ # ruff: noqa: N801, N815, ARG002 invalid-name unused-argument -from marshmallow import ValidationError, validates_schema +from marshmallow import ValidationError, post_load, validates_schema from marshmallow.fields import Integer, List, Nested, Raw, String from marshmallow.validate import Length, Range, Regexp @@ -208,6 +208,26 @@ class ProviderPublicResponseSchema(ForgivingSchema): # Note the lack of `licenses` here: we do not return license data for public endpoints +class PublicLicenseSearchResponseSchema(ForgivingSchema): + """ + License object fields returned by the public query providers endpoint (OpenSearch-backed). + Used to sanitize license records extracted from inner_hits; jurisdiction is renamed to licenseJurisdiction. + """ + + providerId = Raw(required=True, allow_none=False) + givenName = String(required=True, allow_none=False, validate=Length(1, 100)) + familyName = String(required=True, allow_none=False, validate=Length(1, 100)) + jurisdiction = String(required=False, allow_none=False, load_only=True) # OpenSearch uses jurisdiction + licenseJurisdiction = String(required=False, allow_none=False, load_default=None) + compact = Compact(required=True, allow_none=False) + licenseNumber = String(required=True, allow_none=False, validate=Length(1, 100)) + + @post_load + def rename_jurisdiction_to_license_jurisdiction(self, data, **kwargs): + if 'jurisdiction' in data: + data['licenseJurisdiction'] = data.pop('jurisdiction') + return data + class QueryProvidersRequestSchema(CCRequestSchema): """ Schema for query providers requests. @@ -228,6 +248,7 @@ class QuerySchema(CCRequestSchema): jurisdiction = Jurisdiction(required=False, allow_none=False) givenName = String(required=False, allow_none=False, validate=Length(min=1, max=100)) familyName = String(required=False, allow_none=False, validate=Length(min=1, max=100)) + licenseNumber = String(required=False, allow_none=False, validate=Length(min=1, max=100)) class PaginationSchema(ForgivingSchema): """ diff --git a/backend/cosmetology-app/pipeline/backend_stage.py b/backend/cosmetology-app/pipeline/backend_stage.py index 067ce66d3..982cd1941 100644 --- a/backend/cosmetology-app/pipeline/backend_stage.py +++ b/backend/cosmetology-app/pipeline/backend_stage.py @@ -114,6 +114,18 @@ def __init__( persistent_stack=self.persistent_stack, ) + # Search Persistent Stack - OpenSearch Domain (created before ApiStack for public search wiring) + self.search_persistent_stack = SearchPersistentStack( + self, + 'SearchPersistentStack', + env=environment, + environment_context=environment_context, + standard_tags=standard_tags, + environment_name=environment_name, + vpc_stack=self.vpc_stack, + persistent_stack=self.persistent_stack, + ) + self.api_stack = ApiStack( self, 'APIStack', @@ -123,6 +135,7 @@ def __init__( environment_name=environment_name, persistent_stack=self.persistent_stack, api_lambda_stack=self.api_lambda_stack, + search_persistent_stack=self.search_persistent_stack, ) self.state_api_stack = StateApiStack( @@ -191,18 +204,6 @@ def __init__( standard_tags=standard_tags, ) - # Search Persistent Stack - OpenSearch Domain for advanced provider search - self.search_persistent_stack = SearchPersistentStack( - self, - 'SearchPersistentStack', - env=environment, - environment_context=environment_context, - standard_tags=standard_tags, - environment_name=environment_name, - vpc_stack=self.vpc_stack, - persistent_stack=self.persistent_stack, - ) - self.search_api_stack = SearchApiStack( self, 'SearchAPIStack', diff --git a/backend/cosmetology-app/stacks/api_lambda_stack/public_lookup_api.py b/backend/cosmetology-app/stacks/api_lambda_stack/public_lookup_api.py index c0bad9ccb..190a406f9 100644 --- a/backend/cosmetology-app/stacks/api_lambda_stack/public_lookup_api.py +++ b/backend/cosmetology-app/stacks/api_lambda_stack/public_lookup_api.py @@ -52,6 +52,11 @@ def __init__( ) api_lambda_stack.log_groups.append(self.query_providers_handler.log_group) + # Dummy export to avoid CDK deadly embrace: public query providers now uses + # SearchPersistentStack.public_handler; this lambda is no longer wired to the API. + # TODO: remove this export (and the lambda above) after the stack is deployed and the export can be retired # noqa: FIX002 + stack.export_value(self.query_providers_handler.function_arn) + def _get_provider_handler( self, scope: Construct, diff --git a/backend/cosmetology-app/stacks/api_stack/__init__.py b/backend/cosmetology-app/stacks/api_stack/__init__.py index 9488e7064..b9d56c586 100644 --- a/backend/cosmetology-app/stacks/api_stack/__init__.py +++ b/backend/cosmetology-app/stacks/api_stack/__init__.py @@ -5,6 +5,7 @@ from constructs import Construct from stacks import persistent_stack as ps +from stacks import search_persistent_stack as sps from stacks.api_lambda_stack import ApiLambdaStack from .api import LicenseApi @@ -20,6 +21,7 @@ def __init__( environment_context: dict, persistent_stack: ps.PersistentStack, api_lambda_stack: ApiLambdaStack, + search_persistent_stack: sps.SearchPersistentStack, **kwargs, ): super().__init__( @@ -35,5 +37,6 @@ def __init__( security_profile=security_profile, persistent_stack=persistent_stack, api_lambda_stack=api_lambda_stack, + search_persistent_stack=search_persistent_stack, domain_name=self.api_domain_name, ) diff --git a/backend/cosmetology-app/stacks/api_stack/api.py b/backend/cosmetology-app/stacks/api_stack/api.py index 89c98fc03..92df96209 100644 --- a/backend/cosmetology-app/stacks/api_stack/api.py +++ b/backend/cosmetology-app/stacks/api_stack/api.py @@ -6,6 +6,7 @@ from common_constructs.cc_api import CCApi from stacks import persistent_stack as ps +from stacks import search_persistent_stack as sps from stacks.api_lambda_stack import ApiLambdaStack @@ -17,6 +18,7 @@ def __init__( *, persistent_stack: ps.PersistentStack, api_lambda_stack: ApiLambdaStack, + search_persistent_stack: sps.SearchPersistentStack, **kwargs, ): super().__init__( @@ -33,6 +35,7 @@ def __init__( self.root, persistent_stack=persistent_stack, api_lambda_stack=api_lambda_stack, + search_persistent_stack=search_persistent_stack, ) @cached_property diff --git a/backend/cosmetology-app/stacks/api_stack/v1_api/api.py b/backend/cosmetology-app/stacks/api_stack/v1_api/api.py index ccffb7b83..dfd68c188 100644 --- a/backend/cosmetology-app/stacks/api_stack/v1_api/api.py +++ b/backend/cosmetology-app/stacks/api_stack/v1_api/api.py @@ -4,6 +4,7 @@ from aws_cdk.aws_apigateway import AuthorizationType, IResource, MethodOptions from stacks import persistent_stack as ps +from stacks import search_persistent_stack as sps from stacks.api_lambda_stack import ApiLambdaStack from .api_model import ApiModel @@ -23,6 +24,7 @@ def __init__( root: IResource, persistent_stack: ps.PersistentStack, api_lambda_stack: ApiLambdaStack, + search_persistent_stack: sps.SearchPersistentStack, ): super().__init__() from stacks.api_stack.api import LicenseApi @@ -112,6 +114,7 @@ def __init__( resource=self.public_compacts_compact_providers_resource, api_model=self.api_model, api_lambda_stack=api_lambda_stack, + search_persistent_stack=search_persistent_stack, ) # /v1/compacts diff --git a/backend/cosmetology-app/stacks/api_stack/v1_api/api_model.py b/backend/cosmetology-app/stacks/api_stack/v1_api/api_model.py index 7ad26e463..4f0c660d3 100644 --- a/backend/cosmetology-app/stacks/api_stack/v1_api/api_model.py +++ b/backend/cosmetology-app/stacks/api_stack/v1_api/api_model.py @@ -110,6 +110,12 @@ def query_providers_request_model(self) -> Model: max_length=100, description='Filter for providers with a family name', ), + 'licenseNumber': JsonSchema( + type=JsonSchemaType.STRING, + min_length=1, + max_length=500, + description='Filter for licenses with a specific license number', + ), }, ), 'pagination': self._pagination_request_schema, @@ -1311,7 +1317,7 @@ def public_query_providers_response_model(self) -> Model: 'providers': JsonSchema( type=JsonSchemaType.ARRAY, max_length=100, - items=self._public_providers_response_schema, + items=self._public_license_search_response_schema, ), 'pagination': self._pagination_response_schema, 'query': JsonSchema( @@ -1337,6 +1343,12 @@ def public_query_providers_response_model(self) -> Model: max_length=100, description='Filter for providers with a family name', ), + 'licenseNumber': JsonSchema( + type=JsonSchemaType.STRING, + min_length=1, + max_length=100, + description='Filter for licenses with a specific license number', + ), }, ), 'sorting': self._sorting_schema, @@ -1627,6 +1639,32 @@ def provider_registration_request_model(self) -> Model: ) return self.api._v1_provider_registration_request_model + @property + def _public_license_search_response_schema(self): + """Schema for public query providers response (license-level items: providerId, givenName, familyName, licenseJurisdiction, compact, licenseNumber).""" + stack: AppStack = AppStack.of(self.api) + return JsonSchema( + type=JsonSchemaType.OBJECT, + required=[ + 'providerId', + 'givenName', + 'familyName', + 'licenseJurisdiction', + 'compact', + 'licenseNumber', + ], + properties={ + 'providerId': JsonSchema(type=JsonSchemaType.STRING, pattern=cc_api.UUID4_FORMAT), + 'givenName': JsonSchema(type=JsonSchemaType.STRING, min_length=1, max_length=100), + 'familyName': JsonSchema(type=JsonSchemaType.STRING, min_length=1, max_length=100), + 'licenseJurisdiction': JsonSchema( + type=JsonSchemaType.STRING, enum=stack.node.get_context('jurisdictions') + ), + 'compact': JsonSchema(type=JsonSchemaType.STRING, enum=stack.node.get_context('compacts')), + 'licenseNumber': JsonSchema(type=JsonSchemaType.STRING, min_length=1, max_length=100), + }, + ) + @property def _public_providers_response_schema(self): return JsonSchema( diff --git a/backend/cosmetology-app/stacks/api_stack/v1_api/public_lookup_api.py b/backend/cosmetology-app/stacks/api_stack/v1_api/public_lookup_api.py index dc335b2f4..2c13505d0 100644 --- a/backend/cosmetology-app/stacks/api_stack/v1_api/public_lookup_api.py +++ b/backend/cosmetology-app/stacks/api_stack/v1_api/public_lookup_api.py @@ -5,6 +5,7 @@ from cdk_nag import NagSuppressions from common_constructs.cc_api import CCApi +from stacks import search_persistent_stack as sps from stacks.api_lambda_stack import ApiLambdaStack from .api_model import ApiModel @@ -17,6 +18,7 @@ def __init__( resource: Resource, api_model: ApiModel, api_lambda_stack: ApiLambdaStack, + search_persistent_stack: sps.SearchPersistentStack, ): super().__init__() @@ -32,9 +34,7 @@ def __init__( 'licenseType' ).add_resource('{licenseType}') - self._add_public_query_providers( - api_lambda_stack=api_lambda_stack, - ) + self._add_public_query_providers(search_persistent_stack=search_persistent_stack) self._add_public_get_provider( api_lambda_stack=api_lambda_stack, ) @@ -73,13 +73,10 @@ def _add_public_get_provider( ], ) - def _add_public_query_providers( - self, - api_lambda_stack: ApiLambdaStack, - ): + def _add_public_query_providers(self, search_persistent_stack: sps.SearchPersistentStack): query_resource = self.resource.add_resource('query') - handler = api_lambda_stack.public_lookup_lambdas.query_providers_handler + handler = search_persistent_stack.search_handler.public_handler public_query_provider_method = query_resource.add_method( 'POST', diff --git a/backend/cosmetology-app/stacks/search_persistent_stack/search_handler.py b/backend/cosmetology-app/stacks/search_persistent_stack/search_handler.py index 798083649..6bf0e0670 100644 --- a/backend/cosmetology-app/stacks/search_persistent_stack/search_handler.py +++ b/backend/cosmetology-app/stacks/search_persistent_stack/search_handler.py @@ -76,6 +76,53 @@ def __init__( alarm_topic=alarm_topic, ) + # Create Lambda function for public query providers + self.public_handler = PythonFunction( + self, + 'PublicSearchProvidersFunction', + description='Public search handler for OpenSearch license queries', + index=os.path.join('handlers', 'search.py'), + lambda_dir='search', + handler='public_search_api_handler', + role=lambda_role, + log_retention=RetentionDays.ONE_MONTH, + environment={ + 'OPENSEARCH_HOST_ENDPOINT': opensearch_domain.domain_endpoint, + **stack.common_env_vars, + }, + timeout=Duration.seconds(29), + memory_size=2048, + vpc=vpc_stack.vpc, + vpc_subnets=vpc_subnets, + security_groups=[vpc_stack.lambda_security_group], + alarm_topic=alarm_topic, + ) + opensearch_domain.grant_read(self.public_handler) + + # Create metric filter and alarm for public handler errors + public_error_log_metric = MetricFilter( + self, + 'PublicSearchHandlerErrorLogMetric', + log_group=self.public_handler.log_group, + metric_namespace='CompactConnect/Search', + metric_name='PublicSearchHandlerErrors', + filter_pattern=FilterPattern.string_value(json_field='$.level', comparison='=', value='ERROR'), + metric_value='1', + default_value=0, + ) + public_error_log_alarm = Alarm( + self, + 'PublicSearchHandlerErrorLogAlarm', + metric=public_error_log_metric.metric(statistic='Sum'), + evaluation_periods=1, + threshold=1, + actions_enabled=True, + alarm_description='The Public Search Handler Lambda logged an ERROR level message.', + comparison_operator=ComparisonOperator.GREATER_THAN_OR_EQUAL_TO_THRESHOLD, + treat_missing_data=TreatMissingData.NOT_BREACHING, + ) + public_error_log_alarm.add_alarm_action(SnsAction(alarm_topic)) + # Grant the handler read access to the OpenSearch domain opensearch_domain.grant_read(self.handler) diff --git a/backend/cosmetology-app/tests/smoke/rollback_license_upload_smoke_tests.py b/backend/cosmetology-app/tests/smoke/rollback_license_upload_smoke_tests.py index 266a82afc..2c92f4889 100644 --- a/backend/cosmetology-app/tests/smoke/rollback_license_upload_smoke_tests.py +++ b/backend/cosmetology-app/tests/smoke/rollback_license_upload_smoke_tests.py @@ -370,7 +370,6 @@ def create_privilege_for_provider(provider_id: str, compact: str): 'privilegeId': f'{license_type_abbr.upper()}-{privilege_jurisdiction.upper()}-12345', 'administratorSetStatus': 'active', 'compactTransactionId': 'test-transaction-12345', - 'compactTransactionIdGSIPK': f'COMPACT#{compact}#TX#test-transaction-12345#', } config.provider_user_dynamodb_table.put_item(Item=privilege_record) From 683d5c68e6e6f76b2d9118dfef66882929a0f23c Mon Sep 17 00:00:00 2001 From: Landon Shumway Date: Mon, 2 Mar 2026 17:48:04 -0600 Subject: [PATCH 02/36] Move public search logic into separate file Also added custom cursor logic for tracking accurate page size of licenses. --- .../python/search/handlers/public_search.py | 238 ++++++++++ .../function/test_public_search_providers.py | 426 ++++++++++++++++++ .../search_persistent_stack/search_handler.py | 2 +- 3 files changed, 665 insertions(+), 1 deletion(-) create mode 100644 backend/cosmetology-app/lambdas/python/search/handlers/public_search.py create mode 100644 backend/cosmetology-app/lambdas/python/search/tests/function/test_public_search_providers.py diff --git a/backend/cosmetology-app/lambdas/python/search/handlers/public_search.py b/backend/cosmetology-app/lambdas/python/search/handlers/public_search.py new file mode 100644 index 000000000..1f6a52e6f --- /dev/null +++ b/backend/cosmetology-app/lambdas/python/search/handlers/public_search.py @@ -0,0 +1,238 @@ +import json +from base64 import b64decode, b64encode + +from aws_lambda_powertools.utilities.typing import LambdaContext +from cc_common.config import config, logger +from cc_common.data_model.schema.provider.api import ( + PublicLicenseSearchResponseSchema, + QueryProvidersRequestSchema, +) +from cc_common.exceptions import CCInvalidRequestException +from cc_common.utils import api_handler +from marshmallow import ValidationError +from opensearch_client import OpenSearchClient + +# Default and maximum page sizes for search results +MAX_PROVIDER_PAGE_SIZE = 100 + + +# Instantiate the OpenSearch client outside the handler to cache the connection between invocations +# Set timeout to 20 seconds to give API gateway time to respond with response +opensearch_client = OpenSearchClient(timeout=25) + +@api_handler +def public_search_api_handler(event: dict, context: LambdaContext): # noqa: ARG001 unused-argument + """ + Public query providers endpoint (no auth). + Translates structured query (licenseNumber, familyName, givenName, jurisdiction) into OpenSearch + nested query and returns license-level results with existing pagination schema. + """ + http_method = event.get('httpMethod') + resource_path = event.get('resource') + if (http_method, resource_path) != ('POST', '/v1/public/compacts/{compact}/providers/query'): + raise CCInvalidRequestException(f'Unsupported method or resource: {http_method} {resource_path}') + + return _public_query_licenses(event, context) + + +def _public_query_licenses(event: dict, context: LambdaContext): # noqa: ARG001 unused-argument + compact = event['pathParameters']['compact'] + body = _parse_and_validate_public_query_body(event) + query_obj = body.get('query', {}) + pagination = body.get('pagination') or {} + page_size = pagination.get('pageSize') or config.default_page_size + + cursor = _decode_public_cursor(pagination.get('lastKey')) + search_body = _build_public_license_search_body(compact=compact, body=body, cursor=cursor) + index_name = f'compact_{compact}_providers' + + logger.info('Executing public license search', compact=compact, index_name=index_name) + response = opensearch_client.search(index_name=index_name, body=search_body) + + hits = response.get('hits', {}).get('hits', []) + license_schema = PublicLicenseSearchResponseSchema() + providers = [] + last_sort = None + prev_sort = None + resume_provider_id = cursor.get('resume_provider_id') if cursor else None + resume_offset = (cursor.get('license_offset') or 0) if cursor else 0 + next_cursor_resume_provider_id = None + next_cursor_resume_provider_sort = None + next_cursor_license_offset = None + next_cursor_search_after = None + + for hit in hits: + source = hit.get('_source', {}) + provider_id = source.get('providerId') + if source.get('compact') != compact: + logger.warning( + 'Provider compact does not match path, skipping', + provider_id=provider_id, + path_compact=compact, + ) + continue + inner_hits = hit.get('inner_hits', {}).get('licenses', {}).get('hits', {}).get('hits', []) + skip = resume_offset if (resume_provider_id == provider_id) else 0 + if resume_provider_id == provider_id: + resume_provider_id = None + resume_offset = 0 + consumed_from_this_provider = 0 + for inner in inner_hits: + if skip > 0: + skip -= 1 + continue + if len(providers) >= page_size: + next_cursor_resume_provider_id = provider_id + next_cursor_resume_provider_sort = hit.get('sort') + next_cursor_license_offset = consumed_from_this_provider + last_sort = hit.get('sort') + next_cursor_search_after = prev_sort + break + license_source = inner.get('_source', {}).copy() + license_source['providerId'] = provider_id + license_source['compact'] = compact + try: + sanitized = license_schema.load(license_source) + sanitized.pop('jurisdiction', None) + providers.append(sanitized) + consumed_from_this_provider += 1 + except ValidationError as e: + logger.error( + 'Failed to sanitize license record', + provider_id=provider_id, + errors=e.messages, + ) + if next_cursor_resume_provider_id is not None: + break + prev_sort = last_sort + last_sort = hit.get('sort') + + last_key = None + if len(providers) >= page_size and last_sort is not None: + if next_cursor_resume_provider_id is not None: + last_key = _encode_public_cursor( + search_after=next_cursor_search_after, + resume_provider_id=next_cursor_resume_provider_id, + resume_provider_sort=next_cursor_resume_provider_sort, + license_offset=next_cursor_license_offset, + ) + else: + last_key = _encode_public_cursor(search_after=last_sort) + + return { + 'providers': providers, + 'pagination': { + 'pageSize': page_size, + 'lastKey': last_key, + 'prevLastKey': pagination.get('lastKey'), + }, + 'query': query_obj, + } + + +def _parse_and_validate_public_query_body(event: dict) -> dict: + try: + schema = QueryProvidersRequestSchema() + raw_body = event.get('body') or '{}' + body = schema.loads(raw_body) + except ValidationError as e: + logger.warning('Invalid public query request body', errors=e.messages) + raise CCInvalidRequestException(f'Invalid request: {e.messages}') from e + + query = body.get('query', {}) + if query.get('givenName') and not query.get('familyName'): + raise CCInvalidRequestException('familyName is required if givenName is provided') + + if not any((query.get('licenseNumber'), query.get('jurisdiction'), query.get('familyName'))): + raise CCInvalidRequestException( + 'At least one of licenseNumber, jurisdiction, or familyName must be provided' + ) + + return body + + +def _decode_public_cursor(last_key: str | None) -> dict | None: + """ + Decode and validate the public cursor. + Returns dict with search_after (optional), and optionally resume_provider_id, resume_provider_sort, license_offset. + Raises CCInvalidRequestException if lastKey is present but invalid. + """ + if not last_key: + return None + try: + decoded = json.loads(b64decode(last_key).decode('utf-8')) + except Exception as e: + raise CCInvalidRequestException('Invalid lastKey') from e + if not isinstance(decoded, dict): + raise CCInvalidRequestException('Invalid lastKey') + has_resume = 'resume_provider_id' in decoded and 'license_offset' in decoded + if not has_resume and not decoded.get('search_after'): + raise CCInvalidRequestException('Invalid lastKey') + if has_resume and 'resume_provider_sort' not in decoded: + raise CCInvalidRequestException('Invalid lastKey') + return decoded + + +def _encode_public_cursor( + search_after: list | None, + resume_provider_id: str | None = None, + resume_provider_sort: list | None = None, + license_offset: int | None = None, +) -> str: + payload = {} + if search_after is not None: + payload['search_after'] = search_after + if resume_provider_id is not None and resume_provider_sort is not None and license_offset is not None: + payload['resume_provider_id'] = resume_provider_id + payload['resume_provider_sort'] = resume_provider_sort + payload['license_offset'] = license_offset + return b64encode(json.dumps(payload).encode('utf-8')).decode('utf-8') + + +def _build_public_license_search_body(*, compact: str, body: dict, cursor: dict | None = None) -> dict: + query_obj = body.get('query', {}) + pagination = body.get('pagination') or {} + page_size = pagination.get('pageSize') or config.default_page_size + + search_after = cursor.get('search_after') if cursor else None + + nested_must = [] + if query_obj.get('licenseNumber'): + nested_must.append({'term': {'licenses.licenseNumber': query_obj['licenseNumber']}}) + if query_obj.get('jurisdiction'): + nested_must.append({'term': {'licenses.jurisdiction': query_obj['jurisdiction'].lower()}}) + if query_obj.get('familyName'): + nested_must.append({'match': {'licenses.familyName': query_obj['familyName']}}) + if query_obj.get('givenName'): + nested_must.append({'match': {'licenses.givenName': query_obj['givenName']}}) + + nested_query = {'nested': {'path': 'licenses', 'query': {'bool': {'must': nested_must}}}} + if nested_must: + nested_query['nested']['inner_hits'] = { + 'name': 'licenses', + 'size': MAX_PROVIDER_PAGE_SIZE, + 'sort': [ + {'licenses.jurisdiction.keyword': 'asc'}, + {'licenses.licenseType.keyword': 'asc'}, + {'licenses.licenseNumber.keyword': 'asc'}, + ], + } + + must = [ + {'term': {'compact': compact}}, + nested_query, + ] + + search_body = { + 'query': {'bool': {'must': must}}, + 'size': page_size, + 'sort': [ + {'familyName.keyword': 'asc'}, + {'givenName.keyword': 'asc'}, + {'providerId': 'asc'}, + ], + } + if search_after is not None: + search_body['search_after'] = search_after + + return search_body diff --git a/backend/cosmetology-app/lambdas/python/search/tests/function/test_public_search_providers.py b/backend/cosmetology-app/lambdas/python/search/tests/function/test_public_search_providers.py new file mode 100644 index 000000000..8e9f553c2 --- /dev/null +++ b/backend/cosmetology-app/lambdas/python/search/tests/function/test_public_search_providers.py @@ -0,0 +1,426 @@ +import json +from unittest.mock import patch + +from moto import mock_aws + +from . import TstFunction + +@mock_aws +class TestPublicSearchProviders(TstFunction): + """Test suite for public_search_api_handler - public license search via OpenSearch.""" + + def setUp(self): + super().setUp() + + def _create_public_api_event(self, compact: str, body: dict = None) -> dict: + """Create API Gateway event for public query providers (no auth).""" + return { + 'resource': '/v1/public/compacts/{compact}/providers/query', + 'path': f'/v1/public/compacts/{compact}/providers/query', + 'httpMethod': 'POST', + 'headers': {'accept': 'application/json', 'content-type': 'application/json'}, + 'multiValueHeaders': {}, + 'queryStringParameters': None, + 'pathParameters': {'compact': compact}, + 'requestContext': { + 'httpMethod': 'POST', + 'resourcePath': '/v1/public/compacts/{compact}/providers/query', + }, + 'body': json.dumps(body) if body else None, + 'isBase64Encoded': False, + } + + def _create_mock_hit_with_inner_hits( + self, + provider_id: str = '00000000-0000-0000-0000-000000000001', + compact: str = 'cosm', + jurisdiction: str = 'oh', + license_number: str = 'LN123', + family_name: str = 'Doe', + given_name: str = 'John', + sort_values: list = None, + inner_license_count: int = 1, + ) -> dict: + """Create a mock OpenSearch hit with inner_hits for nested licenses. + inner_license_count: number of license inner hits (deterministic order: jurisdiction, licenseType, licenseNumber). + """ + inner_sources = [] + for i in range(inner_license_count): + inner_sources.append({ + '_source': { + 'providerId': provider_id, + 'givenName': given_name, + 'familyName': family_name, + 'jurisdiction': jurisdiction, + 'compact': compact, + 'licenseNumber': f'{license_number}-{i}' if inner_license_count > 1 else license_number, + 'licenseType': f'type{i}', + } + }) + hit = { + '_index': f'compact_{compact}_providers', + '_id': provider_id, + '_source': { + 'providerId': provider_id, + 'compact': compact, + 'givenName': given_name, + 'familyName': family_name, + }, + 'inner_hits': { + 'licenses': { + 'hits': { + 'hits': inner_sources, + } + } + }, + } + if sort_values is not None: + hit['sort'] = sort_values + return hit + + @patch('handlers.public_search.opensearch_client') + def test_license_number_search_builds_nested_query(self, mock_opensearch_client): + """Test that licenseNumber in query builds nested term query on licenses.licenseNumber.""" + from handlers.public_search import public_search_api_handler + + mock_opensearch_client.search.return_value = { + 'hits': {'total': {'value': 0, 'relation': 'eq'}, 'hits': []}, + } + event = self._create_public_api_event( + 'cosm', + body={'query': {'licenseNumber': 'LN999'}, 'pagination': {'pageSize': 10}}, + ) + public_search_api_handler(event, self.mock_context) + call_body = mock_opensearch_client.search.call_args.kwargs['body'] + self.assertIn('query', call_body) + must = call_body['query']['bool']['must'] + nested = next(m for m in must if 'nested' in m) + self.assertEqual('licenses', nested['nested']['path']) + inner_must = nested['nested']['query']['bool']['must'] + self.assertIn({'term': {'licenses.licenseNumber': 'LN999'}}, inner_must) + + @patch('handlers.public_search.opensearch_client') + def test_jurisdiction_and_name_search_builds_nested_query(self, mock_opensearch_client): + """Test that jurisdiction and familyName build correct nested query.""" + from handlers.public_search import public_search_api_handler + + mock_opensearch_client.search.return_value = { + 'hits': {'total': {'value': 0, 'relation': 'eq'}, 'hits': []}, + } + event = self._create_public_api_event( + 'cosm', + body={ + 'query': {'jurisdiction': 'oh', 'familyName': 'Smith'}, + 'pagination': {'pageSize': 10}, + }, + ) + public_search_api_handler(event, self.mock_context) + call_body = mock_opensearch_client.search.call_args.kwargs['body'] + must = call_body['query']['bool']['must'] + nested = next(m for m in must if 'nested' in m) + inner_must = nested['nested']['query']['bool']['must'] + self.assertIn({'term': {'licenses.jurisdiction': 'oh'}}, inner_must) + self.assertTrue(any('licenses.familyName' in str(m) for m in inner_must)) + + @patch('handlers.public_search.opensearch_client') + def test_name_only_search_builds_nested_query(self, mock_opensearch_client): + """Test that familyName only builds nested match on licenses.familyName.""" + from handlers.public_search import public_search_api_handler + + mock_opensearch_client.search.return_value = { + 'hits': {'total': {'value': 0, 'relation': 'eq'}, 'hits': []}, + } + event = self._create_public_api_event( + 'cosm', + body={'query': {'familyName': 'Jones'}, 'pagination': {'pageSize': 10}}, + ) + public_search_api_handler(event, self.mock_context) + call_body = mock_opensearch_client.search.call_args.kwargs['body'] + must = call_body['query']['bool']['must'] + nested = next(m for m in must if 'nested' in m) + inner_must = nested['nested']['query']['bool']['must'] + self.assertTrue(any('familyName' in str(m) for m in inner_must)) + + def test_given_name_without_family_name_returns_400(self): + """Test that givenName without familyName returns 400.""" + from handlers.public_search import public_search_api_handler + + event = self._create_public_api_event( + 'cosm', + body={'query': {'givenName': 'John'}, 'pagination': {'pageSize': 10}}, + ) + response = public_search_api_handler(event, self.mock_context) + self.assertEqual(400, response['statusCode']) + body = json.loads(response['body']) + self.assertIn('familyName is required if givenName is provided', body['message']) + + def test_no_search_criteria_returns_400(self): + """Test that at least one of licenseNumber, jurisdiction, or familyName is required.""" + from handlers.public_search import public_search_api_handler + + event = self._create_public_api_event( + 'cosm', + body={'query': {}, 'pagination': {'pageSize': 10}}, + ) + response = public_search_api_handler(event, self.mock_context) + self.assertEqual(400, response['statusCode']) + body = json.loads(response['body']) + self.assertIn('At least one of licenseNumber, jurisdiction, or familyName', body['message']) + + @patch('handlers.public_search.opensearch_client') + def test_pagination_page_size_maps_to_size_and_search_after_from_last_key(self, mock_opensearch_client): + """Test that pageSize maps to size and lastKey decodes to search_after.""" + from base64 import b64encode + + from handlers.public_search import public_search_api_handler + + mock_opensearch_client.search.return_value = { + 'hits': {'total': {'value': 0, 'relation': 'eq'}, 'hits': []}, + } + last_key_payload = json.dumps({'search_after': ['doe', 'jane', 'uuid-123']}) + last_key_str = b64encode(last_key_payload.encode('utf-8')).decode('utf-8') + event = self._create_public_api_event( + 'cosm', + body={ + 'query': {'familyName': 'Doe'}, + 'pagination': {'pageSize': 25, 'lastKey': last_key_str}, + }, + ) + public_search_api_handler(event, self.mock_context) + call_body = mock_opensearch_client.search.call_args.kwargs['body'] + self.assertEqual(25, call_body['size']) + self.assertEqual(['doe', 'jane', 'uuid-123'], call_body['search_after']) + + @patch('handlers.public_search.opensearch_client') + def test_response_includes_last_key_when_more_results_and_null_when_done(self, mock_opensearch_client): + """Test that lastKey is set when full page returned, null when fewer results than pageSize.""" + from base64 import b64decode + + from handlers.public_search import public_search_api_handler + + mock_hit = self._create_mock_hit_with_inner_hits(sort_values=['doe', 'john', '00000000-0000-0000-0000-000000000001']) + mock_opensearch_client.search.return_value = { + 'hits': {'total': {'value': 1, 'relation': 'eq'}, 'hits': [mock_hit]}, + } + event = self._create_public_api_event( + 'cosm', + body={'query': {'familyName': 'Doe'}, 'pagination': {'pageSize': 1}}, + ) + response = public_search_api_handler(event, self.mock_context) + body = json.loads(response['body']) + self.assertIn('lastKey', body['pagination']) + self.assertIsNotNone(body['pagination']['lastKey']) + decoded = json.loads(b64decode(body['pagination']['lastKey']).decode('utf-8')) + self.assertEqual(decoded['search_after'], ['doe', 'john', '00000000-0000-0000-0000-000000000001']) + + mock_opensearch_client.search.return_value = { + 'hits': {'total': {'value': 1, 'relation': 'eq'}, 'hits': [mock_hit]}, + } + event['body'] = json.dumps({'query': {'familyName': 'Doe'}, 'pagination': {'pageSize': 100}}) + response2 = public_search_api_handler(event, self.mock_context) + body2 = json.loads(response2['body']) + self.assertIsNone(body2['pagination']['lastKey']) + + @patch('handlers.public_search.opensearch_client') + def test_response_contains_only_allowed_license_fields(self, mock_opensearch_client): + """Test that each item in providers has only providerId, givenName, familyName, licenseJurisdiction, compact, licenseNumber.""" + from handlers.public_search import public_search_api_handler + + mock_hit = self._create_mock_hit_with_inner_hits() + mock_opensearch_client.search.return_value = { + 'hits': {'total': {'value': 1, 'relation': 'eq'}, 'hits': [mock_hit]}, + } + event = self._create_public_api_event( + 'cosm', + body={'query': {'licenseNumber': 'LN123'}, 'pagination': {'pageSize': 10}}, + ) + response = public_search_api_handler(event, self.mock_context) + body = json.loads(response['body']) + self.assertEqual(len(body['providers']), 1) + provider = body['providers'][0] + allowed = {'providerId', 'givenName', 'familyName', 'licenseJurisdiction', 'compact', 'licenseNumber'} + self.assertEqual(set(provider.keys()), allowed) + self.assertEqual(provider['licenseJurisdiction'], 'oh') + self.assertEqual(provider['licenseNumber'], 'LN123') + + @patch('handlers.public_search.opensearch_client') + def test_compact_mismatch_filtered_out(self, mock_opensearch_client): + """Test that hits with compact != path compact are not included in results.""" + from handlers.public_search import public_search_api_handler + + mock_hit = self._create_mock_hit_with_inner_hits(compact='other') + mock_opensearch_client.search.return_value = { + 'hits': {'total': {'value': 1, 'relation': 'eq'}, 'hits': [mock_hit]}, + } + event = self._create_public_api_event( + 'cosm', + body={'query': {'familyName': 'Doe'}, 'pagination': {'pageSize': 10}}, + ) + response = public_search_api_handler(event, self.mock_context) + body = json.loads(response['body']) + self.assertEqual(body['providers'], []) + + def test_invalid_request_body_returns_400(self): + """Test that invalid or missing body returns 400.""" + from handlers.public_search import public_search_api_handler + + event = self._create_public_api_event('cosm', body=None) + event['body'] = 'not valid json' + response = public_search_api_handler(event, self.mock_context) + self.assertEqual(400, response['statusCode']) + body = json.loads(response['body']) + self.assertIn('Invalid request', body['message']) + + def test_unsupported_route_returns_400(self): + """Test that wrong method/path returns 400.""" + from handlers.public_search import public_search_api_handler + + event = self._create_public_api_event('cosm', body={'query': {'familyName': 'x'}}) + event['resource'] = '/v1/public/compacts/{compact}/providers/other' + response = public_search_api_handler(event, self.mock_context) + self.assertEqual(400, response['statusCode']) + self.assertIn('Unsupported method or resource', json.loads(response['body'])['message']) + + # --- Custom cursor (license-level page size) tests --- + + @patch('handlers.public_search.opensearch_client') + def test_providers_array_length_never_exceeds_page_size(self, mock_opensearch_client): + """License-level paging: returned providers (license records) must be <= pageSize.""" + from handlers.public_search import public_search_api_handler + + # One provider with 20 matching licenses; pageSize 10 -> must return exactly 10 + mock_hit = self._create_mock_hit_with_inner_hits( + provider_id='pid-1', + sort_values=['doe', 'john', 'pid-1'], + inner_license_count=20, + ) + mock_opensearch_client.search.return_value = { + 'hits': {'total': {'value': 1, 'relation': 'eq'}, 'hits': [mock_hit]}, + } + event = self._create_public_api_event( + 'cosm', + body={'query': {'familyName': 'Doe'}, 'pagination': {'pageSize': 10}}, + ) + response = public_search_api_handler(event, self.mock_context) + body = json.loads(response['body']) + self.assertLessEqual( + len(body['providers']), + 10, + 'providers array must not exceed pageSize', + ) + self.assertEqual(len(body['providers']), 10, 'first page should return exactly pageSize when available') + + @patch('handlers.public_search.opensearch_client') + def test_last_key_uses_cursor_format_with_resume_fields_when_mid_provider(self, mock_opensearch_client): + """lastKey when mid-provider includes resume_provider_sort, resume_provider_id, license_offset; search_after optional.""" + from base64 import b64decode + + from handlers.public_search import public_search_api_handler + + mock_hit = self._create_mock_hit_with_inner_hits( + provider_id='pid-1', + sort_values=['doe', 'john', 'pid-1'], + inner_license_count=15, + ) + mock_opensearch_client.search.return_value = { + 'hits': {'total': {'value': 1, 'relation': 'eq'}, 'hits': [mock_hit]}, + } + event = self._create_public_api_event( + 'cosm', + body={'query': {'familyName': 'Doe'}, 'pagination': {'pageSize': 10}}, + ) + response = public_search_api_handler(event, self.mock_context) + body = json.loads(response['body']) + self.assertIsNotNone(body['pagination']['lastKey'], 'should have next page when more licenses exist') + decoded = json.loads(b64decode(body['pagination']['lastKey']).decode('utf-8')) + self.assertEqual(decoded.get('resume_provider_id'), 'pid-1') + self.assertEqual(decoded.get('resume_provider_sort'), ['doe', 'john', 'pid-1']) + self.assertEqual(decoded.get('license_offset'), 10, 'first page consumed 10 licenses from this provider') + if decoded.get('search_after') is not None: + self.assertEqual(decoded['search_after'], ['doe', 'john', 'pid-1']) + + @patch('handlers.public_search.opensearch_client') + def test_terminal_page_returns_last_key_null(self, mock_opensearch_client): + """When no more license records exist, lastKey must be null.""" + from handlers.public_search import public_search_api_handler + + mock_hit = self._create_mock_hit_with_inner_hits( + provider_id='pid-1', + sort_values=['doe', 'john', 'pid-1'], + inner_license_count=3, + ) + mock_opensearch_client.search.return_value = { + 'hits': {'total': {'value': 1, 'relation': 'eq'}, 'hits': [mock_hit]}, + } + event = self._create_public_api_event( + 'cosm', + body={'query': {'familyName': 'Doe'}, 'pagination': {'pageSize': 10}}, + ) + response = public_search_api_handler(event, self.mock_context) + body = json.loads(response['body']) + self.assertIsNone(body['pagination']['lastKey'], 'no more results -> lastKey null') + + @patch('handlers.public_search.opensearch_client') + def test_resume_from_cursor_skips_license_offset_and_returns_next_page(self, mock_opensearch_client): + """Using lastKey with license_offset resumes from that provider at offset; next page has no duplicates.""" + from base64 import b64decode, b64encode + + from handlers.public_search import public_search_api_handler + + mock_hit = self._create_mock_hit_with_inner_hits( + provider_id='pid-1', + sort_values=['doe', 'john', 'pid-1'], + inner_license_count=15, + ) + mock_opensearch_client.search.return_value = { + 'hits': {'total': {'value': 1, 'relation': 'eq'}, 'hits': [mock_hit]}, + } + event = self._create_public_api_event( + 'cosm', + body={'query': {'familyName': 'Doe'}, 'pagination': {'pageSize': 10}}, + ) + response1 = public_search_api_handler(event, self.mock_context) + body1 = json.loads(response1['body']) + self.assertEqual(len(body1['providers']), 10) + last_key = body1['pagination']['lastKey'] + self.assertIsNotNone(last_key) + + # Second request with lastKey: same single provider hit returned by OpenSearch; we resume at offset 10 + event2 = self._create_public_api_event( + 'cosm', + body={ + 'query': {'familyName': 'Doe'}, + 'pagination': {'pageSize': 10, 'lastKey': last_key}, + }, + ) + response2 = public_search_api_handler(event2, self.mock_context) + body2 = json.loads(response2['body']) + self.assertEqual(len(body2['providers']), 5, 'remaining 5 licenses from same provider') + first_license_page2 = body2['providers'][0].get('licenseNumber') + last_license_page1 = body1['providers'][-1].get('licenseNumber') + self.assertNotEqual(first_license_page2, last_license_page1, 'no duplicate at boundary') + + @patch('handlers.public_search.opensearch_client') + def test_invalid_last_key_format_returns_400(self, mock_opensearch_client): + """Malformed or invalid lastKey must return 400.""" + from base64 import b64encode + + from handlers.public_search import public_search_api_handler + + mock_opensearch_client.search.return_value = { + 'hits': {'total': {'value': 0, 'relation': 'eq'}, 'hits': []}, + } + # Cursor must have search_after or resume fields; empty object is invalid + bad_payload = json.dumps({}) + last_key = b64encode(bad_payload.encode('utf-8')).decode('utf-8') + event = self._create_public_api_event( + 'cosm', + body={ + 'query': {'familyName': 'Doe'}, + 'pagination': {'pageSize': 10, 'lastKey': last_key}, + }, + ) + response = public_search_api_handler(event, self.mock_context) + self.assertEqual(response['statusCode'], 400) + body = json.loads(response['body']) + self.assertIn('lastkey', body['message'].lower()) diff --git a/backend/cosmetology-app/stacks/search_persistent_stack/search_handler.py b/backend/cosmetology-app/stacks/search_persistent_stack/search_handler.py index 6bf0e0670..5c8ac3538 100644 --- a/backend/cosmetology-app/stacks/search_persistent_stack/search_handler.py +++ b/backend/cosmetology-app/stacks/search_persistent_stack/search_handler.py @@ -81,7 +81,7 @@ def __init__( self, 'PublicSearchProvidersFunction', description='Public search handler for OpenSearch license queries', - index=os.path.join('handlers', 'search.py'), + index=os.path.join('handlers', 'public_search.py'), lambda_dir='search', handler='public_search_api_handler', role=lambda_role, From d3c83d3ffd3b07827ef11eae3b7641d9b5fce726 Mon Sep 17 00:00:00 2001 From: Landon Shumway Date: Tue, 3 Mar 2026 13:57:01 -0600 Subject: [PATCH 03/36] Add additional cursor tests to verify pagination --- .../python/search/handlers/public_search.py | 6 +- .../function/test_public_search_providers.py | 78 ++++++++++++++++++- 2 files changed, 78 insertions(+), 6 deletions(-) diff --git a/backend/cosmetology-app/lambdas/python/search/handlers/public_search.py b/backend/cosmetology-app/lambdas/python/search/handlers/public_search.py index 1f6a52e6f..5b9832d37 100644 --- a/backend/cosmetology-app/lambdas/python/search/handlers/public_search.py +++ b/backend/cosmetology-app/lambdas/python/search/handlers/public_search.py @@ -212,9 +212,9 @@ def _build_public_license_search_body(*, compact: str, body: dict, cursor: dict 'name': 'licenses', 'size': MAX_PROVIDER_PAGE_SIZE, 'sort': [ - {'licenses.jurisdiction.keyword': 'asc'}, - {'licenses.licenseType.keyword': 'asc'}, - {'licenses.licenseNumber.keyword': 'asc'}, + {'licenses.jurisdiction': 'asc'}, + {'licenses.licenseType': 'asc'}, + {'licenses.licenseNumber': 'asc'}, ], } diff --git a/backend/cosmetology-app/lambdas/python/search/tests/function/test_public_search_providers.py b/backend/cosmetology-app/lambdas/python/search/tests/function/test_public_search_providers.py index 8e9f553c2..5e2de5f06 100644 --- a/backend/cosmetology-app/lambdas/python/search/tests/function/test_public_search_providers.py +++ b/backend/cosmetology-app/lambdas/python/search/tests/function/test_public_search_providers.py @@ -284,7 +284,7 @@ def test_unsupported_route_returns_400(self): # --- Custom cursor (license-level page size) tests --- @patch('handlers.public_search.opensearch_client') - def test_providers_array_length_never_exceeds_page_size(self, mock_opensearch_client): + def test_providers_array_length_never_exceeds_page_size_large_license_matches(self, mock_opensearch_client): """License-level paging: returned providers (license records) must be <= pageSize.""" from handlers.public_search import public_search_api_handler @@ -310,6 +310,31 @@ def test_providers_array_length_never_exceeds_page_size(self, mock_opensearch_cl ) self.assertEqual(len(body['providers']), 10, 'first page should return exactly pageSize when available') + @patch('handlers.public_search.opensearch_client') + def test_providers_array_length_never_exceeds_page_size_when_many_providers_match(self, mock_opensearch_client): + """License-level paging: returned providers (license records) must be <= pageSize.""" + from handlers.public_search import public_search_api_handler + + # One provider with 20 matching licenses; pageSize 10 -> must return exactly 10 + mock_hits = [] + + for i in range(30): + mock_hits.append(self._create_mock_hit_with_inner_hits( + provider_id=f'pid-{i}', + sort_values=['doe', 'john', f'pid-{i}'], + inner_license_count=1, + )) + mock_opensearch_client.search.return_value = { + 'hits': {'total': {'value': 30, 'relation': 'eq'}, 'hits': mock_hits}, + } + event = self._create_public_api_event( + 'cosm', + body={'query': {'familyName': 'Doe'}, 'pagination': {'pageSize': 25}}, + ) + response = public_search_api_handler(event, self.mock_context) + body = json.loads(response['body']) + self.assertEqual(len(body['providers']), 25, 'first page should return exactly pageSize when available') + @patch('handlers.public_search.opensearch_client') def test_last_key_uses_cursor_format_with_resume_fields_when_mid_provider(self, mock_opensearch_client): """lastKey when mid-provider includes resume_provider_sort, resume_provider_id, license_offset; search_after optional.""" @@ -363,8 +388,6 @@ def test_terminal_page_returns_last_key_null(self, mock_opensearch_client): @patch('handlers.public_search.opensearch_client') def test_resume_from_cursor_skips_license_offset_and_returns_next_page(self, mock_opensearch_client): """Using lastKey with license_offset resumes from that provider at offset; next page has no duplicates.""" - from base64 import b64decode, b64encode - from handlers.public_search import public_search_api_handler mock_hit = self._create_mock_hit_with_inner_hits( @@ -400,6 +423,55 @@ def test_resume_from_cursor_skips_license_offset_and_returns_next_page(self, moc last_license_page1 = body1['providers'][-1].get('licenseNumber') self.assertNotEqual(first_license_page2, last_license_page1, 'no duplicate at boundary') + @patch('handlers.public_search.opensearch_client') + def test_resume_from_cursor_skips_license_offset_and_returns_next_page_multi_provider(self, mock_opensearch_client): + """Using lastKey with license_offset resumes from that provider at offset; next page has no duplicates.""" + from handlers.public_search import public_search_api_handler + + mock_hits = [] + # this sets up five providers that match, each with two licenses (10 total) + for i in range(5): + mock_hits.append(self._create_mock_hit_with_inner_hits( + provider_id=f'pid-{i}', + license_number=f'LIC-{i}', + sort_values=['doe', 'john', f'pid-{i}'], + inner_license_count=2, + )) + # This mock simulates the first request returning all matching providers, then the second request returning the + # remaining 3 after the search_after cursor is applied. + mock_opensearch_client.search.side_effect = [ + { + 'hits': {'total': {'value': 5, 'relation': 'eq'}, 'hits': mock_hits}, + }, + { + 'hits': {'total': {'value': 3, 'relation': 'eq'}, 'hits': mock_hits[2:]}, + } + ] + event = self._create_public_api_event( + 'cosm', + body={'query': {'familyName': 'Doe'}, 'pagination': {'pageSize': 5}}, + ) + response1 = public_search_api_handler(event, self.mock_context) + body1 = json.loads(response1['body']) + self.assertEqual(len(body1['providers']), 5) + last_key = body1['pagination']['lastKey'] + self.assertIsNotNone(last_key) + + # Second request with lastKey: same single provider hit returned by OpenSearch; we resume at offset 25 + event2 = self._create_public_api_event( + 'cosm', + body={ + 'query': {'familyName': 'Doe'}, + 'pagination': {'pageSize': 5, 'lastKey': last_key}, + }, + ) + response2 = public_search_api_handler(event2, self.mock_context) + body2 = json.loads(response2['body']) + self.assertEqual(len(body2['providers']), 5, 'remaining 5 licenses') + first_license_page2 = body2['providers'][0].get('licenseNumber') + last_license_page1 = body1['providers'][-1].get('licenseNumber') + self.assertNotEqual(first_license_page2, last_license_page1, 'duplicate license numbers detected when paging') + @patch('handlers.public_search.opensearch_client') def test_invalid_last_key_format_returns_400(self, mock_opensearch_client): """Malformed or invalid lastKey must return 400.""" From 9eb8be9fb19213ddbbb6b07d4b02c34c778cdd8b Mon Sep 17 00:00:00 2001 From: Landon Shumway Date: Tue, 3 Mar 2026 13:57:24 -0600 Subject: [PATCH 04/36] Add mock DB setup for remaining search tests --- backend/cosmetology-app/bin/run_python_tests.py | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/cosmetology-app/bin/run_python_tests.py b/backend/cosmetology-app/bin/run_python_tests.py index 2d35ad977..22270123c 100755 --- a/backend/cosmetology-app/bin/run_python_tests.py +++ b/backend/cosmetology-app/bin/run_python_tests.py @@ -30,6 +30,7 @@ 'lambdas/python/disaster-recovery', 'lambdas/python/migration', 'lambdas/python/provider-data-v1', + 'lambdas/python/search', 'lambdas/python/staff-user-pre-token', 'lambdas/python/staff-users', '.', # CDK tests From 771aa6b2323259e9c7e8a2a26f5f3680d81b8766 Mon Sep 17 00:00:00 2001 From: Landon Shumway Date: Tue, 3 Mar 2026 15:21:37 -0600 Subject: [PATCH 05/36] Update CDK tests --- .../app/test_api/test_public_lookup_api.py | 18 ++++---- ...PUBLIC_QUERY_PROVIDERS_REQUEST_SCHEMA.json | 6 +++ ...UBLIC_QUERY_PROVIDERS_RESPONSE_SCHEMA.json | 43 ++++++++----------- .../QUERY_PROVIDERS_REQUEST_SCHEMA.json | 6 +++ 4 files changed, 38 insertions(+), 35 deletions(-) diff --git a/backend/cosmetology-app/tests/app/test_api/test_public_lookup_api.py b/backend/cosmetology-app/tests/app/test_api/test_public_lookup_api.py index 045f40ede..d19a17616 100644 --- a/backend/cosmetology-app/tests/app/test_api/test_public_lookup_api.py +++ b/backend/cosmetology-app/tests/app/test_api/test_public_lookup_api.py @@ -85,8 +85,8 @@ def test_synth_generates_public_query_providers_endpoint(self): """Test that the POST /providers/query endpoint is configured correctly.""" api_stack = self.app.sandbox_backend_stage.api_stack api_stack_template = Template.from_stack(api_stack) - api_lambda_stack = self.app.sandbox_backend_stage.api_lambda_stack - api_lambda_stack_template = Template.from_stack(api_lambda_stack) + search_persistent_stack = self.app.sandbox_backend_stage.search_persistent_stack + search_persistent_stack_template = Template.from_stack(search_persistent_stack) # Ensure the resource is created with expected path api_stack_template.has_resource_properties( @@ -102,13 +102,13 @@ def test_synth_generates_public_query_providers_endpoint(self): # Ensure the lambda is created with expected code path in the ApiLambdaStack query_handler = TestApi.get_resource_properties_by_logical_id( - api_lambda_stack.get_logical_id( - api_lambda_stack.public_lookup_lambdas.query_providers_handler.node.default_child + search_persistent_stack.get_logical_id( + search_persistent_stack.search_handler.public_handler.node.default_child ), - api_lambda_stack_template.find_resources(CfnFunction.CFN_RESOURCE_TYPE_NAME), + search_persistent_stack_template.find_resources(CfnFunction.CFN_RESOURCE_TYPE_NAME), ) - self.assertEqual(query_handler['Handler'], 'handlers.public_lookup.public_query_providers') + self.assertEqual(query_handler['Handler'], 'handlers.public_search.public_search_api_handler') # Capture model logical IDs for verification request_model_logical_id_capture = Capture() @@ -120,9 +120,9 @@ def test_synth_generates_public_query_providers_endpoint(self): props={ 'HttpMethod': 'POST', 'Integration': TestApi.generate_expected_integration_object_for_imported_lambda( - api_lambda_stack, - api_lambda_stack_template, - api_lambda_stack.public_lookup_lambdas.query_providers_handler, + search_persistent_stack, + search_persistent_stack_template, + search_persistent_stack.search_handler.public_handler, ), 'RequestModels': { 'application/json': {'Ref': request_model_logical_id_capture}, diff --git a/backend/cosmetology-app/tests/resources/snapshots/PUBLIC_QUERY_PROVIDERS_REQUEST_SCHEMA.json b/backend/cosmetology-app/tests/resources/snapshots/PUBLIC_QUERY_PROVIDERS_REQUEST_SCHEMA.json index 1d3d3eeb7..0d12e375c 100644 --- a/backend/cosmetology-app/tests/resources/snapshots/PUBLIC_QUERY_PROVIDERS_REQUEST_SCHEMA.json +++ b/backend/cosmetology-app/tests/resources/snapshots/PUBLIC_QUERY_PROVIDERS_REQUEST_SCHEMA.json @@ -35,6 +35,12 @@ "description": "Filter for providers with a family name", "maxLength": 100, "type": "string" + }, + "licenseNumber": { + "description": "Filter for licenses with a specific license number", + "maxLength": 500, + "minLength": 1, + "type": "string" } }, "type": "object" diff --git a/backend/cosmetology-app/tests/resources/snapshots/PUBLIC_QUERY_PROVIDERS_RESPONSE_SCHEMA.json b/backend/cosmetology-app/tests/resources/snapshots/PUBLIC_QUERY_PROVIDERS_RESPONSE_SCHEMA.json index 380303be6..2c62fa41b 100644 --- a/backend/cosmetology-app/tests/resources/snapshots/PUBLIC_QUERY_PROVIDERS_RESPONSE_SCHEMA.json +++ b/backend/cosmetology-app/tests/resources/snapshots/PUBLIC_QUERY_PROVIDERS_RESPONSE_SCHEMA.json @@ -3,12 +3,6 @@ "providers": { "items": { "properties": { - "type": { - "enum": [ - "provider" - ], - "type": "string" - }, "providerId": { "pattern": "[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab]{1}[0-9a-f]{3}-[0-9a-f]{12}", "type": "string" @@ -18,27 +12,11 @@ "minLength": 1, "type": "string" }, - "middleName": { - "maxLength": 100, - "minLength": 1, - "type": "string" - }, "familyName": { "maxLength": 100, "minLength": 1, "type": "string" }, - "suffix": { - "maxLength": 100, - "minLength": 1, - "type": "string" - }, - "compact": { - "enum": [ - "cosm" - ], - "type": "string" - }, "licenseJurisdiction": { "enum": [ "al", @@ -54,18 +32,25 @@ ], "type": "string" }, - "dateOfUpdate": { - "format": "date-time", + "compact": { + "enum": [ + "cosm" + ], + "type": "string" + }, + "licenseNumber": { + "maxLength": 100, + "minLength": 1, "type": "string" } }, "required": [ - "type", "providerId", "givenName", "familyName", + "licenseJurisdiction", "compact", - "licenseJurisdiction" + "licenseNumber" ], "type": "object" }, @@ -130,6 +115,12 @@ "description": "Filter for providers with a family name", "maxLength": 100, "type": "string" + }, + "licenseNumber": { + "description": "Filter for licenses with a specific license number", + "maxLength": 100, + "minLength": 1, + "type": "string" } }, "type": "object" diff --git a/backend/cosmetology-app/tests/resources/snapshots/QUERY_PROVIDERS_REQUEST_SCHEMA.json b/backend/cosmetology-app/tests/resources/snapshots/QUERY_PROVIDERS_REQUEST_SCHEMA.json index 1d3d3eeb7..0d12e375c 100644 --- a/backend/cosmetology-app/tests/resources/snapshots/QUERY_PROVIDERS_REQUEST_SCHEMA.json +++ b/backend/cosmetology-app/tests/resources/snapshots/QUERY_PROVIDERS_REQUEST_SCHEMA.json @@ -35,6 +35,12 @@ "description": "Filter for providers with a family name", "maxLength": 100, "type": "string" + }, + "licenseNumber": { + "description": "Filter for licenses with a specific license number", + "maxLength": 500, + "minLength": 1, + "type": "string" } }, "type": "object" From d0b23be9a283003cdbab6be25e7c7c303dcac60b Mon Sep 17 00:00:00 2001 From: Landon Shumway Date: Thu, 26 Mar 2026 15:35:06 -0500 Subject: [PATCH 06/36] Remove complex pagination logic We are updating our OpenSearch indexing design to index one document per license, rather than per provider. This means that we can use native OpenSearch pagination and return the exact number of results the client requests if there are enough matches found. It also reduces the complexity of only returning licenses that match, rather than having to map inner hits. --- .../data_model/schema/provider/api.py | 2 +- .../python/search/handlers/public_search.py | 119 ++----- .../function/test_public_search_providers.py | 323 ++++++------------ 3 files changed, 137 insertions(+), 307 deletions(-) diff --git a/backend/cosmetology-app/lambdas/python/common/cc_common/data_model/schema/provider/api.py b/backend/cosmetology-app/lambdas/python/common/cc_common/data_model/schema/provider/api.py index a59efae3a..26ae6795a 100644 --- a/backend/cosmetology-app/lambdas/python/common/cc_common/data_model/schema/provider/api.py +++ b/backend/cosmetology-app/lambdas/python/common/cc_common/data_model/schema/provider/api.py @@ -256,7 +256,7 @@ class PaginationSchema(ForgivingSchema): """ lastKey = String(required=False, allow_none=False, validate=Length(min=1, max=1024)) - pageSize = Integer(required=False, allow_none=False) + pageSize = Integer(required=False, allow_none=False, validate=Range(min=5, max=100)) class SortingSchema(ForgivingSchema): """ diff --git a/backend/cosmetology-app/lambdas/python/search/handlers/public_search.py b/backend/cosmetology-app/lambdas/python/search/handlers/public_search.py index 5b9832d37..c62d2fc50 100644 --- a/backend/cosmetology-app/lambdas/python/search/handlers/public_search.py +++ b/backend/cosmetology-app/lambdas/python/search/handlers/public_search.py @@ -12,10 +12,6 @@ from marshmallow import ValidationError from opensearch_client import OpenSearchClient -# Default and maximum page sizes for search results -MAX_PROVIDER_PAGE_SIZE = 100 - - # Instantiate the OpenSearch client outside the handler to cache the connection between invocations # Set timeout to 20 seconds to give API gateway time to respond with response opensearch_client = OpenSearchClient(timeout=25) @@ -26,6 +22,8 @@ def public_search_api_handler(event: dict, context: LambdaContext): # noqa: ARG Public query providers endpoint (no auth). Translates structured query (licenseNumber, familyName, givenName, jurisdiction) into OpenSearch nested query and returns license-level results with existing pagination schema. + + Indexing is one OpenSearch document per license; each hit maps to one license row. """ http_method = event.get('httpMethod') resource_path = event.get('resource') @@ -52,14 +50,6 @@ def _public_query_licenses(event: dict, context: LambdaContext): # noqa: ARG001 hits = response.get('hits', {}).get('hits', []) license_schema = PublicLicenseSearchResponseSchema() providers = [] - last_sort = None - prev_sort = None - resume_provider_id = cursor.get('resume_provider_id') if cursor else None - resume_offset = (cursor.get('license_offset') or 0) if cursor else 0 - next_cursor_resume_provider_id = None - next_cursor_resume_provider_sort = None - next_cursor_license_offset = None - next_cursor_search_after = None for hit in hits: source = hit.get('_source', {}) @@ -71,53 +61,31 @@ def _public_query_licenses(event: dict, context: LambdaContext): # noqa: ARG001 path_compact=compact, ) continue - inner_hits = hit.get('inner_hits', {}).get('licenses', {}).get('hits', {}).get('hits', []) - skip = resume_offset if (resume_provider_id == provider_id) else 0 - if resume_provider_id == provider_id: - resume_provider_id = None - resume_offset = 0 - consumed_from_this_provider = 0 - for inner in inner_hits: - if skip > 0: - skip -= 1 - continue - if len(providers) >= page_size: - next_cursor_resume_provider_id = provider_id - next_cursor_resume_provider_sort = hit.get('sort') - next_cursor_license_offset = consumed_from_this_provider - last_sort = hit.get('sort') - next_cursor_search_after = prev_sort - break - license_source = inner.get('_source', {}).copy() - license_source['providerId'] = provider_id - license_source['compact'] = compact - try: - sanitized = license_schema.load(license_source) - sanitized.pop('jurisdiction', None) - providers.append(sanitized) - consumed_from_this_provider += 1 - except ValidationError as e: - logger.error( - 'Failed to sanitize license record', - provider_id=provider_id, - errors=e.messages, - ) - if next_cursor_resume_provider_id is not None: - break - prev_sort = last_sort - last_sort = hit.get('sort') + licenses = source.get('licenses') or [] + if not licenses: + logger.warning('OpenSearch hit has no licenses array', provider_id=provider_id) + continue + license_fields = licenses[0].copy() + license_fields['providerId'] = source['providerId'] + license_fields['compact'] = source['compact'] + license_fields['givenName'] = source['givenName'] + license_fields['familyName'] = source['familyName'] + try: + sanitized = license_schema.load(license_fields) + sanitized.pop('jurisdiction', None) + providers.append(sanitized) + except ValidationError as e: + logger.error( + 'Failed to sanitize license record', + provider_id=provider_id, + errors=e.messages, + ) + last_sort = hits[-1].get('sort') if hits else None + # Full page from OpenSearch => may have more results; use last hit's sort values for search_after last_key = None - if len(providers) >= page_size and last_sort is not None: - if next_cursor_resume_provider_id is not None: - last_key = _encode_public_cursor( - search_after=next_cursor_search_after, - resume_provider_id=next_cursor_resume_provider_id, - resume_provider_sort=next_cursor_resume_provider_sort, - license_offset=next_cursor_license_offset, - ) - else: - last_key = _encode_public_cursor(search_after=last_sort) + if last_sort is not None and len(hits) >= page_size: + last_key = _encode_public_cursor(last_sort) return { 'providers': providers, @@ -153,8 +121,7 @@ def _parse_and_validate_public_query_body(event: dict) -> dict: def _decode_public_cursor(last_key: str | None) -> dict | None: """ - Decode and validate the public cursor. - Returns dict with search_after (optional), and optionally resume_provider_id, resume_provider_sort, license_offset. + Decode and validate the public cursor (base64 JSON with search_after list). Raises CCInvalidRequestException if lastKey is present but invalid. """ if not last_key: @@ -165,27 +132,14 @@ def _decode_public_cursor(last_key: str | None) -> dict | None: raise CCInvalidRequestException('Invalid lastKey') from e if not isinstance(decoded, dict): raise CCInvalidRequestException('Invalid lastKey') - has_resume = 'resume_provider_id' in decoded and 'license_offset' in decoded - if not has_resume and not decoded.get('search_after'): + search_after = decoded.get('search_after') + if not isinstance(search_after, list) or len(search_after) == 0: raise CCInvalidRequestException('Invalid lastKey') - if has_resume and 'resume_provider_sort' not in decoded: - raise CCInvalidRequestException('Invalid lastKey') - return decoded + return {'search_after': search_after} -def _encode_public_cursor( - search_after: list | None, - resume_provider_id: str | None = None, - resume_provider_sort: list | None = None, - license_offset: int | None = None, -) -> str: - payload = {} - if search_after is not None: - payload['search_after'] = search_after - if resume_provider_id is not None and resume_provider_sort is not None and license_offset is not None: - payload['resume_provider_id'] = resume_provider_id - payload['resume_provider_sort'] = resume_provider_sort - payload['license_offset'] = license_offset +def _encode_public_cursor(search_after: list) -> str: + payload = {'search_after': search_after} return b64encode(json.dumps(payload).encode('utf-8')).decode('utf-8') @@ -207,16 +161,6 @@ def _build_public_license_search_body(*, compact: str, body: dict, cursor: dict nested_must.append({'match': {'licenses.givenName': query_obj['givenName']}}) nested_query = {'nested': {'path': 'licenses', 'query': {'bool': {'must': nested_must}}}} - if nested_must: - nested_query['nested']['inner_hits'] = { - 'name': 'licenses', - 'size': MAX_PROVIDER_PAGE_SIZE, - 'sort': [ - {'licenses.jurisdiction': 'asc'}, - {'licenses.licenseType': 'asc'}, - {'licenses.licenseNumber': 'asc'}, - ], - } must = [ {'term': {'compact': compact}}, @@ -230,6 +174,7 @@ def _build_public_license_search_body(*, compact: str, body: dict, cursor: dict {'familyName.keyword': 'asc'}, {'givenName.keyword': 'asc'}, {'providerId': 'asc'}, + {'_id': 'asc'}, ], } if search_after is not None: diff --git a/backend/cosmetology-app/lambdas/python/search/tests/function/test_public_search_providers.py b/backend/cosmetology-app/lambdas/python/search/tests/function/test_public_search_providers.py index 5e2de5f06..0e7b666d0 100644 --- a/backend/cosmetology-app/lambdas/python/search/tests/function/test_public_search_providers.py +++ b/backend/cosmetology-app/lambdas/python/search/tests/function/test_public_search_providers.py @@ -5,6 +5,7 @@ from . import TstFunction + @mock_aws class TestPublicSearchProviders(TstFunction): """Test suite for public_search_api_handler - public license search via OpenSearch.""" @@ -30,7 +31,7 @@ def _create_public_api_event(self, compact: str, body: dict = None) -> dict: 'isBase64Encoded': False, } - def _create_mock_hit_with_inner_hits( + def _create_mock_hit( self, provider_id: str = '00000000-0000-0000-0000-000000000001', compact: str = 'cosm', @@ -39,39 +40,25 @@ def _create_mock_hit_with_inner_hits( family_name: str = 'Doe', given_name: str = 'John', sort_values: list = None, - inner_license_count: int = 1, + license_type: str = 'cosmetologist', ) -> dict: - """Create a mock OpenSearch hit with inner_hits for nested licenses. - inner_license_count: number of license inner hits (deterministic order: jurisdiction, licenseType, licenseNumber). - """ - inner_sources = [] - for i in range(inner_license_count): - inner_sources.append({ - '_source': { - 'providerId': provider_id, - 'givenName': given_name, - 'familyName': family_name, - 'jurisdiction': jurisdiction, - 'compact': compact, - 'licenseNumber': f'{license_number}-{i}' if inner_license_count > 1 else license_number, - 'licenseType': f'type{i}', - } - }) + """Create a mock OpenSearch hit for one document per license.""" + doc_id = f'{provider_id}#{jurisdiction}#{license_type}' hit = { '_index': f'compact_{compact}_providers', - '_id': provider_id, + '_id': doc_id, '_source': { 'providerId': provider_id, 'compact': compact, 'givenName': given_name, 'familyName': family_name, - }, - 'inner_hits': { - 'licenses': { - 'hits': { - 'hits': inner_sources, + 'licenses': [ + { + 'jurisdiction': jurisdiction, + 'licenseNumber': license_number, + 'licenseType': license_type, } - } + ], }, } if sort_values is not None: @@ -96,6 +83,7 @@ def test_license_number_search_builds_nested_query(self, mock_opensearch_client) must = call_body['query']['bool']['must'] nested = next(m for m in must if 'nested' in m) self.assertEqual('licenses', nested['nested']['path']) + self.assertNotIn('inner_hits', nested['nested']) inner_must = nested['nested']['query']['bool']['must'] self.assertIn({'term': {'licenses.licenseNumber': 'LN999'}}, inner_must) @@ -118,6 +106,7 @@ def test_jurisdiction_and_name_search_builds_nested_query(self, mock_opensearch_ call_body = mock_opensearch_client.search.call_args.kwargs['body'] must = call_body['query']['bool']['must'] nested = next(m for m in must if 'nested' in m) + self.assertNotIn('inner_hits', nested['nested']) inner_must = nested['nested']['query']['bool']['must'] self.assertIn({'term': {'licenses.jurisdiction': 'oh'}}, inner_must) self.assertTrue(any('licenses.familyName' in str(m) for m in inner_must)) @@ -138,9 +127,28 @@ def test_name_only_search_builds_nested_query(self, mock_opensearch_client): call_body = mock_opensearch_client.search.call_args.kwargs['body'] must = call_body['query']['bool']['must'] nested = next(m for m in must if 'nested' in m) + self.assertNotIn('inner_hits', nested['nested']) inner_must = nested['nested']['query']['bool']['must'] self.assertTrue(any('familyName' in str(m) for m in inner_must)) + @patch('handlers.public_search.opensearch_client') + def test_sort_includes_id_tiebreaker(self, mock_opensearch_client): + """OpenSearch sort includes _id as the fourth tiebreaker for deterministic pagination.""" + from handlers.public_search import public_search_api_handler + + mock_opensearch_client.search.return_value = { + 'hits': {'total': {'value': 0, 'relation': 'eq'}, 'hits': []}, + } + event = self._create_public_api_event( + 'cosm', + body={'query': {'familyName': 'Doe'}, 'pagination': {'pageSize': 10}}, + ) + public_search_api_handler(event, self.mock_context) + call_body = mock_opensearch_client.search.call_args.kwargs['body'] + sort = call_body['sort'] + self.assertEqual(4, len(sort)) + self.assertEqual({'_id': 'asc'}, sort[3]) + def test_given_name_without_family_name_returns_400(self): """Test that givenName without familyName returns 400.""" from handlers.public_search import public_search_api_handler @@ -177,7 +185,9 @@ def test_pagination_page_size_maps_to_size_and_search_after_from_last_key(self, mock_opensearch_client.search.return_value = { 'hits': {'total': {'value': 0, 'relation': 'eq'}, 'hits': []}, } - last_key_payload = json.dumps({'search_after': ['doe', 'jane', 'uuid-123']}) + last_key_payload = json.dumps( + {'search_after': ['doe', 'jane', 'uuid-123', 'uuid-123#oh#cosmetologist']} + ) last_key_str = b64encode(last_key_payload.encode('utf-8')).decode('utf-8') event = self._create_public_api_event( 'cosm', @@ -189,44 +199,75 @@ def test_pagination_page_size_maps_to_size_and_search_after_from_last_key(self, public_search_api_handler(event, self.mock_context) call_body = mock_opensearch_client.search.call_args.kwargs['body'] self.assertEqual(25, call_body['size']) - self.assertEqual(['doe', 'jane', 'uuid-123'], call_body['search_after']) + self.assertEqual( + ['doe', 'jane', 'uuid-123', 'uuid-123#oh#cosmetologist'], + call_body['search_after'], + ) @patch('handlers.public_search.opensearch_client') - def test_response_includes_last_key_when_more_results_and_null_when_done(self, mock_opensearch_client): - """Test that lastKey is set when full page returned, null when fewer results than pageSize.""" + def test_response_last_key_encodes_last_hit_sort_when_full_page(self, mock_opensearch_client): + """When OpenSearch returns a full page of hits, lastKey encodes search_after from the last hit.""" from base64 import b64decode from handlers.public_search import public_search_api_handler - mock_hit = self._create_mock_hit_with_inner_hits(sort_values=['doe', 'john', '00000000-0000-0000-0000-000000000001']) + mock_hits_full_page = [] + for i in range(5): + sort_i = [ + 'doe', + 'john', + f'00000000-0000-0000-0000-00000000000{i}', + f'00000000-0000-0000-0000-00000000000{i}#oh#cosmetologist', + ] + mock_hits_full_page.append( + self._create_mock_hit( + provider_id=f'00000000-0000-0000-0000-00000000000{i}', + sort_values=sort_i, + ) + ) mock_opensearch_client.search.return_value = { - 'hits': {'total': {'value': 1, 'relation': 'eq'}, 'hits': [mock_hit]}, + 'hits': {'total': {'value': 10, 'relation': 'eq'}, 'hits': mock_hits_full_page}, } event = self._create_public_api_event( 'cosm', - body={'query': {'familyName': 'Doe'}, 'pagination': {'pageSize': 1}}, + body={'query': {'familyName': 'Doe'}, 'pagination': {'pageSize': 5}}, ) response = public_search_api_handler(event, self.mock_context) body = json.loads(response['body']) self.assertIn('lastKey', body['pagination']) self.assertIsNotNone(body['pagination']['lastKey']) decoded = json.loads(b64decode(body['pagination']['lastKey']).decode('utf-8')) - self.assertEqual(decoded['search_after'], ['doe', 'john', '00000000-0000-0000-0000-000000000001']) + self.assertEqual(decoded['search_after'], mock_hits_full_page[-1]['sort']) + + @patch('handlers.public_search.opensearch_client') + def test_response_last_key_null_when_fewer_hits_than_page_size(self, mock_opensearch_client): + """When hit count is below pageSize, there are no more pages and lastKey is null.""" + from handlers.public_search import public_search_api_handler + sort_four = [ + 'doe', + 'john', + '00000000-0000-0000-0000-000000000001', + '00000000-0000-0000-0000-000000000001#oh#cosmetologist', + ] + single_hit = self._create_mock_hit(sort_values=sort_four) mock_opensearch_client.search.return_value = { - 'hits': {'total': {'value': 1, 'relation': 'eq'}, 'hits': [mock_hit]}, + 'hits': {'total': {'value': 1, 'relation': 'eq'}, 'hits': [single_hit]}, } - event['body'] = json.dumps({'query': {'familyName': 'Doe'}, 'pagination': {'pageSize': 100}}) - response2 = public_search_api_handler(event, self.mock_context) - body2 = json.loads(response2['body']) - self.assertIsNone(body2['pagination']['lastKey']) + event = self._create_public_api_event( + 'cosm', + body={'query': {'familyName': 'Doe'}, 'pagination': {'pageSize': 100}}, + ) + response = public_search_api_handler(event, self.mock_context) + body = json.loads(response['body']) + self.assertIsNone(body['pagination']['lastKey']) @patch('handlers.public_search.opensearch_client') def test_response_contains_only_allowed_license_fields(self, mock_opensearch_client): - """Test that each item in providers has only providerId, givenName, familyName, licenseJurisdiction, compact, licenseNumber.""" + """Test that each item in providers has only expected fields.""" from handlers.public_search import public_search_api_handler - mock_hit = self._create_mock_hit_with_inner_hits() + mock_hit = self._create_mock_hit() mock_opensearch_client.search.return_value = { 'hits': {'total': {'value': 1, 'relation': 'eq'}, 'hits': [mock_hit]}, } @@ -248,7 +289,7 @@ def test_compact_mismatch_filtered_out(self, mock_opensearch_client): """Test that hits with compact != path compact are not included in results.""" from handlers.public_search import public_search_api_handler - mock_hit = self._create_mock_hit_with_inner_hits(compact='other') + mock_hit = self._create_mock_hit(compact='other') mock_opensearch_client.search.return_value = { 'hits': {'total': {'value': 1, 'relation': 'eq'}, 'hits': [mock_hit]}, } @@ -281,101 +322,33 @@ def test_unsupported_route_returns_400(self): self.assertEqual(400, response['statusCode']) self.assertIn('Unsupported method or resource', json.loads(response['body'])['message']) - # --- Custom cursor (license-level page size) tests --- - - @patch('handlers.public_search.opensearch_client') - def test_providers_array_length_never_exceeds_page_size_large_license_matches(self, mock_opensearch_client): - """License-level paging: returned providers (license records) must be <= pageSize.""" - from handlers.public_search import public_search_api_handler - - # One provider with 20 matching licenses; pageSize 10 -> must return exactly 10 - mock_hit = self._create_mock_hit_with_inner_hits( - provider_id='pid-1', - sort_values=['doe', 'john', 'pid-1'], - inner_license_count=20, - ) - mock_opensearch_client.search.return_value = { - 'hits': {'total': {'value': 1, 'relation': 'eq'}, 'hits': [mock_hit]}, - } - event = self._create_public_api_event( - 'cosm', - body={'query': {'familyName': 'Doe'}, 'pagination': {'pageSize': 10}}, - ) - response = public_search_api_handler(event, self.mock_context) - body = json.loads(response['body']) - self.assertLessEqual( - len(body['providers']), - 10, - 'providers array must not exceed pageSize', - ) - self.assertEqual(len(body['providers']), 10, 'first page should return exactly pageSize when available') - - @patch('handlers.public_search.opensearch_client') - def test_providers_array_length_never_exceeds_page_size_when_many_providers_match(self, mock_opensearch_client): - """License-level paging: returned providers (license records) must be <= pageSize.""" - from handlers.public_search import public_search_api_handler - - # One provider with 20 matching licenses; pageSize 10 -> must return exactly 10 - mock_hits = [] - - for i in range(30): - mock_hits.append(self._create_mock_hit_with_inner_hits( - provider_id=f'pid-{i}', - sort_values=['doe', 'john', f'pid-{i}'], - inner_license_count=1, - )) - mock_opensearch_client.search.return_value = { - 'hits': {'total': {'value': 30, 'relation': 'eq'}, 'hits': mock_hits}, - } - event = self._create_public_api_event( - 'cosm', - body={'query': {'familyName': 'Doe'}, 'pagination': {'pageSize': 25}}, - ) - response = public_search_api_handler(event, self.mock_context) - body = json.loads(response['body']) - self.assertEqual(len(body['providers']), 25, 'first page should return exactly pageSize when available') - - @patch('handlers.public_search.opensearch_client') - def test_last_key_uses_cursor_format_with_resume_fields_when_mid_provider(self, mock_opensearch_client): - """lastKey when mid-provider includes resume_provider_sort, resume_provider_id, license_offset; search_after optional.""" - from base64 import b64decode - - from handlers.public_search import public_search_api_handler - - mock_hit = self._create_mock_hit_with_inner_hits( - provider_id='pid-1', - sort_values=['doe', 'john', 'pid-1'], - inner_license_count=15, - ) - mock_opensearch_client.search.return_value = { - 'hits': {'total': {'value': 1, 'relation': 'eq'}, 'hits': [mock_hit]}, - } - event = self._create_public_api_event( - 'cosm', - body={'query': {'familyName': 'Doe'}, 'pagination': {'pageSize': 10}}, - ) - response = public_search_api_handler(event, self.mock_context) - body = json.loads(response['body']) - self.assertIsNotNone(body['pagination']['lastKey'], 'should have next page when more licenses exist') - decoded = json.loads(b64decode(body['pagination']['lastKey']).decode('utf-8')) - self.assertEqual(decoded.get('resume_provider_id'), 'pid-1') - self.assertEqual(decoded.get('resume_provider_sort'), ['doe', 'john', 'pid-1']) - self.assertEqual(decoded.get('license_offset'), 10, 'first page consumed 10 licenses from this provider') - if decoded.get('search_after') is not None: - self.assertEqual(decoded['search_after'], ['doe', 'john', 'pid-1']) - @patch('handlers.public_search.opensearch_client') def test_terminal_page_returns_last_key_null(self, mock_opensearch_client): - """When no more license records exist, lastKey must be null.""" + """When fewer hits than pageSize, lastKey must be null.""" from handlers.public_search import public_search_api_handler - mock_hit = self._create_mock_hit_with_inner_hits( - provider_id='pid-1', - sort_values=['doe', 'john', 'pid-1'], - inner_license_count=3, - ) + mock_hits = [ + self._create_mock_hit( + provider_id='pid-1', + jurisdiction='oh', + license_number='L1', + sort_values=['doe', 'john', 'pid-1', 'pid-1#oh#cosmetologist'], + ), + self._create_mock_hit( + provider_id='pid-1', + jurisdiction='al', + license_number='L2', + sort_values=['doe', 'john', 'pid-1', 'pid-1#al#cosmetologist'], + ), + self._create_mock_hit( + provider_id='pid-2', + jurisdiction='oh', + license_number='L3', + sort_values=['doe', 'john', 'pid-2', 'pid-2#oh#cosmetologist'], + ), + ] mock_opensearch_client.search.return_value = { - 'hits': {'total': {'value': 1, 'relation': 'eq'}, 'hits': [mock_hit]}, + 'hits': {'total': {'value': 3, 'relation': 'eq'}, 'hits': mock_hits}, } event = self._create_public_api_event( 'cosm', @@ -385,93 +358,6 @@ def test_terminal_page_returns_last_key_null(self, mock_opensearch_client): body = json.loads(response['body']) self.assertIsNone(body['pagination']['lastKey'], 'no more results -> lastKey null') - @patch('handlers.public_search.opensearch_client') - def test_resume_from_cursor_skips_license_offset_and_returns_next_page(self, mock_opensearch_client): - """Using lastKey with license_offset resumes from that provider at offset; next page has no duplicates.""" - from handlers.public_search import public_search_api_handler - - mock_hit = self._create_mock_hit_with_inner_hits( - provider_id='pid-1', - sort_values=['doe', 'john', 'pid-1'], - inner_license_count=15, - ) - mock_opensearch_client.search.return_value = { - 'hits': {'total': {'value': 1, 'relation': 'eq'}, 'hits': [mock_hit]}, - } - event = self._create_public_api_event( - 'cosm', - body={'query': {'familyName': 'Doe'}, 'pagination': {'pageSize': 10}}, - ) - response1 = public_search_api_handler(event, self.mock_context) - body1 = json.loads(response1['body']) - self.assertEqual(len(body1['providers']), 10) - last_key = body1['pagination']['lastKey'] - self.assertIsNotNone(last_key) - - # Second request with lastKey: same single provider hit returned by OpenSearch; we resume at offset 10 - event2 = self._create_public_api_event( - 'cosm', - body={ - 'query': {'familyName': 'Doe'}, - 'pagination': {'pageSize': 10, 'lastKey': last_key}, - }, - ) - response2 = public_search_api_handler(event2, self.mock_context) - body2 = json.loads(response2['body']) - self.assertEqual(len(body2['providers']), 5, 'remaining 5 licenses from same provider') - first_license_page2 = body2['providers'][0].get('licenseNumber') - last_license_page1 = body1['providers'][-1].get('licenseNumber') - self.assertNotEqual(first_license_page2, last_license_page1, 'no duplicate at boundary') - - @patch('handlers.public_search.opensearch_client') - def test_resume_from_cursor_skips_license_offset_and_returns_next_page_multi_provider(self, mock_opensearch_client): - """Using lastKey with license_offset resumes from that provider at offset; next page has no duplicates.""" - from handlers.public_search import public_search_api_handler - - mock_hits = [] - # this sets up five providers that match, each with two licenses (10 total) - for i in range(5): - mock_hits.append(self._create_mock_hit_with_inner_hits( - provider_id=f'pid-{i}', - license_number=f'LIC-{i}', - sort_values=['doe', 'john', f'pid-{i}'], - inner_license_count=2, - )) - # This mock simulates the first request returning all matching providers, then the second request returning the - # remaining 3 after the search_after cursor is applied. - mock_opensearch_client.search.side_effect = [ - { - 'hits': {'total': {'value': 5, 'relation': 'eq'}, 'hits': mock_hits}, - }, - { - 'hits': {'total': {'value': 3, 'relation': 'eq'}, 'hits': mock_hits[2:]}, - } - ] - event = self._create_public_api_event( - 'cosm', - body={'query': {'familyName': 'Doe'}, 'pagination': {'pageSize': 5}}, - ) - response1 = public_search_api_handler(event, self.mock_context) - body1 = json.loads(response1['body']) - self.assertEqual(len(body1['providers']), 5) - last_key = body1['pagination']['lastKey'] - self.assertIsNotNone(last_key) - - # Second request with lastKey: same single provider hit returned by OpenSearch; we resume at offset 25 - event2 = self._create_public_api_event( - 'cosm', - body={ - 'query': {'familyName': 'Doe'}, - 'pagination': {'pageSize': 5, 'lastKey': last_key}, - }, - ) - response2 = public_search_api_handler(event2, self.mock_context) - body2 = json.loads(response2['body']) - self.assertEqual(len(body2['providers']), 5, 'remaining 5 licenses') - first_license_page2 = body2['providers'][0].get('licenseNumber') - last_license_page1 = body1['providers'][-1].get('licenseNumber') - self.assertNotEqual(first_license_page2, last_license_page1, 'duplicate license numbers detected when paging') - @patch('handlers.public_search.opensearch_client') def test_invalid_last_key_format_returns_400(self, mock_opensearch_client): """Malformed or invalid lastKey must return 400.""" @@ -482,7 +368,6 @@ def test_invalid_last_key_format_returns_400(self, mock_opensearch_client): mock_opensearch_client.search.return_value = { 'hits': {'total': {'value': 0, 'relation': 'eq'}, 'hits': []}, } - # Cursor must have search_after or resume fields; empty object is invalid bad_payload = json.dumps({}) last_key = b64encode(bad_payload.encode('utf-8')).decode('utf-8') event = self._create_public_api_event( From e41a7d272539ba4e297b28415ace2c596467403b Mon Sep 17 00:00:00 2001 From: Landon Shumway Date: Fri, 27 Mar 2026 09:07:13 -0500 Subject: [PATCH 07/36] Add support for sorting results by familyName or dateOfUpdate --- .../python/search/handlers/public_search.py | 39 ++++- .../function/test_public_search_providers.py | 143 ++++++++++++++++++ 2 files changed, 176 insertions(+), 6 deletions(-) diff --git a/backend/cosmetology-app/lambdas/python/search/handlers/public_search.py b/backend/cosmetology-app/lambdas/python/search/handlers/public_search.py index c62d2fc50..bba60609a 100644 --- a/backend/cosmetology-app/lambdas/python/search/handlers/public_search.py +++ b/backend/cosmetology-app/lambdas/python/search/handlers/public_search.py @@ -87,6 +87,10 @@ def _public_query_licenses(event: dict, context: LambdaContext): # noqa: ARG001 if last_sort is not None and len(hits) >= page_size: last_key = _encode_public_cursor(last_sort) + sorting = body.get('sorting') or {} + resolved_sort_key = sorting.get('key') or 'familyName' + resolved_direction = sorting.get('direction') or 'ascending' + return { 'providers': providers, 'pagination': { @@ -95,6 +99,7 @@ def _public_query_licenses(event: dict, context: LambdaContext): # noqa: ARG001 'prevLastKey': pagination.get('lastKey'), }, 'query': query_obj, + 'sorting': {'key': resolved_sort_key, 'direction': resolved_direction}, } @@ -143,6 +148,33 @@ def _encode_public_cursor(search_after: list) -> str: return b64encode(json.dumps(payload).encode('utf-8')).decode('utf-8') +def _build_public_opensearch_sort(body: dict) -> list: + """ + Map API sorting (familyName | dateOfUpdate, ascending | descending) to OpenSearch sort clauses. + Uses top-level dateOfUpdate for date sort; _id ascending is always the final tiebreaker. + """ + sorting = body.get('sorting') or {} + sort_key = sorting.get('key') or 'familyName' + sort_direction = sorting.get('direction', 'ascending') + os_dir = 'asc' if sort_direction == 'ascending' else 'desc' + + match sort_key: + case 'familyName': + return [ + {'familyName.keyword': os_dir}, + {'givenName.keyword': os_dir}, + {'providerId': os_dir}, + {'_id': 'asc'}, + ] + case 'dateOfUpdate': + return [ + {'dateOfUpdate': os_dir}, + {'_id': 'asc'}, + ] + case _: + raise CCInvalidRequestException(f"Invalid sort key: '{sort_key}'") + + def _build_public_license_search_body(*, compact: str, body: dict, cursor: dict | None = None) -> dict: query_obj = body.get('query', {}) pagination = body.get('pagination') or {} @@ -170,12 +202,7 @@ def _build_public_license_search_body(*, compact: str, body: dict, cursor: dict search_body = { 'query': {'bool': {'must': must}}, 'size': page_size, - 'sort': [ - {'familyName.keyword': 'asc'}, - {'givenName.keyword': 'asc'}, - {'providerId': 'asc'}, - {'_id': 'asc'}, - ], + 'sort': _build_public_opensearch_sort(body), } if search_after is not None: search_body['search_after'] = search_after diff --git a/backend/cosmetology-app/lambdas/python/search/tests/function/test_public_search_providers.py b/backend/cosmetology-app/lambdas/python/search/tests/function/test_public_search_providers.py index 0e7b666d0..c974943fd 100644 --- a/backend/cosmetology-app/lambdas/python/search/tests/function/test_public_search_providers.py +++ b/backend/cosmetology-app/lambdas/python/search/tests/function/test_public_search_providers.py @@ -149,6 +149,148 @@ def test_sort_includes_id_tiebreaker(self, mock_opensearch_client): self.assertEqual(4, len(sort)) self.assertEqual({'_id': 'asc'}, sort[3]) + @patch('handlers.public_search.opensearch_client') + def test_default_sort_is_family_name_ascending(self, mock_opensearch_client): + """Without sorting in request, default is familyName ascending; response echoes sorting.""" + from handlers.public_search import public_search_api_handler + + mock_opensearch_client.search.return_value = { + 'hits': {'total': {'value': 0, 'relation': 'eq'}, 'hits': []}, + } + event = self._create_public_api_event( + 'cosm', + body={'query': {'familyName': 'Doe'}, 'pagination': {'pageSize': 10}}, + ) + response = public_search_api_handler(event, self.mock_context) + call_body = mock_opensearch_client.search.call_args.kwargs['body'] + sort = call_body['sort'] + self.assertEqual(4, len(sort)) + self.assertEqual({'familyName.keyword': 'asc'}, sort[0]) + self.assertEqual({'givenName.keyword': 'asc'}, sort[1]) + self.assertEqual({'providerId': 'asc'}, sort[2]) + self.assertEqual({'_id': 'asc'}, sort[3]) + body = json.loads(response['body']) + self.assertEqual( + {'key': 'familyName', 'direction': 'ascending'}, + body['sorting'], + ) + + @patch('handlers.public_search.opensearch_client') + def test_family_name_sort_descending(self, mock_opensearch_client): + """sorting key familyName with descending direction maps to OpenSearch desc on name fields.""" + from handlers.public_search import public_search_api_handler + + mock_opensearch_client.search.return_value = { + 'hits': {'total': {'value': 0, 'relation': 'eq'}, 'hits': []}, + } + event = self._create_public_api_event( + 'cosm', + body={ + 'query': {'familyName': 'Doe'}, + 'pagination': {'pageSize': 10}, + 'sorting': {'key': 'familyName', 'direction': 'descending'}, + }, + ) + response = public_search_api_handler(event, self.mock_context) + call_body = mock_opensearch_client.search.call_args.kwargs['body'] + sort = call_body['sort'] + self.assertEqual({'familyName.keyword': 'desc'}, sort[0]) + self.assertEqual({'givenName.keyword': 'desc'}, sort[1]) + self.assertEqual({'providerId': 'desc'}, sort[2]) + self.assertEqual({'_id': 'asc'}, sort[3]) + body = json.loads(response['body']) + self.assertEqual( + {'key': 'familyName', 'direction': 'descending'}, + body['sorting'], + ) + + @patch('handlers.public_search.opensearch_client') + def test_date_of_update_sort_ascending(self, mock_opensearch_client): + """sorting by dateOfUpdate uses top-level date field and _id tiebreaker.""" + from handlers.public_search import public_search_api_handler + + mock_opensearch_client.search.return_value = { + 'hits': {'total': {'value': 0, 'relation': 'eq'}, 'hits': []}, + } + event = self._create_public_api_event( + 'cosm', + body={ + 'query': {'licenseNumber': 'LN999'}, + 'pagination': {'pageSize': 10}, + 'sorting': {'key': 'dateOfUpdate', 'direction': 'ascending'}, + }, + ) + response = public_search_api_handler(event, self.mock_context) + call_body = mock_opensearch_client.search.call_args.kwargs['body'] + self.assertEqual( + [{'dateOfUpdate': 'asc'}, {'_id': 'asc'}], + call_body['sort'], + ) + body = json.loads(response['body']) + self.assertEqual( + {'key': 'dateOfUpdate', 'direction': 'ascending'}, + body['sorting'], + ) + + @patch('handlers.public_search.opensearch_client') + def test_date_of_update_sort_descending(self, mock_opensearch_client): + """dateOfUpdate descending keeps _id tiebreaker ascending.""" + from handlers.public_search import public_search_api_handler + + mock_opensearch_client.search.return_value = { + 'hits': {'total': {'value': 0, 'relation': 'eq'}, 'hits': []}, + } + event = self._create_public_api_event( + 'cosm', + body={ + 'query': {'licenseNumber': 'LN999'}, + 'pagination': {'pageSize': 10}, + 'sorting': {'key': 'dateOfUpdate', 'direction': 'descending'}, + }, + ) + public_search_api_handler(event, self.mock_context) + call_body = mock_opensearch_client.search.call_args.kwargs['body'] + self.assertEqual( + [{'dateOfUpdate': 'desc'}, {'_id': 'asc'}], + call_body['sort'], + ) + + @patch('handlers.public_search.opensearch_client') + def test_response_always_contains_sorting_field(self, mock_opensearch_client): + """Successful public search responses include sorting with key and direction.""" + from handlers.public_search import public_search_api_handler + + mock_opensearch_client.search.return_value = { + 'hits': {'total': {'value': 0, 'relation': 'eq'}, 'hits': []}, + } + event = self._create_public_api_event( + 'cosm', + body={'query': {'jurisdiction': 'oh'}, 'pagination': {'pageSize': 10}}, + ) + response = public_search_api_handler(event, self.mock_context) + self.assertEqual(200, response['statusCode']) + body = json.loads(response['body']) + self.assertIn('sorting', body) + self.assertEqual({'key', 'direction'}, set(body['sorting'].keys())) + + @patch('handlers.public_search.opensearch_client') + def test_invalid_sort_key_returns_400(self, mock_opensearch_client): + """Unknown sorting.key returns 400.""" + from handlers.public_search import public_search_api_handler + + event = self._create_public_api_event( + 'cosm', + body={ + 'query': {'familyName': 'Doe'}, + 'pagination': {'pageSize': 10}, + 'sorting': {'key': 'invalidKey', 'direction': 'ascending'}, + }, + ) + response = public_search_api_handler(event, self.mock_context) + self.assertEqual(400, response['statusCode']) + body = json.loads(response['body']) + self.assertIn('Invalid sort key', body['message']) + def test_given_name_without_family_name_returns_400(self): """Test that givenName without familyName returns 400.""" from handlers.public_search import public_search_api_handler @@ -381,3 +523,4 @@ def test_invalid_last_key_format_returns_400(self, mock_opensearch_client): self.assertEqual(response['statusCode'], 400) body = json.loads(response['body']) self.assertIn('lastkey', body['message'].lower()) + mock_opensearch_client.search.assert_not_called() From 17bd14057c5583b51c4f61a42e9ceb619b724f20 Mon Sep 17 00:00:00 2001 From: Landon Shumway Date: Fri, 27 Mar 2026 09:21:06 -0500 Subject: [PATCH 08/36] Cleanup response schema validation --- .../cc_common/data_model/schema/provider/api.py | 11 ++--------- .../lambdas/python/search/handlers/public_search.py | 4 ++++ 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/backend/cosmetology-app/lambdas/python/common/cc_common/data_model/schema/provider/api.py b/backend/cosmetology-app/lambdas/python/common/cc_common/data_model/schema/provider/api.py index 26ae6795a..a27bf5d34 100644 --- a/backend/cosmetology-app/lambdas/python/common/cc_common/data_model/schema/provider/api.py +++ b/backend/cosmetology-app/lambdas/python/common/cc_common/data_model/schema/provider/api.py @@ -211,23 +211,16 @@ class ProviderPublicResponseSchema(ForgivingSchema): class PublicLicenseSearchResponseSchema(ForgivingSchema): """ License object fields returned by the public query providers endpoint (OpenSearch-backed). - Used to sanitize license records extracted from inner_hits; jurisdiction is renamed to licenseJurisdiction. + Jurisdiction is renamed to licenseJurisdiction for parity with JCC implementation. """ providerId = Raw(required=True, allow_none=False) givenName = String(required=True, allow_none=False, validate=Length(1, 100)) familyName = String(required=True, allow_none=False, validate=Length(1, 100)) - jurisdiction = String(required=False, allow_none=False, load_only=True) # OpenSearch uses jurisdiction - licenseJurisdiction = String(required=False, allow_none=False, load_default=None) + licenseJurisdiction = String(required=True, allow_none=False) compact = Compact(required=True, allow_none=False) licenseNumber = String(required=True, allow_none=False, validate=Length(1, 100)) - @post_load - def rename_jurisdiction_to_license_jurisdiction(self, data, **kwargs): - if 'jurisdiction' in data: - data['licenseJurisdiction'] = data.pop('jurisdiction') - return data - class QueryProvidersRequestSchema(CCRequestSchema): """ Schema for query providers requests. diff --git a/backend/cosmetology-app/lambdas/python/search/handlers/public_search.py b/backend/cosmetology-app/lambdas/python/search/handlers/public_search.py index bba60609a..cc9ce9a00 100644 --- a/backend/cosmetology-app/lambdas/python/search/handlers/public_search.py +++ b/backend/cosmetology-app/lambdas/python/search/handlers/public_search.py @@ -71,6 +71,10 @@ def _public_query_licenses(event: dict, context: LambdaContext): # noqa: ARG001 license_fields['givenName'] = source['givenName'] license_fields['familyName'] = source['familyName'] try: + # home state is stored under the 'jurisdiction' field on the license record, but + # the frontend expects this to be labeled 'licenseJurisdiction' for parity with other + # public search response schemas. + license_fields['licenseJurisdiction'] = license_fields.pop('jurisdiction') sanitized = license_schema.load(license_fields) sanitized.pop('jurisdiction', None) providers.append(sanitized) From c0d9e73bbcd72fe0a3670dc7a3a859b994320b1b Mon Sep 17 00:00:00 2001 From: Landon Shumway Date: Fri, 27 Mar 2026 09:26:06 -0500 Subject: [PATCH 09/36] PR feedback - set license number max length to match api spec --- .../data_model/schema/provider/api.py | 2 +- .../test_schema/test_provider.py | 20 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/backend/cosmetology-app/lambdas/python/common/cc_common/data_model/schema/provider/api.py b/backend/cosmetology-app/lambdas/python/common/cc_common/data_model/schema/provider/api.py index a27bf5d34..3daedaf3a 100644 --- a/backend/cosmetology-app/lambdas/python/common/cc_common/data_model/schema/provider/api.py +++ b/backend/cosmetology-app/lambdas/python/common/cc_common/data_model/schema/provider/api.py @@ -241,7 +241,7 @@ class QuerySchema(CCRequestSchema): jurisdiction = Jurisdiction(required=False, allow_none=False) givenName = String(required=False, allow_none=False, validate=Length(min=1, max=100)) familyName = String(required=False, allow_none=False, validate=Length(min=1, max=100)) - licenseNumber = String(required=False, allow_none=False, validate=Length(min=1, max=100)) + licenseNumber = String(required=False, allow_none=False, validate=Length(min=1, max=500)) class PaginationSchema(ForgivingSchema): """ diff --git a/backend/cosmetology-app/lambdas/python/common/tests/unit/test_data_model/test_schema/test_provider.py b/backend/cosmetology-app/lambdas/python/common/tests/unit/test_data_model/test_schema/test_provider.py index 1c2028506..bddf1e360 100644 --- a/backend/cosmetology-app/lambdas/python/common/tests/unit/test_data_model/test_schema/test_provider.py +++ b/backend/cosmetology-app/lambdas/python/common/tests/unit/test_data_model/test_schema/test_provider.py @@ -108,6 +108,26 @@ def test_general_response_schema_does_not_include_date_of_birth_in_licenses(self self.assertNotIn('dateOfBirth', result['licenses'][0]) +class TestQueryProvidersRequestSchema(TstLambdas): + """QueryProvidersRequestSchema.QuerySchema licenseNumber length matches API Gateway model (max 500).""" + + def test_query_license_number_accepts_500_chars(self): + from cc_common.data_model.schema.provider.api import QueryProvidersRequestSchema + + ln = 'x' * 500 + body = {'query': {'licenseNumber': ln, 'jurisdiction': 'oh'}} + loaded = QueryProvidersRequestSchema().load(body) + self.assertEqual(ln, loaded['query']['licenseNumber']) + + def test_query_license_number_rejects_over_500_chars(self): + from cc_common.data_model.schema.provider.api import QueryProvidersRequestSchema + + body = {'query': {'licenseNumber': 'x' * 501, 'jurisdiction': 'oh'}} + with self.assertRaises(ValidationError) as ctx: + QueryProvidersRequestSchema().load(body) + self.assertIn('licenseNumber', ctx.exception.messages['query']) + + class TestProviderRecordSchema(TstLambdas): def test_serde(self): """Test round-trip deserialization/serialization""" From 8216615bafbecbb83ad3506e592510760a97edb0 Mon Sep 17 00:00:00 2001 From: Landon Shumway Date: Fri, 27 Mar 2026 09:37:56 -0500 Subject: [PATCH 10/36] Set all public request schemas to limit license number to 100 chars --- .../common/cc_common/data_model/schema/provider/api.py | 2 +- .../unit/test_data_model/test_schema/test_provider.py | 10 +++++----- .../stacks/api_stack/v1_api/api_model.py | 2 +- .../PUBLIC_QUERY_PROVIDERS_REQUEST_SCHEMA.json | 2 +- .../snapshots/QUERY_PROVIDERS_REQUEST_SCHEMA.json | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/backend/cosmetology-app/lambdas/python/common/cc_common/data_model/schema/provider/api.py b/backend/cosmetology-app/lambdas/python/common/cc_common/data_model/schema/provider/api.py index 3daedaf3a..a27bf5d34 100644 --- a/backend/cosmetology-app/lambdas/python/common/cc_common/data_model/schema/provider/api.py +++ b/backend/cosmetology-app/lambdas/python/common/cc_common/data_model/schema/provider/api.py @@ -241,7 +241,7 @@ class QuerySchema(CCRequestSchema): jurisdiction = Jurisdiction(required=False, allow_none=False) givenName = String(required=False, allow_none=False, validate=Length(min=1, max=100)) familyName = String(required=False, allow_none=False, validate=Length(min=1, max=100)) - licenseNumber = String(required=False, allow_none=False, validate=Length(min=1, max=500)) + licenseNumber = String(required=False, allow_none=False, validate=Length(min=1, max=100)) class PaginationSchema(ForgivingSchema): """ diff --git a/backend/cosmetology-app/lambdas/python/common/tests/unit/test_data_model/test_schema/test_provider.py b/backend/cosmetology-app/lambdas/python/common/tests/unit/test_data_model/test_schema/test_provider.py index bddf1e360..d045cbafe 100644 --- a/backend/cosmetology-app/lambdas/python/common/tests/unit/test_data_model/test_schema/test_provider.py +++ b/backend/cosmetology-app/lambdas/python/common/tests/unit/test_data_model/test_schema/test_provider.py @@ -109,20 +109,20 @@ def test_general_response_schema_does_not_include_date_of_birth_in_licenses(self class TestQueryProvidersRequestSchema(TstLambdas): - """QueryProvidersRequestSchema.QuerySchema licenseNumber length matches API Gateway model (max 500).""" + """QueryProvidersRequestSchema.QuerySchema licenseNumber length matches API Gateway model (max 100).""" - def test_query_license_number_accepts_500_chars(self): + def test_query_license_number_accepts_100_chars(self): from cc_common.data_model.schema.provider.api import QueryProvidersRequestSchema - ln = 'x' * 500 + ln = 'x' * 100 body = {'query': {'licenseNumber': ln, 'jurisdiction': 'oh'}} loaded = QueryProvidersRequestSchema().load(body) self.assertEqual(ln, loaded['query']['licenseNumber']) - def test_query_license_number_rejects_over_500_chars(self): + def test_query_license_number_rejects_over_100_chars(self): from cc_common.data_model.schema.provider.api import QueryProvidersRequestSchema - body = {'query': {'licenseNumber': 'x' * 501, 'jurisdiction': 'oh'}} + body = {'query': {'licenseNumber': 'x' * 101, 'jurisdiction': 'oh'}} with self.assertRaises(ValidationError) as ctx: QueryProvidersRequestSchema().load(body) self.assertIn('licenseNumber', ctx.exception.messages['query']) diff --git a/backend/cosmetology-app/stacks/api_stack/v1_api/api_model.py b/backend/cosmetology-app/stacks/api_stack/v1_api/api_model.py index 4f0c660d3..5684836a8 100644 --- a/backend/cosmetology-app/stacks/api_stack/v1_api/api_model.py +++ b/backend/cosmetology-app/stacks/api_stack/v1_api/api_model.py @@ -113,7 +113,7 @@ def query_providers_request_model(self) -> Model: 'licenseNumber': JsonSchema( type=JsonSchemaType.STRING, min_length=1, - max_length=500, + max_length=100, description='Filter for licenses with a specific license number', ), }, diff --git a/backend/cosmetology-app/tests/resources/snapshots/PUBLIC_QUERY_PROVIDERS_REQUEST_SCHEMA.json b/backend/cosmetology-app/tests/resources/snapshots/PUBLIC_QUERY_PROVIDERS_REQUEST_SCHEMA.json index 0d12e375c..e6102e020 100644 --- a/backend/cosmetology-app/tests/resources/snapshots/PUBLIC_QUERY_PROVIDERS_REQUEST_SCHEMA.json +++ b/backend/cosmetology-app/tests/resources/snapshots/PUBLIC_QUERY_PROVIDERS_REQUEST_SCHEMA.json @@ -38,7 +38,7 @@ }, "licenseNumber": { "description": "Filter for licenses with a specific license number", - "maxLength": 500, + "maxLength": 100, "minLength": 1, "type": "string" } diff --git a/backend/cosmetology-app/tests/resources/snapshots/QUERY_PROVIDERS_REQUEST_SCHEMA.json b/backend/cosmetology-app/tests/resources/snapshots/QUERY_PROVIDERS_REQUEST_SCHEMA.json index 0d12e375c..e6102e020 100644 --- a/backend/cosmetology-app/tests/resources/snapshots/QUERY_PROVIDERS_REQUEST_SCHEMA.json +++ b/backend/cosmetology-app/tests/resources/snapshots/QUERY_PROVIDERS_REQUEST_SCHEMA.json @@ -38,7 +38,7 @@ }, "licenseNumber": { "description": "Filter for licenses with a specific license number", - "maxLength": 500, + "maxLength": 100, "minLength": 1, "type": "string" } From c00141f396807467616dfdd399c1fa8959cd6835 Mon Sep 17 00:00:00 2001 From: Landon Shumway Date: Fri, 27 Mar 2026 09:43:44 -0500 Subject: [PATCH 11/36] Remove previous public search implementation --- .../handlers/public_lookup.py | 102 ------------------ 1 file changed, 102 deletions(-) diff --git a/backend/cosmetology-app/lambdas/python/provider-data-v1/handlers/public_lookup.py b/backend/cosmetology-app/lambdas/python/provider-data-v1/handlers/public_lookup.py index 6f4fafdbd..c9c63244f 100644 --- a/backend/cosmetology-app/lambdas/python/provider-data-v1/handlers/public_lookup.py +++ b/backend/cosmetology-app/lambdas/python/provider-data-v1/handlers/public_lookup.py @@ -8,108 +8,6 @@ from . import get_provider_information -@api_handler -def public_query_providers(event: dict, context: LambdaContext): # noqa: ARG001 unused-argument - """Query providers data - :param event: Standard API Gateway event, API schema documented in the CDK ApiStack - :param LambdaContext context: - """ - compact = event['pathParameters']['compact'] - - # Parse and validate the request body using the schema to strip whitespace - try: - schema = QueryProvidersRequestSchema() - body = schema.loads(event['body']) - except ValidationError as e: - logger.warning('Invalid request body', errors=e.messages) - raise CCInvalidRequestException(f'Invalid request: {e.messages}') from e - - query = body.get('query', {}) - if 'providerId' in query.keys(): - provider_id = query['providerId'] - query = {'providerId': provider_id} - resp = config.data_client.get_provider( - compact=compact, - provider_id=provider_id, - pagination=body.get('pagination'), - detail=False, - ) - resp['query'] = query - - else: - if 'givenName' in query.keys() and 'familyName' not in query.keys(): - raise CCInvalidRequestException('familyName is required if givenName is provided') - provider_name = None - if 'familyName' in query.keys(): - provider_name = (query.get('familyName'), query.get('givenName')) - - jurisdiction = query.get('jurisdiction') - - if jurisdiction: - # If the request is for a jurisdiction that is not live yet in the compact, - # we return empty results to reduce the number of queries made - # otherwise the request will search through the entire data set - if not config.compact_configuration_client.is_jurisdiction_live_in_compact(compact, jurisdiction): - logger.info( - 'Jurisdiction is not live in compact, returning empty results', - compact=compact, - jurisdiction=jurisdiction, - ) - return { - 'query': query, - 'sorting': body.get('sorting', {}), - 'providers': [], - 'pagination': body.get('pagination', {}), - } - - sorting = body.get('sorting', {}) - sorting_key = sorting.get('key') - - sort_direction = sorting.get('direction', 'ascending') - scan_forward = sort_direction == 'ascending' - - match sorting_key: - case None | 'familyName': - resp = { - 'query': query, - 'sorting': {'key': 'familyName', 'direction': sort_direction}, - **config.data_client.get_providers_sorted_by_family_name( - compact=compact, - jurisdiction=jurisdiction, - provider_name=provider_name, - scan_forward=scan_forward, - pagination=body.get('pagination'), - ), - } - case 'dateOfUpdate': - if provider_name is not None: - raise CCInvalidRequestException( - 'givenName and familyName are not supported for sorting by dateOfUpdate', - ) - resp = { - 'query': query, - 'sorting': {'key': 'dateOfUpdate', 'direction': sort_direction}, - **config.data_client.get_providers_sorted_by_updated( - compact=compact, - jurisdiction=jurisdiction, - scan_forward=scan_forward, - pagination=body.get('pagination'), - ), - } - case _: - # This shouldn't happen unless our api validation gets misconfigured - raise CCInvalidRequestException(f"Invalid sort key: '{sorting_key}'") - # Convert generic field to more specific one for this API and sanitize data - unsanitized_providers = resp.pop('items', []) - # for the public query endpoint, we only return publicly available data - public_schema = ProviderPublicResponseSchema() - sanitized_providers = [public_schema.load(provider) for provider in unsanitized_providers] - - resp['providers'] = sanitized_providers - - return resp - - @api_handler def public_get_provider(event: dict, context: LambdaContext): # noqa: ARG001 unused-argument """Return one provider's data From 8c9c69bfca57efd4e970b2bba95ac45059d847ce Mon Sep 17 00:00:00 2001 From: Landon Shumway Date: Fri, 27 Mar 2026 10:06:58 -0500 Subject: [PATCH 12/36] Add public license response schema for cosm public lookup --- .../data_model/schema/license/api.py | 18 + .../data_model/schema/privilege/api.py | 1 - .../data_model/schema/provider/api.py | 7 +- .../test_handlers/test_public_lookup.py | 412 ++---------------- 4 files changed, 60 insertions(+), 378 deletions(-) diff --git a/backend/cosmetology-app/lambdas/python/common/cc_common/data_model/schema/license/api.py b/backend/cosmetology-app/lambdas/python/common/cc_common/data_model/schema/license/api.py index 0e4db7d86..568e76032 100644 --- a/backend/cosmetology-app/lambdas/python/common/cc_common/data_model/schema/license/api.py +++ b/backend/cosmetology-app/lambdas/python/common/cc_common/data_model/schema/license/api.py @@ -243,3 +243,21 @@ class LicenseOpenSearchDocumentSchema(LicenseGeneralResponseSchema): """ dateOfBirth = Raw(required=False, allow_none=False) + + +class LicensePublicResponseSchema(LicenseExpirationStatusMixin, ForgivingSchema): + """ + License object fields, as seen by the public lookup endpoints. + + Serialization direction: + Python -> load() -> API + """ + + type = String(required=True, allow_none=False) + compact = Compact(required=True, allow_none=False) + jurisdiction = Jurisdiction(required=True, allow_none=False) + licenseType = String(required=True, allow_none=False) + licenseStatus = ActiveInactive(required=True, allow_none=False) + compactEligibility = CompactEligibility(required=True, allow_none=False) + dateOfExpiration = Raw(required=True, allow_none=False) + licenseNumber = String(required=True, allow_none=False, validate=Length(1, 100)) diff --git a/backend/cosmetology-app/lambdas/python/common/cc_common/data_model/schema/privilege/api.py b/backend/cosmetology-app/lambdas/python/common/cc_common/data_model/schema/privilege/api.py index 375552406..cab72b8cc 100644 --- a/backend/cosmetology-app/lambdas/python/common/cc_common/data_model/schema/privilege/api.py +++ b/backend/cosmetology-app/lambdas/python/common/cc_common/data_model/schema/privilege/api.py @@ -81,6 +81,5 @@ class PrivilegePublicResponseSchema(ForgivingSchema): licenseJurisdiction = Jurisdiction(required=True, allow_none=False) licenseType = String(required=True, allow_none=False) dateOfExpiration = Raw(required=True, allow_none=False) - adverseActions = List(Nested(AdverseActionPublicResponseSchema, required=False, allow_none=False)) administratorSetStatus = ActiveInactive(required=True, allow_none=False) status = ActiveInactive(required=True, allow_none=False) diff --git a/backend/cosmetology-app/lambdas/python/common/cc_common/data_model/schema/provider/api.py b/backend/cosmetology-app/lambdas/python/common/cc_common/data_model/schema/provider/api.py index a27bf5d34..bbc4b5858 100644 --- a/backend/cosmetology-app/lambdas/python/common/cc_common/data_model/schema/provider/api.py +++ b/backend/cosmetology-app/lambdas/python/common/cc_common/data_model/schema/provider/api.py @@ -15,6 +15,7 @@ from cc_common.data_model.schema.license.api import ( LicenseGeneralResponseSchema, LicenseOpenSearchDocumentSchema, + LicensePublicResponseSchema, LicenseReadPrivateResponseSchema, ) from cc_common.data_model.schema.privilege.api import ( @@ -202,10 +203,10 @@ class ProviderPublicResponseSchema(ForgivingSchema): familyName = String(required=True, allow_none=False, validate=Length(1, 100)) suffix = String(required=False, allow_none=False, validate=Length(1, 100)) - # Unlike the internal provider search endpoints used by staff users, which return license data in addition to - # privilege data for a provider, we only return privilege data for a provider from the public GET provider endpoint + # Unlike the JCC public provider search, which only returns privilege data for a provider, Cosmetology returns both + # licenses and privileges and does not return any adverse action data. + licenses = List(Nested(LicensePublicResponseSchema(), required=False, allow_none=False)) privileges = List(Nested(PrivilegePublicResponseSchema(), required=False, allow_none=False)) - # Note the lack of `licenses` here: we do not return license data for public endpoints class PublicLicenseSearchResponseSchema(ForgivingSchema): diff --git a/backend/cosmetology-app/lambdas/python/provider-data-v1/tests/function/test_handlers/test_public_lookup.py b/backend/cosmetology-app/lambdas/python/provider-data-v1/tests/function/test_handlers/test_public_lookup.py index 4eb64442d..d7c72db8f 100644 --- a/backend/cosmetology-app/lambdas/python/provider-data-v1/tests/function/test_handlers/test_public_lookup.py +++ b/backend/cosmetology-app/lambdas/python/provider-data-v1/tests/function/test_handlers/test_public_lookup.py @@ -1,362 +1,12 @@ import json from datetime import datetime from unittest.mock import patch -from urllib.parse import quote from moto import mock_aws from .. import TstFunction -@mock_aws -@patch('cc_common.config._Config.current_standard_datetime', datetime.fromisoformat('2024-11-08T23:59:59+00:00')) -class TestPublicQueryProviders(TstFunction): - def _when_jurisdiction_is_live_in_compact(self, jurisdiction): - self.test_data_generator.put_default_compact_configuration_in_configuration_table( - value_overrides={ - 'compactAbbr': 'cosm', - 'configuredStates': [{'postalAbbreviation': jurisdiction, 'isLive': True}], - } - ) - - def test_public_query_by_provider_id_returns_public_allowed_fields(self): - self._load_provider_data() - - from handlers.public_lookup import public_query_providers - - with open('../common/tests/resources/api-event.json') as f: - event = json.load(f) - - # public endpoint does not have authorizer - del event['requestContext']['authorizer'] - event['pathParameters'] = {'compact': 'cosm'} - event['body'] = json.dumps({'query': {'providerId': '89a6377e-c3a5-40e5-bca5-317ec854c570'}}) - - resp = public_query_providers(event, self.mock_context) - - self.assertEqual(200, resp['statusCode']) - - with open('../common/tests/resources/api/provider-response.json') as f: - expected_provider = json.load(f) - # we do not return the following fields for the public endpoint - expected_provider.pop('birthMonthDay') - expected_provider.pop('dateOfExpiration') - expected_provider.pop('jurisdictionUploadedLicenseStatus') - expected_provider.pop('jurisdictionUploadedCompactEligibility') - - body = json.loads(resp['body']) - self.assertEqual( - { - 'providers': [expected_provider], - 'pagination': {'pageSize': 100, 'lastKey': None, 'prevLastKey': None}, - 'query': {'providerId': '89a6377e-c3a5-40e5-bca5-317ec854c570'}, - }, - body, - ) - - def test_public_query_providers_updated_sorting(self): - from handlers.public_lookup import public_query_providers - - self._when_jurisdiction_is_live_in_compact(jurisdiction='oh') - - # 20 providers with licenses in oh (two batches) - self._generate_providers(home='oh', start_serial=9999) - self._generate_providers(home='oh', start_serial=9899) - - with open('../common/tests/resources/api-event.json') as f: - event = json.load(f) - - # public endpoint does not have authorizer - del event['requestContext']['authorizer'] - event['pathParameters'] = {'compact': 'cosm'} - event['body'] = json.dumps( - {'sorting': {'key': 'dateOfUpdate'}, 'query': {'jurisdiction': 'oh'}, 'pagination': {'pageSize': 10}}, - ) - - resp = public_query_providers(event, self.mock_context) - - self.assertEqual(200, resp['statusCode']) - - body = json.loads(resp['body']) - self.assertEqual(10, len(body['providers'])) - self.assertEqual({'providers', 'pagination', 'query', 'sorting'}, body.keys()) - self.assertIsInstance(body['pagination']['lastKey'], str) - # Check we're actually sorted - dates_of_update = [provider['dateOfUpdate'] for provider in body['providers']] - self.assertListEqual(sorted(dates_of_update), dates_of_update) - - def test_public_query_providers_updated_sorting_returns_providers_with_license_in_jurisdiction(self): - """Tests that the public endpoint returns providers with a license in the requested jurisdiction.""" - from handlers.public_lookup import public_query_providers - - self._when_jurisdiction_is_live_in_compact(jurisdiction='oh') - - # 20 providers with licenses in oh (two batches) - self._generate_providers(home='oh', start_serial=9999) - self._generate_providers(home='oh', start_serial=9899) - - with open('../common/tests/resources/api-event.json') as f: - event = json.load(f) - - # public endpoint does not have authorizer - del event['requestContext']['authorizer'] - event['pathParameters'] = {'compact': 'cosm'} - event['body'] = json.dumps( - {'sorting': {'key': 'dateOfUpdate'}, 'query': {'jurisdiction': 'oh'}, 'pagination': {'pageSize': 20}}, - ) - - resp = public_query_providers(event, self.mock_context) - - self.assertEqual(200, resp['statusCode']) - - body = json.loads(resp['body']) - self.assertEqual(20, len(body['providers'])) - # Check we're actually sorted - dates_of_update = [provider['dateOfUpdate'] for provider in body['providers']] - self.assertListEqual(sorted(dates_of_update), dates_of_update) - - def test_public_query_providers_family_name_sorting(self): - from handlers.public_lookup import public_query_providers - - self._when_jurisdiction_is_live_in_compact(jurisdiction='oh') - - # 20 providers with licenses in oh (two batches); first 10 have challenging name characters - names = [ - ('山田', '1'), - ('後藤', '2'), - ('清水', '3'), - ('近藤', '4'), - ('Anderson', '5'), - ('Bañuelos', '6'), - ('de la Fuente', '7'), - ('Dennis', '8'), - ('Figueroa', '9'), - ('Frías', '10'), - ] - self._generate_providers(home='oh', start_serial=9999, names=names) - self._generate_providers(home='oh', start_serial=9899) - - with open('../common/tests/resources/api-event.json') as f: - event = json.load(f) - - # public endpoint does not have authorizer - del event['requestContext']['authorizer'] - event['pathParameters'] = {'compact': 'cosm'} - event['body'] = json.dumps( - {'sorting': {'key': 'familyName'}, 'query': {'jurisdiction': 'oh'}, 'pagination': {'pageSize': 10}}, - ) - - resp = public_query_providers(event, self.mock_context) - - self.assertEqual(200, resp['statusCode']) - - body = json.loads(resp['body']) - self.assertEqual(10, len(body['providers'])) - self.assertEqual({'providers', 'pagination', 'query', 'sorting'}, body.keys()) - self.assertEqual({'key': 'familyName', 'direction': 'ascending'}, body['sorting']) - self.assertIsInstance(body['pagination']['lastKey'], str) - # Check we're actually sorted - family_names = [provider['familyName'].lower() for provider in body['providers']] - self.assertListEqual(sorted(family_names, key=quote), family_names) - - def test_public_query_providers_by_family_name(self): - from handlers.public_lookup import public_query_providers - - self._when_jurisdiction_is_live_in_compact(jurisdiction='oh') - - # 10 providers with licenses in oh, including Tess and Ted Testerly - self._generate_providers( - home='oh', - start_serial=9999, - names=(('Testerly', 'Tess'), ('Testerly', 'Ted')), - ) - - with open('../common/tests/resources/api-event.json') as f: - event = json.load(f) - - # public endpoint does not have authorizer - del event['requestContext']['authorizer'] - event['pathParameters'] = {'compact': 'cosm'} - event['body'] = json.dumps( - { - 'sorting': {'key': 'familyName'}, - 'query': {'jurisdiction': 'oh', 'familyName': 'Testerly'}, - 'pagination': {'pageSize': 10}, - }, - ) - - resp = public_query_providers(event, self.mock_context) - - self.assertEqual(200, resp['statusCode']) - - body = json.loads(resp['body']) - self.assertEqual(2, len(body['providers'])) - - def test_public_query_returns_empty_results_if_jurisdiction_is_not_live(self): - from handlers.public_lookup import public_query_providers - - # 10 providers from ohio, but ohio is not live in the system, so we should return without querying - # for providers - self._generate_providers( - home='oh', - start_serial=9999, - names=(('Testerly', 'Tess'), ('Testerly', 'Ted')), - ) - - with open('../common/tests/resources/api-event.json') as f: - event = json.load(f) - - # public endpoint does not have authorizer - del event['requestContext']['authorizer'] - event['pathParameters'] = {'compact': 'cosm'} - event['body'] = json.dumps( - { - 'sorting': {'key': 'familyName'}, - 'query': {'jurisdiction': 'oh', 'familyName': 'Testerly'}, - 'pagination': {'pageSize': 10}, - }, - ) - - resp = public_query_providers(event, self.mock_context) - - self.assertEqual(200, resp['statusCode']) - - body = json.loads(resp['body']) - self.assertEqual( - { - 'pagination': {'pageSize': 10}, - 'providers': [], - 'query': {'familyName': 'Testerly', 'jurisdiction': 'oh'}, - 'sorting': {'key': 'familyName'}, - }, - body, - ) - - def test_public_query_providers_given_name_only_not_allowed(self): - from handlers.public_lookup import public_query_providers - - self._when_jurisdiction_is_live_in_compact(jurisdiction='oh') - - # 10 providers with licenses in oh, including Tess and Ted Testerly - self._generate_providers( - home='oh', - start_serial=9999, - names=(('Testerly', 'Tess'), ('Testerly', 'Ted')), - ) - - with open('../common/tests/resources/api-event.json') as f: - event = json.load(f) - - # public endpoint does not have authorizer - del event['requestContext']['authorizer'] - event['pathParameters'] = {'compact': 'cosm'} - event['body'] = json.dumps( - { - 'sorting': {'key': 'familyName'}, - 'query': {'jurisdiction': 'oh', 'givenName': 'Tess'}, - 'pagination': {'pageSize': 10}, - }, - ) - - resp = public_query_providers(event, self.mock_context) - - self.assertEqual(400, resp['statusCode']) - - def test_query_providers_default_sorting(self): - """If sorting is not specified, familyName is default""" - from handlers.public_lookup import public_query_providers - - self._when_jurisdiction_is_live_in_compact(jurisdiction='oh') - - # 20 providers with licenses (10 in oh, 10 in ne) - self._generate_providers(home='oh', start_serial=9999) - self._generate_providers(home='ne', start_serial=9899) - - with open('../common/tests/resources/api-event.json') as f: - event = json.load(f) - - # public endpoint does not have authorizer - del event['requestContext']['authorizer'] - event['pathParameters'] = {'compact': 'cosm'} - event['body'] = json.dumps({'query': {}}) - - resp = public_query_providers(event, self.mock_context) - - self.assertEqual(200, resp['statusCode']) - - body = json.loads(resp['body']) - self.assertEqual(20, len(body['providers'])) - self.assertEqual({'providers', 'pagination', 'query', 'sorting'}, body.keys()) - self.assertEqual({'key': 'familyName', 'direction': 'ascending'}, body['sorting']) - self.assertIsNone(body['pagination']['lastKey']) - # Check we're actually sorted - family_names = [provider['familyName'].lower() for provider in body['providers']] - self.assertListEqual(sorted(family_names, key=quote), family_names) - - def test_public_query_providers_invalid_sorting(self): - from handlers.public_lookup import public_query_providers - - self._when_jurisdiction_is_live_in_compact(jurisdiction='oh') - - # 20 providers with licenses (10 in oh, 10 in ne) - self._generate_providers(home='oh', start_serial=9999) - self._generate_providers(home='ne', start_serial=9899) - - with open('../common/tests/resources/api-event.json') as f: - event = json.load(f) - - # public endpoint does not have authorizer - del event['requestContext']['authorizer'] - event['pathParameters'] = {'compact': 'cosm'} - event['body'] = json.dumps({'query': {'jurisdiction': 'oh'}, 'sorting': {'key': 'invalid'}}) - - resp = public_query_providers(event, self.mock_context) - - # Should reject the query, with 400 - self.assertEqual(400, resp['statusCode']) - - def test_public_query_providers_strips_whitespace_from_query_fields(self): - """Test that whitespace is stripped from multiple fields simultaneously.""" - from handlers.public_lookup import public_query_providers - - self._when_jurisdiction_is_live_in_compact(jurisdiction='oh') - - # Create providers with known names for testing - self._generate_providers( - home='oh', - start_serial=9999, - names=(('Testerly', 'Tess'), ('Testerly', 'Ted')), - ) - - with open('../common/tests/resources/api-event.json') as f: - event = json.load(f) - - # public endpoint does not have authorizer - del event['requestContext']['authorizer'] - event['pathParameters'] = {'compact': 'cosm'} - - # Test multiple fields with whitespace - event['body'] = json.dumps( - { - 'query': { - 'givenName': ' Ted ', - 'familyName': ' Testerly ', - 'jurisdiction': ' oh ', - }, - 'pagination': {'pageSize': 10}, - } - ) - - resp = public_query_providers(event, self.mock_context) - self.assertEqual(200, resp['statusCode']) - - body = json.loads(resp['body']) - self.assertEqual(1, len(body['providers'])) # Should find Ted Testerly - found_provider = body['providers'][0] - self.assertEqual('Ted', found_provider['givenName']) - self.assertEqual('Testerly', found_provider['familyName']) - - @mock_aws @patch('cc_common.config._Config.current_standard_datetime', datetime.fromisoformat('2024-11-08T23:59:59+00:00')) class TestPublicGetProvider(TstFunction): @@ -364,13 +14,6 @@ def setUp(self): super().setUp() self.set_live_compact_jurisdictions_for_test({'cosm': ['ne']}) - @staticmethod - def _get_sensitive_hash(): - with open('../common/tests/resources/dynamo/license-update.json') as f: - sk = json.load(f)['sk'] - # The actual sensitive part is the hash at the end of the key - return sk.split('/')[-1] - def test_public_get_provider_response_with_expected_fields_filtered(self): self._load_provider_data() @@ -389,26 +32,47 @@ def test_public_get_provider_response_with_expected_fields_filtered(self): self.assertEqual(200, resp['statusCode']) provider_data = json.loads(resp['body']) - with open('../common/tests/resources/api/provider-detail-response.json') as f: - expected_provider = json.load(f) - # we do not return the following fields from the public endpoint - expected_provider.pop('ssnLastFour') - expected_provider.pop('dateOfBirth') - expected_provider.pop('birthMonthDay') - expected_provider.pop('licenses') - expected_provider['privileges'][0].pop('investigations') - expected_provider.pop('dateOfExpiration') - expected_provider.pop('jurisdictionUploadedLicenseStatus') - expected_provider.pop('jurisdictionUploadedCompactEligibility') + # ProviderPublicResponseSchema + LicensePublicResponseSchema + PrivilegePublicResponseSchema + expected_provider = { + 'type': 'provider', + 'providerId': '89a6377e-c3a5-40e5-bca5-317ec854c570', + 'dateOfUpdate': '2024-07-08T23:59:59+00:00', + 'compact': 'cosm', + 'licenseJurisdiction': 'oh', + 'licenseStatus': 'active', + 'compactEligibility': 'eligible', + 'givenName': 'Björk', + 'middleName': 'Gunnar', + 'familyName': 'Guðmundsdóttir', + 'licenses': [ + { + 'type': 'license', + 'compact': 'cosm', + 'jurisdiction': 'oh', + 'licenseType': 'cosmetologist', + 'licenseStatus': 'active', + 'compactEligibility': 'eligible', + 'dateOfExpiration': '2025-04-04', + 'licenseNumber': 'A0608337260', + } + ], + 'privileges': [ + { + 'type': 'privilege', + 'providerId': '89a6377e-c3a5-40e5-bca5-317ec854c570', + 'compact': 'cosm', + 'jurisdiction': 'ne', + 'licenseJurisdiction': 'oh', + 'licenseType': 'cosmetologist', + 'dateOfExpiration': '2025-04-04', + 'administratorSetStatus': 'active', + 'status': 'active', + } + ], + } self.assertEqual(expected_provider, provider_data) - # The sk for a license-update record is sensitive so we'll do an extra, pretty broad, check just to make sure - # we guard against future changes that might accidentally send the key out via the API. See discussion on - # key generation in the LicenseUpdateRecordSchema for details. - sensitive_hash = self._get_sensitive_hash() - self.assertNotIn(sensitive_hash, resp['body']) - def test_public_get_provider_missing_provider_id(self): from handlers.public_lookup import public_get_provider From ab36ddd9986c33282f9ea433a192dad6626a821f Mon Sep 17 00:00:00 2001 From: Landon Shumway Date: Fri, 27 Mar 2026 10:22:11 -0500 Subject: [PATCH 13/36] linter/formatting --- .../common/cc_common/data_model/schema/privilege/api.py | 1 - .../common/cc_common/data_model/schema/provider/api.py | 3 ++- .../python/provider-data-v1/handlers/public_lookup.py | 5 ++--- .../lambdas/python/search/handlers/public_search.py | 5 ++--- .../search/tests/function/test_public_search_providers.py | 5 ++--- .../python/search/tests/function/test_search_providers.py | 4 +--- .../stacks/api_lambda_stack/public_lookup_api.py | 2 +- backend/cosmetology-app/stacks/api_stack/v1_api/api_model.py | 2 +- 8 files changed, 11 insertions(+), 16 deletions(-) diff --git a/backend/cosmetology-app/lambdas/python/common/cc_common/data_model/schema/privilege/api.py b/backend/cosmetology-app/lambdas/python/common/cc_common/data_model/schema/privilege/api.py index cab72b8cc..f08f35e0d 100644 --- a/backend/cosmetology-app/lambdas/python/common/cc_common/data_model/schema/privilege/api.py +++ b/backend/cosmetology-app/lambdas/python/common/cc_common/data_model/schema/privilege/api.py @@ -4,7 +4,6 @@ from cc_common.data_model.schema.adverse_action.api import ( AdverseActionGeneralResponseSchema, - AdverseActionPublicResponseSchema, ) from cc_common.data_model.schema.base_record import ForgivingSchema from cc_common.data_model.schema.fields import ( diff --git a/backend/cosmetology-app/lambdas/python/common/cc_common/data_model/schema/provider/api.py b/backend/cosmetology-app/lambdas/python/common/cc_common/data_model/schema/provider/api.py index bbc4b5858..14006f9c8 100644 --- a/backend/cosmetology-app/lambdas/python/common/cc_common/data_model/schema/provider/api.py +++ b/backend/cosmetology-app/lambdas/python/common/cc_common/data_model/schema/provider/api.py @@ -1,5 +1,5 @@ # ruff: noqa: N801, N815, ARG002 invalid-name unused-argument -from marshmallow import ValidationError, post_load, validates_schema +from marshmallow import ValidationError, validates_schema from marshmallow.fields import Integer, List, Nested, Raw, String from marshmallow.validate import Length, Range, Regexp @@ -222,6 +222,7 @@ class PublicLicenseSearchResponseSchema(ForgivingSchema): compact = Compact(required=True, allow_none=False) licenseNumber = String(required=True, allow_none=False, validate=Length(1, 100)) + class QueryProvidersRequestSchema(CCRequestSchema): """ Schema for query providers requests. diff --git a/backend/cosmetology-app/lambdas/python/provider-data-v1/handlers/public_lookup.py b/backend/cosmetology-app/lambdas/python/provider-data-v1/handlers/public_lookup.py index c9c63244f..9fa6abd8f 100644 --- a/backend/cosmetology-app/lambdas/python/provider-data-v1/handlers/public_lookup.py +++ b/backend/cosmetology-app/lambdas/python/provider-data-v1/handlers/public_lookup.py @@ -1,9 +1,8 @@ from aws_lambda_powertools.utilities.typing import LambdaContext -from cc_common.config import config, logger -from cc_common.data_model.schema.provider.api import ProviderPublicResponseSchema, QueryProvidersRequestSchema +from cc_common.config import logger +from cc_common.data_model.schema.provider.api import ProviderPublicResponseSchema from cc_common.exceptions import CCInvalidRequestException from cc_common.utils import api_handler -from marshmallow import ValidationError from . import get_provider_information diff --git a/backend/cosmetology-app/lambdas/python/search/handlers/public_search.py b/backend/cosmetology-app/lambdas/python/search/handlers/public_search.py index cc9ce9a00..24f1f5971 100644 --- a/backend/cosmetology-app/lambdas/python/search/handlers/public_search.py +++ b/backend/cosmetology-app/lambdas/python/search/handlers/public_search.py @@ -16,6 +16,7 @@ # Set timeout to 20 seconds to give API gateway time to respond with response opensearch_client = OpenSearchClient(timeout=25) + @api_handler def public_search_api_handler(event: dict, context: LambdaContext): # noqa: ARG001 unused-argument """ @@ -121,9 +122,7 @@ def _parse_and_validate_public_query_body(event: dict) -> dict: raise CCInvalidRequestException('familyName is required if givenName is provided') if not any((query.get('licenseNumber'), query.get('jurisdiction'), query.get('familyName'))): - raise CCInvalidRequestException( - 'At least one of licenseNumber, jurisdiction, or familyName must be provided' - ) + raise CCInvalidRequestException('At least one of licenseNumber, jurisdiction, or familyName must be provided') return body diff --git a/backend/cosmetology-app/lambdas/python/search/tests/function/test_public_search_providers.py b/backend/cosmetology-app/lambdas/python/search/tests/function/test_public_search_providers.py index c974943fd..003d8061d 100644 --- a/backend/cosmetology-app/lambdas/python/search/tests/function/test_public_search_providers.py +++ b/backend/cosmetology-app/lambdas/python/search/tests/function/test_public_search_providers.py @@ -290,6 +290,7 @@ def test_invalid_sort_key_returns_400(self, mock_opensearch_client): self.assertEqual(400, response['statusCode']) body = json.loads(response['body']) self.assertIn('Invalid sort key', body['message']) + mock_opensearch_client.search.assert_not_called() def test_given_name_without_family_name_returns_400(self): """Test that givenName without familyName returns 400.""" @@ -327,9 +328,7 @@ def test_pagination_page_size_maps_to_size_and_search_after_from_last_key(self, mock_opensearch_client.search.return_value = { 'hits': {'total': {'value': 0, 'relation': 'eq'}, 'hits': []}, } - last_key_payload = json.dumps( - {'search_after': ['doe', 'jane', 'uuid-123', 'uuid-123#oh#cosmetologist']} - ) + last_key_payload = json.dumps({'search_after': ['doe', 'jane', 'uuid-123', 'uuid-123#oh#cosmetologist']}) last_key_str = b64encode(last_key_payload.encode('utf-8')).decode('utf-8') event = self._create_public_api_event( 'cosm', diff --git a/backend/cosmetology-app/lambdas/python/search/tests/function/test_search_providers.py b/backend/cosmetology-app/lambdas/python/search/tests/function/test_search_providers.py index 7bb957f40..827737264 100644 --- a/backend/cosmetology-app/lambdas/python/search/tests/function/test_search_providers.py +++ b/backend/cosmetology-app/lambdas/python/search/tests/function/test_search_providers.py @@ -618,9 +618,7 @@ def test_search_with_exists_field_date_of_birth_rejected_without_read_private_sc mock_opensearch_client.search.assert_not_called() @patch('handlers.search.opensearch_client') - def test_search_with_date_of_birth_string_in_list_rejected_without_read_private_scope( - self, mock_opensearch_client - ): + def test_search_with_date_of_birth_string_in_list_rejected_without_read_private_scope(self, mock_opensearch_client): """dateOfBirth as a list element (e.g. multi_match fields) must not bypass readPrivate checks.""" from handlers.search import search_api_handler diff --git a/backend/cosmetology-app/stacks/api_lambda_stack/public_lookup_api.py b/backend/cosmetology-app/stacks/api_lambda_stack/public_lookup_api.py index 190a406f9..93f3b72a4 100644 --- a/backend/cosmetology-app/stacks/api_lambda_stack/public_lookup_api.py +++ b/backend/cosmetology-app/stacks/api_lambda_stack/public_lookup_api.py @@ -54,7 +54,7 @@ def __init__( # Dummy export to avoid CDK deadly embrace: public query providers now uses # SearchPersistentStack.public_handler; this lambda is no longer wired to the API. - # TODO: remove this export (and the lambda above) after the stack is deployed and the export can be retired # noqa: FIX002 + # TODO: remove this export (and the lambda above) after the stack is deployed to all envs # noqa: FIX002 stack.export_value(self.query_providers_handler.function_arn) def _get_provider_handler( diff --git a/backend/cosmetology-app/stacks/api_stack/v1_api/api_model.py b/backend/cosmetology-app/stacks/api_stack/v1_api/api_model.py index 5684836a8..fa2a08876 100644 --- a/backend/cosmetology-app/stacks/api_stack/v1_api/api_model.py +++ b/backend/cosmetology-app/stacks/api_stack/v1_api/api_model.py @@ -1641,7 +1641,7 @@ def provider_registration_request_model(self) -> Model: @property def _public_license_search_response_schema(self): - """Schema for public query providers response (license-level items: providerId, givenName, familyName, licenseJurisdiction, compact, licenseNumber).""" + """Schema for public query providers response""" stack: AppStack = AppStack.of(self.api) return JsonSchema( type=JsonSchemaType.OBJECT, From 430e17e0afacfdfac98a1c49c7274b2a000adb73 Mon Sep 17 00:00:00 2001 From: Landon Shumway Date: Fri, 27 Mar 2026 11:38:12 -0500 Subject: [PATCH 14/36] Add licenseType to top level public search response --- .../cc_common/data_model/schema/provider/api.py | 1 + .../tests/function/test_public_search_providers.py | 11 ++++++++++- .../stacks/api_lambda_stack/public_lookup_api.py | 3 +++ .../stacks/api_stack/v1_api/api_model.py | 5 +++++ .../PUBLIC_QUERY_PROVIDERS_RESPONSE_SCHEMA.json | 5 +++++ 5 files changed, 24 insertions(+), 1 deletion(-) diff --git a/backend/cosmetology-app/lambdas/python/common/cc_common/data_model/schema/provider/api.py b/backend/cosmetology-app/lambdas/python/common/cc_common/data_model/schema/provider/api.py index 14006f9c8..0b5a9f99d 100644 --- a/backend/cosmetology-app/lambdas/python/common/cc_common/data_model/schema/provider/api.py +++ b/backend/cosmetology-app/lambdas/python/common/cc_common/data_model/schema/provider/api.py @@ -220,6 +220,7 @@ class PublicLicenseSearchResponseSchema(ForgivingSchema): familyName = String(required=True, allow_none=False, validate=Length(1, 100)) licenseJurisdiction = String(required=True, allow_none=False) compact = Compact(required=True, allow_none=False) + licenseType = String(required=True, allow_none=False) licenseNumber = String(required=True, allow_none=False, validate=Length(1, 100)) diff --git a/backend/cosmetology-app/lambdas/python/search/tests/function/test_public_search_providers.py b/backend/cosmetology-app/lambdas/python/search/tests/function/test_public_search_providers.py index 003d8061d..59016bef9 100644 --- a/backend/cosmetology-app/lambdas/python/search/tests/function/test_public_search_providers.py +++ b/backend/cosmetology-app/lambdas/python/search/tests/function/test_public_search_providers.py @@ -420,9 +420,18 @@ def test_response_contains_only_allowed_license_fields(self, mock_opensearch_cli body = json.loads(response['body']) self.assertEqual(len(body['providers']), 1) provider = body['providers'][0] - allowed = {'providerId', 'givenName', 'familyName', 'licenseJurisdiction', 'compact', 'licenseNumber'} + allowed = { + 'providerId', + 'givenName', + 'familyName', + 'licenseJurisdiction', + 'compact', + 'licenseType', + 'licenseNumber', + } self.assertEqual(set(provider.keys()), allowed) self.assertEqual(provider['licenseJurisdiction'], 'oh') + self.assertEqual(provider['licenseType'], 'cosmetologist') self.assertEqual(provider['licenseNumber'], 'LN123') @patch('handlers.public_search.opensearch_client') diff --git a/backend/cosmetology-app/stacks/api_lambda_stack/public_lookup_api.py b/backend/cosmetology-app/stacks/api_lambda_stack/public_lookup_api.py index 93f3b72a4..8aba98160 100644 --- a/backend/cosmetology-app/stacks/api_lambda_stack/public_lookup_api.py +++ b/backend/cosmetology-app/stacks/api_lambda_stack/public_lookup_api.py @@ -38,6 +38,7 @@ def __init__( env_vars=lambda_environment, data_encryption_key=persistent_stack.shared_encryption_key, provider_table=persistent_stack.provider_table, + compact_configuration_table=persistent_stack.compact_configuration_table, alarm_topic=persistent_stack.alarm_topic, ) api_lambda_stack.log_groups.append(self.get_provider_handler.log_group) @@ -63,6 +64,7 @@ def _get_provider_handler( env_vars: dict, data_encryption_key: IKey, provider_table: ITable, + compact_configuration_table: ITable, alarm_topic: ITopic, ) -> PythonFunction: stack = Stack.of(scope) @@ -79,6 +81,7 @@ def _get_provider_handler( ) data_encryption_key.grant_decrypt(handler) provider_table.grant_read_data(handler) + compact_configuration_table.grant_read_data(handler) NagSuppressions.add_resource_suppressions_by_path( stack, diff --git a/backend/cosmetology-app/stacks/api_stack/v1_api/api_model.py b/backend/cosmetology-app/stacks/api_stack/v1_api/api_model.py index fa2a08876..8713352bb 100644 --- a/backend/cosmetology-app/stacks/api_stack/v1_api/api_model.py +++ b/backend/cosmetology-app/stacks/api_stack/v1_api/api_model.py @@ -1651,6 +1651,7 @@ def _public_license_search_response_schema(self): 'familyName', 'licenseJurisdiction', 'compact', + 'licenseType', 'licenseNumber', ], properties={ @@ -1661,6 +1662,10 @@ def _public_license_search_response_schema(self): type=JsonSchemaType.STRING, enum=stack.node.get_context('jurisdictions') ), 'compact': JsonSchema(type=JsonSchemaType.STRING, enum=stack.node.get_context('compacts')), + 'licenseType': JsonSchema( + type=JsonSchemaType.STRING, + description='License type or profession designation for this license row', + ), 'licenseNumber': JsonSchema(type=JsonSchemaType.STRING, min_length=1, max_length=100), }, ) diff --git a/backend/cosmetology-app/tests/resources/snapshots/PUBLIC_QUERY_PROVIDERS_RESPONSE_SCHEMA.json b/backend/cosmetology-app/tests/resources/snapshots/PUBLIC_QUERY_PROVIDERS_RESPONSE_SCHEMA.json index 2c62fa41b..4be0803c4 100644 --- a/backend/cosmetology-app/tests/resources/snapshots/PUBLIC_QUERY_PROVIDERS_RESPONSE_SCHEMA.json +++ b/backend/cosmetology-app/tests/resources/snapshots/PUBLIC_QUERY_PROVIDERS_RESPONSE_SCHEMA.json @@ -38,6 +38,10 @@ ], "type": "string" }, + "licenseType": { + "description": "License type or profession designation for this license row", + "type": "string" + }, "licenseNumber": { "maxLength": 100, "minLength": 1, @@ -50,6 +54,7 @@ "familyName", "licenseJurisdiction", "compact", + "licenseType", "licenseNumber" ], "type": "object" From a4e52fb405ea6bd6973267746744f2848cfc5894 Mon Sep 17 00:00:00 2001 From: Landon Shumway Date: Fri, 27 Mar 2026 12:24:31 -0500 Subject: [PATCH 15/36] Add public license api model to response schema --- .../stacks/api_stack/v1_api/api_model.py | 36 +++++++++ .../PUBLIC_GET_PROVIDER_RESPONSE_SCHEMA.json | 77 +++++++++++++++++++ 2 files changed, 113 insertions(+) diff --git a/backend/cosmetology-app/stacks/api_stack/v1_api/api_model.py b/backend/cosmetology-app/stacks/api_stack/v1_api/api_model.py index 8713352bb..b71c5f320 100644 --- a/backend/cosmetology-app/stacks/api_stack/v1_api/api_model.py +++ b/backend/cosmetology-app/stacks/api_stack/v1_api/api_model.py @@ -1409,6 +1409,11 @@ def _public_provider_detailed_response_schema(self): 'familyName', ], properties={ + 'licenses': JsonSchema( + type=JsonSchemaType.ARRAY, + description='Sanitized home-state license rows (LicensePublicResponseSchema)', + items=self._public_license_public_response_schema, + ), 'privileges': JsonSchema( type=JsonSchemaType.ARRAY, items=self._public_privilege_response_schema, @@ -1417,6 +1422,37 @@ def _public_provider_detailed_response_schema(self): }, ) + @property + def _public_license_public_response_schema(self): + """License items in public GET provider responses; mirrors LicensePublicResponseSchema.""" + stack: AppStack = AppStack.of(self.api) + return JsonSchema( + type=JsonSchemaType.OBJECT, + required=[ + 'type', + 'compact', + 'jurisdiction', + 'licenseType', + 'licenseStatus', + 'compactEligibility', + 'dateOfExpiration', + 'licenseNumber', + ], + properties={ + 'type': JsonSchema(type=JsonSchemaType.STRING, enum=['license']), + 'compact': JsonSchema(type=JsonSchemaType.STRING, enum=stack.node.get_context('compacts')), + 'jurisdiction': JsonSchema( + type=JsonSchemaType.STRING, + enum=stack.node.get_context('jurisdictions'), + ), + 'licenseType': JsonSchema(type=JsonSchemaType.STRING, enum=self.stack.license_type_names), + 'licenseStatus': JsonSchema(type=JsonSchemaType.STRING, enum=['active', 'inactive']), + 'compactEligibility': JsonSchema(type=JsonSchemaType.STRING, enum=['eligible', 'ineligible']), + 'dateOfExpiration': JsonSchema(type=JsonSchemaType.STRING, format='date', pattern=cc_api.YMD_FORMAT), + 'licenseNumber': JsonSchema(type=JsonSchemaType.STRING, min_length=1, max_length=100), + }, + ) + @property def _public_privilege_response_schema(self): """Schema for public privilege responses""" diff --git a/backend/cosmetology-app/tests/resources/snapshots/PUBLIC_GET_PROVIDER_RESPONSE_SCHEMA.json b/backend/cosmetology-app/tests/resources/snapshots/PUBLIC_GET_PROVIDER_RESPONSE_SCHEMA.json index 1b7cd6c94..0df43f560 100644 --- a/backend/cosmetology-app/tests/resources/snapshots/PUBLIC_GET_PROVIDER_RESPONSE_SCHEMA.json +++ b/backend/cosmetology-app/tests/resources/snapshots/PUBLIC_GET_PROVIDER_RESPONSE_SCHEMA.json @@ -1,5 +1,82 @@ { "properties": { + "licenses": { + "description": "Sanitized home-state license rows (LicensePublicResponseSchema)", + "items": { + "properties": { + "type": { + "enum": [ + "license" + ], + "type": "string" + }, + "compact": { + "enum": [ + "cosm" + ], + "type": "string" + }, + "jurisdiction": { + "enum": [ + "al", + "az", + "co", + "ks", + "ky", + "md", + "oh", + "tn", + "va", + "wa" + ], + "type": "string" + }, + "licenseType": { + "enum": [ + "cosmetologist", + "esthetician" + ], + "type": "string" + }, + "licenseStatus": { + "enum": [ + "active", + "inactive" + ], + "type": "string" + }, + "compactEligibility": { + "enum": [ + "eligible", + "ineligible" + ], + "type": "string" + }, + "dateOfExpiration": { + "format": "date", + "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "type": "string" + }, + "licenseNumber": { + "maxLength": 100, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "type", + "compact", + "jurisdiction", + "licenseType", + "licenseStatus", + "compactEligibility", + "dateOfExpiration", + "licenseNumber" + ], + "type": "object" + }, + "type": "array" + }, "privileges": { "items": { "properties": { From 15486e256a112d0c4605266a8bd8b0c2dd30e0fc Mon Sep 17 00:00:00 2001 From: Landon Shumway Date: Fri, 27 Mar 2026 12:28:29 -0500 Subject: [PATCH 16/36] Remove aa and history fields from privilege public response model --- .../stacks/api_stack/v1_api/api_model.py | 105 -------- .../PUBLIC_GET_PROVIDER_RESPONSE_SCHEMA.json | 226 ------------------ 2 files changed, 331 deletions(-) diff --git a/backend/cosmetology-app/stacks/api_stack/v1_api/api_model.py b/backend/cosmetology-app/stacks/api_stack/v1_api/api_model.py index b71c5f320..e4972ccf1 100644 --- a/backend/cosmetology-app/stacks/api_stack/v1_api/api_model.py +++ b/backend/cosmetology-app/stacks/api_stack/v1_api/api_model.py @@ -1486,111 +1486,6 @@ def _public_privilege_response_schema(self): 'dateOfExpiration': JsonSchema(type=JsonSchemaType.STRING, format='date', pattern=cc_api.YMD_FORMAT), 'administratorSetStatus': JsonSchema(type=JsonSchemaType.STRING, enum=['active', 'inactive']), 'status': JsonSchema(type=JsonSchemaType.STRING, enum=['active', 'inactive']), - 'history': JsonSchema( - type=JsonSchemaType.ARRAY, - items=JsonSchema( - type=JsonSchemaType.OBJECT, - required=[ - 'type', - 'updateType', - 'providerId', - 'compact', - 'jurisdiction', - 'licenseType', - 'dateOfUpdate', - 'previous', - 'updatedValues', - ], - properties={ - 'type': JsonSchema(type=JsonSchemaType.STRING, enum=['privilegeUpdate']), - 'updateType': self._update_type_schema, - 'providerId': JsonSchema(type=JsonSchemaType.STRING, pattern=cc_api.UUID4_FORMAT), - 'compact': JsonSchema(type=JsonSchemaType.STRING, enum=stack.node.get_context('compacts')), - 'jurisdiction': JsonSchema( - type=JsonSchemaType.STRING, - enum=stack.node.get_context('jurisdictions'), - ), - 'licenseType': JsonSchema(type=JsonSchemaType.STRING, enum=self.stack.license_type_names), - 'dateOfUpdate': JsonSchema(type=JsonSchemaType.STRING, format='date-time'), - 'previous': JsonSchema( - type=JsonSchemaType.OBJECT, - required=[ - 'administratorSetStatus', - 'dateOfExpiration', - 'licenseJurisdiction', - ], - properties={ - 'administratorSetStatus': JsonSchema( - type=JsonSchemaType.STRING, enum=['active', 'inactive'] - ), - 'dateOfExpiration': JsonSchema( - type=JsonSchemaType.STRING, format='date', pattern=cc_api.YMD_FORMAT - ), - 'licenseJurisdiction': JsonSchema( - type=JsonSchemaType.STRING, - enum=stack.node.get_context('jurisdictions'), - ), - }, - ), - 'updatedValues': JsonSchema( - type=JsonSchemaType.OBJECT, - properties={ - 'administratorSetStatus': JsonSchema( - type=JsonSchemaType.STRING, enum=['active', 'inactive'] - ), - 'dateOfExpiration': JsonSchema( - type=JsonSchemaType.STRING, format='date', pattern=cc_api.YMD_FORMAT - ), - 'licenseJurisdiction': JsonSchema( - type=JsonSchemaType.STRING, - enum=stack.node.get_context('jurisdictions'), - ), - }, - ), - }, - ), - ), - 'adverseActions': JsonSchema( - type=JsonSchemaType.ARRAY, - items=JsonSchema( - type=JsonSchemaType.OBJECT, - required=[ - 'type', - 'compact', - 'providerId', - 'jurisdiction', - 'licenseTypeAbbreviation', - 'licenseType', - 'actionAgainst', - 'effectiveStartDate', - 'creationDate', - 'adverseActionId', - 'dateOfUpdate', - ], - properties={ - 'type': JsonSchema(type=JsonSchemaType.STRING, enum=['adverseAction']), - 'compact': JsonSchema(type=JsonSchemaType.STRING, enum=stack.node.get_context('compacts')), - 'providerId': JsonSchema(type=JsonSchemaType.STRING, pattern=cc_api.UUID4_FORMAT), - 'jurisdiction': JsonSchema( - type=JsonSchemaType.STRING, enum=stack.node.get_context('jurisdictions') - ), - 'licenseTypeAbbreviation': JsonSchema(type=JsonSchemaType.STRING), - 'licenseType': JsonSchema(type=JsonSchemaType.STRING), - 'actionAgainst': JsonSchema(type=JsonSchemaType.STRING), - 'effectiveStartDate': JsonSchema( - type=JsonSchemaType.STRING, format='date', pattern=cc_api.YMD_FORMAT - ), - 'creationDate': JsonSchema( - type=JsonSchemaType.STRING, format='date', pattern=cc_api.YMD_FORMAT - ), - 'adverseActionId': JsonSchema(type=JsonSchemaType.STRING), - 'effectiveLiftDate': JsonSchema( - type=JsonSchemaType.STRING, format='date', pattern=cc_api.YMD_FORMAT - ), - 'dateOfUpdate': JsonSchema(type=JsonSchemaType.STRING, format='date-time'), - }, - ), - ), }, ) diff --git a/backend/cosmetology-app/tests/resources/snapshots/PUBLIC_GET_PROVIDER_RESPONSE_SCHEMA.json b/backend/cosmetology-app/tests/resources/snapshots/PUBLIC_GET_PROVIDER_RESPONSE_SCHEMA.json index 0df43f560..ed852baa7 100644 --- a/backend/cosmetology-app/tests/resources/snapshots/PUBLIC_GET_PROVIDER_RESPONSE_SCHEMA.json +++ b/backend/cosmetology-app/tests/resources/snapshots/PUBLIC_GET_PROVIDER_RESPONSE_SCHEMA.json @@ -151,232 +151,6 @@ "inactive" ], "type": "string" - }, - "history": { - "items": { - "properties": { - "type": { - "enum": [ - "privilegeUpdate" - ], - "type": "string" - }, - "updateType": { - "enum": [ - "deactivation", - "expiration", - "issuance", - "other", - "renewal", - "encumbrance", - "lifting_encumbrance", - "licenseDeactivation" - ], - "type": "string" - }, - "providerId": { - "pattern": "[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab]{1}[0-9a-f]{3}-[0-9a-f]{12}", - "type": "string" - }, - "compact": { - "enum": [ - "cosm" - ], - "type": "string" - }, - "jurisdiction": { - "enum": [ - "al", - "az", - "co", - "ks", - "ky", - "md", - "oh", - "tn", - "va", - "wa" - ], - "type": "string" - }, - "licenseType": { - "enum": [ - "cosmetologist", - "esthetician" - ], - "type": "string" - }, - "dateOfUpdate": { - "format": "date-time", - "type": "string" - }, - "previous": { - "properties": { - "administratorSetStatus": { - "enum": [ - "active", - "inactive" - ], - "type": "string" - }, - "dateOfExpiration": { - "format": "date", - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", - "type": "string" - }, - "licenseJurisdiction": { - "enum": [ - "al", - "az", - "co", - "ks", - "ky", - "md", - "oh", - "tn", - "va", - "wa" - ], - "type": "string" - } - }, - "required": [ - "administratorSetStatus", - "dateOfExpiration", - "licenseJurisdiction" - ], - "type": "object" - }, - "updatedValues": { - "properties": { - "administratorSetStatus": { - "enum": [ - "active", - "inactive" - ], - "type": "string" - }, - "dateOfExpiration": { - "format": "date", - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", - "type": "string" - }, - "licenseJurisdiction": { - "enum": [ - "al", - "az", - "co", - "ks", - "ky", - "md", - "oh", - "tn", - "va", - "wa" - ], - "type": "string" - } - }, - "type": "object" - } - }, - "required": [ - "type", - "updateType", - "providerId", - "compact", - "jurisdiction", - "licenseType", - "dateOfUpdate", - "previous", - "updatedValues" - ], - "type": "object" - }, - "type": "array" - }, - "adverseActions": { - "items": { - "properties": { - "type": { - "enum": [ - "adverseAction" - ], - "type": "string" - }, - "compact": { - "enum": [ - "cosm" - ], - "type": "string" - }, - "providerId": { - "pattern": "[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab]{1}[0-9a-f]{3}-[0-9a-f]{12}", - "type": "string" - }, - "jurisdiction": { - "enum": [ - "al", - "az", - "co", - "ks", - "ky", - "md", - "oh", - "tn", - "va", - "wa" - ], - "type": "string" - }, - "licenseTypeAbbreviation": { - "type": "string" - }, - "licenseType": { - "type": "string" - }, - "actionAgainst": { - "type": "string" - }, - "effectiveStartDate": { - "format": "date", - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", - "type": "string" - }, - "creationDate": { - "format": "date", - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", - "type": "string" - }, - "adverseActionId": { - "type": "string" - }, - "effectiveLiftDate": { - "format": "date", - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", - "type": "string" - }, - "dateOfUpdate": { - "format": "date-time", - "type": "string" - } - }, - "required": [ - "type", - "compact", - "providerId", - "jurisdiction", - "licenseTypeAbbreviation", - "licenseType", - "actionAgainst", - "effectiveStartDate", - "creationDate", - "adverseActionId", - "dateOfUpdate" - ], - "type": "object" - }, - "type": "array" } }, "required": [ From 32787305ecf8b2d91ad7468bd983a4249317dc53 Mon Sep 17 00:00:00 2001 From: Landon Shumway Date: Fri, 27 Mar 2026 13:14:41 -0500 Subject: [PATCH 17/36] Update API specs to latest --- .../docs/api-specification/latest-oas30.json | 24 +- .../api-specification/latest-oas30.json | 4760 +++++++++-------- .../internal/postman/postman-collection.json | 212 +- .../docs/postman/postman-collection.json | 22 +- .../api-specification/latest-oas30.json | 78 +- .../postman/postman-collection.json | 8 +- 6 files changed, 2562 insertions(+), 2542 deletions(-) diff --git a/backend/cosmetology-app/docs/api-specification/latest-oas30.json b/backend/cosmetology-app/docs/api-specification/latest-oas30.json index a1d0e94a3..70ed01a4b 100644 --- a/backend/cosmetology-app/docs/api-specification/latest-oas30.json +++ b/backend/cosmetology-app/docs/api-specification/latest-oas30.json @@ -2,7 +2,7 @@ "openapi": "3.0.1", "info": { "title": "StateApi", - "version": "2026-02-16T16:29:16Z" + "version": "2026-03-13T17:32:08Z" }, "servers": [ { @@ -74,7 +74,16 @@ { "SandboxStateAPIStackStateApiStateAuthAuthorizer7F83A6D3": [ "cosm/write", - "az/cosm.write" + "al/cosm.write", + "az/cosm.write", + "co/cosm.write", + "ks/cosm.write", + "ky/cosm.write", + "md/cosm.write", + "oh/cosm.write", + "tn/cosm.write", + "va/cosm.write", + "wa/cosm.write" ] } ] @@ -124,7 +133,16 @@ { "SandboxStateAPIStackStateApiStateAuthAuthorizer7F83A6D3": [ "cosm/write", - "az/cosm.write" + "al/cosm.write", + "az/cosm.write", + "co/cosm.write", + "ks/cosm.write", + "ky/cosm.write", + "md/cosm.write", + "oh/cosm.write", + "tn/cosm.write", + "va/cosm.write", + "wa/cosm.write" ] } ] diff --git a/backend/cosmetology-app/docs/internal/api-specification/latest-oas30.json b/backend/cosmetology-app/docs/internal/api-specification/latest-oas30.json index c69959e20..75b8b2058 100644 --- a/backend/cosmetology-app/docs/internal/api-specification/latest-oas30.json +++ b/backend/cosmetology-app/docs/internal/api-specification/latest-oas30.json @@ -2,7 +2,7 @@ "openapi": "3.0.1", "info": { "title": "LicenseApi", - "version": "2026-02-27T15:29:27Z" + "version": "2026-03-27T16:48:03Z" }, "servers": [ { @@ -36,7 +36,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SandboLicenqza9dE2UnEU1" + "$ref": "#/components/schemas/SandboLicen7ttv4cZS4giU" } } } @@ -73,7 +73,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SandboLicenABWdja2fpGrf" + "$ref": "#/components/schemas/SandboLicen8c9UvYiiWSov" } } }, @@ -85,7 +85,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SandboLicentIcqTWOgUIGm" + "$ref": "#/components/schemas/SandboLicenoUuAvkbDI3RY" } } } @@ -136,7 +136,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SandboLicenmIdUa45H3yV3" + "$ref": "#/components/schemas/SandboLicenkrLrsMciNA4g" } } } @@ -185,7 +185,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SandboLicenVzNQc01P5WRr" + "$ref": "#/components/schemas/SandboLicen2Vz3YGPLLiyw" } } } @@ -230,7 +230,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SandboLicenAZYObIVGD6AE" + "$ref": "#/components/schemas/SandboLicenrIIW1WWuAg11" } } }, @@ -242,7 +242,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SandboLicentIcqTWOgUIGm" + "$ref": "#/components/schemas/SandboLicenoUuAvkbDI3RY" } } } @@ -301,7 +301,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SandboLicendw4AUcBtsulc" + "$ref": "#/components/schemas/SandboLicenz9o6U9FoduDo" } } } @@ -350,7 +350,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SandboLicenXTP0xFadIMHH" + "$ref": "#/components/schemas/SandboLicenFmIDl0vIO4Wx" } } }, @@ -362,7 +362,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SandboLicenQjARLDBg8yqp" + "$ref": "#/components/schemas/SandboLicencx4uEmf1xIGK" } } } @@ -411,7 +411,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SandboLicengNz6BQmOzv9N" + "$ref": "#/components/schemas/SandboLicen35ID7rKg6pmg" } } } @@ -474,7 +474,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SandboLicen905yAh4VGw9c" + "$ref": "#/components/schemas/SandboLicenbdgqjZHiRCin" } } }, @@ -486,7 +486,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SandboLicentIcqTWOgUIGm" + "$ref": "#/components/schemas/SandboLicenoUuAvkbDI3RY" } } } @@ -567,7 +567,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SandboLicenY31VDvsVuYXJ" + "$ref": "#/components/schemas/SandboLicenTMNnpZtssvOZ" } } }, @@ -579,7 +579,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SandboLicentIcqTWOgUIGm" + "$ref": "#/components/schemas/SandboLicenoUuAvkbDI3RY" } } } @@ -652,7 +652,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SandboLicennxxmBbSCJcel" + "$ref": "#/components/schemas/SandboLicenSOFKnGm6KsSr" } } }, @@ -664,7 +664,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SandboLicentIcqTWOgUIGm" + "$ref": "#/components/schemas/SandboLicenoUuAvkbDI3RY" } } } @@ -745,7 +745,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SandboLicenTiUhKamH8kWG" + "$ref": "#/components/schemas/SandboLicen1BRGGYZ2H9BZ" } } }, @@ -757,7 +757,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SandboLicentIcqTWOgUIGm" + "$ref": "#/components/schemas/SandboLicenoUuAvkbDI3RY" } } } @@ -830,7 +830,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SandboLicentzGiICqenA1I" + "$ref": "#/components/schemas/SandboLicenGJKqabDhc7zG" } } }, @@ -842,7 +842,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SandboLicentIcqTWOgUIGm" + "$ref": "#/components/schemas/SandboLicenoUuAvkbDI3RY" } } } @@ -923,7 +923,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SandboLicenTdkUw59snX0Q" + "$ref": "#/components/schemas/SandboLicene9LoNzFMzxyp" } } }, @@ -935,7 +935,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SandboLicentIcqTWOgUIGm" + "$ref": "#/components/schemas/SandboLicenoUuAvkbDI3RY" } } } @@ -1008,7 +1008,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SandboLicenBxCMDP0yz42u" + "$ref": "#/components/schemas/SandboLicendc4CujpQTISE" } } }, @@ -1020,7 +1020,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SandboLicentIcqTWOgUIGm" + "$ref": "#/components/schemas/SandboLicenoUuAvkbDI3RY" } } } @@ -1101,7 +1101,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SandboLicenuVRFe60q6S7D" + "$ref": "#/components/schemas/SandboLicenJUCiAgoCMvNX" } } }, @@ -1113,7 +1113,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SandboLicentIcqTWOgUIGm" + "$ref": "#/components/schemas/SandboLicenoUuAvkbDI3RY" } } } @@ -1172,7 +1172,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SandboLicenGJ2Vrxb2wvlG" + "$ref": "#/components/schemas/SandboLicenL9pTEzhVX7rk" } } } @@ -1222,7 +1222,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SandboLicengSyqbaS5PyUI" + "$ref": "#/components/schemas/SandboLicen14sZXYfvuEUn" } } } @@ -1261,7 +1261,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SandboLicenMQ8w3yNRTuci" + "$ref": "#/components/schemas/SandboLicenub1ZBTU9W6qw" } } }, @@ -1280,7 +1280,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SandboLicenjPULg4TeFeF1" + "$ref": "#/components/schemas/SandboLicenDFkhWUSCFcZm" } } } @@ -1331,7 +1331,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SandboLicentIcqTWOgUIGm" + "$ref": "#/components/schemas/SandboLicenoUuAvkbDI3RY" } } } @@ -1348,7 +1348,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SandboLicenjPULg4TeFeF1" + "$ref": "#/components/schemas/SandboLicenDFkhWUSCFcZm" } } } @@ -1397,7 +1397,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SandboLicentIcqTWOgUIGm" + "$ref": "#/components/schemas/SandboLicenoUuAvkbDI3RY" } } } @@ -1407,7 +1407,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SandboLicentIcqTWOgUIGm" + "$ref": "#/components/schemas/SandboLicenoUuAvkbDI3RY" } } } @@ -1454,7 +1454,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SandboLicenTD8eYiNU2b3J" + "$ref": "#/components/schemas/SandboLicenOURP3fzKxUd9" } } }, @@ -1466,7 +1466,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SandboLicentIcqTWOgUIGm" + "$ref": "#/components/schemas/SandboLicenoUuAvkbDI3RY" } } } @@ -1483,7 +1483,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SandboLicenjPULg4TeFeF1" + "$ref": "#/components/schemas/SandboLicenDFkhWUSCFcZm" } } } @@ -1534,7 +1534,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SandboLicentIcqTWOgUIGm" + "$ref": "#/components/schemas/SandboLicenoUuAvkbDI3RY" } } } @@ -1544,7 +1544,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SandboLicentIcqTWOgUIGm" + "$ref": "#/components/schemas/SandboLicenoUuAvkbDI3RY" } } } @@ -1585,7 +1585,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SandboLicenxdosUrB9q9s6" + "$ref": "#/components/schemas/SandboLicencffN3I5vrayp" } } }, @@ -1597,7 +1597,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SandboLicenVVd6s0tk4Osi" + "$ref": "#/components/schemas/SandboLicens761O5xFOa9i" } } } @@ -1623,7 +1623,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SandboLicenmIdUa45H3yV3" + "$ref": "#/components/schemas/SandboLicenkrLrsMciNA4g" } } } @@ -1647,7 +1647,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SandboLicenXTP0xFadIMHH" + "$ref": "#/components/schemas/SandboLicenFmIDl0vIO4Wx" } } }, @@ -1659,7 +1659,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SandboLicenMplIbIWayHWa" + "$ref": "#/components/schemas/SandboLicen27qpKUeWihE2" } } } @@ -1693,7 +1693,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SandboLicen7muYupt1OyB4" + "$ref": "#/components/schemas/SandboLicenDor5iRpVkAJb" } } } @@ -1718,7 +1718,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SandboLicenPUwIzAMSlfRh" + "$ref": "#/components/schemas/SandboLicenNqOvNMkAA7cK" } } } @@ -1734,7 +1734,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SandboLicentIcqTWOgUIGm" + "$ref": "#/components/schemas/SandboLicenoUuAvkbDI3RY" } } } @@ -1751,7 +1751,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SandboLicenjPULg4TeFeF1" + "$ref": "#/components/schemas/SandboLicenDFkhWUSCFcZm" } } } @@ -1770,7 +1770,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SandboLicenMcATit6vegoa" + "$ref": "#/components/schemas/SandboLicenUZbApOOB9TTq" } } }, @@ -1782,7 +1782,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SandboLicentIcqTWOgUIGm" + "$ref": "#/components/schemas/SandboLicenoUuAvkbDI3RY" } } } @@ -1799,7 +1799,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SandboLicenjPULg4TeFeF1" + "$ref": "#/components/schemas/SandboLicenDFkhWUSCFcZm" } } } @@ -1817,54 +1817,125 @@ }, "components": { "schemas": { - "SandboLicenBxCMDP0yz42u": { + "SandboLicenDFkhWUSCFcZm": { + "required": [ + "attributes", + "permissions", + "status", + "userId" + ], "type": "object", - "properties": {} + "properties": { + "permissions": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "actions": { + "type": "object", + "properties": { + "readPrivate": { + "type": "boolean" + }, + "admin": { + "type": "boolean" + }, + "readSSN": { + "type": "boolean" + } + } + }, + "jurisdictions": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "actions": { + "type": "object", + "properties": { + "readPrivate": { + "type": "boolean" + }, + "admin": { + "type": "boolean" + }, + "write": { + "type": "boolean" + }, + "readSSN": { + "type": "boolean" + } + }, + "additionalProperties": false + } + } + } + } + }, + "additionalProperties": false + } + }, + "attributes": { + "required": [ + "email", + "familyName", + "givenName" + ], + "type": "object", + "properties": { + "givenName": { + "maxLength": 100, + "minLength": 1, + "type": "string" + }, + "familyName": { + "maxLength": 100, + "minLength": 1, + "type": "string" + }, + "email": { + "maxLength": 100, + "minLength": 5, + "type": "string" + } + }, + "additionalProperties": false + }, + "userId": { + "type": "string" + }, + "status": { + "type": "string", + "enum": [ + "active", + "inactive" + ] + } + }, + "additionalProperties": false }, - "SandboLicen7muYupt1OyB4": { + "SandboLicen8c9UvYiiWSov": { "required": [ - "compact", - "dateOfUpdate", - "familyName", - "givenName", - "licenseJurisdiction", - "providerId", - "type" + "compactAdverseActionsNotificationEmails", + "compactOperationsTeamEmails", + "configuredStates", + "licenseeRegistrationEnabled" ], "type": "object", "properties": { - "privileges": { + "configuredStates": { "type": "array", + "description": "List of states that have submitted configurations and their live status", "items": { "required": [ - "administratorSetStatus", - "compact", - "dateOfExpiration", - "jurisdiction", - "licenseJurisdiction", - "licenseType", - "providerId", - "status", - "type" + "isLive", + "postalAbbreviation" ], "type": "object", "properties": { - "licenseType": { - "type": "string", - "enum": [ - "cosmetologist", - "esthetician" - ] - }, - "administratorSetStatus": { - "type": "string", - "enum": [ - "active", - "inactive" - ] - }, - "licenseJurisdiction": { + "postalAbbreviation": { "type": "string", + "description": "The postal abbreviation of the jurisdiction", "enum": [ "al", "az", @@ -1878,350 +1949,70 @@ "wa" ] }, - "dateOfExpiration": { - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", - "type": "string", - "format": "date" - }, - "compact": { - "type": "string", - "enum": [ - "cosm" - ] - }, - "providerId": { - "pattern": "[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab]{1}[0-9a-f]{3}-[0-9a-f]{12}", - "type": "string" - }, - "jurisdiction": { - "type": "string", - "enum": [ - "al", - "az", - "co", - "ks", - "ky", - "md", - "oh", - "tn", - "va", - "wa" - ] - }, - "history": { - "type": "array", - "items": { - "required": [ - "compact", - "dateOfUpdate", - "jurisdiction", - "licenseType", - "previous", - "providerId", - "type", - "updateType", - "updatedValues" - ], - "type": "object", - "properties": { - "licenseType": { - "type": "string", - "enum": [ - "cosmetologist", - "esthetician" - ] - }, - "compact": { - "type": "string", - "enum": [ - "cosm" - ] - }, - "previous": { - "required": [ - "administratorSetStatus", - "dateOfExpiration", - "licenseJurisdiction" - ], - "type": "object", - "properties": { - "administratorSetStatus": { - "type": "string", - "enum": [ - "active", - "inactive" - ] - }, - "dateOfExpiration": { - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", - "type": "string", - "format": "date" - }, - "licenseJurisdiction": { - "type": "string", - "enum": [ - "al", - "az", - "co", - "ks", - "ky", - "md", - "oh", - "tn", - "va", - "wa" - ] - } - } - }, - "providerId": { - "pattern": "[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab]{1}[0-9a-f]{3}-[0-9a-f]{12}", - "type": "string" - }, - "jurisdiction": { - "type": "string", - "enum": [ - "al", - "az", - "co", - "ks", - "ky", - "md", - "oh", - "tn", - "va", - "wa" - ] - }, - "updatedValues": { - "type": "object", - "properties": { - "administratorSetStatus": { - "type": "string", - "enum": [ - "active", - "inactive" - ] - }, - "dateOfExpiration": { - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", - "type": "string", - "format": "date" - }, - "licenseJurisdiction": { - "type": "string", - "enum": [ - "al", - "az", - "co", - "ks", - "ky", - "md", - "oh", - "tn", - "va", - "wa" - ] - } - } - }, - "type": { - "type": "string", - "enum": [ - "privilegeUpdate" - ] - }, - "dateOfUpdate": { - "type": "string", - "format": "date-time" - }, - "updateType": { - "type": "string", - "enum": [ - "deactivation", - "expiration", - "issuance", - "other", - "renewal", - "encumbrance", - "lifting_encumbrance", - "licenseDeactivation" - ] - } - } - } - }, - "type": { - "type": "string", - "enum": [ - "privilege" - ] - }, - "adverseActions": { - "type": "array", - "items": { - "required": [ - "actionAgainst", - "adverseActionId", - "compact", - "creationDate", - "dateOfUpdate", - "effectiveStartDate", - "jurisdiction", - "licenseType", - "licenseTypeAbbreviation", - "providerId", - "type" - ], - "type": "object", - "properties": { - "licenseType": { - "type": "string" - }, - "compact": { - "type": "string", - "enum": [ - "cosm" - ] - }, - "providerId": { - "pattern": "[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab]{1}[0-9a-f]{3}-[0-9a-f]{12}", - "type": "string" - }, - "jurisdiction": { - "type": "string", - "enum": [ - "al", - "az", - "co", - "ks", - "ky", - "md", - "oh", - "tn", - "va", - "wa" - ] - }, - "effectiveStartDate": { - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", - "type": "string", - "format": "date" - }, - "licenseTypeAbbreviation": { - "type": "string" - }, - "adverseActionId": { - "type": "string" - }, - "effectiveLiftDate": { - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", - "type": "string", - "format": "date" - }, - "type": { - "type": "string", - "enum": [ - "adverseAction" - ] - }, - "creationDate": { - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", - "type": "string", - "format": "date" - }, - "actionAgainst": { - "type": "string" - }, - "dateOfUpdate": { - "type": "string", - "format": "date-time" - } - } - } - }, - "status": { - "type": "string", - "enum": [ - "active", - "inactive" - ] - } - } - } - }, - "licenseJurisdiction": { - "type": "string", - "enum": [ - "al", - "az", - "co", - "ks", - "ky", - "md", - "oh", - "tn", - "va", - "wa" - ] - }, - "compact": { - "type": "string", - "enum": [ - "cosm" - ] - }, - "providerId": { - "pattern": "[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab]{1}[0-9a-f]{3}-[0-9a-f]{12}", - "type": "string" - }, - "givenName": { - "maxLength": 100, - "minLength": 1, - "type": "string" - }, - "familyName": { - "maxLength": 100, - "minLength": 1, - "type": "string" - }, - "middleName": { - "maxLength": 100, - "minLength": 1, - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "provider" - ] - }, - "suffix": { - "maxLength": 100, - "minLength": 1, - "type": "string" - }, - "dateOfUpdate": { - "type": "string", - "format": "date-time" - } - } - }, - "SandboLicenxdosUrB9q9s6": { - "type": "object", - "properties": { - "context": { - "type": "object", - "properties": { - "userId": { - "maxLength": 100, - "minLength": 1, - "type": "string", - "description": "Optional user ID for feature flag evaluation" - }, - "customAttributes": { - "type": "object", - "additionalProperties": { + "isLive": { + "type": "boolean", + "description": "Whether the state is live and available for registrations." + } + }, + "additionalProperties": false + } + }, + "compactAdverseActionsNotificationEmails": { + "maxItems": 10, + "minItems": 1, + "uniqueItems": true, + "type": "array", + "description": "List of email addresses for adverse actions notifications", + "items": { + "type": "string", + "format": "email" + } + }, + "licenseeRegistrationEnabled": { + "type": "boolean", + "description": "Denotes whether licensee registration is enabled" + }, + "compactOperationsTeamEmails": { + "maxItems": 10, + "minItems": 1, + "uniqueItems": true, + "type": "array", + "description": "List of email addresses for operations team notifications", + "items": { + "type": "string", + "format": "email" + } + } + }, + "additionalProperties": false + }, + "SandboLicenoUuAvkbDI3RY": { + "required": [ + "message" + ], + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "A message about the request" + } + } + }, + "SandboLicencffN3I5vrayp": { + "type": "object", + "properties": { + "context": { + "type": "object", + "properties": { + "userId": { + "maxLength": 100, + "minLength": 1, + "type": "string", + "description": "Optional user ID for feature flag evaluation" + }, + "customAttributes": { + "type": "object", + "additionalProperties": { "type": "string" }, "description": "Optional custom attributes for feature flag evaluation" @@ -2233,7 +2024,7 @@ }, "additionalProperties": false }, - "SandboLicenXTP0xFadIMHH": { + "SandboLicenFmIDl0vIO4Wx": { "required": [ "query" ], @@ -2288,6 +2079,12 @@ "maxLength": 100, "type": "string", "description": "Filter for providers with a family name" + }, + "licenseNumber": { + "maxLength": 100, + "minLength": 1, + "type": "string", + "description": "Filter for licenses with a specific license number" } }, "additionalProperties": false, @@ -2321,105 +2118,306 @@ }, "additionalProperties": false }, - "SandboLicendw4AUcBtsulc": { + "SandboLicen27qpKUeWihE2": { "required": [ - "upload" + "pagination", + "providers" + ], + "type": "object", + "properties": { + "pagination": { + "type": "object", + "properties": { + "prevLastKey": { + "maxLength": 1024, + "minLength": 1, + "type": "object" + }, + "lastKey": { + "maxLength": 1024, + "minLength": 1, + "type": "object" + }, + "pageSize": { + "maximum": 100, + "minimum": 5, + "type": "integer" + } + } + }, + "query": { + "type": "object", + "properties": { + "providerId": { + "pattern": "[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab]{1}[0-9a-f]{3}-[0-9a-f]{12}", + "type": "string", + "description": "Internal UUID for the provider" + }, + "jurisdiction": { + "type": "string", + "description": "Filter for providers with privilege/license in a jurisdiction", + "enum": [ + "al", + "az", + "co", + "ks", + "ky", + "md", + "oh", + "tn", + "va", + "wa" + ] + }, + "givenName": { + "maxLength": 100, + "type": "string", + "description": "Filter for providers with a given name" + }, + "familyName": { + "maxLength": 100, + "type": "string", + "description": "Filter for providers with a family name" + }, + "licenseNumber": { + "maxLength": 100, + "minLength": 1, + "type": "string", + "description": "Filter for licenses with a specific license number" + } + } + }, + "sorting": { + "required": [ + "key" + ], + "type": "object", + "properties": { + "key": { + "type": "string", + "description": "The key to sort results by", + "enum": [ + "dateOfUpdate", + "familyName" + ] + }, + "direction": { + "type": "string", + "description": "Direction to sort results by", + "enum": [ + "ascending", + "descending" + ] + } + }, + "description": "How to sort results" + }, + "providers": { + "maxLength": 100, + "type": "array", + "items": { + "required": [ + "compact", + "familyName", + "givenName", + "licenseJurisdiction", + "licenseNumber", + "licenseType", + "providerId" + ], + "type": "object", + "properties": { + "licenseType": { + "type": "string", + "description": "License type or profession designation for this license row" + }, + "licenseJurisdiction": { + "type": "string", + "enum": [ + "al", + "az", + "co", + "ks", + "ky", + "md", + "oh", + "tn", + "va", + "wa" + ] + }, + "compact": { + "type": "string", + "enum": [ + "cosm" + ] + }, + "providerId": { + "pattern": "[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab]{1}[0-9a-f]{3}-[0-9a-f]{12}", + "type": "string" + }, + "givenName": { + "maxLength": 100, + "minLength": 1, + "type": "string" + }, + "familyName": { + "maxLength": 100, + "minLength": 1, + "type": "string" + }, + "licenseNumber": { + "maxLength": 100, + "minLength": 1, + "type": "string" + } + } + } + } + } + }, + "SandboLicene9LoNzFMzxyp": { + "required": [ + "effectiveLiftDate" + ], + "type": "object", + "properties": { + "effectiveLiftDate": { + "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "type": "string", + "description": "The effective date when the encumbrance will be lifted", + "format": "date" + } + }, + "additionalProperties": false + }, + "SandboLicenrIIW1WWuAg11": { + "required": [ + "jurisdictionAdverseActionsNotificationEmails", + "jurisdictionOperationsTeamEmails", + "licenseeRegistrationEnabled" + ], + "type": "object", + "properties": { + "jurisdictionAdverseActionsNotificationEmails": { + "maxItems": 10, + "minItems": 1, + "uniqueItems": true, + "type": "array", + "description": "List of email addresses for adverse actions notifications", + "items": { + "type": "string", + "format": "email" + } + }, + "jurisdictionOperationsTeamEmails": { + "maxItems": 10, + "minItems": 1, + "uniqueItems": true, + "type": "array", + "description": "List of email addresses for operations team notifications", + "items": { + "type": "string", + "format": "email" + } + }, + "licenseeRegistrationEnabled": { + "type": "boolean", + "description": "Denotes whether licensee registration is enabled" + } + }, + "additionalProperties": false + }, + "SandboLicen2Vz3YGPLLiyw": { + "required": [ + "compact", + "jurisdictionAdverseActionsNotificationEmails", + "jurisdictionName", + "jurisdictionOperationsTeamEmails", + "licenseeRegistrationEnabled", + "postalAbbreviation" ], "type": "object", "properties": { - "upload": { - "required": [ - "fields", - "url" - ], - "type": "object", - "properties": { - "fields": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "url": { - "type": "string" - } + "postalAbbreviation": { + "type": "string", + "description": "The postal abbreviation of the jurisdiction" + }, + "jurisdictionAdverseActionsNotificationEmails": { + "type": "array", + "description": "List of email addresses for adverse actions notifications", + "items": { + "type": "string", + "format": "email" } + }, + "jurisdictionOperationsTeamEmails": { + "type": "array", + "description": "List of email addresses for operations team notifications", + "items": { + "type": "string", + "format": "email" + } + }, + "compact": { + "type": "string", + "description": "The compact this jurisdiction configuration belongs to", + "enum": [ + "cosm" + ] + }, + "licenseeRegistrationEnabled": { + "type": "boolean", + "description": "Denotes whether licensee registration is enabled" + }, + "jurisdictionName": { + "type": "string", + "description": "The name of the jurisdiction" } } }, - "SandboLicenQjARLDBg8yqp": { + "SandboLicenDor5iRpVkAJb": { "required": [ - "pagination", - "providers" + "compact", + "dateOfUpdate", + "familyName", + "givenName", + "licenseJurisdiction", + "providerId", + "type" ], "type": "object", "properties": { - "pagination": { - "type": "object", - "properties": { - "prevLastKey": { - "maxLength": 1024, - "minLength": 1, - "type": "object" - }, - "lastKey": { - "maxLength": 1024, - "minLength": 1, - "type": "object" - }, - "pageSize": { - "maximum": 100, - "minimum": 5, - "type": "integer" - } - } - }, - "sorting": { - "required": [ - "key" - ], - "type": "object", - "properties": { - "key": { - "type": "string", - "description": "The key to sort results by", - "enum": [ - "dateOfUpdate", - "familyName" - ] - }, - "direction": { - "type": "string", - "description": "Direction to sort results by", - "enum": [ - "ascending", - "descending" - ] - } - }, - "description": "How to sort results" - }, - "providers": { - "maxLength": 100, + "privileges": { "type": "array", "items": { "required": [ - "birthMonthDay", + "administratorSetStatus", "compact", - "compactEligibility", "dateOfExpiration", - "dateOfUpdate", - "familyName", - "givenName", - "jurisdictionUploadedCompactEligibility", - "jurisdictionUploadedLicenseStatus", + "jurisdiction", "licenseJurisdiction", - "licenseStatus", + "licenseType", "providerId", + "status", "type" ], "type": "object", "properties": { + "licenseType": { + "type": "string", + "enum": [ + "cosmetologist", + "esthetician" + ] + }, + "administratorSetStatus": { + "type": "string", + "enum": [ + "active", + "inactive" + ] + }, "licenseJurisdiction": { "type": "string", "enum": [ @@ -2435,399 +2433,362 @@ "wa" ] }, + "dateOfExpiration": { + "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "type": "string", + "format": "date" + }, "compact": { "type": "string", "enum": [ "cosm" ] }, - "givenName": { - "maxLength": 100, - "minLength": 1, + "providerId": { + "pattern": "[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab]{1}[0-9a-f]{3}-[0-9a-f]{12}", "type": "string" }, - "compactEligibility": { - "type": "string", - "enum": [ - "eligible", - "ineligible" - ] - }, - "jurisdictionUploadedCompactEligibility": { + "jurisdiction": { "type": "string", "enum": [ - "eligible", - "ineligible" + "al", + "az", + "co", + "ks", + "ky", + "md", + "oh", + "tn", + "va", + "wa" ] }, - "dateOfBirth": { - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", - "type": "string", - "format": "date" - }, - "jurisdictionUploadedLicenseStatus": { - "type": "string", - "enum": [ - "active", - "inactive" - ] + "history": { + "type": "array", + "items": { + "required": [ + "compact", + "dateOfUpdate", + "jurisdiction", + "licenseType", + "previous", + "providerId", + "type", + "updateType", + "updatedValues" + ], + "type": "object", + "properties": { + "licenseType": { + "type": "string", + "enum": [ + "cosmetologist", + "esthetician" + ] + }, + "compact": { + "type": "string", + "enum": [ + "cosm" + ] + }, + "previous": { + "required": [ + "administratorSetStatus", + "dateOfExpiration", + "licenseJurisdiction" + ], + "type": "object", + "properties": { + "administratorSetStatus": { + "type": "string", + "enum": [ + "active", + "inactive" + ] + }, + "dateOfExpiration": { + "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "type": "string", + "format": "date" + }, + "licenseJurisdiction": { + "type": "string", + "enum": [ + "al", + "az", + "co", + "ks", + "ky", + "md", + "oh", + "tn", + "va", + "wa" + ] + } + } + }, + "providerId": { + "pattern": "[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab]{1}[0-9a-f]{3}-[0-9a-f]{12}", + "type": "string" + }, + "jurisdiction": { + "type": "string", + "enum": [ + "al", + "az", + "co", + "ks", + "ky", + "md", + "oh", + "tn", + "va", + "wa" + ] + }, + "updatedValues": { + "type": "object", + "properties": { + "administratorSetStatus": { + "type": "string", + "enum": [ + "active", + "inactive" + ] + }, + "dateOfExpiration": { + "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "type": "string", + "format": "date" + }, + "licenseJurisdiction": { + "type": "string", + "enum": [ + "al", + "az", + "co", + "ks", + "ky", + "md", + "oh", + "tn", + "va", + "wa" + ] + } + } + }, + "type": { + "type": "string", + "enum": [ + "privilegeUpdate" + ] + }, + "dateOfUpdate": { + "type": "string", + "format": "date-time" + }, + "updateType": { + "type": "string", + "enum": [ + "deactivation", + "expiration", + "issuance", + "other", + "renewal", + "encumbrance", + "lifting_encumbrance", + "licenseDeactivation" + ] + } + } + } }, "type": { "type": "string", "enum": [ - "provider" - ] - }, - "suffix": { - "maxLength": 100, - "minLength": 1, - "type": "string" - }, - "ssnLastFour": { - "pattern": "^[0-9]{4}$", - "type": "string" - }, - "dateOfExpiration": { - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", - "type": "string", - "format": "date" - }, - "providerId": { - "pattern": "[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab]{1}[0-9a-f]{3}-[0-9a-f]{12}", - "type": "string" - }, - "licenseStatus": { - "type": "string", - "enum": [ - "active", - "inactive" + "privilege" ] }, - "familyName": { - "maxLength": 100, - "minLength": 1, - "type": "string" - }, - "middleName": { - "maxLength": 100, - "minLength": 1, - "type": "string" - }, - "birthMonthDay": { - "pattern": "^[01]{1}[0-9]{1}-[0-3]{1}[0-9]{1}$", - "type": "string", - "format": "date" - }, - "dateOfUpdate": { - "type": "string", - "format": "date-time" - } - } - } - } - } - }, - "SandboLicenVzNQc01P5WRr": { - "required": [ - "compact", - "jurisdictionAdverseActionsNotificationEmails", - "jurisdictionName", - "jurisdictionOperationsTeamEmails", - "licenseeRegistrationEnabled", - "postalAbbreviation" - ], - "type": "object", - "properties": { - "postalAbbreviation": { - "type": "string", - "description": "The postal abbreviation of the jurisdiction" - }, - "jurisdictionAdverseActionsNotificationEmails": { - "type": "array", - "description": "List of email addresses for adverse actions notifications", - "items": { - "type": "string", - "format": "email" - } - }, - "jurisdictionOperationsTeamEmails": { - "type": "array", - "description": "List of email addresses for operations team notifications", - "items": { - "type": "string", - "format": "email" - } - }, - "compact": { - "type": "string", - "description": "The compact this jurisdiction configuration belongs to", - "enum": [ - "cosm" - ] - }, - "licenseeRegistrationEnabled": { - "type": "boolean", - "description": "Denotes whether licensee registration is enabled" - }, - "jurisdictionName": { - "type": "string", - "description": "The name of the jurisdiction" - } - } - }, - "SandboLicenMcATit6vegoa": { - "type": "object", - "properties": { - "attributes": { - "type": "object", - "properties": { - "givenName": { - "maxLength": 100, - "minLength": 1, - "type": "string" - }, - "familyName": { - "maxLength": 100, - "minLength": 1, - "type": "string" + "adverseActions": { + "type": "array", + "items": { + "required": [ + "actionAgainst", + "adverseActionId", + "compact", + "creationDate", + "dateOfUpdate", + "effectiveStartDate", + "jurisdiction", + "licenseType", + "licenseTypeAbbreviation", + "providerId", + "type" + ], + "type": "object", + "properties": { + "licenseType": { + "type": "string" + }, + "compact": { + "type": "string", + "enum": [ + "cosm" + ] + }, + "providerId": { + "pattern": "[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab]{1}[0-9a-f]{3}-[0-9a-f]{12}", + "type": "string" + }, + "jurisdiction": { + "type": "string", + "enum": [ + "al", + "az", + "co", + "ks", + "ky", + "md", + "oh", + "tn", + "va", + "wa" + ] + }, + "effectiveStartDate": { + "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "type": "string", + "format": "date" + }, + "licenseTypeAbbreviation": { + "type": "string" + }, + "adverseActionId": { + "type": "string" + }, + "effectiveLiftDate": { + "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "type": "string", + "format": "date" + }, + "type": { + "type": "string", + "enum": [ + "adverseAction" + ] + }, + "creationDate": { + "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "type": "string", + "format": "date" + }, + "actionAgainst": { + "type": "string" + }, + "dateOfUpdate": { + "type": "string", + "format": "date-time" + } + } + } + }, + "status": { + "type": "string", + "enum": [ + "active", + "inactive" + ] + } } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - "SandboLicenuVRFe60q6S7D": { - "required": [ - "action" - ], - "type": "object", - "properties": { - "action": { + } + }, + "licenseJurisdiction": { "type": "string", "enum": [ - "close" + "al", + "az", + "co", + "ks", + "ky", + "md", + "oh", + "tn", + "va", + "wa" ] }, - "encumbrance": { - "required": [ - "clinicalPrivilegeActionCategories", - "encumbranceEffectiveDate", - "encumbranceType" - ], - "type": "object", - "properties": { - "encumbranceEffectiveDate": { - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", - "type": "string", - "description": "The effective date of the encumbrance", - "format": "date" - }, - "clinicalPrivilegeActionCategories": { - "type": "array", - "description": "The categories of clinical privilege action", - "items": { - "type": "string" - } - }, - "encumbranceType": { - "type": "string", - "description": "The type of encumbrance", - "enum": [ - "fine", - "reprimand", - "required supervision", - "completion of continuing education", - "public reprimand", - "probation", - "injunctive action", - "suspension", - "revocation", - "denial", - "surrender of license", - "modification of previous action-extension", - "modification of previous action-reduction", - "other monitoring", - "other adjudicated action not listed" - ] - } - }, - "additionalProperties": false, - "description": "Encumbrance data to create" - } - } - }, - "SandboLicenTdkUw59snX0Q": { - "required": [ - "effectiveLiftDate" - ], - "type": "object", - "properties": { - "effectiveLiftDate": { - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", - "type": "string", - "description": "The effective date when the encumbrance will be lifted", - "format": "date" - } - }, - "additionalProperties": false - }, - "SandboLicenTiUhKamH8kWG": { - "required": [ - "action" - ], - "type": "object", - "properties": { - "action": { + "compact": { "type": "string", "enum": [ - "close" + "cosm" ] }, - "encumbrance": { - "required": [ - "clinicalPrivilegeActionCategories", - "encumbranceEffectiveDate", - "encumbranceType" - ], - "type": "object", - "properties": { - "encumbranceEffectiveDate": { - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", - "type": "string", - "description": "The effective date of the encumbrance", - "format": "date" - }, - "clinicalPrivilegeActionCategories": { - "type": "array", - "description": "The categories of clinical privilege action", - "items": { - "type": "string" - } - }, - "encumbranceType": { - "type": "string", - "description": "The type of encumbrance", - "enum": [ - "fine", - "reprimand", - "required supervision", - "completion of continuing education", - "public reprimand", - "probation", - "injunctive action", - "suspension", - "revocation", - "denial", - "surrender of license", - "modification of previous action-extension", - "modification of previous action-reduction", - "other monitoring", - "other adjudicated action not listed" - ] - } - }, - "additionalProperties": false, - "description": "Encumbrance data to create" - } - } - }, - "SandboLicenAZYObIVGD6AE": { - "required": [ - "jurisdictionAdverseActionsNotificationEmails", - "jurisdictionOperationsTeamEmails", - "licenseeRegistrationEnabled" - ], - "type": "object", - "properties": { - "jurisdictionAdverseActionsNotificationEmails": { - "maxItems": 10, - "minItems": 1, - "uniqueItems": true, - "type": "array", - "description": "List of email addresses for adverse actions notifications", - "items": { - "type": "string", - "format": "email" - } + "providerId": { + "pattern": "[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab]{1}[0-9a-f]{3}-[0-9a-f]{12}", + "type": "string" }, - "jurisdictionOperationsTeamEmails": { - "maxItems": 10, - "minItems": 1, - "uniqueItems": true, - "type": "array", - "description": "List of email addresses for operations team notifications", - "items": { - "type": "string", - "format": "email" - } + "givenName": { + "maxLength": 100, + "minLength": 1, + "type": "string" }, - "licenseeRegistrationEnabled": { - "type": "boolean", - "description": "Denotes whether licensee registration is enabled" - } - }, - "additionalProperties": false - }, - "SandboLicen905yAh4VGw9c": { - "required": [ - "clinicalPrivilegeActionCategories", - "encumbranceEffectiveDate", - "encumbranceType" - ], - "type": "object", - "properties": { - "encumbranceEffectiveDate": { - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", - "type": "string", - "description": "The effective date of the encumbrance", - "format": "date" + "familyName": { + "maxLength": 100, + "minLength": 1, + "type": "string" }, - "clinicalPrivilegeActionCategories": { - "type": "array", - "description": "The categories of clinical privilege action", - "items": { - "type": "string" - } + "middleName": { + "maxLength": 100, + "minLength": 1, + "type": "string" }, - "encumbranceType": { + "type": { "type": "string", - "description": "The type of encumbrance", "enum": [ - "fine", - "reprimand", - "required supervision", - "completion of continuing education", - "public reprimand", - "probation", - "injunctive action", - "suspension", - "revocation", - "denial", - "surrender of license", - "modification of previous action-extension", - "modification of previous action-reduction", - "other monitoring", - "other adjudicated action not listed" + "provider" ] - } - }, - "additionalProperties": false, - "description": "Encumbrance data to create" + }, + "suffix": { + "maxLength": 100, + "minLength": 1, + "type": "string" + }, + "dateOfUpdate": { + "type": "string", + "format": "date-time" + } + } }, - "SandboLicenVVd6s0tk4Osi": { - "required": [ - "enabled" - ], + "SandboLicenUZbApOOB9TTq": { "type": "object", "properties": { - "enabled": { - "type": "boolean", - "description": "Whether the feature flag is enabled" + "attributes": { + "type": "object", + "properties": { + "givenName": { + "maxLength": 100, + "minLength": 1, + "type": "string" + }, + "familyName": { + "maxLength": 100, + "minLength": 1, + "type": "string" + } + }, + "additionalProperties": false } - } + }, + "additionalProperties": false }, - "SandboLicengSyqbaS5PyUI": { + "SandboLicencx4uEmf1xIGK": { + "required": [ + "pagination", + "providers" + ], "type": "object", "properties": { "pagination": { @@ -2850,127 +2811,160 @@ } } }, - "users": { + "sorting": { + "required": [ + "key" + ], + "type": "object", + "properties": { + "key": { + "type": "string", + "description": "The key to sort results by", + "enum": [ + "dateOfUpdate", + "familyName" + ] + }, + "direction": { + "type": "string", + "description": "Direction to sort results by", + "enum": [ + "ascending", + "descending" + ] + } + }, + "description": "How to sort results" + }, + "providers": { + "maxLength": 100, "type": "array", "items": { "required": [ - "attributes", - "permissions", - "status", - "userId" + "birthMonthDay", + "compact", + "compactEligibility", + "dateOfExpiration", + "dateOfUpdate", + "familyName", + "givenName", + "jurisdictionUploadedCompactEligibility", + "jurisdictionUploadedLicenseStatus", + "licenseJurisdiction", + "licenseStatus", + "providerId", + "type" ], "type": "object", "properties": { - "permissions": { - "type": "object", - "additionalProperties": { - "type": "object", - "properties": { - "actions": { - "type": "object", - "properties": { - "readPrivate": { - "type": "boolean" - }, - "admin": { - "type": "boolean" - }, - "readSSN": { - "type": "boolean" - } - } - }, - "jurisdictions": { - "type": "object", - "additionalProperties": { - "type": "object", - "properties": { - "actions": { - "type": "object", - "properties": { - "readPrivate": { - "type": "boolean" - }, - "admin": { - "type": "boolean" - }, - "write": { - "type": "boolean" - }, - "readSSN": { - "type": "boolean" - } - }, - "additionalProperties": false - } - } - } - } - }, - "additionalProperties": false - } + "licenseJurisdiction": { + "type": "string", + "enum": [ + "al", + "az", + "co", + "ks", + "ky", + "md", + "oh", + "tn", + "va", + "wa" + ] }, - "attributes": { - "required": [ - "email", - "familyName", - "givenName" - ], - "type": "object", - "properties": { - "givenName": { - "maxLength": 100, - "minLength": 1, - "type": "string" - }, - "familyName": { - "maxLength": 100, - "minLength": 1, - "type": "string" - }, - "email": { - "maxLength": 100, - "minLength": 5, - "type": "string" - } - }, - "additionalProperties": false + "compact": { + "type": "string", + "enum": [ + "cosm" + ] }, - "userId": { + "givenName": { + "maxLength": 100, + "minLength": 1, "type": "string" }, - "status": { + "compactEligibility": { + "type": "string", + "enum": [ + "eligible", + "ineligible" + ] + }, + "jurisdictionUploadedCompactEligibility": { + "type": "string", + "enum": [ + "eligible", + "ineligible" + ] + }, + "dateOfBirth": { + "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "type": "string", + "format": "date" + }, + "jurisdictionUploadedLicenseStatus": { "type": "string", "enum": [ "active", "inactive" ] - } - }, - "additionalProperties": false - } - } - }, - "additionalProperties": false - }, - "SandboLicenGJ2Vrxb2wvlG": { - "required": [ - "ssn" - ], - "type": "object", - "properties": { - "ssn": { - "pattern": "^[0-9]{3}-[0-9]{2}-[0-9]{4}$", - "type": "string", - "description": "The provider's social security number" + }, + "type": { + "type": "string", + "enum": [ + "provider" + ] + }, + "suffix": { + "maxLength": 100, + "minLength": 1, + "type": "string" + }, + "ssnLastFour": { + "pattern": "^[0-9]{4}$", + "type": "string" + }, + "dateOfExpiration": { + "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "type": "string", + "format": "date" + }, + "providerId": { + "pattern": "[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab]{1}[0-9a-f]{3}-[0-9a-f]{12}", + "type": "string" + }, + "licenseStatus": { + "type": "string", + "enum": [ + "active", + "inactive" + ] + }, + "familyName": { + "maxLength": 100, + "minLength": 1, + "type": "string" + }, + "middleName": { + "maxLength": 100, + "minLength": 1, + "type": "string" + }, + "birthMonthDay": { + "pattern": "^[01]{1}[0-9]{1}-[0-3]{1}[0-9]{1}$", + "type": "string", + "format": "date" + }, + "dateOfUpdate": { + "type": "string", + "format": "date-time" + } + } + } } } }, - "SandboLicenMQ8w3yNRTuci": { - "required": [ - "attributes", - "permissions" - ], + "SandboLicenOURP3fzKxUd9": { "type": "object", "properties": { "permissions": { @@ -3021,546 +3015,498 @@ }, "additionalProperties": false } - }, - "attributes": { - "required": [ - "email", - "familyName", - "givenName" - ], - "type": "object", - "properties": { - "givenName": { - "maxLength": 100, - "minLength": 1, - "type": "string" - }, - "familyName": { - "maxLength": 100, - "minLength": 1, - "type": "string" - }, - "email": { - "maxLength": 100, - "minLength": 5, - "type": "string" - } - }, - "additionalProperties": false } }, "additionalProperties": false }, - "SandboLicengNz6BQmOzv9N": { + "SandboLicenkrLrsMciNA4g": { + "type": "array", + "items": { + "required": [ + "compact", + "jurisdictionName", + "postalAbbreviation" + ], + "type": "object", + "properties": { + "postalAbbreviation": { + "type": "string", + "description": "The postal abbreviation of the jurisdiction" + }, + "compact": { + "type": "string" + }, + "jurisdictionName": { + "type": "string", + "description": "The name of the jurisdiction" + } + } + } + }, + "SandboLicenJUCiAgoCMvNX": { "required": [ - "birthMonthDay", - "compact", - "dateOfExpiration", - "dateOfUpdate", - "familyName", - "givenName", - "licenseJurisdiction", - "licenses", - "privileges", - "providerId", - "type" + "action" ], "type": "object", "properties": { - "privileges": { - "type": "array", - "items": { - "required": [ - "administratorSetStatus", - "compact", - "compactTransactionId", - "dateOfExpiration", - "history", - "jurisdiction", - "licenseJurisdiction", - "licenseType", - "providerId", - "status", - "type" - ], - "type": "object", - "properties": { - "investigationStatus": { - "type": "string", - "description": "Status indicating if the privilege is under investigation", - "enum": [ - "underInvestigation" - ] - }, - "licenseJurisdiction": { - "type": "string", - "enum": [ - "al", - "az", - "co", - "ks", - "ky", - "md", - "oh", - "tn", - "va", - "wa" - ] - }, - "compact": { - "type": "string", - "enum": [ - "cosm" - ] - }, - "jurisdiction": { - "type": "string", - "enum": [ - "al", - "az", - "co", - "ks", - "ky", - "md", - "oh", - "tn", - "va", - "wa" - ] - }, - "investigations": { - "type": "array", - "items": { - "required": [ - "compact", - "creationDate", - "dateOfUpdate", - "investigationId", - "jurisdiction", - "licenseType", - "providerId", - "submittingUser", - "type" - ], - "type": "object", - "properties": { - "licenseType": { - "type": "string" - }, - "investigationId": { - "type": "string" - }, - "compact": { - "type": "string", - "enum": [ - "cosm" - ] - }, - "providerId": { - "pattern": "[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab]{1}[0-9a-f]{3}-[0-9a-f]{12}", - "type": "string" - }, - "jurisdiction": { - "type": "string", - "enum": [ - "al", - "az", - "co", - "ks", - "ky", - "md", - "oh", - "tn", - "va", - "wa" - ] - }, - "submittingUser": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "investigation" - ] - }, - "creationDate": { - "type": "string", - "format": "date-time" - }, - "dateOfUpdate": { - "type": "string", - "format": "date-time" - } - } - } - }, - "history": { - "type": "array", - "items": { - "required": [ - "compact", - "dateOfUpdate", - "jurisdiction", - "previous", - "type", - "updateType" - ], + "action": { + "type": "string", + "enum": [ + "close" + ] + }, + "encumbrance": { + "required": [ + "clinicalPrivilegeActionCategories", + "encumbranceEffectiveDate", + "encumbranceType" + ], + "type": "object", + "properties": { + "encumbranceEffectiveDate": { + "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "type": "string", + "description": "The effective date of the encumbrance", + "format": "date" + }, + "clinicalPrivilegeActionCategories": { + "type": "array", + "description": "The categories of clinical privilege action", + "items": { + "type": "string" + } + }, + "encumbranceType": { + "type": "string", + "description": "The type of encumbrance", + "enum": [ + "fine", + "reprimand", + "required supervision", + "completion of continuing education", + "public reprimand", + "probation", + "injunctive action", + "suspension", + "revocation", + "denial", + "surrender of license", + "modification of previous action-extension", + "modification of previous action-reduction", + "other monitoring", + "other adjudicated action not listed" + ] + } + }, + "additionalProperties": false, + "description": "Encumbrance data to create" + } + } + }, + "SandboLicenTMNnpZtssvOZ": { + "required": [ + "effectiveLiftDate" + ], + "type": "object", + "properties": { + "effectiveLiftDate": { + "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "type": "string", + "description": "The effective date when the encumbrance will be lifted", + "format": "date" + } + }, + "additionalProperties": false + }, + "SandboLicen14sZXYfvuEUn": { + "type": "object", + "properties": { + "pagination": { + "type": "object", + "properties": { + "prevLastKey": { + "maxLength": 1024, + "minLength": 1, + "type": "object" + }, + "lastKey": { + "maxLength": 1024, + "minLength": 1, + "type": "object" + }, + "pageSize": { + "maximum": 100, + "minimum": 5, + "type": "integer" + } + } + }, + "users": { + "type": "array", + "items": { + "required": [ + "attributes", + "permissions", + "status", + "userId" + ], + "type": "object", + "properties": { + "permissions": { + "type": "object", + "additionalProperties": { "type": "object", "properties": { - "removedValues": { - "type": "array", - "description": "List of field names that were present in the previous record but removed in the update", - "items": { - "type": "string" - } - }, - "licenseType": { - "type": "string", - "enum": [ - "cosmetologist", - "esthetician" - ] - }, - "compact": { - "type": "string", - "enum": [ - "cosm" - ] - }, - "previous": { - "required": [ - "administratorSetStatus", - "compactTransactionId", - "dateOfExpiration", - "licenseJurisdiction" - ], + "actions": { "type": "object", "properties": { - "administratorSetStatus": { - "type": "string", - "enum": [ - "active", - "inactive" - ] - }, - "dateOfExpiration": { - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", - "type": "string", - "format": "date" - }, - "licenseJurisdiction": { - "type": "string", - "enum": [ - "al", - "az", - "co", - "ks", - "ky", - "md", - "oh", - "tn", - "va", - "wa" - ] - }, - "compact": { - "type": "string", - "enum": [ - "cosm" - ] - }, - "providerId": { - "pattern": "[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab]{1}[0-9a-f]{3}-[0-9a-f]{12}", - "type": "string" - }, - "jurisdiction": { - "type": "string", - "enum": [ - "al", - "az", - "co", - "ks", - "ky", - "md", - "oh", - "tn", - "va", - "wa" - ] - }, - "type": { - "type": "string", - "enum": [ - "privilege" - ] + "readPrivate": { + "type": "boolean" }, - "compactTransactionId": { - "type": "string" + "admin": { + "type": "boolean" }, - "status": { - "type": "string", - "enum": [ - "active", - "inactive" - ] + "readSSN": { + "type": "boolean" } } }, - "jurisdiction": { - "type": "string", - "enum": [ - "al", - "az", - "co", - "ks", - "ky", - "md", - "oh", - "tn", - "va", - "wa" - ] - }, - "updatedValues": { + "jurisdictions": { "type": "object", - "properties": { - "administratorSetStatus": { - "type": "string", - "enum": [ - "active", - "inactive" - ] - }, - "dateOfExpiration": { - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", - "type": "string", - "format": "date" - }, - "licenseJurisdiction": { - "type": "string", - "enum": [ - "al", - "az", - "co", - "ks", - "ky", - "md", - "oh", - "tn", - "va", - "wa" - ] - }, - "compact": { - "type": "string", - "enum": [ - "cosm" - ] - }, - "providerId": { - "pattern": "[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab]{1}[0-9a-f]{3}-[0-9a-f]{12}", - "type": "string" - }, - "jurisdiction": { - "type": "string", - "enum": [ - "al", - "az", - "co", - "ks", - "ky", - "md", - "oh", - "tn", - "va", - "wa" - ] - }, - "type": { - "type": "string", - "enum": [ - "privilege" - ] - }, - "compactTransactionId": { - "type": "string" - }, - "status": { - "type": "string", - "enum": [ - "active", - "inactive" - ] + "additionalProperties": { + "type": "object", + "properties": { + "actions": { + "type": "object", + "properties": { + "readPrivate": { + "type": "boolean" + }, + "admin": { + "type": "boolean" + }, + "write": { + "type": "boolean" + }, + "readSSN": { + "type": "boolean" + } + }, + "additionalProperties": false + } } } - }, - "type": { - "type": "string", - "enum": [ - "privilegeUpdate" - ] - }, - "dateOfUpdate": { - "type": "string", - "format": "date-time" - }, - "updateType": { - "type": "string", - "enum": [ - "deactivation", - "expiration", - "issuance", - "other", - "renewal", - "encumbrance", - "lifting_encumbrance", - "licenseDeactivation" - ] } - } + }, + "additionalProperties": false } }, - "type": { - "type": "string", - "enum": [ - "privilege" - ] + "attributes": { + "required": [ + "email", + "familyName", + "givenName" + ], + "type": "object", + "properties": { + "givenName": { + "maxLength": 100, + "minLength": 1, + "type": "string" + }, + "familyName": { + "maxLength": 100, + "minLength": 1, + "type": "string" + }, + "email": { + "maxLength": 100, + "minLength": 5, + "type": "string" + } + }, + "additionalProperties": false }, - "compactTransactionId": { + "userId": { "type": "string" }, - "licenseType": { - "type": "string", - "enum": [ - "cosmetologist", - "esthetician" - ] - }, - "administratorSetStatus": { + "status": { "type": "string", "enum": [ "active", "inactive" ] + } + }, + "additionalProperties": false + } + } + }, + "additionalProperties": false + }, + "SandboLicenub1ZBTU9W6qw": { + "required": [ + "attributes", + "permissions" + ], + "type": "object", + "properties": { + "permissions": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "actions": { + "type": "object", + "properties": { + "readPrivate": { + "type": "boolean" + }, + "admin": { + "type": "boolean" + }, + "readSSN": { + "type": "boolean" + } + } }, - "dateOfExpiration": { - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", - "type": "string", - "format": "date" - }, - "providerId": { - "pattern": "[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab]{1}[0-9a-f]{3}-[0-9a-f]{12}", - "type": "string" - }, - "adverseActions": { - "type": "array", - "items": { - "required": [ - "actionAgainst", - "adverseActionId", - "compact", - "creationDate", - "dateOfUpdate", - "effectiveStartDate", - "encumbranceType", - "jurisdiction", - "licenseType", - "licenseTypeAbbreviation", - "providerId", - "type" - ], + "jurisdictions": { + "type": "object", + "additionalProperties": { "type": "object", "properties": { - "clinicalPrivilegeActionCategories": { - "type": "array", - "description": "The categories of clinical privilege action", - "items": { - "type": "string" - } - }, - "compact": { - "type": "string", - "enum": [ - "cosm" - ] - }, - "jurisdiction": { - "type": "string", - "enum": [ - "al", - "az", - "co", - "ks", - "ky", - "md", - "oh", - "tn", - "va", - "wa" - ] - }, - "licenseTypeAbbreviation": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "adverseAction" - ] - }, - "creationDate": { - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", - "type": "string", - "format": "date" - }, - "actionAgainst": { - "type": "string" - }, - "licenseType": { - "type": "string" - }, - "providerId": { - "pattern": "[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab]{1}[0-9a-f]{3}-[0-9a-f]{12}", - "type": "string" - }, - "effectiveStartDate": { - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", - "type": "string", - "format": "date" - }, - "adverseActionId": { - "type": "string" - }, - "effectiveLiftDate": { - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", - "type": "string", - "format": "date" - }, - "encumbranceType": { - "type": "string" - }, - "liftingUser": { - "type": "string" - }, - "dateOfUpdate": { - "type": "string", - "format": "date-time" + "actions": { + "type": "object", + "properties": { + "readPrivate": { + "type": "boolean" + }, + "admin": { + "type": "boolean" + }, + "write": { + "type": "boolean" + }, + "readSSN": { + "type": "boolean" + } + }, + "additionalProperties": false } } } - }, - "status": { - "type": "string", - "enum": [ - "active", - "inactive" - ] } + }, + "additionalProperties": false + } + }, + "attributes": { + "required": [ + "email", + "familyName", + "givenName" + ], + "type": "object", + "properties": { + "givenName": { + "maxLength": 100, + "minLength": 1, + "type": "string" + }, + "familyName": { + "maxLength": 100, + "minLength": 1, + "type": "string" + }, + "email": { + "maxLength": 100, + "minLength": 5, + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "SandboLicenL9pTEzhVX7rk": { + "required": [ + "ssn" + ], + "type": "object", + "properties": { + "ssn": { + "pattern": "^[0-9]{3}-[0-9]{2}-[0-9]{4}$", + "type": "string", + "description": "The provider's social security number" + } + } + }, + "SandboLicendc4CujpQTISE": { + "type": "object", + "properties": {} + }, + "SandboLicenSOFKnGm6KsSr": { + "type": "object", + "properties": {} + }, + "SandboLicen1BRGGYZ2H9BZ": { + "required": [ + "action" + ], + "type": "object", + "properties": { + "action": { + "type": "string", + "enum": [ + "close" + ] + }, + "encumbrance": { + "required": [ + "clinicalPrivilegeActionCategories", + "encumbranceEffectiveDate", + "encumbranceType" + ], + "type": "object", + "properties": { + "encumbranceEffectiveDate": { + "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "type": "string", + "description": "The effective date of the encumbrance", + "format": "date" + }, + "clinicalPrivilegeActionCategories": { + "type": "array", + "description": "The categories of clinical privilege action", + "items": { + "type": "string" + } + }, + "encumbranceType": { + "type": "string", + "description": "The type of encumbrance", + "enum": [ + "fine", + "reprimand", + "required supervision", + "completion of continuing education", + "public reprimand", + "probation", + "injunctive action", + "suspension", + "revocation", + "denial", + "surrender of license", + "modification of previous action-extension", + "modification of previous action-reduction", + "other monitoring", + "other adjudicated action not listed" + ] } + }, + "additionalProperties": false, + "description": "Encumbrance data to create" + } + } + }, + "SandboLicenbdgqjZHiRCin": { + "required": [ + "clinicalPrivilegeActionCategories", + "encumbranceEffectiveDate", + "encumbranceType" + ], + "type": "object", + "properties": { + "encumbranceEffectiveDate": { + "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "type": "string", + "description": "The effective date of the encumbrance", + "format": "date" + }, + "clinicalPrivilegeActionCategories": { + "type": "array", + "description": "The categories of clinical privilege action", + "items": { + "type": "string" } }, - "licenseJurisdiction": { + "encumbranceType": { + "type": "string", + "description": "The type of encumbrance", + "enum": [ + "fine", + "reprimand", + "required supervision", + "completion of continuing education", + "public reprimand", + "probation", + "injunctive action", + "suspension", + "revocation", + "denial", + "surrender of license", + "modification of previous action-extension", + "modification of previous action-reduction", + "other monitoring", + "other adjudicated action not listed" + ] + } + }, + "additionalProperties": false, + "description": "Encumbrance data to create" + }, + "SandboLicenGJKqabDhc7zG": { + "required": [ + "clinicalPrivilegeActionCategories", + "encumbranceEffectiveDate", + "encumbranceType" + ], + "type": "object", + "properties": { + "encumbranceEffectiveDate": { + "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "type": "string", + "description": "The effective date of the encumbrance", + "format": "date" + }, + "clinicalPrivilegeActionCategories": { + "type": "array", + "description": "The categories of clinical privilege action", + "items": { + "type": "string" + } + }, + "encumbranceType": { + "type": "string", + "description": "The type of encumbrance", + "enum": [ + "fine", + "reprimand", + "required supervision", + "completion of continuing education", + "public reprimand", + "probation", + "injunctive action", + "suspension", + "revocation", + "denial", + "surrender of license", + "modification of previous action-extension", + "modification of previous action-reduction", + "other monitoring", + "other adjudicated action not listed" + ] + } + }, + "additionalProperties": false, + "description": "Encumbrance data to create" + }, + "SandboLicenNqOvNMkAA7cK": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { "type": "string", "enum": [ "al", @@ -3574,94 +3520,183 @@ "va", "wa" ] + } + } + }, + "SandboLicenz9o6U9FoduDo": { + "required": [ + "upload" + ], + "type": "object", + "properties": { + "upload": { + "required": [ + "fields", + "url" + ], + "type": "object", + "properties": { + "fields": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "url": { + "type": "string" + } + } + } + } + }, + "SandboLicens761O5xFOa9i": { + "required": [ + "enabled" + ], + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "description": "Whether the feature flag is enabled" + } + } + }, + "SandboLicen7ttv4cZS4giU": { + "required": [ + "compactAbbr", + "compactAdverseActionsNotificationEmails", + "compactName", + "compactOperationsTeamEmails", + "configuredStates", + "licenseeRegistrationEnabled" + ], + "type": "object", + "properties": { + "configuredStates": { + "type": "array", + "description": "List of states that have submitted configurations and their live status", + "items": { + "required": [ + "isLive", + "postalAbbreviation" + ], + "type": "object", + "properties": { + "postalAbbreviation": { + "type": "string", + "description": "The postal abbreviation of the jurisdiction", + "enum": [ + "al", + "az", + "co", + "ks", + "ky", + "md", + "oh", + "tn", + "va", + "wa" + ] + }, + "isLive": { + "type": "boolean", + "description": "Whether the state is live and available for registrations." + } + } + } }, - "compact": { - "type": "string", - "enum": [ - "cosm" - ] - }, - "givenName": { - "maxLength": 100, - "minLength": 1, - "type": "string" - }, - "compactEligibility": { - "type": "string", - "enum": [ - "eligible", - "ineligible" - ] - }, - "jurisdictionUploadedCompactEligibility": { - "type": "string", - "enum": [ - "eligible", - "ineligible" - ] + "compactAdverseActionsNotificationEmails": { + "type": "array", + "description": "List of email addresses for adverse actions notifications", + "items": { + "type": "string", + "format": "email" + } }, - "dateOfBirth": { - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", - "type": "string", - "format": "date" + "licenseeRegistrationEnabled": { + "type": "boolean", + "description": "Denotes whether licensee registration is enabled" }, - "jurisdictionUploadedLicenseStatus": { + "compactAbbr": { "type": "string", - "enum": [ - "active", - "inactive" - ] + "description": "The abbreviation of the compact" }, - "type": { + "compactName": { "type": "string", - "enum": [ - "provider" - ] - }, - "suffix": { - "maxLength": 100, - "minLength": 1, - "type": "string" + "description": "The full name of the compact" }, - "licenses": { + "compactOperationsTeamEmails": { + "type": "array", + "description": "List of email addresses for operations team notifications", + "items": { + "type": "string", + "format": "email" + } + } + } + }, + "SandboLicen35ID7rKg6pmg": { + "required": [ + "birthMonthDay", + "compact", + "dateOfExpiration", + "dateOfUpdate", + "familyName", + "givenName", + "licenseJurisdiction", + "licenses", + "privileges", + "providerId", + "type" + ], + "type": "object", + "properties": { + "privileges": { "type": "array", "items": { "required": [ + "administratorSetStatus", "compact", - "compactEligibility", + "compactTransactionId", "dateOfExpiration", - "dateOfIssuance", - "dateOfRenewal", - "dateOfUpdate", - "familyName", - "givenName", "history", - "homeAddressCity", - "homeAddressPostalCode", - "homeAddressState", - "homeAddressStreet1", "jurisdiction", - "jurisdictionUploadedCompactEligibility", - "jurisdictionUploadedLicenseStatus", - "licenseStatus", + "licenseJurisdiction", "licenseType", - "middleName", "providerId", + "status", "type" ], "type": "object", "properties": { + "investigationStatus": { + "type": "string", + "description": "Status indicating if the privilege is under investigation", + "enum": [ + "underInvestigation" + ] + }, + "licenseJurisdiction": { + "type": "string", + "enum": [ + "al", + "az", + "co", + "ks", + "ky", + "md", + "oh", + "tn", + "va", + "wa" + ] + }, "compact": { "type": "string", "enum": [ "cosm" ] }, - "homeAddressStreet2": { - "maxLength": 100, - "minLength": 1, - "type": "string" - }, "jurisdiction": { "type": "string", "enum": [ @@ -3677,11 +3712,6 @@ "wa" ] }, - "homeAddressStreet1": { - "maxLength": 100, - "minLength": 2, - "type": "string" - }, "investigations": { "type": "array", "items": { @@ -3749,112 +3779,6 @@ } } }, - "type": { - "type": "string", - "enum": [ - "license-home" - ] - }, - "suffix": { - "maxLength": 100, - "minLength": 1, - "type": "string" - }, - "dateOfIssuance": { - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", - "type": "string", - "format": "date" - }, - "licenseType": { - "type": "string", - "enum": [ - "cosmetologist", - "esthetician" - ] - }, - "emailAddress": { - "maxLength": 100, - "minLength": 5, - "type": "string", - "format": "email" - }, - "dateOfExpiration": { - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", - "type": "string", - "format": "date" - }, - "homeAddressState": { - "maxLength": 100, - "minLength": 2, - "type": "string" - }, - "providerId": { - "pattern": "[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab]{1}[0-9a-f]{3}-[0-9a-f]{12}", - "type": "string" - }, - "dateOfRenewal": { - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", - "type": "string", - "format": "date" - }, - "familyName": { - "maxLength": 100, - "minLength": 1, - "type": "string" - }, - "homeAddressCity": { - "maxLength": 100, - "minLength": 2, - "type": "string" - }, - "licenseNumber": { - "maxLength": 100, - "minLength": 1, - "type": "string" - }, - "investigationStatus": { - "type": "string", - "description": "Status indicating if the license is under investigation", - "enum": [ - "underInvestigation" - ] - }, - "homeAddressPostalCode": { - "maxLength": 7, - "minLength": 5, - "type": "string" - }, - "compactEligibility": { - "type": "string", - "enum": [ - "eligible", - "ineligible" - ] - }, - "givenName": { - "maxLength": 100, - "minLength": 1, - "type": "string" - }, - "jurisdictionUploadedCompactEligibility": { - "type": "string", - "enum": [ - "eligible", - "ineligible" - ] - }, - "dateOfBirth": { - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", - "type": "string", - "format": "date" - }, - "jurisdictionUploadedLicenseStatus": { - "type": "string", - "enum": [ - "active", - "inactive" - ] - }, "history": { "type": "array", "items": { @@ -3889,134 +3813,81 @@ ] }, "previous": { - "required": [ - "dateOfExpiration", - "dateOfIssuance", - "dateOfRenewal", - "familyName", - "givenName", - "homeAddressCity", - "homeAddressPostalCode", - "homeAddressState", - "homeAddressStreet1", - "jurisdictionUploadedCompactEligibility", - "jurisdictionUploadedLicenseStatus", - "middleName" + "required": [ + "administratorSetStatus", + "compactTransactionId", + "dateOfExpiration", + "licenseJurisdiction" ], "type": "object", "properties": { - "homeAddressStreet2": { - "maxLength": 100, - "minLength": 1, - "type": "string" - }, - "homeAddressPostalCode": { - "maxLength": 7, - "minLength": 5, - "type": "string" - }, - "givenName": { - "maxLength": 100, - "minLength": 1, - "type": "string" - }, - "homeAddressStreet1": { - "maxLength": 100, - "minLength": 2, - "type": "string" - }, - "compactEligibility": { - "type": "string", - "enum": [ - "eligible", - "ineligible" - ] - }, - "jurisdictionUploadedCompactEligibility": { + "administratorSetStatus": { "type": "string", "enum": [ - "eligible", - "ineligible" + "active", + "inactive" ] }, - "dateOfBirth": { + "dateOfExpiration": { "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", "type": "string", "format": "date" }, - "jurisdictionUploadedLicenseStatus": { + "licenseJurisdiction": { "type": "string", "enum": [ - "active", - "inactive" + "al", + "az", + "co", + "ks", + "ky", + "md", + "oh", + "tn", + "va", + "wa" ] }, - "suffix": { - "maxLength": 100, - "minLength": 1, - "type": "string" - }, - "dateOfIssuance": { - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "compact": { "type": "string", - "format": "date" + "enum": [ + "cosm" + ] }, - "emailAddress": { - "maxLength": 100, - "minLength": 5, - "type": "string", - "format": "email" + "providerId": { + "pattern": "[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab]{1}[0-9a-f]{3}-[0-9a-f]{12}", + "type": "string" }, - "dateOfExpiration": { - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "jurisdiction": { "type": "string", - "format": "date" + "enum": [ + "al", + "az", + "co", + "ks", + "ky", + "md", + "oh", + "tn", + "va", + "wa" + ] }, - "phoneNumber": { - "pattern": "^\\+[0-9]{8,15}$", - "type": "string" + "type": { + "type": "string", + "enum": [ + "privilege" + ] }, - "homeAddressState": { - "maxLength": 100, - "minLength": 2, + "compactTransactionId": { "type": "string" }, - "dateOfRenewal": { - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", - "type": "string", - "format": "date" - }, - "licenseStatus": { + "status": { "type": "string", "enum": [ "active", "inactive" ] - }, - "familyName": { - "maxLength": 100, - "minLength": 1, - "type": "string" - }, - "homeAddressCity": { - "maxLength": 100, - "minLength": 2, - "type": "string" - }, - "licenseNumber": { - "maxLength": 100, - "minLength": 1, - "type": "string" - }, - "middleName": { - "maxLength": 100, - "minLength": 1, - "type": "string" - }, - "licenseStatusName": { - "maxLength": 100, - "minLength": 1, - "type": "string" } } }, @@ -4038,125 +3909,80 @@ "updatedValues": { "type": "object", "properties": { - "homeAddressStreet2": { - "maxLength": 100, - "minLength": 1, - "type": "string" - }, - "homeAddressPostalCode": { - "maxLength": 7, - "minLength": 5, - "type": "string" - }, - "givenName": { - "maxLength": 100, - "minLength": 1, - "type": "string" - }, - "homeAddressStreet1": { - "maxLength": 100, - "minLength": 2, - "type": "string" - }, - "compactEligibility": { - "type": "string", - "enum": [ - "eligible", - "ineligible" - ] - }, - "jurisdictionUploadedCompactEligibility": { - "type": "string", - "enum": [ - "eligible", - "ineligible" - ] - }, - "dateOfBirth": { - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", - "type": "string", - "format": "date" - }, - "jurisdictionUploadedLicenseStatus": { + "administratorSetStatus": { "type": "string", "enum": [ "active", "inactive" ] }, - "suffix": { - "maxLength": 100, - "minLength": 1, - "type": "string" - }, - "dateOfIssuance": { - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", - "type": "string", - "format": "date" - }, - "emailAddress": { - "maxLength": 100, - "minLength": 5, - "type": "string", - "format": "email" - }, "dateOfExpiration": { "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", "type": "string", "format": "date" }, - "phoneNumber": { - "pattern": "^\\+[0-9]{8,15}$", - "type": "string" - }, - "homeAddressState": { - "maxLength": 100, - "minLength": 2, - "type": "string" - }, - "dateOfRenewal": { - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "licenseJurisdiction": { "type": "string", - "format": "date" + "enum": [ + "al", + "az", + "co", + "ks", + "ky", + "md", + "oh", + "tn", + "va", + "wa" + ] }, - "licenseStatus": { + "compact": { "type": "string", "enum": [ - "active", - "inactive" + "cosm" ] }, - "familyName": { - "maxLength": 100, - "minLength": 1, - "type": "string" - }, - "homeAddressCity": { - "maxLength": 100, - "minLength": 2, + "providerId": { + "pattern": "[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab]{1}[0-9a-f]{3}-[0-9a-f]{12}", "type": "string" }, - "licenseNumber": { - "maxLength": 100, - "minLength": 1, - "type": "string" + "jurisdiction": { + "type": "string", + "enum": [ + "al", + "az", + "co", + "ks", + "ky", + "md", + "oh", + "tn", + "va", + "wa" + ] }, - "middleName": { - "maxLength": 100, - "minLength": 1, - "type": "string" + "type": { + "type": "string", + "enum": [ + "privilege" + ] }, - "licenseStatusName": { - "maxLength": 100, - "minLength": 1, + "compactTransactionId": { "type": "string" + }, + "status": { + "type": "string", + "enum": [ + "active", + "inactive" + ] } } }, "type": { "type": "string", "enum": [ - "licenseUpdate" + "privilegeUpdate" ] }, "dateOfUpdate": { @@ -4179,29 +4005,36 @@ } } }, - "ssnLastFour": { - "pattern": "^[0-9]{4}$", - "type": "string" + "type": { + "type": "string", + "enum": [ + "privilege" + ] }, - "phoneNumber": { - "pattern": "^\\+[0-9]{8,15}$", + "compactTransactionId": { "type": "string" }, - "licenseStatus": { + "licenseType": { + "type": "string", + "enum": [ + "cosmetologist", + "esthetician" + ] + }, + "administratorSetStatus": { "type": "string", "enum": [ "active", "inactive" ] }, - "middleName": { - "maxLength": 100, - "minLength": 1, - "type": "string" + "dateOfExpiration": { + "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "type": "string", + "format": "date" }, - "licenseStatusName": { - "maxLength": 100, - "minLength": 1, + "providerId": { + "pattern": "[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab]{1}[0-9a-f]{3}-[0-9a-f]{12}", "type": "string" }, "adverseActions": { @@ -4301,59 +4134,17 @@ } } }, - "dateOfUpdate": { + "status": { "type": "string", - "format": "date-time" + "enum": [ + "active", + "inactive" + ] } } } }, - "ssnLastFour": { - "pattern": "^[0-9]{4}$", - "type": "string" - }, - "dateOfExpiration": { - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", - "type": "string", - "format": "date" - }, - "providerId": { - "pattern": "[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab]{1}[0-9a-f]{3}-[0-9a-f]{12}", - "type": "string" - }, - "licenseStatus": { - "type": "string", - "enum": [ - "active", - "inactive" - ] - }, - "familyName": { - "maxLength": 100, - "minLength": 1, - "type": "string" - }, - "middleName": { - "maxLength": 100, - "minLength": 1, - "type": "string" - }, - "birthMonthDay": { - "pattern": "^[01]{1}[0-9]{1}-[0-3]{1}[0-9]{1}$", - "type": "string", - "format": "date" - }, - "dateOfUpdate": { - "type": "string", - "format": "date-time" - } - } - }, - "SandboLicenPUwIzAMSlfRh": { - "type": "object", - "additionalProperties": { - "type": "array", - "items": { + "licenseJurisdiction": { "type": "string", "enum": [ "al", @@ -4367,151 +4158,96 @@ "va", "wa" ] - } - } - }, - "SandboLicentzGiICqenA1I": { - "required": [ - "clinicalPrivilegeActionCategories", - "encumbranceEffectiveDate", - "encumbranceType" - ], - "type": "object", - "properties": { - "encumbranceEffectiveDate": { - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + }, + "compact": { "type": "string", - "description": "The effective date of the encumbrance", - "format": "date" + "enum": [ + "cosm" + ] }, - "clinicalPrivilegeActionCategories": { - "type": "array", - "description": "The categories of clinical privilege action", - "items": { - "type": "string" - } + "givenName": { + "maxLength": 100, + "minLength": 1, + "type": "string" }, - "encumbranceType": { + "compactEligibility": { "type": "string", - "description": "The type of encumbrance", "enum": [ - "fine", - "reprimand", - "required supervision", - "completion of continuing education", - "public reprimand", - "probation", - "injunctive action", - "suspension", - "revocation", - "denial", - "surrender of license", - "modification of previous action-extension", - "modification of previous action-reduction", - "other monitoring", - "other adjudicated action not listed" + "eligible", + "ineligible" ] - } - }, - "additionalProperties": false, - "description": "Encumbrance data to create" - }, - "SandboLicenqza9dE2UnEU1": { - "required": [ - "compactAbbr", - "compactAdverseActionsNotificationEmails", - "compactName", - "compactOperationsTeamEmails", - "configuredStates", - "licenseeRegistrationEnabled" - ], - "type": "object", - "properties": { - "configuredStates": { - "type": "array", - "description": "List of states that have submitted configurations and their live status", - "items": { - "required": [ - "isLive", - "postalAbbreviation" - ], - "type": "object", - "properties": { - "postalAbbreviation": { - "type": "string", - "description": "The postal abbreviation of the jurisdiction", - "enum": [ - "al", - "az", - "co", - "ks", - "ky", - "md", - "oh", - "tn", - "va", - "wa" - ] - }, - "isLive": { - "type": "boolean", - "description": "Whether the state is live and available for registrations." - } - } - } }, - "compactAdverseActionsNotificationEmails": { - "type": "array", - "description": "List of email addresses for adverse actions notifications", - "items": { - "type": "string", - "format": "email" - } + "jurisdictionUploadedCompactEligibility": { + "type": "string", + "enum": [ + "eligible", + "ineligible" + ] }, - "licenseeRegistrationEnabled": { - "type": "boolean", - "description": "Denotes whether licensee registration is enabled" + "dateOfBirth": { + "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "type": "string", + "format": "date" }, - "compactAbbr": { + "jurisdictionUploadedLicenseStatus": { "type": "string", - "description": "The abbreviation of the compact" + "enum": [ + "active", + "inactive" + ] }, - "compactName": { + "type": { "type": "string", - "description": "The full name of the compact" + "enum": [ + "provider" + ] }, - "compactOperationsTeamEmails": { - "type": "array", - "description": "List of email addresses for operations team notifications", - "items": { - "type": "string", - "format": "email" - } - } - } - }, - "SandboLicenABWdja2fpGrf": { - "required": [ - "compactAdverseActionsNotificationEmails", - "compactOperationsTeamEmails", - "configuredStates", - "licenseeRegistrationEnabled" - ], - "type": "object", - "properties": { - "configuredStates": { + "suffix": { + "maxLength": 100, + "minLength": 1, + "type": "string" + }, + "licenses": { "type": "array", - "description": "List of states that have submitted configurations and their live status", "items": { "required": [ - "isLive", - "postalAbbreviation" + "compact", + "compactEligibility", + "dateOfExpiration", + "dateOfIssuance", + "dateOfRenewal", + "dateOfUpdate", + "familyName", + "givenName", + "history", + "homeAddressCity", + "homeAddressPostalCode", + "homeAddressState", + "homeAddressStreet1", + "jurisdiction", + "jurisdictionUploadedCompactEligibility", + "jurisdictionUploadedLicenseStatus", + "licenseStatus", + "licenseType", + "middleName", + "providerId", + "type" ], "type": "object", "properties": { - "postalAbbreviation": { + "compact": { + "type": "string", + "enum": [ + "cosm" + ] + }, + "homeAddressStreet2": { + "maxLength": 100, + "minLength": 1, + "type": "string" + }, + "jurisdiction": { "type": "string", - "description": "The postal abbreviation of the jurisdiction", "enum": [ "al", "az", @@ -4525,409 +4261,675 @@ "wa" ] }, - "isLive": { - "type": "boolean", - "description": "Whether the state is live and available for registrations." - } - }, - "additionalProperties": false - } - }, - "compactAdverseActionsNotificationEmails": { - "maxItems": 10, - "minItems": 1, - "uniqueItems": true, - "type": "array", - "description": "List of email addresses for adverse actions notifications", - "items": { - "type": "string", - "format": "email" - } - }, - "licenseeRegistrationEnabled": { - "type": "boolean", - "description": "Denotes whether licensee registration is enabled" - }, - "compactOperationsTeamEmails": { - "maxItems": 10, - "minItems": 1, - "uniqueItems": true, - "type": "array", - "description": "List of email addresses for operations team notifications", - "items": { - "type": "string", - "format": "email" - } - } - }, - "additionalProperties": false - }, - "SandboLicenjPULg4TeFeF1": { - "required": [ - "attributes", - "permissions", - "status", - "userId" - ], - "type": "object", - "properties": { - "permissions": { - "type": "object", - "additionalProperties": { - "type": "object", - "properties": { - "actions": { - "type": "object", - "properties": { - "readPrivate": { - "type": "boolean" - }, - "admin": { - "type": "boolean" - }, - "readSSN": { - "type": "boolean" + "homeAddressStreet1": { + "maxLength": 100, + "minLength": 2, + "type": "string" + }, + "investigations": { + "type": "array", + "items": { + "required": [ + "compact", + "creationDate", + "dateOfUpdate", + "investigationId", + "jurisdiction", + "licenseType", + "providerId", + "submittingUser", + "type" + ], + "type": "object", + "properties": { + "licenseType": { + "type": "string" + }, + "investigationId": { + "type": "string" + }, + "compact": { + "type": "string", + "enum": [ + "cosm" + ] + }, + "providerId": { + "pattern": "[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab]{1}[0-9a-f]{3}-[0-9a-f]{12}", + "type": "string" + }, + "jurisdiction": { + "type": "string", + "enum": [ + "al", + "az", + "co", + "ks", + "ky", + "md", + "oh", + "tn", + "va", + "wa" + ] + }, + "submittingUser": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "investigation" + ] + }, + "creationDate": { + "type": "string", + "format": "date-time" + }, + "dateOfUpdate": { + "type": "string", + "format": "date-time" + } } } }, - "jurisdictions": { - "type": "object", - "additionalProperties": { + "type": { + "type": "string", + "enum": [ + "license-home" + ] + }, + "suffix": { + "maxLength": 100, + "minLength": 1, + "type": "string" + }, + "dateOfIssuance": { + "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "type": "string", + "format": "date" + }, + "licenseType": { + "type": "string", + "enum": [ + "cosmetologist", + "esthetician" + ] + }, + "emailAddress": { + "maxLength": 100, + "minLength": 5, + "type": "string", + "format": "email" + }, + "dateOfExpiration": { + "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "type": "string", + "format": "date" + }, + "homeAddressState": { + "maxLength": 100, + "minLength": 2, + "type": "string" + }, + "providerId": { + "pattern": "[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab]{1}[0-9a-f]{3}-[0-9a-f]{12}", + "type": "string" + }, + "dateOfRenewal": { + "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "type": "string", + "format": "date" + }, + "familyName": { + "maxLength": 100, + "minLength": 1, + "type": "string" + }, + "homeAddressCity": { + "maxLength": 100, + "minLength": 2, + "type": "string" + }, + "licenseNumber": { + "maxLength": 100, + "minLength": 1, + "type": "string" + }, + "investigationStatus": { + "type": "string", + "description": "Status indicating if the license is under investigation", + "enum": [ + "underInvestigation" + ] + }, + "homeAddressPostalCode": { + "maxLength": 7, + "minLength": 5, + "type": "string" + }, + "compactEligibility": { + "type": "string", + "enum": [ + "eligible", + "ineligible" + ] + }, + "givenName": { + "maxLength": 100, + "minLength": 1, + "type": "string" + }, + "jurisdictionUploadedCompactEligibility": { + "type": "string", + "enum": [ + "eligible", + "ineligible" + ] + }, + "dateOfBirth": { + "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "type": "string", + "format": "date" + }, + "jurisdictionUploadedLicenseStatus": { + "type": "string", + "enum": [ + "active", + "inactive" + ] + }, + "history": { + "type": "array", + "items": { + "required": [ + "compact", + "dateOfUpdate", + "jurisdiction", + "previous", + "type", + "updateType" + ], "type": "object", "properties": { - "actions": { + "removedValues": { + "type": "array", + "description": "List of field names that were present in the previous record but removed in the update", + "items": { + "type": "string" + } + }, + "licenseType": { + "type": "string", + "enum": [ + "cosmetologist", + "esthetician" + ] + }, + "compact": { + "type": "string", + "enum": [ + "cosm" + ] + }, + "previous": { + "required": [ + "dateOfExpiration", + "dateOfIssuance", + "dateOfRenewal", + "familyName", + "givenName", + "homeAddressCity", + "homeAddressPostalCode", + "homeAddressState", + "homeAddressStreet1", + "jurisdictionUploadedCompactEligibility", + "jurisdictionUploadedLicenseStatus", + "middleName" + ], "type": "object", "properties": { - "readPrivate": { - "type": "boolean" + "homeAddressStreet2": { + "maxLength": 100, + "minLength": 1, + "type": "string" + }, + "homeAddressPostalCode": { + "maxLength": 7, + "minLength": 5, + "type": "string" + }, + "givenName": { + "maxLength": 100, + "minLength": 1, + "type": "string" + }, + "homeAddressStreet1": { + "maxLength": 100, + "minLength": 2, + "type": "string" + }, + "compactEligibility": { + "type": "string", + "enum": [ + "eligible", + "ineligible" + ] + }, + "jurisdictionUploadedCompactEligibility": { + "type": "string", + "enum": [ + "eligible", + "ineligible" + ] + }, + "dateOfBirth": { + "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "type": "string", + "format": "date" + }, + "jurisdictionUploadedLicenseStatus": { + "type": "string", + "enum": [ + "active", + "inactive" + ] + }, + "suffix": { + "maxLength": 100, + "minLength": 1, + "type": "string" + }, + "dateOfIssuance": { + "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "type": "string", + "format": "date" + }, + "emailAddress": { + "maxLength": 100, + "minLength": 5, + "type": "string", + "format": "email" + }, + "dateOfExpiration": { + "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "type": "string", + "format": "date" + }, + "phoneNumber": { + "pattern": "^\\+[0-9]{8,15}$", + "type": "string" + }, + "homeAddressState": { + "maxLength": 100, + "minLength": 2, + "type": "string" + }, + "dateOfRenewal": { + "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "type": "string", + "format": "date" + }, + "licenseStatus": { + "type": "string", + "enum": [ + "active", + "inactive" + ] + }, + "familyName": { + "maxLength": 100, + "minLength": 1, + "type": "string" + }, + "homeAddressCity": { + "maxLength": 100, + "minLength": 2, + "type": "string" + }, + "licenseNumber": { + "maxLength": 100, + "minLength": 1, + "type": "string" + }, + "middleName": { + "maxLength": 100, + "minLength": 1, + "type": "string" + }, + "licenseStatusName": { + "maxLength": 100, + "minLength": 1, + "type": "string" + } + } + }, + "jurisdiction": { + "type": "string", + "enum": [ + "al", + "az", + "co", + "ks", + "ky", + "md", + "oh", + "tn", + "va", + "wa" + ] + }, + "updatedValues": { + "type": "object", + "properties": { + "homeAddressStreet2": { + "maxLength": 100, + "minLength": 1, + "type": "string" + }, + "homeAddressPostalCode": { + "maxLength": 7, + "minLength": 5, + "type": "string" + }, + "givenName": { + "maxLength": 100, + "minLength": 1, + "type": "string" + }, + "homeAddressStreet1": { + "maxLength": 100, + "minLength": 2, + "type": "string" + }, + "compactEligibility": { + "type": "string", + "enum": [ + "eligible", + "ineligible" + ] + }, + "jurisdictionUploadedCompactEligibility": { + "type": "string", + "enum": [ + "eligible", + "ineligible" + ] + }, + "dateOfBirth": { + "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "type": "string", + "format": "date" + }, + "jurisdictionUploadedLicenseStatus": { + "type": "string", + "enum": [ + "active", + "inactive" + ] + }, + "suffix": { + "maxLength": 100, + "minLength": 1, + "type": "string" + }, + "dateOfIssuance": { + "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "type": "string", + "format": "date" }, - "admin": { - "type": "boolean" + "emailAddress": { + "maxLength": 100, + "minLength": 5, + "type": "string", + "format": "email" }, - "write": { - "type": "boolean" + "dateOfExpiration": { + "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "type": "string", + "format": "date" }, - "readSSN": { - "type": "boolean" + "phoneNumber": { + "pattern": "^\\+[0-9]{8,15}$", + "type": "string" + }, + "homeAddressState": { + "maxLength": 100, + "minLength": 2, + "type": "string" + }, + "dateOfRenewal": { + "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "type": "string", + "format": "date" + }, + "licenseStatus": { + "type": "string", + "enum": [ + "active", + "inactive" + ] + }, + "familyName": { + "maxLength": 100, + "minLength": 1, + "type": "string" + }, + "homeAddressCity": { + "maxLength": 100, + "minLength": 2, + "type": "string" + }, + "licenseNumber": { + "maxLength": 100, + "minLength": 1, + "type": "string" + }, + "middleName": { + "maxLength": 100, + "minLength": 1, + "type": "string" + }, + "licenseStatusName": { + "maxLength": 100, + "minLength": 1, + "type": "string" } - }, - "additionalProperties": false + } + }, + "type": { + "type": "string", + "enum": [ + "licenseUpdate" + ] + }, + "dateOfUpdate": { + "type": "string", + "format": "date-time" + }, + "updateType": { + "type": "string", + "enum": [ + "deactivation", + "expiration", + "issuance", + "other", + "renewal", + "encumbrance", + "lifting_encumbrance", + "licenseDeactivation" + ] } } } - } - }, - "additionalProperties": false - } - }, - "attributes": { - "required": [ - "email", - "familyName", - "givenName" - ], - "type": "object", - "properties": { - "givenName": { - "maxLength": 100, - "minLength": 1, - "type": "string" - }, - "familyName": { - "maxLength": 100, - "minLength": 1, - "type": "string" - }, - "email": { - "maxLength": 100, - "minLength": 5, - "type": "string" - } - }, - "additionalProperties": false - }, - "userId": { - "type": "string" - }, - "status": { - "type": "string", - "enum": [ - "active", - "inactive" - ] - } - }, - "additionalProperties": false - }, - "SandboLicenMplIbIWayHWa": { - "required": [ - "pagination", - "providers" - ], - "type": "object", - "properties": { - "pagination": { - "type": "object", - "properties": { - "prevLastKey": { - "maxLength": 1024, - "minLength": 1, - "type": "object" - }, - "lastKey": { - "maxLength": 1024, - "minLength": 1, - "type": "object" - }, - "pageSize": { - "maximum": 100, - "minimum": 5, - "type": "integer" - } - } - }, - "query": { - "type": "object", - "properties": { - "providerId": { - "pattern": "[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab]{1}[0-9a-f]{3}-[0-9a-f]{12}", - "type": "string", - "description": "Internal UUID for the provider" - }, - "jurisdiction": { - "type": "string", - "description": "Filter for providers with privilege/license in a jurisdiction", - "enum": [ - "al", - "az", - "co", - "ks", - "ky", - "md", - "oh", - "tn", - "va", - "wa" - ] - }, - "givenName": { - "maxLength": 100, - "type": "string", - "description": "Filter for providers with a given name" - }, - "familyName": { - "maxLength": 100, - "type": "string", - "description": "Filter for providers with a family name" - } - } - }, - "sorting": { - "required": [ - "key" - ], - "type": "object", - "properties": { - "key": { - "type": "string", - "description": "The key to sort results by", - "enum": [ - "dateOfUpdate", - "familyName" - ] - }, - "direction": { - "type": "string", - "description": "Direction to sort results by", - "enum": [ - "ascending", - "descending" - ] - } - }, - "description": "How to sort results" - }, - "providers": { - "maxLength": 100, - "type": "array", - "items": { - "required": [ - "compact", - "familyName", - "givenName", - "licenseJurisdiction", - "providerId", - "type" - ], - "type": "object", - "properties": { - "licenseJurisdiction": { - "type": "string", - "enum": [ - "al", - "az", - "co", - "ks", - "ky", - "md", - "oh", - "tn", - "va", - "wa" - ] - }, - "compact": { - "type": "string", - "enum": [ - "cosm" - ] }, - "providerId": { - "pattern": "[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab]{1}[0-9a-f]{3}-[0-9a-f]{12}", + "ssnLastFour": { + "pattern": "^[0-9]{4}$", "type": "string" }, - "givenName": { - "maxLength": 100, - "minLength": 1, + "phoneNumber": { + "pattern": "^\\+[0-9]{8,15}$", "type": "string" }, - "familyName": { - "maxLength": 100, - "minLength": 1, - "type": "string" + "licenseStatus": { + "type": "string", + "enum": [ + "active", + "inactive" + ] }, "middleName": { "maxLength": 100, "minLength": 1, "type": "string" }, - "type": { - "type": "string", - "enum": [ - "provider" - ] - }, - "suffix": { + "licenseStatusName": { "maxLength": 100, "minLength": 1, "type": "string" }, + "adverseActions": { + "type": "array", + "items": { + "required": [ + "actionAgainst", + "adverseActionId", + "compact", + "creationDate", + "dateOfUpdate", + "effectiveStartDate", + "encumbranceType", + "jurisdiction", + "licenseType", + "licenseTypeAbbreviation", + "providerId", + "type" + ], + "type": "object", + "properties": { + "clinicalPrivilegeActionCategories": { + "type": "array", + "description": "The categories of clinical privilege action", + "items": { + "type": "string" + } + }, + "compact": { + "type": "string", + "enum": [ + "cosm" + ] + }, + "jurisdiction": { + "type": "string", + "enum": [ + "al", + "az", + "co", + "ks", + "ky", + "md", + "oh", + "tn", + "va", + "wa" + ] + }, + "licenseTypeAbbreviation": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "adverseAction" + ] + }, + "creationDate": { + "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "type": "string", + "format": "date" + }, + "actionAgainst": { + "type": "string" + }, + "licenseType": { + "type": "string" + }, + "providerId": { + "pattern": "[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab]{1}[0-9a-f]{3}-[0-9a-f]{12}", + "type": "string" + }, + "effectiveStartDate": { + "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "type": "string", + "format": "date" + }, + "adverseActionId": { + "type": "string" + }, + "effectiveLiftDate": { + "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "type": "string", + "format": "date" + }, + "encumbranceType": { + "type": "string" + }, + "liftingUser": { + "type": "string" + }, + "dateOfUpdate": { + "type": "string", + "format": "date-time" + } + } + } + }, "dateOfUpdate": { "type": "string", "format": "date-time" } } } - } - } - }, - "SandboLicennxxmBbSCJcel": { - "type": "object", - "properties": {} - }, - "SandboLicenY31VDvsVuYXJ": { - "required": [ - "effectiveLiftDate" - ], - "type": "object", - "properties": { - "effectiveLiftDate": { + }, + "ssnLastFour": { + "pattern": "^[0-9]{4}$", + "type": "string" + }, + "dateOfExpiration": { "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", "type": "string", - "description": "The effective date when the encumbrance will be lifted", "format": "date" - } - }, - "additionalProperties": false - }, - "SandboLicenmIdUa45H3yV3": { - "type": "array", - "items": { - "required": [ - "compact", - "jurisdictionName", - "postalAbbreviation" - ], - "type": "object", - "properties": { - "postalAbbreviation": { - "type": "string", - "description": "The postal abbreviation of the jurisdiction" - }, - "compact": { - "type": "string" - }, - "jurisdictionName": { - "type": "string", - "description": "The name of the jurisdiction" - } - } - } - }, - "SandboLicenTD8eYiNU2b3J": { - "type": "object", - "properties": { - "permissions": { - "type": "object", - "additionalProperties": { - "type": "object", - "properties": { - "actions": { - "type": "object", - "properties": { - "readPrivate": { - "type": "boolean" - }, - "admin": { - "type": "boolean" - }, - "readSSN": { - "type": "boolean" - } - } - }, - "jurisdictions": { - "type": "object", - "additionalProperties": { - "type": "object", - "properties": { - "actions": { - "type": "object", - "properties": { - "readPrivate": { - "type": "boolean" - }, - "admin": { - "type": "boolean" - }, - "write": { - "type": "boolean" - }, - "readSSN": { - "type": "boolean" - } - }, - "additionalProperties": false - } - } - } - } - }, - "additionalProperties": false - } - } - }, - "additionalProperties": false - }, - "SandboLicentIcqTWOgUIGm": { - "required": [ - "message" - ], - "type": "object", - "properties": { - "message": { + }, + "providerId": { + "pattern": "[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab]{1}[0-9a-f]{3}-[0-9a-f]{12}", + "type": "string" + }, + "licenseStatus": { "type": "string", - "description": "A message about the request" + "enum": [ + "active", + "inactive" + ] + }, + "familyName": { + "maxLength": 100, + "minLength": 1, + "type": "string" + }, + "middleName": { + "maxLength": 100, + "minLength": 1, + "type": "string" + }, + "birthMonthDay": { + "pattern": "^[01]{1}[0-9]{1}-[0-3]{1}[0-9]{1}$", + "type": "string", + "format": "date" + }, + "dateOfUpdate": { + "type": "string", + "format": "date-time" } } } diff --git a/backend/cosmetology-app/docs/internal/postman/postman-collection.json b/backend/cosmetology-app/docs/internal/postman/postman-collection.json index 006731546..4967e57b1 100644 --- a/backend/cosmetology-app/docs/internal/postman/postman-collection.json +++ b/backend/cosmetology-app/docs/internal/postman/postman-collection.json @@ -10,7 +10,7 @@ "type": "bearer" }, "info": { - "_postman_id": "c86d356c-40cb-4d66-9540-42f3202343d5", + "_postman_id": "27196783-5625-40c7-9341-cd0e12a9ebf6", "description": { "content": "", "type": "text/plain" @@ -401,7 +401,7 @@ "item": [ { "event": [], - "id": "69ea0609-73d9-4dbc-8c37-70535531091a", + "id": "73383dc9-7406-4477-8e23-7f49b2c1106a", "name": "/v1/compacts/:compact", "protocolProfileBehavior": { "disableBodyPruning": true @@ -444,7 +444,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"compactAbbr\": \"\",\n \"compactAdverseActionsNotificationEmails\": [\n \"\",\n \"\"\n ],\n \"compactName\": \"\",\n \"compactOperationsTeamEmails\": [\n \"\",\n \"\"\n ],\n \"configuredStates\": [\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"wa\"\n },\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"va\"\n }\n ],\n \"licenseeRegistrationEnabled\": \"\"\n}", + "body": "{\n \"compactAbbr\": \"\",\n \"compactAdverseActionsNotificationEmails\": [\n \"\",\n \"\"\n ],\n \"compactName\": \"\",\n \"compactOperationsTeamEmails\": [\n \"\",\n \"\"\n ],\n \"configuredStates\": [\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"ky\"\n },\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"md\"\n }\n ],\n \"licenseeRegistrationEnabled\": \"\"\n}", "code": 200, "cookie": [], "header": [ @@ -453,7 +453,7 @@ "value": "application/json" } ], - "id": "5e922d0d-16a1-427f-84a1-c5a9a363df39", + "id": "14abac83-334a-4006-a334-a81b8b034f7a", "name": "200 response", "originalRequest": { "body": {}, @@ -491,7 +491,7 @@ }, { "event": [], - "id": "ea60e924-1a4d-4a82-ab18-124f32d22f6d", + "id": "9c008cc0-dd62-4e06-a170-2f83b68d80c2", "name": "/v1/compacts/:compact", "protocolProfileBehavior": { "disableBodyPruning": true @@ -505,7 +505,7 @@ "language": "json" } }, - "raw": "{\n \"compactAdverseActionsNotificationEmails\": [\n \"\"\n ],\n \"compactOperationsTeamEmails\": [\n \"\"\n ],\n \"configuredStates\": [\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"wa\"\n },\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"ks\"\n }\n ],\n \"licenseeRegistrationEnabled\": \"\"\n}" + "raw": "{\n \"compactAdverseActionsNotificationEmails\": [\n \"\"\n ],\n \"compactOperationsTeamEmails\": [\n \"\"\n ],\n \"configuredStates\": [\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"va\"\n },\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"md\"\n }\n ],\n \"licenseeRegistrationEnabled\": \"\"\n}" }, "description": {}, "header": [ @@ -556,7 +556,7 @@ "value": "application/json" } ], - "id": "ab0606b6-be4a-48ef-b795-acfa0672270e", + "id": "d0145f00-691e-4174-95dc-cf436b3c0083", "name": "200 response", "originalRequest": { "body": { @@ -567,7 +567,7 @@ "language": "json" } }, - "raw": "{\n \"compactAdverseActionsNotificationEmails\": [\n \"\"\n ],\n \"compactOperationsTeamEmails\": [\n \"\"\n ],\n \"configuredStates\": [\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"wa\"\n },\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"ks\"\n }\n ],\n \"licenseeRegistrationEnabled\": \"\"\n}" + "raw": "{\n \"compactAdverseActionsNotificationEmails\": [\n \"\"\n ],\n \"compactOperationsTeamEmails\": [\n \"\"\n ],\n \"configuredStates\": [\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"va\"\n },\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"md\"\n }\n ],\n \"licenseeRegistrationEnabled\": \"\"\n}" }, "header": [ { @@ -610,7 +610,7 @@ "item": [ { "event": [], - "id": "f76398a7-73fc-4e37-a4fe-a29529d29867", + "id": "c704cdde-5fb7-4320-9953-acfb6718e7b4", "name": "/v1/compacts/:compact/jurisdictions", "protocolProfileBehavior": { "disableBodyPruning": true @@ -663,7 +663,7 @@ "value": "application/json" } ], - "id": "4653aac0-f631-412b-9bf6-d4f43699bf5e", + "id": "6feff217-87de-452b-8b5e-f2b983cf3f00", "name": "200 response", "originalRequest": { "body": {}, @@ -705,7 +705,7 @@ "item": [ { "event": [], - "id": "2eb438e1-dfb0-44bd-adbd-6811d09bbc2c", + "id": "ffbcf5f7-9949-4181-ae53-a6ff16996466", "name": "/v1/compacts/:compact/jurisdictions/:jurisdiction", "protocolProfileBehavior": { "disableBodyPruning": true @@ -769,7 +769,7 @@ "value": "application/json" } ], - "id": "ab057823-5bc7-49f4-9ee4-09add2419179", + "id": "7c0d180b-0ce7-4190-bcaa-80905d1a6483", "name": "200 response", "originalRequest": { "body": {}, @@ -809,7 +809,7 @@ }, { "event": [], - "id": "ebbbcb4d-8b09-4746-95ca-25e16afd1a0d", + "id": "514b730f-5551-49ab-8a57-60bb6fc3b375", "name": "/v1/compacts/:compact/jurisdictions/:jurisdiction", "protocolProfileBehavior": { "disableBodyPruning": true @@ -886,7 +886,7 @@ "value": "application/json" } ], - "id": "1a3508c8-45c5-4267-b022-3031f5ee2695", + "id": "94b9332e-6499-4e84-8e37-76f0da6b9b2f", "name": "200 response", "originalRequest": { "body": { @@ -970,7 +970,7 @@ } } ], - "id": "8f7e2286-26de-4b1f-ae10-2d52bcb2929b", + "id": "55e7657e-adf6-4591-b94f-6892e64df01e", "name": "/v1/compacts/:compact/jurisdictions/:jurisdiction/licenses/bulk-upload", "protocolProfileBehavior": { "disableBodyPruning": true @@ -1027,7 +1027,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"upload\": {\n \"fields\": {\n \"incididunt_555\": \"\"\n },\n \"url\": \"\"\n }\n}", + "body": "{\n \"upload\": {\n \"fields\": {\n \"in971\": \"\"\n },\n \"url\": \"\"\n }\n}", "code": 200, "cookie": [], "header": [ @@ -1036,7 +1036,7 @@ "value": "application/json" } ], - "id": "49a87d26-0946-4aae-9ee6-cff37b11aeea", + "id": "e0c7306c-11f6-4093-baa7-d0ba095bd3e7", "name": "200 response", "originalRequest": { "body": {}, @@ -1096,7 +1096,7 @@ "item": [ { "event": [], - "id": "6df89efd-a66d-4a98-8e12-3f27ab199e8f", + "id": "de218e7d-f38b-4b5e-a853-a1159e16ceeb", "name": "/v1/compacts/:compact/providers/query", "protocolProfileBehavior": { "disableBodyPruning": true @@ -1110,7 +1110,7 @@ "language": "json" } }, - "raw": "{\n \"query\": {\n \"providerId\": \"5d9241fc-627f-447a-a0e6-2b2277baf117\",\n \"jurisdiction\": \"ks\",\n \"givenName\": \"\",\n \"familyName\": \"\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"key\": \"familyName\",\n \"direction\": \"descending\"\n }\n}" + "raw": "{\n \"query\": {\n \"providerId\": \"ccff1ab1-d6be-4814-a0bd-0c94fa320dbb\",\n \"jurisdiction\": \"va\",\n \"givenName\": \"\",\n \"familyName\": \"\",\n \"licenseNumber\": \"\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"key\": \"dateOfUpdate\",\n \"direction\": \"ascending\"\n }\n}" }, "description": {}, "header": [ @@ -1154,7 +1154,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"pagination\": {\n \"prevLastKey\": {},\n \"lastKey\": {},\n \"pageSize\": \"\"\n },\n \"providers\": [\n {\n \"birthMonthDay\": \"08-32\",\n \"compact\": \"cosm\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"1954-07-29\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"licenseJurisdiction\": \"al\",\n \"licenseStatus\": \"inactive\",\n \"providerId\": \"41d828db-f6e9-4dbd-b9af-f483e0d06f49\",\n \"type\": \"provider\",\n \"dateOfBirth\": \"1759-04-09\",\n \"suffix\": \"\",\n \"ssnLastFour\": \"2396\",\n \"middleName\": \"\"\n },\n {\n \"birthMonthDay\": \"15-02\",\n \"compact\": \"cosm\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"2943-08-29\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"licenseJurisdiction\": \"oh\",\n \"licenseStatus\": \"inactive\",\n \"providerId\": \"ebe8ae48-c84f-4394-b925-19afb1c469a9\",\n \"type\": \"provider\",\n \"dateOfBirth\": \"1672-07-16\",\n \"suffix\": \"\",\n \"ssnLastFour\": \"1920\",\n \"middleName\": \"\"\n }\n ],\n \"sorting\": {\n \"key\": \"dateOfUpdate\",\n \"direction\": \"ascending\"\n }\n}", + "body": "{\n \"pagination\": {\n \"prevLastKey\": {},\n \"lastKey\": {},\n \"pageSize\": \"\"\n },\n \"providers\": [\n {\n \"birthMonthDay\": \"16-30\",\n \"compact\": \"cosm\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"1559-11-30\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseJurisdiction\": \"az\",\n \"licenseStatus\": \"active\",\n \"providerId\": \"9140aa3d-3344-4520-8ed4-a433488dcf83\",\n \"type\": \"provider\",\n \"dateOfBirth\": \"2552-05-31\",\n \"suffix\": \"\",\n \"ssnLastFour\": \"3162\",\n \"middleName\": \"\"\n },\n {\n \"birthMonthDay\": \"06-02\",\n \"compact\": \"cosm\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"2112-06-28\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"licenseJurisdiction\": \"az\",\n \"licenseStatus\": \"inactive\",\n \"providerId\": \"d1ee34cd-6a17-422c-86f5-7c6115ce6aac\",\n \"type\": \"provider\",\n \"dateOfBirth\": \"2157-10-08\",\n \"suffix\": \"\",\n \"ssnLastFour\": \"9226\",\n \"middleName\": \"\"\n }\n ],\n \"sorting\": {\n \"key\": \"dateOfUpdate\",\n \"direction\": \"descending\"\n }\n}", "code": 200, "cookie": [], "header": [ @@ -1163,7 +1163,7 @@ "value": "application/json" } ], - "id": "030e47b5-b981-4002-bbee-676f0c02a000", + "id": "e4c19f03-ed09-4708-a6a7-5f21bde8e7c3", "name": "200 response", "originalRequest": { "body": { @@ -1174,7 +1174,7 @@ "language": "json" } }, - "raw": "{\n \"query\": {\n \"providerId\": \"5d9241fc-627f-447a-a0e6-2b2277baf117\",\n \"jurisdiction\": \"ks\",\n \"givenName\": \"\",\n \"familyName\": \"\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"key\": \"familyName\",\n \"direction\": \"descending\"\n }\n}" + "raw": "{\n \"query\": {\n \"providerId\": \"ccff1ab1-d6be-4814-a0bd-0c94fa320dbb\",\n \"jurisdiction\": \"va\",\n \"givenName\": \"\",\n \"familyName\": \"\",\n \"licenseNumber\": \"\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"key\": \"dateOfUpdate\",\n \"direction\": \"ascending\"\n }\n}" }, "header": [ { @@ -1222,7 +1222,7 @@ "item": [ { "event": [], - "id": "845c2956-9cf3-4c68-8386-21dc7a0fa91a", + "id": "c3addc9a-155e-4e39-a331-ac69c762b2c6", "name": "/v1/compacts/:compact/providers/:providerId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -1277,7 +1277,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"birthMonthDay\": \"19-29\",\n \"compact\": \"cosm\",\n \"dateOfExpiration\": \"2223-12-05\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"oh\",\n \"licenses\": [\n {\n \"compact\": \"cosm\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"1755-09-29\",\n \"dateOfIssuance\": \"1994-08-06\",\n \"dateOfRenewal\": \"2614-11-30\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"history\": [\n {\n \"compact\": \"cosm\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"ks\",\n \"previous\": {\n \"dateOfExpiration\": \"1382-03-30\",\n \"dateOfIssuance\": \"1010-09-24\",\n \"dateOfRenewal\": \"2238-03-30\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2286-12-07\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+169705366\",\n \"licenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"issuance\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"esthetician\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"ineligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1246-10-27\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2896-04-01\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2825-08-31\",\n \"phoneNumber\": \"+0246304877\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"2569-10-31\",\n \"licenseStatus\": \"inactive\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n },\n {\n \"compact\": \"cosm\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"az\",\n \"previous\": {\n \"dateOfExpiration\": \"1215-12-16\",\n \"dateOfIssuance\": \"1129-12-06\",\n \"dateOfRenewal\": \"2158-05-07\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"1724-12-26\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+23539194\",\n \"licenseStatus\": \"active\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"lifting_encumbrance\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"cosmetologist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"1165-01-03\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"1967-08-30\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"1894-07-04\",\n \"phoneNumber\": \"+04189833\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"1162-12-26\",\n \"licenseStatus\": \"active\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n }\n ],\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"md\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"cosmetologist\",\n \"middleName\": \"\",\n \"providerId\": \"981397ce-fa77-4ed4-a44e-25ecf102a958\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"investigations\": [\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"az\",\n \"licenseType\": \"\",\n \"providerId\": \"a652f834-acc8-4681-b909-46ee53494605\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"co\",\n \"licenseType\": \"\",\n \"providerId\": \"888382e9-1794-4c21-9366-4ed523901966\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"licenseNumber\": \"\",\n \"investigationStatus\": \"underInvestigation\",\n \"dateOfBirth\": \"2917-02-12\",\n \"ssnLastFour\": \"6928\",\n \"phoneNumber\": \"+76732543\",\n \"licenseStatusName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"2521-11-05\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1857-09-30\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ky\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"3aeb03b9-b96d-4bb2-9b4f-341e50123933\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2748-12-12\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1843-04-03\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2572-03-24\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"al\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"f00229d0-b3f5-4bd9-b0e3-9415eb52268b\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1000-09-06\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"compact\": \"cosm\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"1331-11-14\",\n \"dateOfIssuance\": \"1588-05-30\",\n \"dateOfRenewal\": \"2693-12-31\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"history\": [\n {\n \"compact\": \"cosm\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"oh\",\n \"previous\": {\n \"dateOfExpiration\": \"1500-01-06\",\n \"dateOfIssuance\": \"1718-12-04\",\n \"dateOfRenewal\": \"1258-08-31\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2107-04-05\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+41499628297\",\n \"licenseStatus\": \"active\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"other\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"esthetician\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"ineligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1125-04-13\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"1602-03-13\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2305-12-31\",\n \"phoneNumber\": \"+68419329788\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"1870-05-30\",\n \"licenseStatus\": \"active\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n },\n {\n \"compact\": \"cosm\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"ks\",\n \"previous\": {\n \"dateOfExpiration\": \"2303-11-31\",\n \"dateOfIssuance\": \"2827-12-06\",\n \"dateOfRenewal\": \"1874-06-05\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1981-11-18\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+35309281959\",\n \"licenseStatus\": \"active\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"licenseDeactivation\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"esthetician\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"ineligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2151-10-15\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"1608-05-10\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"1757-10-08\",\n \"phoneNumber\": \"+88645057\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"2728-03-30\",\n \"licenseStatus\": \"active\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n }\n ],\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"ks\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"cosmetologist\",\n \"middleName\": \"\",\n \"providerId\": \"331b9a04-3819-46a9-82db-133316566a37\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"investigations\": [\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"al\",\n \"licenseType\": \"\",\n \"providerId\": \"dfa9b698-6ee0-4e2f-94ee-24d83987666c\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"ky\",\n \"licenseType\": \"\",\n \"providerId\": \"5e835f9a-6b62-4aaa-bc86-27db21f905ce\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"licenseNumber\": \"\",\n \"investigationStatus\": \"underInvestigation\",\n \"dateOfBirth\": \"2542-05-16\",\n \"ssnLastFour\": \"7522\",\n \"phoneNumber\": \"+671890341856\",\n \"licenseStatusName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1552-10-08\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1645-05-28\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ks\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"528beca2-d37c-486c-a7c0-623dbb8d64ea\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2491-08-26\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"2870-12-09\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2897-12-24\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"al\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"d17fc19c-fa5a-4776-825c-0f851e2c4c75\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1257-12-06\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"privileges\": [\n {\n \"administratorSetStatus\": \"active\",\n \"compact\": \"cosm\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2059-12-06\",\n \"history\": [\n {\n \"compact\": \"cosm\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"co\",\n \"previous\": {\n \"administratorSetStatus\": \"inactive\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1097-10-31\",\n \"licenseJurisdiction\": \"va\",\n \"compact\": \"cosm\",\n \"providerId\": \"440453a8-af65-476e-9d27-533483bb8b42\",\n \"jurisdiction\": \"tn\",\n \"type\": \"privilege\",\n \"status\": \"active\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"licenseDeactivation\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"cosmetologist\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"1932-12-04\",\n \"licenseJurisdiction\": \"az\",\n \"compact\": \"cosm\",\n \"providerId\": \"e10462ee-8c85-4250-8713-92ccf431de2f\",\n \"jurisdiction\": \"md\",\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"status\": \"inactive\"\n }\n },\n {\n \"compact\": \"cosm\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"tn\",\n \"previous\": {\n \"administratorSetStatus\": \"inactive\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1369-01-01\",\n \"licenseJurisdiction\": \"tn\",\n \"compact\": \"cosm\",\n \"providerId\": \"719411e6-26f3-4377-bd04-ebb1ba9fcbbb\",\n \"jurisdiction\": \"va\",\n \"type\": \"privilege\",\n \"status\": \"inactive\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"other\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"cosmetologist\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"1029-11-03\",\n \"licenseJurisdiction\": \"az\",\n \"compact\": \"cosm\",\n \"providerId\": \"723b1674-81f6-437a-9430-81602d9a635c\",\n \"jurisdiction\": \"ky\",\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"status\": \"inactive\"\n }\n }\n ],\n \"jurisdiction\": \"co\",\n \"licenseJurisdiction\": \"va\",\n \"licenseType\": \"cosmetologist\",\n \"providerId\": \"47eb043c-9bab-4a88-97d9-3f6fbf4c18d8\",\n \"status\": \"active\",\n \"type\": \"privilege\",\n \"investigationStatus\": \"underInvestigation\",\n \"investigations\": [\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"ky\",\n \"licenseType\": \"\",\n \"providerId\": \"4ccce5bc-4c50-48f1-a3c4-519f098404ba\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"ky\",\n \"licenseType\": \"\",\n \"providerId\": \"176f294a-53ed-41d5-a4f5-944b520fd4cc\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1529-11-30\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1617-07-31\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"co\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"aeaff713-4948-4c75-86f6-ef2e09963604\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2639-10-31\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"2681-12-24\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2473-02-20\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ky\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"3f9d0c76-8dcd-415e-8152-e9883564a022\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2430-05-01\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"administratorSetStatus\": \"inactive\",\n \"compact\": \"cosm\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1017-03-05\",\n \"history\": [\n {\n \"compact\": \"cosm\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"ks\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1521-02-30\",\n \"licenseJurisdiction\": \"al\",\n \"compact\": \"cosm\",\n \"providerId\": \"190255de-3b03-4ee7-949d-90e9aa545b81\",\n \"jurisdiction\": \"ky\",\n \"type\": \"privilege\",\n \"status\": \"active\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"lifting_encumbrance\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"esthetician\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"1951-11-01\",\n \"licenseJurisdiction\": \"az\",\n \"compact\": \"cosm\",\n \"providerId\": \"cb017e6a-c29d-44c3-a59c-70dc29975fad\",\n \"jurisdiction\": \"va\",\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"status\": \"active\"\n }\n },\n {\n \"compact\": \"cosm\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"ks\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1472-04-04\",\n \"licenseJurisdiction\": \"wa\",\n \"compact\": \"cosm\",\n \"providerId\": \"d8372770-6d4f-48d0-9898-a62595d22a0c\",\n \"jurisdiction\": \"co\",\n \"type\": \"privilege\",\n \"status\": \"inactive\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"expiration\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"esthetician\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"1713-04-30\",\n \"licenseJurisdiction\": \"ks\",\n \"compact\": \"cosm\",\n \"providerId\": \"6fae54e3-ed49-4093-8275-7ed80ea7fe95\",\n \"jurisdiction\": \"tn\",\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"status\": \"inactive\"\n }\n }\n ],\n \"jurisdiction\": \"co\",\n \"licenseJurisdiction\": \"co\",\n \"licenseType\": \"esthetician\",\n \"providerId\": \"a3be6506-c659-446a-b2e6-d8e184f8a0c2\",\n \"status\": \"active\",\n \"type\": \"privilege\",\n \"investigationStatus\": \"underInvestigation\",\n \"investigations\": [\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"al\",\n \"licenseType\": \"\",\n \"providerId\": \"92b8e7e1-2b6b-411c-a98a-7a92c3e1d064\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"ks\",\n \"licenseType\": \"\",\n \"providerId\": \"c20e1708-5ffd-4c63-83c0-fff6bd34245b\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1729-12-09\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1342-02-06\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"va\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"174fa4b3-09bb-4c18-8122-d92233fcb464\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1630-10-27\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1259-03-09\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1302-04-26\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ky\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"33b802e6-4afb-446c-a156-1a73f155dc18\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2788-10-06\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"providerId\": \"9bbed952-418f-46dd-a4fe-9e94dc9b4fe7\",\n \"type\": \"provider\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1327-08-30\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"ssnLastFour\": \"8099\",\n \"licenseStatus\": \"active\",\n \"middleName\": \"\"\n}", + "body": "{\n \"birthMonthDay\": \"04-16\",\n \"compact\": \"cosm\",\n \"dateOfExpiration\": \"2519-07-31\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"az\",\n \"licenses\": [\n {\n \"compact\": \"cosm\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"1866-12-03\",\n \"dateOfIssuance\": \"2975-10-30\",\n \"dateOfRenewal\": \"2304-02-16\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"history\": [\n {\n \"compact\": \"cosm\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"oh\",\n \"previous\": {\n \"dateOfExpiration\": \"1246-10-30\",\n \"dateOfIssuance\": \"2441-11-30\",\n \"dateOfRenewal\": \"1977-12-31\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2689-11-31\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+32400846\",\n \"licenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"deactivation\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"cosmetologist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1977-12-14\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2987-10-31\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"1509-11-14\",\n \"phoneNumber\": \"+5350833196535\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"2897-06-06\",\n \"licenseStatus\": \"inactive\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n },\n {\n \"compact\": \"cosm\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"tn\",\n \"previous\": {\n \"dateOfExpiration\": \"2566-03-18\",\n \"dateOfIssuance\": \"1308-11-27\",\n \"dateOfRenewal\": \"2985-06-30\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2497-06-30\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+07312112731624\",\n \"licenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"renewal\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"cosmetologist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"1157-05-07\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2306-10-21\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2081-11-01\",\n \"phoneNumber\": \"+325444234528937\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"1401-10-02\",\n \"licenseStatus\": \"active\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n }\n ],\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"az\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"cosmetologist\",\n \"middleName\": \"\",\n \"providerId\": \"4294585d-3057-48c2-ac53-10c29bb1a75b\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"investigations\": [\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"ks\",\n \"licenseType\": \"\",\n \"providerId\": \"d99d813f-45ff-42af-a86f-a1ba3c8da1db\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"oh\",\n \"licenseType\": \"\",\n \"providerId\": \"86eb0f28-6c52-4f45-89b4-6d83aa34c29d\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"licenseNumber\": \"\",\n \"investigationStatus\": \"underInvestigation\",\n \"dateOfBirth\": \"2420-04-28\",\n \"ssnLastFour\": \"1694\",\n \"phoneNumber\": \"+76140281\",\n \"licenseStatusName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1540-11-20\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2310-05-14\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"oh\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"2b04ac21-ffa8-40a9-8f3b-914fd9b0b239\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1754-04-03\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1379-05-03\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1436-12-30\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ky\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"04531730-ed0d-4e8e-8890-1f51c4cf346d\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2997-09-05\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"compact\": \"cosm\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"2659-12-30\",\n \"dateOfIssuance\": \"1100-11-31\",\n \"dateOfRenewal\": \"1394-10-31\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"history\": [\n {\n \"compact\": \"cosm\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"md\",\n \"previous\": {\n \"dateOfExpiration\": \"2578-03-30\",\n \"dateOfIssuance\": \"1294-10-05\",\n \"dateOfRenewal\": \"1216-09-28\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1183-06-30\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+7953502865\",\n \"licenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"licenseDeactivation\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"cosmetologist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"ineligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2194-10-30\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2344-09-15\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2749-06-07\",\n \"phoneNumber\": \"+7433927495594\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"1087-10-25\",\n \"licenseStatus\": \"active\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n },\n {\n \"compact\": \"cosm\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"tn\",\n \"previous\": {\n \"dateOfExpiration\": \"2364-07-22\",\n \"dateOfIssuance\": \"2762-10-09\",\n \"dateOfRenewal\": \"1441-06-09\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2664-06-18\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+3108049697284\",\n \"licenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"licenseDeactivation\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"cosmetologist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1991-06-23\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2536-09-31\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2603-07-07\",\n \"phoneNumber\": \"+880072538007905\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"2430-03-30\",\n \"licenseStatus\": \"active\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n }\n ],\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"wa\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"cosmetologist\",\n \"middleName\": \"\",\n \"providerId\": \"97c56a33-d221-4e77-acf4-52914ff0580d\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"investigations\": [\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"ky\",\n \"licenseType\": \"\",\n \"providerId\": \"8983550e-f6c8-4f0f-8075-a66113450a7b\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"va\",\n \"licenseType\": \"\",\n \"providerId\": \"016ed490-38cb-41de-9c4f-60eaa1236c80\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"licenseNumber\": \"\",\n \"investigationStatus\": \"underInvestigation\",\n \"dateOfBirth\": \"2743-10-20\",\n \"ssnLastFour\": \"6640\",\n \"phoneNumber\": \"+9049577254\",\n \"licenseStatusName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1366-02-10\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2823-12-25\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"tn\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"a63cc01b-51e6-4e33-94b9-47193158a264\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2496-12-30\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1477-11-30\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2388-11-30\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"md\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"aab3acfc-702f-41db-b891-065c00ac8751\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2259-10-22\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"privileges\": [\n {\n \"administratorSetStatus\": \"active\",\n \"compact\": \"cosm\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1571-12-31\",\n \"history\": [\n {\n \"compact\": \"cosm\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"co\",\n \"previous\": {\n \"administratorSetStatus\": \"inactive\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1778-07-31\",\n \"licenseJurisdiction\": \"co\",\n \"compact\": \"cosm\",\n \"providerId\": \"4c5d75b9-cb9b-4cdc-bd17-b0c715538a14\",\n \"jurisdiction\": \"az\",\n \"type\": \"privilege\",\n \"status\": \"inactive\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"licenseDeactivation\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"cosmetologist\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"1767-02-30\",\n \"licenseJurisdiction\": \"md\",\n \"compact\": \"cosm\",\n \"providerId\": \"01e90700-65e2-42bf-aa22-c356c28bd36e\",\n \"jurisdiction\": \"oh\",\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"status\": \"active\"\n }\n },\n {\n \"compact\": \"cosm\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"ky\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1847-11-30\",\n \"licenseJurisdiction\": \"va\",\n \"compact\": \"cosm\",\n \"providerId\": \"eaf2f11c-e311-4fbf-8c8d-fdfe9e2a3cd1\",\n \"jurisdiction\": \"az\",\n \"type\": \"privilege\",\n \"status\": \"active\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"other\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"cosmetologist\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"2176-02-31\",\n \"licenseJurisdiction\": \"wa\",\n \"compact\": \"cosm\",\n \"providerId\": \"c0ab4674-4c6c-4419-b993-43868daca462\",\n \"jurisdiction\": \"oh\",\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"status\": \"active\"\n }\n }\n ],\n \"jurisdiction\": \"va\",\n \"licenseJurisdiction\": \"md\",\n \"licenseType\": \"cosmetologist\",\n \"providerId\": \"24ed94a7-6743-4005-b56b-1d0836961fd8\",\n \"status\": \"active\",\n \"type\": \"privilege\",\n \"investigationStatus\": \"underInvestigation\",\n \"investigations\": [\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"ky\",\n \"licenseType\": \"\",\n \"providerId\": \"e8303abf-69e5-47b5-a57b-9dbdfd9d55b5\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"ky\",\n \"licenseType\": \"\",\n \"providerId\": \"e64c61a4-7918-4161-a6d4-a6791904033d\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1080-06-21\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1772-06-15\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ks\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"b25d1419-6d5d-42e7-ad09-27e288bb8cb6\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2921-04-31\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1859-11-24\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1117-10-01\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"oh\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"e443c428-a00b-4b2c-9357-2beeba4b0e92\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1358-11-03\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"administratorSetStatus\": \"active\",\n \"compact\": \"cosm\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2833-11-01\",\n \"history\": [\n {\n \"compact\": \"cosm\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"wa\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1299-11-14\",\n \"licenseJurisdiction\": \"md\",\n \"compact\": \"cosm\",\n \"providerId\": \"98c096db-bcbb-4004-946d-0b21db3dbcc2\",\n \"jurisdiction\": \"wa\",\n \"type\": \"privilege\",\n \"status\": \"inactive\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"renewal\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"cosmetologist\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"2636-11-10\",\n \"licenseJurisdiction\": \"co\",\n \"compact\": \"cosm\",\n \"providerId\": \"eddda552-fcaa-4fd6-b3d5-ac10f2b0f7a8\",\n \"jurisdiction\": \"ky\",\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"status\": \"inactive\"\n }\n },\n {\n \"compact\": \"cosm\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"wa\",\n \"previous\": {\n \"administratorSetStatus\": \"inactive\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2883-07-30\",\n \"licenseJurisdiction\": \"va\",\n \"compact\": \"cosm\",\n \"providerId\": \"55d4ba21-4c3a-4270-bbc5-cc63a2302543\",\n \"jurisdiction\": \"co\",\n \"type\": \"privilege\",\n \"status\": \"active\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"deactivation\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"cosmetologist\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"1691-12-11\",\n \"licenseJurisdiction\": \"az\",\n \"compact\": \"cosm\",\n \"providerId\": \"c57d45ea-b92a-47e5-abfb-bc6ddd56a753\",\n \"jurisdiction\": \"tn\",\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"status\": \"inactive\"\n }\n }\n ],\n \"jurisdiction\": \"co\",\n \"licenseJurisdiction\": \"al\",\n \"licenseType\": \"cosmetologist\",\n \"providerId\": \"30752a16-51f7-4468-8c5b-3e6d1b9155ca\",\n \"status\": \"inactive\",\n \"type\": \"privilege\",\n \"investigationStatus\": \"underInvestigation\",\n \"investigations\": [\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"co\",\n \"licenseType\": \"\",\n \"providerId\": \"7f8aca96-5203-44b4-84f2-6712fe2d97fa\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"oh\",\n \"licenseType\": \"\",\n \"providerId\": \"85073bdd-0b09-43b8-adb3-bc8960df2831\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1658-04-12\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2697-02-09\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"md\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"8d4c6331-d019-41e1-99d9-0d43365ff26f\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2135-12-08\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"2244-03-08\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1441-11-31\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"tn\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"cbde5c24-d253-4ebc-96af-3e86486cf1b9\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1153-05-28\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"providerId\": \"a7385c3e-4fc1-4044-81ea-6c9f89b7413b\",\n \"type\": \"provider\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2527-10-08\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"ssnLastFour\": \"8658\",\n \"licenseStatus\": \"active\",\n \"middleName\": \"\"\n}", "code": 200, "cookie": [], "header": [ @@ -1286,7 +1286,7 @@ "value": "application/json" } ], - "id": "2cd97d97-bf93-4ab2-9714-f7f4d48321aa", + "id": "acf52902-2a08-4a62-a9f7-8579f9a80b31", "name": "200 response", "originalRequest": { "body": {}, @@ -1344,7 +1344,7 @@ "item": [ { "event": [], - "id": "22c75de1-18b6-4d92-8a3a-a5d735547c95", + "id": "2c7487da-07ea-4364-b219-1fc04abb52c5", "name": "/v1/compacts/:compact/providers/:providerId/licenses/jurisdiction/:jurisdiction/licenseType/:licenseType/encumbrance", "protocolProfileBehavior": { "disableBodyPruning": true @@ -1358,7 +1358,7 @@ "language": "json" } }, - "raw": "{\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"encumbranceEffectiveDate\": \"2247-08-30\",\n \"encumbranceType\": \"completion of continuing education\"\n}" + "raw": "{\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"encumbranceEffectiveDate\": \"1044-06-17\",\n \"encumbranceType\": \"fine\"\n}" }, "description": {}, "header": [ @@ -1447,7 +1447,7 @@ "value": "application/json" } ], - "id": "762c99c8-ed9f-456a-9697-6b3cf4faf322", + "id": "cec97712-0da6-4aa9-a4cc-05f4bdc98d04", "name": "200 response", "originalRequest": { "body": { @@ -1458,7 +1458,7 @@ "language": "json" } }, - "raw": "{\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"encumbranceEffectiveDate\": \"2247-08-30\",\n \"encumbranceType\": \"completion of continuing education\"\n}" + "raw": "{\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"encumbranceEffectiveDate\": \"1044-06-17\",\n \"encumbranceType\": \"fine\"\n}" }, "header": [ { @@ -1509,7 +1509,7 @@ "item": [ { "event": [], - "id": "abf93958-3268-4ee6-9295-657334e05417", + "id": "3f4a8ac1-ccda-4585-b53e-f72ae742af2a", "name": "/v1/compacts/:compact/providers/:providerId/licenses/jurisdiction/:jurisdiction/licenseType/:licenseType/encumbrance/:encumbranceId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -1523,7 +1523,7 @@ "language": "json" } }, - "raw": "{\n \"effectiveLiftDate\": \"1546-10-02\"\n}" + "raw": "{\n \"effectiveLiftDate\": \"2949-09-08\"\n}" }, "description": {}, "header": [ @@ -1623,7 +1623,7 @@ "value": "application/json" } ], - "id": "c547abc3-cc70-4bf4-9450-f0b5996f0c83", + "id": "0cee3fc2-9892-483f-9173-09517b9eacce", "name": "200 response", "originalRequest": { "body": { @@ -1634,7 +1634,7 @@ "language": "json" } }, - "raw": "{\n \"effectiveLiftDate\": \"1546-10-02\"\n}" + "raw": "{\n \"effectiveLiftDate\": \"2949-09-08\"\n}" }, "header": [ { @@ -1692,7 +1692,7 @@ "item": [ { "event": [], - "id": "ed5fb33b-2e19-494e-ad7d-3b0fd49c12d2", + "id": "a93030db-b18a-4e02-96a9-7b686a8ad630", "name": "/v1/compacts/:compact/providers/:providerId/licenses/jurisdiction/:jurisdiction/licenseType/:licenseType/investigation", "protocolProfileBehavior": { "disableBodyPruning": true @@ -1795,7 +1795,7 @@ "value": "application/json" } ], - "id": "8936d0cb-4c49-41c4-925e-d5ab16ec5c9c", + "id": "965f9c1a-eca9-4841-afac-047d010801c6", "name": "200 response", "originalRequest": { "body": { @@ -1857,7 +1857,7 @@ "item": [ { "event": [], - "id": "d5998329-7445-46c6-a87f-85e5117f6575", + "id": "54749da8-f993-43e2-934b-ad24df414554", "name": "/v1/compacts/:compact/providers/:providerId/licenses/jurisdiction/:jurisdiction/licenseType/:licenseType/investigation/:investigationId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -1871,7 +1871,7 @@ "language": "json" } }, - "raw": "{\n \"action\": \"close\",\n \"encumbrance\": {\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"encumbranceEffectiveDate\": \"2988-11-25\",\n \"encumbranceType\": \"fine\"\n }\n}" + "raw": "{\n \"action\": \"close\",\n \"encumbrance\": {\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"encumbranceEffectiveDate\": \"2947-06-17\",\n \"encumbranceType\": \"reprimand\"\n }\n}" }, "description": {}, "header": [ @@ -1971,7 +1971,7 @@ "value": "application/json" } ], - "id": "16ff65fd-6639-4896-8632-1cbef343e292", + "id": "a3f170da-9c12-4dbf-b1c3-df53c731544f", "name": "200 response", "originalRequest": { "body": { @@ -1982,7 +1982,7 @@ "language": "json" } }, - "raw": "{\n \"action\": \"close\",\n \"encumbrance\": {\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"encumbranceEffectiveDate\": \"2988-11-25\",\n \"encumbranceType\": \"fine\"\n }\n}" + "raw": "{\n \"action\": \"close\",\n \"encumbrance\": {\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"encumbranceEffectiveDate\": \"2947-06-17\",\n \"encumbranceType\": \"reprimand\"\n }\n}" }, "header": [ { @@ -2070,7 +2070,7 @@ "item": [ { "event": [], - "id": "7ef5fbfd-2a81-4ca7-a999-01fdebd821c4", + "id": "6f1183b9-148b-44f4-b393-74322dcc8236", "name": "/v1/compacts/:compact/providers/:providerId/privileges/jurisdiction/:jurisdiction/licenseType/:licenseType/encumbrance", "protocolProfileBehavior": { "disableBodyPruning": true @@ -2084,7 +2084,7 @@ "language": "json" } }, - "raw": "{\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"encumbranceEffectiveDate\": \"2247-08-30\",\n \"encumbranceType\": \"completion of continuing education\"\n}" + "raw": "{\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"encumbranceEffectiveDate\": \"1044-06-17\",\n \"encumbranceType\": \"fine\"\n}" }, "description": {}, "header": [ @@ -2173,7 +2173,7 @@ "value": "application/json" } ], - "id": "83e464b4-5367-4aef-ad7e-90197622d469", + "id": "d816a9a0-5449-40c4-9528-aef7716c9053", "name": "200 response", "originalRequest": { "body": { @@ -2184,7 +2184,7 @@ "language": "json" } }, - "raw": "{\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"encumbranceEffectiveDate\": \"2247-08-30\",\n \"encumbranceType\": \"completion of continuing education\"\n}" + "raw": "{\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"encumbranceEffectiveDate\": \"1044-06-17\",\n \"encumbranceType\": \"fine\"\n}" }, "header": [ { @@ -2235,7 +2235,7 @@ "item": [ { "event": [], - "id": "39b08c0d-662d-4ed4-afb0-6ba9001f0ce8", + "id": "4ea23ea2-7372-461e-b714-7108c250a7fe", "name": "/v1/compacts/:compact/providers/:providerId/privileges/jurisdiction/:jurisdiction/licenseType/:licenseType/encumbrance/:encumbranceId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -2249,7 +2249,7 @@ "language": "json" } }, - "raw": "{\n \"effectiveLiftDate\": \"1546-10-02\"\n}" + "raw": "{\n \"effectiveLiftDate\": \"2949-09-08\"\n}" }, "description": {}, "header": [ @@ -2349,7 +2349,7 @@ "value": "application/json" } ], - "id": "9b478e5a-0991-42ef-80a4-c98c649ab4dd", + "id": "520525d5-b25d-436b-8e41-6671bd7fa0f5", "name": "200 response", "originalRequest": { "body": { @@ -2360,7 +2360,7 @@ "language": "json" } }, - "raw": "{\n \"effectiveLiftDate\": \"1546-10-02\"\n}" + "raw": "{\n \"effectiveLiftDate\": \"2949-09-08\"\n}" }, "header": [ { @@ -2418,7 +2418,7 @@ "item": [ { "event": [], - "id": "242ac733-7e86-4530-90e2-55919686e8d3", + "id": "c4369dbc-58be-4230-96cb-714e2dad2176", "name": "/v1/compacts/:compact/providers/:providerId/privileges/jurisdiction/:jurisdiction/licenseType/:licenseType/investigation", "protocolProfileBehavior": { "disableBodyPruning": true @@ -2521,7 +2521,7 @@ "value": "application/json" } ], - "id": "755a1f8b-a044-42c0-8874-3f7086f0a81f", + "id": "5237cba8-57dd-4d39-a536-fe63dcd1a6fc", "name": "200 response", "originalRequest": { "body": { @@ -2583,7 +2583,7 @@ "item": [ { "event": [], - "id": "916f9056-091c-4127-972c-d58097d2154b", + "id": "0c23167f-a74e-47ba-aa2c-3a022ca91bcc", "name": "/v1/compacts/:compact/providers/:providerId/privileges/jurisdiction/:jurisdiction/licenseType/:licenseType/investigation/:investigationId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -2597,7 +2597,7 @@ "language": "json" } }, - "raw": "{\n \"action\": \"close\",\n \"encumbrance\": {\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"encumbranceEffectiveDate\": \"2988-11-25\",\n \"encumbranceType\": \"fine\"\n }\n}" + "raw": "{\n \"action\": \"close\",\n \"encumbrance\": {\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"encumbranceEffectiveDate\": \"2947-06-17\",\n \"encumbranceType\": \"reprimand\"\n }\n}" }, "description": {}, "header": [ @@ -2697,7 +2697,7 @@ "value": "application/json" } ], - "id": "dfd67bd7-ea8f-4ec1-bffd-bcb7a9a190e0", + "id": "d7187e4a-b52a-4b03-8ee8-77782694e099", "name": "200 response", "originalRequest": { "body": { @@ -2708,7 +2708,7 @@ "language": "json" } }, - "raw": "{\n \"action\": \"close\",\n \"encumbrance\": {\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"encumbranceEffectiveDate\": \"2988-11-25\",\n \"encumbranceType\": \"fine\"\n }\n}" + "raw": "{\n \"action\": \"close\",\n \"encumbrance\": {\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"encumbranceEffectiveDate\": \"2947-06-17\",\n \"encumbranceType\": \"reprimand\"\n }\n}" }, "header": [ { @@ -2781,7 +2781,7 @@ "item": [ { "event": [], - "id": "bb648299-5be8-47b7-be14-16c1ff4982a5", + "id": "e39b3d1d-e8c9-4b7e-a263-53ae736c1c10", "name": "/v1/compacts/:compact/providers/:providerId/ssn", "protocolProfileBehavior": { "disableBodyPruning": true @@ -2837,7 +2837,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"ssn\": \"688-70-3643\"\n}", + "body": "{\n \"ssn\": \"059-06-1522\"\n}", "code": 200, "cookie": [], "header": [ @@ -2846,7 +2846,7 @@ "value": "application/json" } ], - "id": "73658cf2-d30a-4e68-8c4c-3607af6c954a", + "id": "951fea8b-0c0c-4769-970d-9e61bef71ea4", "name": "200 response", "originalRequest": { "body": {}, @@ -2899,7 +2899,7 @@ "item": [ { "event": [], - "id": "88b549c5-5289-4490-8473-ed0418c4202b", + "id": "6128f536-5123-46cd-892c-69129e460fd0", "name": "/v1/compacts/:compact/staff-users", "protocolProfileBehavior": { "disableBodyPruning": true @@ -2943,7 +2943,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"pagination\": {\n \"prevLastKey\": {},\n \"lastKey\": {},\n \"pageSize\": \"\"\n },\n \"users\": [\n {\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"incididunt2a7\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"veniam_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"consequat_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"ullamco_3\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"mollit_b\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"aute_f5b\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"inactive\",\n \"userId\": \"\"\n },\n {\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"laboris_3b\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"incididunt_20\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n }\n ]\n}", + "body": "{\n \"pagination\": {\n \"prevLastKey\": {},\n \"lastKey\": {},\n \"pageSize\": \"\"\n },\n \"users\": [\n {\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"dolore_b\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"ad_9d\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"ipsumf\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"seda1d\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"mollitb\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"adipisicing4c\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"voluptate2d\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"sed_11\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"reprehenderit1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"tempor94\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"quidc5\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"sunt505\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"Loremc3_\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"deserunt35\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"ex0_f\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"incididunt_80\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n },\n {\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"adipisicing_b27\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"mollitcd6\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"aliqua_6\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"minim_5\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"mollit64\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"sunt_7\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"velit_\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"ut1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"quibb5\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"eiusmod_3\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"do_9\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"nostrud0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"inactive\",\n \"userId\": \"\"\n }\n ]\n}", "code": 200, "cookie": [], "header": [ @@ -2961,7 +2961,7 @@ "value": "" } ], - "id": "89eb9b76-972f-4536-9329-f7eb777f5bfd", + "id": "23ae873c-527f-4b64-a790-3d40e7ff94e5", "name": "200 response", "originalRequest": { "body": {}, @@ -3000,7 +3000,7 @@ }, { "event": [], - "id": "1131a085-2a0d-4b72-b750-737f28f15003", + "id": "33bcd202-3a54-4619-a667-fdbae0d9cded", "name": "/v1/compacts/:compact/staff-users", "protocolProfileBehavior": { "disableBodyPruning": true @@ -3014,7 +3014,7 @@ "language": "json" } }, - "raw": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"qui8_\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"velit_9\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" + "raw": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"adipisicing_62\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"dolor1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"magna_b8\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"qui_27b\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"sed_f\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" }, "description": {}, "header": [ @@ -3057,7 +3057,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"ad_f6\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"id_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"occaecat_c\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"cillum_3\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n}", + "body": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"Duis894\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"Utc\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"inf\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"dolore_4\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"eiusmod_c6\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"ipsum83\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"cillum_9e\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"amet_89\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n}", "code": 200, "cookie": [], "header": [ @@ -3075,7 +3075,7 @@ "value": "" } ], - "id": "0ee9d8bc-b043-4768-81f5-1a96c252f342", + "id": "386da6f0-925e-4c15-931c-dae17c517bcf", "name": "200 response", "originalRequest": { "body": { @@ -3086,7 +3086,7 @@ "language": "json" } }, - "raw": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"qui8_\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"velit_9\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" + "raw": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"adipisicing_62\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"dolor1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"magna_b8\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"qui_27b\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"sed_f\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" }, "header": [ { @@ -3130,7 +3130,7 @@ "item": [ { "event": [], - "id": "3d324393-e3a4-4e5c-bef3-2afd6eea9442", + "id": "cef0af7e-042a-480d-86c9-12c74d7235f2", "name": "/v1/compacts/:compact/staff-users/:userId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -3185,7 +3185,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"ad_f6\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"id_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"occaecat_c\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"cillum_3\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n}", + "body": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"Duis894\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"Utc\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"inf\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"dolore_4\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"eiusmod_c6\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"ipsum83\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"cillum_9e\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"amet_89\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n}", "code": 200, "cookie": [], "header": [ @@ -3203,7 +3203,7 @@ "value": "" } ], - "id": "9687a7a7-7b09-46eb-80d2-d2d1be30c66c", + "id": "68fdfe98-eef8-406a-abb6-9b4db6231034", "name": "200 response", "originalRequest": { "body": {}, @@ -3250,7 +3250,7 @@ "value": "application/json" } ], - "id": "a91d277d-7104-4b26-9dc7-cd1a281de9fd", + "id": "e9ecfb94-522d-41a1-9550-6212355f0ada", "name": "404 response", "originalRequest": { "body": {}, @@ -3290,7 +3290,7 @@ }, { "event": [], - "id": "5253d0a5-635a-44c4-a065-6f5b6688d12f", + "id": "9060d66a-4468-4c1d-a133-ab2af2921096", "name": "/v1/compacts/:compact/staff-users/:userId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -3354,7 +3354,7 @@ "value": "application/json" } ], - "id": "886dad9b-e40d-4ac7-9c10-94fa4afe8480", + "id": "e457c4b3-4710-4818-8e29-d0e4c71c6c49", "name": "200 response", "originalRequest": { "body": {}, @@ -3401,7 +3401,7 @@ "value": "application/json" } ], - "id": "3b1f81db-220a-4662-a742-9bd3ff395630", + "id": "f07b511f-f41a-4da1-adde-a09af526a98b", "name": "404 response", "originalRequest": { "body": {}, @@ -3441,7 +3441,7 @@ }, { "event": [], - "id": "fbecc5d7-02f2-4463-80ee-8dcc71801b7c", + "id": "004531eb-6f0f-4772-bb68-efcf918d1dd2", "name": "/v1/compacts/:compact/staff-users/:userId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -3455,7 +3455,7 @@ "language": "json" } }, - "raw": "{\n \"permissions\": {\n \"adipisicing__d\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"Ut_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"ullamco_769\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" + "raw": "{\n \"permissions\": {\n \"tempor2f\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"adipisicing_83\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"tempor2e4\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"non__\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"reprehenderit_8\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"fugiat_89\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"reprehenderit__\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"Excepteur_c2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"id_775\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" }, "description": {}, "header": [ @@ -3509,7 +3509,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"ad_f6\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"id_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"occaecat_c\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"cillum_3\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n}", + "body": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"Duis894\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"Utc\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"inf\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"dolore_4\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"eiusmod_c6\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"ipsum83\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"cillum_9e\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"amet_89\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n}", "code": 200, "cookie": [], "header": [ @@ -3527,7 +3527,7 @@ "value": "" } ], - "id": "f8cb39c8-919e-4947-9660-07282adb058a", + "id": "994fa20e-6da8-4372-abe5-93217e84d785", "name": "200 response", "originalRequest": { "body": { @@ -3538,7 +3538,7 @@ "language": "json" } }, - "raw": "{\n \"permissions\": {\n \"adipisicing__d\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"Ut_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"ullamco_769\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" + "raw": "{\n \"permissions\": {\n \"tempor2f\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"adipisicing_83\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"tempor2e4\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"non__\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"reprehenderit_8\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"fugiat_89\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"reprehenderit__\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"Excepteur_c2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"id_775\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" }, "header": [ { @@ -3587,7 +3587,7 @@ "value": "application/json" } ], - "id": "9a1705af-9e3c-415f-a9cc-13ab0a69ae92", + "id": "226b485d-4022-4225-b981-5dd84129071a", "name": "404 response", "originalRequest": { "body": { @@ -3598,7 +3598,7 @@ "language": "json" } }, - "raw": "{\n \"permissions\": {\n \"adipisicing__d\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"Ut_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"ullamco_769\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" + "raw": "{\n \"permissions\": {\n \"tempor2f\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"adipisicing_83\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"tempor2e4\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"non__\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"reprehenderit_8\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"fugiat_89\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"reprehenderit__\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"Excepteur_c2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"id_775\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" }, "header": [ { @@ -3643,7 +3643,7 @@ "item": [ { "event": [], - "id": "609ece77-7a62-406c-a981-bc1b49746330", + "id": "56ed4ca6-2caf-493a-84a8-26ed44c5137b", "name": "/v1/compacts/:compact/staff-users/:userId/reinvite", "protocolProfileBehavior": { "disableBodyPruning": true @@ -3708,7 +3708,7 @@ "value": "application/json" } ], - "id": "0ab0965e-da7e-424f-a497-020710104c35", + "id": "c45f2abc-cd56-46b0-b1f5-c000da3a3188", "name": "200 response", "originalRequest": { "body": {}, @@ -3756,7 +3756,7 @@ "value": "application/json" } ], - "id": "6c9ff999-21ac-4219-8564-28bf985844b5", + "id": "e2329876-e01c-4219-aeed-077d37a9514b", "name": "404 response", "originalRequest": { "body": {}, @@ -3821,7 +3821,7 @@ "item": [ { "event": [], - "id": "a7aad06b-3573-44ff-b189-d3e48c49f082", + "id": "6a1a2b50-103e-46b3-82a1-a942119bff3e", "name": "/v1/flags/:flagId/check", "protocolProfileBehavior": { "disableBodyPruning": true @@ -3838,7 +3838,7 @@ "language": "json" } }, - "raw": "{\n \"context\": {\n \"userId\": \"\",\n \"customAttributes\": {\n \"occaecat_d4\": \"\"\n }\n }\n}" + "raw": "{\n \"context\": {\n \"userId\": \"\",\n \"customAttributes\": {\n \"Duis9c\": \"\"\n }\n }\n}" }, "description": {}, "header": [ @@ -3890,7 +3890,7 @@ "value": "application/json" } ], - "id": "f53f0917-f9ed-4876-ae88-8333e28c3fee", + "id": "f9be1fd7-e01d-48c4-ab7a-24bea0970651", "name": "200 response", "originalRequest": { "body": { @@ -3901,7 +3901,7 @@ "language": "json" } }, - "raw": "{\n \"context\": {\n \"userId\": \"\",\n \"customAttributes\": {\n \"occaecat_d4\": \"\"\n }\n }\n}" + "raw": "{\n \"context\": {\n \"userId\": \"\",\n \"customAttributes\": {\n \"Duis9c\": \"\"\n }\n }\n}" }, "header": [ { @@ -3955,7 +3955,7 @@ "item": [ { "event": [], - "id": "cd64eaf9-4ae0-4494-958b-d0370c451143", + "id": "b68b406d-aedd-4f82-b8c7-608c2c755c6e", "name": "/v1/public/compacts/:compact/jurisdictions", "protocolProfileBehavior": { "disableBodyPruning": true @@ -4012,7 +4012,7 @@ "value": "application/json" } ], - "id": "da6f6b2b-fbb3-4853-b2fc-909f66cd3037", + "id": "2e5f8a9d-21a2-4d93-ba44-f3454c59cebc", "name": "200 response", "originalRequest": { "body": {}, @@ -4053,7 +4053,7 @@ "item": [ { "event": [], - "id": "26ec27f2-6db1-4d6c-8689-65c5a67f57cd", + "id": "41f44d08-cf37-45e3-8c7c-b6132a737b70", "name": "/v1/public/compacts/:compact/providers/query", "protocolProfileBehavior": { "disableBodyPruning": true @@ -4070,7 +4070,7 @@ "language": "json" } }, - "raw": "{\n \"query\": {\n \"providerId\": \"5d9241fc-627f-447a-a0e6-2b2277baf117\",\n \"jurisdiction\": \"ks\",\n \"givenName\": \"\",\n \"familyName\": \"\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"key\": \"familyName\",\n \"direction\": \"descending\"\n }\n}" + "raw": "{\n \"query\": {\n \"providerId\": \"ccff1ab1-d6be-4814-a0bd-0c94fa320dbb\",\n \"jurisdiction\": \"va\",\n \"givenName\": \"\",\n \"familyName\": \"\",\n \"licenseNumber\": \"\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"key\": \"dateOfUpdate\",\n \"direction\": \"ascending\"\n }\n}" }, "description": {}, "header": [ @@ -4115,7 +4115,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"pagination\": {\n \"prevLastKey\": {},\n \"lastKey\": {},\n \"pageSize\": \"\"\n },\n \"providers\": [\n {\n \"compact\": \"cosm\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"tn\",\n \"providerId\": \"04174472-f8ac-43c0-9869-56c7a8edb6d0\",\n \"type\": \"provider\",\n \"middleName\": \"\",\n \"suffix\": \"\",\n \"dateOfUpdate\": \"\"\n },\n {\n \"compact\": \"cosm\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"wa\",\n \"providerId\": \"1731d6f8-c615-4181-83d8-019cbfa7ba56\",\n \"type\": \"provider\",\n \"middleName\": \"\",\n \"suffix\": \"\",\n \"dateOfUpdate\": \"\"\n }\n ],\n \"query\": {\n \"providerId\": \"d9b8b323-f0aa-4dd8-a9fd-c2ba358e4626\",\n \"jurisdiction\": \"al\",\n \"givenName\": \"\",\n \"familyName\": \"\"\n },\n \"sorting\": {\n \"key\": \"dateOfUpdate\",\n \"direction\": \"ascending\"\n }\n}", + "body": "{\n \"pagination\": {\n \"prevLastKey\": {},\n \"lastKey\": {},\n \"pageSize\": \"\"\n },\n \"providers\": [\n {\n \"compact\": \"cosm\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"ky\",\n \"licenseNumber\": \"\",\n \"licenseType\": \"\",\n \"providerId\": \"680d969c-5325-4d33-9c11-7a6034e46b2a\"\n },\n {\n \"compact\": \"cosm\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"co\",\n \"licenseNumber\": \"\",\n \"licenseType\": \"\",\n \"providerId\": \"8974b525-6ef6-4f9a-b699-90cdbbee67c7\"\n }\n ],\n \"query\": {\n \"providerId\": \"c26f3d84-06e3-4e7d-b5ed-ed147da8977b\",\n \"jurisdiction\": \"md\",\n \"givenName\": \"\",\n \"familyName\": \"\",\n \"licenseNumber\": \"\"\n },\n \"sorting\": {\n \"key\": \"familyName\",\n \"direction\": \"ascending\"\n }\n}", "code": 200, "cookie": [], "header": [ @@ -4124,7 +4124,7 @@ "value": "application/json" } ], - "id": "132e3288-79c0-47ad-9c0e-6762cd5a43ff", + "id": "98aaea29-287e-48fb-a9e2-61f9534a369d", "name": "200 response", "originalRequest": { "body": { @@ -4135,7 +4135,7 @@ "language": "json" } }, - "raw": "{\n \"query\": {\n \"providerId\": \"5d9241fc-627f-447a-a0e6-2b2277baf117\",\n \"jurisdiction\": \"ks\",\n \"givenName\": \"\",\n \"familyName\": \"\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"key\": \"familyName\",\n \"direction\": \"descending\"\n }\n}" + "raw": "{\n \"query\": {\n \"providerId\": \"ccff1ab1-d6be-4814-a0bd-0c94fa320dbb\",\n \"jurisdiction\": \"va\",\n \"givenName\": \"\",\n \"familyName\": \"\",\n \"licenseNumber\": \"\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"key\": \"dateOfUpdate\",\n \"direction\": \"ascending\"\n }\n}" }, "header": [ { @@ -4176,7 +4176,7 @@ "item": [ { "event": [], - "id": "6baae5cf-6803-4947-b500-84f807adf551", + "id": "662bc6ab-1229-4ba6-bb04-32d80c7c425a", "name": "/v1/public/compacts/:compact/providers/:providerId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -4235,7 +4235,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"compact\": \"cosm\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"oh\",\n \"providerId\": \"cec770f5-c0df-4b78-a81b-e15e12217c8e\",\n \"type\": \"provider\",\n \"privileges\": [\n {\n \"administratorSetStatus\": \"inactive\",\n \"compact\": \"cosm\",\n \"dateOfExpiration\": \"2140-11-24\",\n \"jurisdiction\": \"va\",\n \"licenseJurisdiction\": \"wa\",\n \"licenseType\": \"cosmetologist\",\n \"providerId\": \"648a71cc-a5e3-4032-ba26-25af2c996c6a\",\n \"status\": \"active\",\n \"type\": \"privilege\",\n \"history\": [\n {\n \"compact\": \"cosm\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"co\",\n \"licenseType\": \"esthetician\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"1832-04-24\",\n \"licenseJurisdiction\": \"tn\"\n },\n \"providerId\": \"ac95eae2-3dbe-43b1-a6a8-b39baceab06a\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"lifting_encumbrance\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"1163-08-05\",\n \"licenseJurisdiction\": \"al\"\n }\n },\n {\n \"compact\": \"cosm\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"az\",\n \"licenseType\": \"cosmetologist\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"2470-12-09\",\n \"licenseJurisdiction\": \"co\"\n },\n \"providerId\": \"96f7a30f-5d68-4d0f-a24e-302c08eca76a\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"licenseDeactivation\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"2192-10-30\",\n \"licenseJurisdiction\": \"wa\"\n }\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1092-12-24\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1398-04-06\",\n \"jurisdiction\": \"va\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"3b767fe5-5c20-413b-b4d7-249f48a1ec11\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"2910-05-05\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1544-12-05\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2738-10-10\",\n \"jurisdiction\": \"co\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"252c844d-ce9f-4eab-a61b-bb54cfc91b1a\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"2399-11-24\"\n }\n ]\n },\n {\n \"administratorSetStatus\": \"inactive\",\n \"compact\": \"cosm\",\n \"dateOfExpiration\": \"2975-12-12\",\n \"jurisdiction\": \"al\",\n \"licenseJurisdiction\": \"wa\",\n \"licenseType\": \"cosmetologist\",\n \"providerId\": \"9c64b3fa-e690-4533-8334-ca0afee60b91\",\n \"status\": \"active\",\n \"type\": \"privilege\",\n \"history\": [\n {\n \"compact\": \"cosm\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"wa\",\n \"licenseType\": \"esthetician\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"1791-02-11\",\n \"licenseJurisdiction\": \"ky\"\n },\n \"providerId\": \"757aecba-8e55-40f6-a358-f12e9d063389\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"deactivation\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"2452-10-23\",\n \"licenseJurisdiction\": \"wa\"\n }\n },\n {\n \"compact\": \"cosm\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"al\",\n \"licenseType\": \"cosmetologist\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"1147-11-31\",\n \"licenseJurisdiction\": \"tn\"\n },\n \"providerId\": \"653bfb61-d1f4-49d6-8c15-9059f0fe7204\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"lifting_encumbrance\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"1642-12-25\",\n \"licenseJurisdiction\": \"va\"\n }\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1431-10-04\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2078-06-05\",\n \"jurisdiction\": \"co\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"1211f046-0b89-4b07-b126-729d9c94c113\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"1467-07-10\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"2931-12-13\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1686-11-05\",\n \"jurisdiction\": \"tn\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"9c2ca79d-1319-4ad9-ac4d-e5dcc2d3fd89\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"2427-12-17\"\n }\n ]\n }\n ],\n \"middleName\": \"\",\n \"suffix\": \"\"\n}", + "body": "{\n \"compact\": \"cosm\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"oh\",\n \"providerId\": \"a1f51500-ed7a-4d11-9f33-142b26f47827\",\n \"type\": \"provider\",\n \"privileges\": [\n {\n \"administratorSetStatus\": \"inactive\",\n \"compact\": \"cosm\",\n \"dateOfExpiration\": \"1380-05-15\",\n \"jurisdiction\": \"va\",\n \"licenseJurisdiction\": \"co\",\n \"licenseType\": \"esthetician\",\n \"providerId\": \"792d412c-9500-43b8-8621-a9131b2efd33\",\n \"status\": \"inactive\",\n \"type\": \"privilege\",\n \"history\": [\n {\n \"compact\": \"cosm\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"az\",\n \"licenseType\": \"esthetician\",\n \"previous\": {\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"1694-11-11\",\n \"licenseJurisdiction\": \"az\"\n },\n \"providerId\": \"627e312e-94f7-4b87-a703-4548d39ef642\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"other\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"2887-07-13\",\n \"licenseJurisdiction\": \"tn\"\n }\n },\n {\n \"compact\": \"cosm\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"tn\",\n \"licenseType\": \"esthetician\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"2263-11-06\",\n \"licenseJurisdiction\": \"ks\"\n },\n \"providerId\": \"49920765-5ef7-442c-b865-c374eac9c364\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"deactivation\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"1687-12-09\",\n \"licenseJurisdiction\": \"tn\"\n }\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"2901-04-18\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1312-08-31\",\n \"jurisdiction\": \"va\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"7d4f181c-97e6-4490-838d-00c7144f0813\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"2136-12-05\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"2846-09-31\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1832-10-16\",\n \"jurisdiction\": \"al\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"980a24c2-1b91-455d-9b47-ff7770d6873f\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"2988-03-22\"\n }\n ]\n },\n {\n \"administratorSetStatus\": \"inactive\",\n \"compact\": \"cosm\",\n \"dateOfExpiration\": \"1315-01-28\",\n \"jurisdiction\": \"tn\",\n \"licenseJurisdiction\": \"az\",\n \"licenseType\": \"cosmetologist\",\n \"providerId\": \"18c55d91-5371-4bab-9aee-3bb9a1bfd573\",\n \"status\": \"inactive\",\n \"type\": \"privilege\",\n \"history\": [\n {\n \"compact\": \"cosm\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"az\",\n \"licenseType\": \"esthetician\",\n \"previous\": {\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"1747-11-26\",\n \"licenseJurisdiction\": \"al\"\n },\n \"providerId\": \"7277427c-f5a2-4293-94a7-c7018b8d8321\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"deactivation\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"1572-12-01\",\n \"licenseJurisdiction\": \"tn\"\n }\n },\n {\n \"compact\": \"cosm\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"co\",\n \"licenseType\": \"esthetician\",\n \"previous\": {\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"1748-07-31\",\n \"licenseJurisdiction\": \"md\"\n },\n \"providerId\": \"558502be-70f7-4955-9dda-b92b6c74f78d\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"other\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"1345-04-27\",\n \"licenseJurisdiction\": \"co\"\n }\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"2612-09-05\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2624-12-30\",\n \"jurisdiction\": \"ky\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"dcdeb3c2-60a7-4131-9eb9-c4f72a9bffc3\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"1091-12-06\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1568-10-11\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2471-09-11\",\n \"jurisdiction\": \"oh\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"6c03fb02-e459-4bd1-b591-36454853b002\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"2799-11-11\"\n }\n ]\n }\n ],\n \"middleName\": \"\",\n \"suffix\": \"\"\n}", "code": 200, "cookie": [], "header": [ @@ -4244,7 +4244,7 @@ "value": "application/json" } ], - "id": "477d562d-bc77-4d18-b988-57643163f581", + "id": "f671781f-df23-42f1-a2ef-77550b3d9913", "name": "200 response", "originalRequest": { "body": {}, @@ -4295,7 +4295,7 @@ "item": [ { "event": [], - "id": "24e85428-bd0a-4a2f-975f-6097fc7547e0", + "id": "6a335753-35f1-4c68-ba16-6674995282aa", "name": "/v1/public/jurisdictions/live", "protocolProfileBehavior": { "disableBodyPruning": true @@ -4341,7 +4341,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"in_c\": [\n \"wa\",\n \"az\"\n ]\n}", + "body": "{\n \"laborumdc\": [\n \"al\",\n \"al\"\n ]\n}", "code": 200, "cookie": [], "header": [ @@ -4350,7 +4350,7 @@ "value": "application/json" } ], - "id": "c77c8061-b02a-431d-aa06-201919a71e26", + "id": "1d822625-0493-457a-a636-eac283fe709c", "name": "200 response", "originalRequest": { "body": {}, @@ -4406,7 +4406,7 @@ "item": [ { "event": [], - "id": "5178ba8c-9b68-4319-b2f9-e931e8d57b64", + "id": "d3347b74-a5bb-438c-91cc-d523fee53f53", "name": "/v1/staff-users/me", "protocolProfileBehavior": { "disableBodyPruning": true @@ -4438,7 +4438,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"ad_f6\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"id_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"occaecat_c\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"cillum_3\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n}", + "body": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"Duis894\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"Utc\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"inf\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"dolore_4\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"eiusmod_c6\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"ipsum83\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"cillum_9e\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"amet_89\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n}", "code": 200, "cookie": [], "header": [ @@ -4456,7 +4456,7 @@ "value": "" } ], - "id": "4042f89e-f42d-4470-82cf-563e6385ed92", + "id": "b57fec75-1c80-4c77-b94e-72dbf7b9e15d", "name": "200 response", "originalRequest": { "body": {}, @@ -4501,7 +4501,7 @@ "value": "application/json" } ], - "id": "977b0eae-332a-4d0c-ba12-ae72c0234cc3", + "id": "2007d8cb-1bb4-4eb4-871d-79bc0763aa69", "name": "404 response", "originalRequest": { "body": {}, @@ -4539,7 +4539,7 @@ }, { "event": [], - "id": "0e771354-c3b8-4700-8ac0-14f10951bb29", + "id": "79edf4bf-bf3d-485f-81f0-b7ed0aa1938b", "name": "/v1/staff-users/me", "protocolProfileBehavior": { "disableBodyPruning": true @@ -4584,7 +4584,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"ad_f6\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"id_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"occaecat_c\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"cillum_3\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n}", + "body": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"Duis894\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"Utc\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"inf\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"dolore_4\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"eiusmod_c6\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"ipsum83\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"cillum_9e\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"amet_89\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n}", "code": 200, "cookie": [], "header": [ @@ -4602,7 +4602,7 @@ "value": "" } ], - "id": "05388a56-3021-4d11-b3ae-598caae147ad", + "id": "b1c03b38-5741-4901-b108-52ec3d9428b8", "name": "200 response", "originalRequest": { "body": { @@ -4660,7 +4660,7 @@ "value": "application/json" } ], - "id": "d3f9f3c8-5f32-48b6-97a4-248ee626df2c", + "id": "098cedd8-0ad9-4f7e-9293-ee685a7f6e36", "name": "404 response", "originalRequest": { "body": { diff --git a/backend/cosmetology-app/docs/postman/postman-collection.json b/backend/cosmetology-app/docs/postman/postman-collection.json index 7c321aac1..1898059d6 100644 --- a/backend/cosmetology-app/docs/postman/postman-collection.json +++ b/backend/cosmetology-app/docs/postman/postman-collection.json @@ -10,7 +10,7 @@ "type": "bearer" }, "info": { - "_postman_id": "f7b9902e-dab4-4941-99b1-f2c42f2edfa6", + "_postman_id": "12e32f13-f30d-4689-a21a-b47cfc6f3da6", "description": { "content": "", "type": "text/plain" @@ -410,7 +410,7 @@ "item": [ { "event": [], - "id": "aaf8d266-5468-4a6b-ae58-0b2ca29fbdad", + "id": "83c4ba1f-6c1f-45e2-ae04-7757b214ac8e", "name": "/v1/compacts/:compact/jurisdictions/:jurisdiction/licenses", "protocolProfileBehavior": { "disableBodyPruning": true @@ -424,7 +424,7 @@ "language": "json" } }, - "raw": "[\n {\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2016-01-11\",\n \"dateOfExpiration\": \"1905-06-30\",\n \"dateOfIssuance\": \"1142-04-28\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseNumber\": \"\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"esthetician\",\n \"ssn\": \"595-78-6083\",\n \"homeAddressStreet2\": \"\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+84513167922177\",\n \"dateOfRenewal\": \"2876-10-16\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n },\n {\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2421-12-03\",\n \"dateOfExpiration\": \"1924-12-31\",\n \"dateOfIssuance\": \"1961-06-17\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseNumber\": \"\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"esthetician\",\n \"ssn\": \"999-36-3764\",\n \"homeAddressStreet2\": \"\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+6196608142\",\n \"dateOfRenewal\": \"2580-06-30\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n]" + "raw": "[\n {\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"1100-01-07\",\n \"dateOfExpiration\": \"2398-12-03\",\n \"dateOfIssuance\": \"1414-10-31\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseNumber\": \"\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"cosmetologist\",\n \"ssn\": \"133-07-7776\",\n \"homeAddressStreet2\": \"\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+51485269\",\n \"dateOfRenewal\": \"2283-10-30\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n },\n {\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2471-10-09\",\n \"dateOfExpiration\": \"1419-07-30\",\n \"dateOfIssuance\": \"1716-10-31\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseNumber\": \"\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"esthetician\",\n \"ssn\": \"533-42-6992\",\n \"homeAddressStreet2\": \"\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+877211196331\",\n \"dateOfRenewal\": \"1977-11-30\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n]" }, "description": {}, "header": [ @@ -488,7 +488,7 @@ "value": "application/json" } ], - "id": "d324d0d1-33de-4c34-bdc4-72a11803ce22", + "id": "1e07cff3-9b10-48ed-ae1a-a4db185775b4", "name": "200 response", "originalRequest": { "body": { @@ -499,7 +499,7 @@ "language": "json" } }, - "raw": "[\n {\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2016-01-11\",\n \"dateOfExpiration\": \"1905-06-30\",\n \"dateOfIssuance\": \"1142-04-28\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseNumber\": \"\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"esthetician\",\n \"ssn\": \"595-78-6083\",\n \"homeAddressStreet2\": \"\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+84513167922177\",\n \"dateOfRenewal\": \"2876-10-16\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n },\n {\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2421-12-03\",\n \"dateOfExpiration\": \"1924-12-31\",\n \"dateOfIssuance\": \"1961-06-17\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseNumber\": \"\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"esthetician\",\n \"ssn\": \"999-36-3764\",\n \"homeAddressStreet2\": \"\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+6196608142\",\n \"dateOfRenewal\": \"2580-06-30\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n]" + "raw": "[\n {\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"1100-01-07\",\n \"dateOfExpiration\": \"2398-12-03\",\n \"dateOfIssuance\": \"1414-10-31\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseNumber\": \"\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"cosmetologist\",\n \"ssn\": \"133-07-7776\",\n \"homeAddressStreet2\": \"\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+51485269\",\n \"dateOfRenewal\": \"2283-10-30\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n },\n {\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2471-10-09\",\n \"dateOfExpiration\": \"1419-07-30\",\n \"dateOfIssuance\": \"1716-10-31\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseNumber\": \"\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"esthetician\",\n \"ssn\": \"533-42-6992\",\n \"homeAddressStreet2\": \"\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+877211196331\",\n \"dateOfRenewal\": \"1977-11-30\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n]" }, "header": [ { @@ -540,7 +540,7 @@ }, { "_postman_previewlanguage": "json", - "body": "{\n \"message\": \"\",\n \"errors\": {\n \"anim_5c9\": {\n \"incididunt6\": [\n \"\",\n \"\"\n ]\n }\n }\n}", + "body": "{\n \"message\": \"\",\n \"errors\": {\n \"aliqua9\": {\n \"laborumd5\": [\n \"\",\n \"\"\n ],\n \"Ut_442\": [\n \"\",\n \"\"\n ]\n },\n \"ullamco1_\": {\n \"pariaturdfd\": [\n \"\",\n \"\"\n ]\n }\n }\n}", "code": 400, "cookie": [], "header": [ @@ -549,7 +549,7 @@ "value": "application/json" } ], - "id": "c9392cc6-2bcd-4d49-9c76-2ce436d97b94", + "id": "1075166f-2bae-459b-9cf7-fde9a5b34817", "name": "400 response", "originalRequest": { "body": { @@ -560,7 +560,7 @@ "language": "json" } }, - "raw": "[\n {\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2016-01-11\",\n \"dateOfExpiration\": \"1905-06-30\",\n \"dateOfIssuance\": \"1142-04-28\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseNumber\": \"\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"esthetician\",\n \"ssn\": \"595-78-6083\",\n \"homeAddressStreet2\": \"\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+84513167922177\",\n \"dateOfRenewal\": \"2876-10-16\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n },\n {\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2421-12-03\",\n \"dateOfExpiration\": \"1924-12-31\",\n \"dateOfIssuance\": \"1961-06-17\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseNumber\": \"\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"esthetician\",\n \"ssn\": \"999-36-3764\",\n \"homeAddressStreet2\": \"\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+6196608142\",\n \"dateOfRenewal\": \"2580-06-30\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n]" + "raw": "[\n {\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"1100-01-07\",\n \"dateOfExpiration\": \"2398-12-03\",\n \"dateOfIssuance\": \"1414-10-31\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseNumber\": \"\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"cosmetologist\",\n \"ssn\": \"133-07-7776\",\n \"homeAddressStreet2\": \"\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+51485269\",\n \"dateOfRenewal\": \"2283-10-30\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n },\n {\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2471-10-09\",\n \"dateOfExpiration\": \"1419-07-30\",\n \"dateOfIssuance\": \"1716-10-31\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseNumber\": \"\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"esthetician\",\n \"ssn\": \"533-42-6992\",\n \"homeAddressStreet2\": \"\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+877211196331\",\n \"dateOfRenewal\": \"1977-11-30\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n]" }, "header": [ { @@ -631,7 +631,7 @@ } } ], - "id": "7febd1cc-ed06-4812-9526-9b3dadc334a2", + "id": "617853ff-a0af-4af9-8588-33a75e5c9f37", "name": "/v1/compacts/:compact/jurisdictions/:jurisdiction/licenses/bulk-upload", "protocolProfileBehavior": { "disableBodyPruning": true @@ -688,7 +688,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"upload\": {\n \"fields\": {\n \"quis0e3\": \"\",\n \"consequat_fcf\": \"\",\n \"minime0\": \"\",\n \"minim_3\": \"\",\n \"occaecat988\": \"\"\n },\n \"url\": \"\"\n }\n}", + "body": "{\n \"upload\": {\n \"fields\": {\n \"ipsum_477\": \"\",\n \"minim0e\": \"\",\n \"consequat_a\": \"\",\n \"veniam_58\": \"\"\n },\n \"url\": \"\"\n }\n}", "code": 200, "cookie": [], "header": [ @@ -697,7 +697,7 @@ "value": "application/json" } ], - "id": "8c059a2d-8736-41b6-9fea-9144a01e3aef", + "id": "9da731e7-e9bf-4c21-9bb7-5caf51949487", "name": "200 response", "originalRequest": { "body": {}, diff --git a/backend/cosmetology-app/docs/search-internal/api-specification/latest-oas30.json b/backend/cosmetology-app/docs/search-internal/api-specification/latest-oas30.json index 600edc38b..14e44fe22 100644 --- a/backend/cosmetology-app/docs/search-internal/api-specification/latest-oas30.json +++ b/backend/cosmetology-app/docs/search-internal/api-specification/latest-oas30.json @@ -2,7 +2,7 @@ "openapi": "3.0.1", "info": { "title": "SearchApi", - "version": "2026-02-25T22:40:54Z" + "version": "2026-03-13T19:50:46Z" }, "servers": [ { @@ -34,7 +34,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SandboSearcFlaGc2hNzmIy" + "$ref": "#/components/schemas/SandboSearc6bIbGbp1agwX" } } }, @@ -46,7 +46,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SandboSearcEzLOjtUlVHxz" + "$ref": "#/components/schemas/SandboSearce1qe0F7F8UqP" } } } @@ -64,42 +64,7 @@ }, "components": { "schemas": { - "SandboSearcFlaGc2hNzmIy": { - "required": [ - "query" - ], - "type": "object", - "properties": { - "search_after": { - "type": "array", - "description": "Sort values from the last hit of the previous page for cursor-based pagination" - }, - "size": { - "maximum": 100, - "minimum": 1, - "type": "integer", - "description": "Number of results to return" - }, - "query": { - "type": "object", - "description": "The OpenSearch query body" - }, - "from": { - "minimum": 0, - "type": "integer", - "description": "Starting document offset for pagination" - }, - "sort": { - "type": "array", - "description": "Sort order for results (required for search_after pagination)", - "items": { - "type": "object" - } - } - }, - "additionalProperties": false - }, - "SandboSearcEzLOjtUlVHxz": { + "SandboSearce1qe0F7F8UqP": { "required": [ "providers", "total" @@ -868,6 +833,41 @@ } } } + }, + "SandboSearc6bIbGbp1agwX": { + "required": [ + "query" + ], + "type": "object", + "properties": { + "search_after": { + "type": "array", + "description": "Sort values from the last hit of the previous page for cursor-based pagination" + }, + "size": { + "maximum": 100, + "minimum": 1, + "type": "integer", + "description": "Number of results to return" + }, + "query": { + "type": "object", + "description": "The OpenSearch query body" + }, + "from": { + "minimum": 0, + "type": "integer", + "description": "Starting document offset for pagination" + }, + "sort": { + "type": "array", + "description": "Sort order for results (required for search_after pagination)", + "items": { + "type": "object" + } + } + }, + "additionalProperties": false } }, "securitySchemes": { diff --git a/backend/cosmetology-app/docs/search-internal/postman/postman-collection.json b/backend/cosmetology-app/docs/search-internal/postman/postman-collection.json index 2b6e66209..ea4e4886c 100644 --- a/backend/cosmetology-app/docs/search-internal/postman/postman-collection.json +++ b/backend/cosmetology-app/docs/search-internal/postman/postman-collection.json @@ -10,7 +10,7 @@ "type": "bearer" }, "info": { - "_postman_id": "f30acefe-591b-4aec-9f12-4617ae283540", + "_postman_id": "6a4d3924-4d14-415f-96d9-31ea18c14bde", "description": { "content": "", "type": "text/plain" @@ -407,7 +407,7 @@ "item": [ { "event": [], - "id": "a4788cd8-d46e-4b3c-8a1c-3b794871904b", + "id": "3bdc2e00-cf1a-420f-9102-6fa65ddb2df7", "name": "/v1/compacts/:compact/providers/search", "protocolProfileBehavior": { "disableBodyPruning": true @@ -465,7 +465,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"providers\": [\n {\n \"birthMonthDay\": \"05-29\",\n \"compact\": \"cosm\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"licenseJurisdiction\": \"va\",\n \"licenseStatus\": \"inactive\",\n \"providerId\": \"3b2ce4ac-690b-4b4a-ad49-d103ddb258d7\",\n \"type\": \"provider\",\n \"privileges\": [\n {\n \"administratorSetStatus\": \"inactive\",\n \"compact\": \"cosm\",\n \"dateOfExpiration\": \"2545-10-31\",\n \"jurisdiction\": \"ky\",\n \"licenseJurisdiction\": \"co\",\n \"licenseType\": \"\",\n \"providerId\": \"66b2cb4c-5a1b-4017-a6c0-10f5133d592d\",\n \"status\": \"active\",\n \"type\": \"privilege\",\n \"investigationStatus\": \"underInvestigation\",\n \"investigations\": [\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"va\",\n \"licenseType\": \"\",\n \"providerId\": \"3a730722-0fbb-4416-a76c-188478993f9c\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"al\",\n \"licenseType\": \"\",\n \"providerId\": \"0c54bcd0-11ab-44a8-ac50-a43fc5e6ef28\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"privilege\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1300-06-31\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2855-10-31\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"az\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"cb27b306-5c6f-41e5-b097-0174b801ba7f\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2657-02-09\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"privilege\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"2351-06-16\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2222-11-01\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"tn\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"2720cb02-0305-44cf-b43a-451635c74a89\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2260-12-08\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"administratorSetStatus\": \"active\",\n \"compact\": \"cosm\",\n \"dateOfExpiration\": \"2673-11-09\",\n \"jurisdiction\": \"wa\",\n \"licenseJurisdiction\": \"al\",\n \"licenseType\": \"\",\n \"providerId\": \"73560e5e-920b-4705-a9b8-4cf0930ea1c1\",\n \"status\": \"inactive\",\n \"type\": \"privilege\",\n \"investigationStatus\": \"underInvestigation\",\n \"investigations\": [\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"al\",\n \"licenseType\": \"\",\n \"providerId\": \"b781e6ba-6ecf-446d-8630-d54f33141e27\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"va\",\n \"licenseType\": \"\",\n \"providerId\": \"ba1bd0aa-1b49-4d27-ba7c-82392c87e1b8\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"privilege\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"2379-11-05\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1053-07-30\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"al\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"b051a452-b96c-4796-90ef-c3f4941b7673\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1250-11-06\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"license\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"2007-11-08\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2103-12-17\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"va\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"d75dc6ab-fe82-4455-8353-08e7125e7835\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2896-12-16\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"co\",\n \"licenses\": [\n {\n \"compact\": \"cosm\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"1513-12-29\",\n \"dateOfIssuance\": \"2173-11-24\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"oh\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"licenseNumber\": \"\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"\",\n \"providerId\": \"5ba4090f-a7aa-47b2-b116-28e56b114adb\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"investigations\": [\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"ks\",\n \"licenseType\": \"\",\n \"providerId\": \"bc1e47fb-8544-4994-baa9-c6adb080921d\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"md\",\n \"licenseType\": \"\",\n \"providerId\": \"c499aa70-edb0-4eb4-a91b-42614e7881c7\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"dateOfRenewal\": \"2954-12-08\",\n \"investigationStatus\": \"underInvestigation\",\n \"phoneNumber\": \"+54407065459586\",\n \"licenseStatusName\": \"\",\n \"middleName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"privilege\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1653-12-31\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1139-03-30\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"al\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"95e1a5c7-94e8-466a-9f2f-d6f1168720d2\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2470-04-13\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"license\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"2964-12-30\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1641-08-31\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"va\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"5f79fbf8-c109-40e4-8c8d-c0f18aa5eaf2\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1357-12-01\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"compact\": \"cosm\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"1127-09-29\",\n \"dateOfIssuance\": \"1057-09-17\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"al\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"licenseNumber\": \"\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"\",\n \"providerId\": \"a10754e5-3999-446f-af51-feaa165b210e\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"investigations\": [\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"oh\",\n \"licenseType\": \"\",\n \"providerId\": \"5a02ef9c-de56-4fae-b93f-dd11c4127765\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"ks\",\n \"licenseType\": \"\",\n \"providerId\": \"401a38f4-de8c-4ed1-b3b0-d5497bac644a\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"dateOfRenewal\": \"1399-10-30\",\n \"investigationStatus\": \"underInvestigation\",\n \"phoneNumber\": \"+870840127811956\",\n \"licenseStatusName\": \"\",\n \"middleName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"license\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1474-04-08\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2119-07-08\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"co\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"a9dfba6c-d9a2-4502-99d8-1a82d30ce204\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2497-04-30\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"license\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1118-07-23\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1523-06-31\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"co\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"1c02e6f1-da65-4d0c-bba9-7a56d0d29f7b\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1078-08-31\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n },\n {\n \"birthMonthDay\": \"12-32\",\n \"compact\": \"cosm\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseJurisdiction\": \"co\",\n \"licenseStatus\": \"active\",\n \"providerId\": \"e039f355-1155-4647-bb13-e7e3b03ae353\",\n \"type\": \"provider\",\n \"privileges\": [\n {\n \"administratorSetStatus\": \"active\",\n \"compact\": \"cosm\",\n \"dateOfExpiration\": \"1882-08-31\",\n \"jurisdiction\": \"md\",\n \"licenseJurisdiction\": \"wa\",\n \"licenseType\": \"\",\n \"providerId\": \"413b00f0-92fb-4623-be0f-36648a089a4e\",\n \"status\": \"inactive\",\n \"type\": \"privilege\",\n \"investigationStatus\": \"underInvestigation\",\n \"investigations\": [\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"wa\",\n \"licenseType\": \"\",\n \"providerId\": \"7c4e49f9-211a-4976-8c9b-fa710fe0006a\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"az\",\n \"licenseType\": \"\",\n \"providerId\": \"724def81-de05-49d7-b35b-ff76bef2ba1c\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"license\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"2734-09-31\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2325-06-30\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ks\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"748f52e9-b38c-4b11-9b28-36a9d85cde1a\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1358-06-16\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"license\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1806-09-03\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2718-10-31\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"wa\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"57ab4e63-a38f-4406-9de8-eb36fe23f06f\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1428-10-30\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"administratorSetStatus\": \"inactive\",\n \"compact\": \"cosm\",\n \"dateOfExpiration\": \"2420-06-24\",\n \"jurisdiction\": \"ky\",\n \"licenseJurisdiction\": \"ks\",\n \"licenseType\": \"\",\n \"providerId\": \"56bef94e-f037-48bc-b1b3-6656adcb82d5\",\n \"status\": \"active\",\n \"type\": \"privilege\",\n \"investigationStatus\": \"underInvestigation\",\n \"investigations\": [\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"ks\",\n \"licenseType\": \"\",\n \"providerId\": \"729f2359-b258-4765-811a-7abfe6875218\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"ks\",\n \"licenseType\": \"\",\n \"providerId\": \"d64e0125-554f-4387-acf1-d5f6eb2ef76e\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"license\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"2061-12-04\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2627-11-01\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"md\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"f8897c81-45d4-4745-89fd-9249c67b47cc\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1799-10-30\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"privilege\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1723-12-04\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2654-12-01\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"az\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"92719762-7632-4c94-910e-0c270bc86bea\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1849-03-03\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"al\",\n \"licenses\": [\n {\n \"compact\": \"cosm\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"1209-09-09\",\n \"dateOfIssuance\": \"2562-07-21\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"al\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"\",\n \"providerId\": \"778440f1-8d4a-4d23-bdf5-b2a67de3dec6\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"investigations\": [\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"md\",\n \"licenseType\": \"\",\n \"providerId\": \"de2288d4-6db9-452d-965b-703aa622be6b\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"ky\",\n \"licenseType\": \"\",\n \"providerId\": \"1472f1db-00ca-4f23-a24c-875a06f89120\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"dateOfRenewal\": \"2364-08-14\",\n \"investigationStatus\": \"underInvestigation\",\n \"phoneNumber\": \"+0719488777635\",\n \"licenseStatusName\": \"\",\n \"middleName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"privilege\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1609-03-01\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1242-04-15\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"oh\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"bb61587b-7822-4b68-8e5e-879ed5897d5b\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1283-09-19\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"privilege\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"2772-02-07\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1525-06-16\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"md\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"61a2d3f9-b3b2-457c-8334-eba416548ccc\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2220-04-09\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"compact\": \"cosm\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"2690-10-30\",\n \"dateOfIssuance\": \"2475-10-22\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"ks\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"licenseNumber\": \"\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"\",\n \"providerId\": \"a97be73e-996c-4dcb-bf18-99786e09a26e\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"investigations\": [\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"tn\",\n \"licenseType\": \"\",\n \"providerId\": \"3087ae27-6731-4005-8baa-0d41e992092d\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"wa\",\n \"licenseType\": \"\",\n \"providerId\": \"cbcf5ee9-4f12-4878-bf24-0407896f902c\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"dateOfRenewal\": \"1816-11-01\",\n \"investigationStatus\": \"underInvestigation\",\n \"phoneNumber\": \"+41465201\",\n \"licenseStatusName\": \"\",\n \"middleName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"privilege\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"2383-12-03\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1854-08-10\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ks\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"c954fd7c-a8a9-44fd-a27e-6f379cca8c7c\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1007-10-25\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"license\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1679-02-03\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2536-04-31\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"tn\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"b39d6a11-8ed1-40f5-9876-9a4b9b5b9d23\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1256-11-31\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n }\n ],\n \"total\": {\n \"value\": \"\",\n \"relation\": \"eq\"\n },\n \"lastSort\": \"\"\n}", + "body": "{\n \"providers\": [\n {\n \"birthMonthDay\": \"11-28\",\n \"compact\": \"cosm\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseJurisdiction\": \"oh\",\n \"licenseStatus\": \"inactive\",\n \"providerId\": \"4e5e54d8-25fd-434a-8a3c-ebcd619107c8\",\n \"type\": \"provider\",\n \"privileges\": [\n {\n \"administratorSetStatus\": \"active\",\n \"compact\": \"cosm\",\n \"dateOfExpiration\": \"1283-03-24\",\n \"jurisdiction\": \"az\",\n \"licenseJurisdiction\": \"al\",\n \"licenseType\": \"\",\n \"providerId\": \"e200de7a-6ccf-46af-b0bd-80d608efd32a\",\n \"status\": \"inactive\",\n \"type\": \"privilege\",\n \"investigationStatus\": \"underInvestigation\",\n \"investigations\": [\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"az\",\n \"licenseType\": \"\",\n \"providerId\": \"dacc63bc-87f2-492c-924f-65fb750640cb\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"co\",\n \"licenseType\": \"\",\n \"providerId\": \"e672027a-a455-49ce-a7d5-8ec9e71174fa\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"license\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1013-11-19\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2440-03-22\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"md\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"ed40bb57-424d-41fb-8754-b9b3f8c1b86f\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2020-04-14\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"license\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1822-07-05\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1554-12-12\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"tn\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"84bbb8ef-4cf9-4aec-838f-35b9ebc5f4e2\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2843-08-31\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"administratorSetStatus\": \"inactive\",\n \"compact\": \"cosm\",\n \"dateOfExpiration\": \"2898-10-09\",\n \"jurisdiction\": \"co\",\n \"licenseJurisdiction\": \"md\",\n \"licenseType\": \"\",\n \"providerId\": \"2deb9c93-98bf-4653-8531-ffcf1be9fb5a\",\n \"status\": \"inactive\",\n \"type\": \"privilege\",\n \"investigationStatus\": \"underInvestigation\",\n \"investigations\": [\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"az\",\n \"licenseType\": \"\",\n \"providerId\": \"0b7e195d-bf48-4ae6-8931-aa18653d357c\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"al\",\n \"licenseType\": \"\",\n \"providerId\": \"d1f89895-ad37-4632-81ce-b8c851f38df9\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"license\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1743-10-09\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2883-08-27\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"va\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"11c99e90-1b30-4bec-b007-dbbb9800f430\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1125-10-07\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"license\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1489-10-31\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1130-12-30\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"az\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"2e64934b-db3d-451d-b8e9-d7bd2673d39f\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2957-12-01\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"va\",\n \"licenses\": [\n {\n \"compact\": \"cosm\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"1595-10-23\",\n \"dateOfIssuance\": \"1594-07-30\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"ks\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"licenseNumber\": \"\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"\",\n \"providerId\": \"3d0b3496-1a34-44af-9c6d-893076bbf6c1\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"investigations\": [\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"va\",\n \"licenseType\": \"\",\n \"providerId\": \"b896749e-f421-4bc2-9eb8-64c82dabf0b5\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"co\",\n \"licenseType\": \"\",\n \"providerId\": \"f6d529f0-df70-4bc6-ad90-463cd813b3b1\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"dateOfRenewal\": \"2452-10-30\",\n \"investigationStatus\": \"underInvestigation\",\n \"phoneNumber\": \"+524805413579855\",\n \"licenseStatusName\": \"\",\n \"middleName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"privilege\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1396-06-02\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1806-08-13\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"al\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"8e02546b-fbbd-4d67-ad93-5cbe81128dec\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2943-01-04\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"privilege\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1917-10-07\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1870-11-10\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"az\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"9f472016-4c3f-48dc-a8b8-e146af94f758\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2246-11-05\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"compact\": \"cosm\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"1339-08-02\",\n \"dateOfIssuance\": \"2222-02-29\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"ks\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"\",\n \"providerId\": \"95986a0f-5368-4622-ac7c-49290179b48f\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"investigations\": [\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"md\",\n \"licenseType\": \"\",\n \"providerId\": \"44101c2d-b2b9-4238-8b9b-1ce91888277f\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"az\",\n \"licenseType\": \"\",\n \"providerId\": \"7aec1b97-60b5-42e9-afbd-44be7cf00fbf\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"dateOfRenewal\": \"1716-04-08\",\n \"investigationStatus\": \"underInvestigation\",\n \"phoneNumber\": \"+752037150196\",\n \"licenseStatusName\": \"\",\n \"middleName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"privilege\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1161-01-31\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1515-01-31\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ky\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"fca496e1-5c77-41b8-b734-7e7379f3e18f\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1718-09-30\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"license\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"2425-09-17\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2234-12-31\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"co\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"0d49c3a4-d6c1-405f-aea4-008e40dced79\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1854-12-02\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n },\n {\n \"birthMonthDay\": \"03-13\",\n \"compact\": \"cosm\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"licenseJurisdiction\": \"co\",\n \"licenseStatus\": \"active\",\n \"providerId\": \"9d189082-d9a9-430a-aa0a-d76d6ba467b2\",\n \"type\": \"provider\",\n \"privileges\": [\n {\n \"administratorSetStatus\": \"inactive\",\n \"compact\": \"cosm\",\n \"dateOfExpiration\": \"2526-12-28\",\n \"jurisdiction\": \"az\",\n \"licenseJurisdiction\": \"co\",\n \"licenseType\": \"\",\n \"providerId\": \"582e97c6-08ea-4057-af69-2274d27df67f\",\n \"status\": \"active\",\n \"type\": \"privilege\",\n \"investigationStatus\": \"underInvestigation\",\n \"investigations\": [\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"va\",\n \"licenseType\": \"\",\n \"providerId\": \"4f02d525-4755-4c18-8eb5-45d9c31eeb47\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"oh\",\n \"licenseType\": \"\",\n \"providerId\": \"4628b052-688f-4eaf-8b0d-deeef331e45f\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"privilege\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1382-07-02\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2907-06-05\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"al\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"8cbf7b79-3a70-47e7-8a73-800c54cdcd29\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1438-03-10\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"license\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"2568-12-20\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2378-11-31\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"va\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"ef16ed00-cdfa-4969-81e9-164a9eeb3524\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2190-12-20\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"administratorSetStatus\": \"active\",\n \"compact\": \"cosm\",\n \"dateOfExpiration\": \"1042-02-04\",\n \"jurisdiction\": \"co\",\n \"licenseJurisdiction\": \"oh\",\n \"licenseType\": \"\",\n \"providerId\": \"9d2aa59f-7194-4e86-a115-22136a08e7f2\",\n \"status\": \"inactive\",\n \"type\": \"privilege\",\n \"investigationStatus\": \"underInvestigation\",\n \"investigations\": [\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"md\",\n \"licenseType\": \"\",\n \"providerId\": \"7d4f7102-60b6-4d8d-b465-b651b2137ba1\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"md\",\n \"licenseType\": \"\",\n \"providerId\": \"f13aef15-666d-4274-9e7d-8edd7dee9617\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"license\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"2656-03-05\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2495-02-20\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"al\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"712cdfad-d066-486c-8a5b-5b7ccb0e866c\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2809-11-18\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"license\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1713-01-13\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2687-07-30\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"md\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"4900e42f-3bec-4e1f-bb1b-8c22b05f8bfb\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1773-11-20\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"az\",\n \"licenses\": [\n {\n \"compact\": \"cosm\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"1744-08-15\",\n \"dateOfIssuance\": \"2330-08-28\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"oh\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"licenseNumber\": \"\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"\",\n \"providerId\": \"e69fa2cb-a6e5-4d0b-ad8d-6e1c7c9be32f\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"investigations\": [\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"va\",\n \"licenseType\": \"\",\n \"providerId\": \"9e3dd0d3-175b-44c4-96d6-a6bbc2ee2e44\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"al\",\n \"licenseType\": \"\",\n \"providerId\": \"3e386e9b-ec15-49f5-a18b-9e9e270b29fd\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"dateOfRenewal\": \"2044-03-08\",\n \"investigationStatus\": \"underInvestigation\",\n \"phoneNumber\": \"+5303456155\",\n \"licenseStatusName\": \"\",\n \"middleName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"license\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"2857-03-26\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2489-09-17\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"va\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"31ee1f05-a0b0-4be3-b644-932f640c15d7\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1830-10-09\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"license\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"2493-03-12\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2546-11-18\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"co\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"05d8d94e-75e8-42d4-a002-2c382c85ba10\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2060-05-04\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"compact\": \"cosm\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"1884-09-07\",\n \"dateOfIssuance\": \"2130-09-07\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"az\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"licenseNumber\": \"\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"\",\n \"providerId\": \"8dd298ae-b64b-4c8a-80c5-28aee31ccaed\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"investigations\": [\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"tn\",\n \"licenseType\": \"\",\n \"providerId\": \"164f9b45-0097-4246-8e19-c65e3b213430\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"tn\",\n \"licenseType\": \"\",\n \"providerId\": \"019e741f-019a-4528-87ba-909cba6d93a5\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"dateOfRenewal\": \"2323-03-04\",\n \"investigationStatus\": \"underInvestigation\",\n \"phoneNumber\": \"+633155596720\",\n \"licenseStatusName\": \"\",\n \"middleName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"privilege\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"2977-10-11\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2921-10-04\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"az\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"9d30d02b-2952-4e59-96c8-1106a9b64b94\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2794-12-30\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"license\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1503-12-30\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2894-10-30\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"va\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"62414ec1-8a34-4a16-a754-ecbfed2bc0bf\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2924-01-02\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n }\n ],\n \"total\": {\n \"value\": \"\",\n \"relation\": \"gte\"\n },\n \"lastSort\": \"\"\n}", "code": 200, "cookie": [], "header": [ @@ -474,7 +474,7 @@ "value": "application/json" } ], - "id": "c36abece-6005-41ba-be06-62cc97d6fd61", + "id": "d415a119-fe8a-46d5-92bc-13a4a2d3ee12", "name": "200 response", "originalRequest": { "body": { From de20e40924914978cf72af92d9351f3e2c360060 Mon Sep 17 00:00:00 2001 From: Landon Shumway Date: Fri, 27 Mar 2026 13:22:42 -0500 Subject: [PATCH 18/36] Update API specs to latest --- .../api-specification/latest-oas30.json | 305 +++++------------- .../internal/postman/postman-collection.json | 212 ++++++------ .../docs/postman/postman-collection.json | 22 +- .../postman/postman-collection.json | 8 +- 4 files changed, 199 insertions(+), 348 deletions(-) diff --git a/backend/cosmetology-app/docs/internal/api-specification/latest-oas30.json b/backend/cosmetology-app/docs/internal/api-specification/latest-oas30.json index 75b8b2058..9e2056295 100644 --- a/backend/cosmetology-app/docs/internal/api-specification/latest-oas30.json +++ b/backend/cosmetology-app/docs/internal/api-specification/latest-oas30.json @@ -2,7 +2,7 @@ "openapi": "3.0.1", "info": { "title": "LicenseApi", - "version": "2026-03-27T16:48:03Z" + "version": "2026-03-27T18:19:52Z" }, "servers": [ { @@ -2463,238 +2463,12 @@ "wa" ] }, - "history": { - "type": "array", - "items": { - "required": [ - "compact", - "dateOfUpdate", - "jurisdiction", - "licenseType", - "previous", - "providerId", - "type", - "updateType", - "updatedValues" - ], - "type": "object", - "properties": { - "licenseType": { - "type": "string", - "enum": [ - "cosmetologist", - "esthetician" - ] - }, - "compact": { - "type": "string", - "enum": [ - "cosm" - ] - }, - "previous": { - "required": [ - "administratorSetStatus", - "dateOfExpiration", - "licenseJurisdiction" - ], - "type": "object", - "properties": { - "administratorSetStatus": { - "type": "string", - "enum": [ - "active", - "inactive" - ] - }, - "dateOfExpiration": { - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", - "type": "string", - "format": "date" - }, - "licenseJurisdiction": { - "type": "string", - "enum": [ - "al", - "az", - "co", - "ks", - "ky", - "md", - "oh", - "tn", - "va", - "wa" - ] - } - } - }, - "providerId": { - "pattern": "[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab]{1}[0-9a-f]{3}-[0-9a-f]{12}", - "type": "string" - }, - "jurisdiction": { - "type": "string", - "enum": [ - "al", - "az", - "co", - "ks", - "ky", - "md", - "oh", - "tn", - "va", - "wa" - ] - }, - "updatedValues": { - "type": "object", - "properties": { - "administratorSetStatus": { - "type": "string", - "enum": [ - "active", - "inactive" - ] - }, - "dateOfExpiration": { - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", - "type": "string", - "format": "date" - }, - "licenseJurisdiction": { - "type": "string", - "enum": [ - "al", - "az", - "co", - "ks", - "ky", - "md", - "oh", - "tn", - "va", - "wa" - ] - } - } - }, - "type": { - "type": "string", - "enum": [ - "privilegeUpdate" - ] - }, - "dateOfUpdate": { - "type": "string", - "format": "date-time" - }, - "updateType": { - "type": "string", - "enum": [ - "deactivation", - "expiration", - "issuance", - "other", - "renewal", - "encumbrance", - "lifting_encumbrance", - "licenseDeactivation" - ] - } - } - } - }, "type": { "type": "string", "enum": [ "privilege" ] }, - "adverseActions": { - "type": "array", - "items": { - "required": [ - "actionAgainst", - "adverseActionId", - "compact", - "creationDate", - "dateOfUpdate", - "effectiveStartDate", - "jurisdiction", - "licenseType", - "licenseTypeAbbreviation", - "providerId", - "type" - ], - "type": "object", - "properties": { - "licenseType": { - "type": "string" - }, - "compact": { - "type": "string", - "enum": [ - "cosm" - ] - }, - "providerId": { - "pattern": "[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab]{1}[0-9a-f]{3}-[0-9a-f]{12}", - "type": "string" - }, - "jurisdiction": { - "type": "string", - "enum": [ - "al", - "az", - "co", - "ks", - "ky", - "md", - "oh", - "tn", - "va", - "wa" - ] - }, - "effectiveStartDate": { - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", - "type": "string", - "format": "date" - }, - "licenseTypeAbbreviation": { - "type": "string" - }, - "adverseActionId": { - "type": "string" - }, - "effectiveLiftDate": { - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", - "type": "string", - "format": "date" - }, - "type": { - "type": "string", - "enum": [ - "adverseAction" - ] - }, - "creationDate": { - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", - "type": "string", - "format": "date" - }, - "actionAgainst": { - "type": "string" - }, - "dateOfUpdate": { - "type": "string", - "format": "date-time" - } - } - } - }, "status": { "type": "string", "enum": [ @@ -2705,6 +2479,83 @@ } } }, + "licenses": { + "type": "array", + "description": "Sanitized home-state license rows (LicensePublicResponseSchema)", + "items": { + "required": [ + "compact", + "compactEligibility", + "dateOfExpiration", + "jurisdiction", + "licenseNumber", + "licenseStatus", + "licenseType", + "type" + ], + "type": "object", + "properties": { + "licenseType": { + "type": "string", + "enum": [ + "cosmetologist", + "esthetician" + ] + }, + "dateOfExpiration": { + "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "type": "string", + "format": "date" + }, + "compact": { + "type": "string", + "enum": [ + "cosm" + ] + }, + "licenseStatus": { + "type": "string", + "enum": [ + "active", + "inactive" + ] + }, + "jurisdiction": { + "type": "string", + "enum": [ + "al", + "az", + "co", + "ks", + "ky", + "md", + "oh", + "tn", + "va", + "wa" + ] + }, + "compactEligibility": { + "type": "string", + "enum": [ + "eligible", + "ineligible" + ] + }, + "licenseNumber": { + "maxLength": 100, + "minLength": 1, + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "license" + ] + } + } + } + }, "licenseJurisdiction": { "type": "string", "enum": [ diff --git a/backend/cosmetology-app/docs/internal/postman/postman-collection.json b/backend/cosmetology-app/docs/internal/postman/postman-collection.json index 4967e57b1..d341d00df 100644 --- a/backend/cosmetology-app/docs/internal/postman/postman-collection.json +++ b/backend/cosmetology-app/docs/internal/postman/postman-collection.json @@ -10,7 +10,7 @@ "type": "bearer" }, "info": { - "_postman_id": "27196783-5625-40c7-9341-cd0e12a9ebf6", + "_postman_id": "3ce93373-3ce2-4b76-bcdc-fd6651c792a5", "description": { "content": "", "type": "text/plain" @@ -401,7 +401,7 @@ "item": [ { "event": [], - "id": "73383dc9-7406-4477-8e23-7f49b2c1106a", + "id": "17eccb36-a50d-4dae-bd76-b64ccccaff34", "name": "/v1/compacts/:compact", "protocolProfileBehavior": { "disableBodyPruning": true @@ -444,7 +444,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"compactAbbr\": \"\",\n \"compactAdverseActionsNotificationEmails\": [\n \"\",\n \"\"\n ],\n \"compactName\": \"\",\n \"compactOperationsTeamEmails\": [\n \"\",\n \"\"\n ],\n \"configuredStates\": [\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"ky\"\n },\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"md\"\n }\n ],\n \"licenseeRegistrationEnabled\": \"\"\n}", + "body": "{\n \"compactAbbr\": \"\",\n \"compactAdverseActionsNotificationEmails\": [\n \"\",\n \"\"\n ],\n \"compactName\": \"\",\n \"compactOperationsTeamEmails\": [\n \"\",\n \"\"\n ],\n \"configuredStates\": [\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"md\"\n },\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"az\"\n }\n ],\n \"licenseeRegistrationEnabled\": \"\"\n}", "code": 200, "cookie": [], "header": [ @@ -453,7 +453,7 @@ "value": "application/json" } ], - "id": "14abac83-334a-4006-a334-a81b8b034f7a", + "id": "24ccd08b-0d68-47ac-ac71-fe939c799892", "name": "200 response", "originalRequest": { "body": {}, @@ -491,7 +491,7 @@ }, { "event": [], - "id": "9c008cc0-dd62-4e06-a170-2f83b68d80c2", + "id": "20d241ec-1e4f-4b22-8205-f7ce2f7a934d", "name": "/v1/compacts/:compact", "protocolProfileBehavior": { "disableBodyPruning": true @@ -505,7 +505,7 @@ "language": "json" } }, - "raw": "{\n \"compactAdverseActionsNotificationEmails\": [\n \"\"\n ],\n \"compactOperationsTeamEmails\": [\n \"\"\n ],\n \"configuredStates\": [\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"va\"\n },\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"md\"\n }\n ],\n \"licenseeRegistrationEnabled\": \"\"\n}" + "raw": "{\n \"compactAdverseActionsNotificationEmails\": [\n \"\"\n ],\n \"compactOperationsTeamEmails\": [\n \"\"\n ],\n \"configuredStates\": [\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"tn\"\n },\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"wa\"\n }\n ],\n \"licenseeRegistrationEnabled\": \"\"\n}" }, "description": {}, "header": [ @@ -556,7 +556,7 @@ "value": "application/json" } ], - "id": "d0145f00-691e-4174-95dc-cf436b3c0083", + "id": "68da7087-1424-448e-816f-7afa67312189", "name": "200 response", "originalRequest": { "body": { @@ -567,7 +567,7 @@ "language": "json" } }, - "raw": "{\n \"compactAdverseActionsNotificationEmails\": [\n \"\"\n ],\n \"compactOperationsTeamEmails\": [\n \"\"\n ],\n \"configuredStates\": [\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"va\"\n },\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"md\"\n }\n ],\n \"licenseeRegistrationEnabled\": \"\"\n}" + "raw": "{\n \"compactAdverseActionsNotificationEmails\": [\n \"\"\n ],\n \"compactOperationsTeamEmails\": [\n \"\"\n ],\n \"configuredStates\": [\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"tn\"\n },\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"wa\"\n }\n ],\n \"licenseeRegistrationEnabled\": \"\"\n}" }, "header": [ { @@ -610,7 +610,7 @@ "item": [ { "event": [], - "id": "c704cdde-5fb7-4320-9953-acfb6718e7b4", + "id": "1523ff84-c127-4744-b586-0b4047bc4a98", "name": "/v1/compacts/:compact/jurisdictions", "protocolProfileBehavior": { "disableBodyPruning": true @@ -663,7 +663,7 @@ "value": "application/json" } ], - "id": "6feff217-87de-452b-8b5e-f2b983cf3f00", + "id": "e9d85cac-3310-417d-8c04-c89192494fad", "name": "200 response", "originalRequest": { "body": {}, @@ -705,7 +705,7 @@ "item": [ { "event": [], - "id": "ffbcf5f7-9949-4181-ae53-a6ff16996466", + "id": "f872c07d-3525-4040-8fe9-35bda9071a72", "name": "/v1/compacts/:compact/jurisdictions/:jurisdiction", "protocolProfileBehavior": { "disableBodyPruning": true @@ -769,7 +769,7 @@ "value": "application/json" } ], - "id": "7c0d180b-0ce7-4190-bcaa-80905d1a6483", + "id": "6c6aca1b-5196-4b57-8d5d-f9ca66c67349", "name": "200 response", "originalRequest": { "body": {}, @@ -809,7 +809,7 @@ }, { "event": [], - "id": "514b730f-5551-49ab-8a57-60bb6fc3b375", + "id": "b3b170d7-582a-4a2c-9a9a-f977ba6a9ad2", "name": "/v1/compacts/:compact/jurisdictions/:jurisdiction", "protocolProfileBehavior": { "disableBodyPruning": true @@ -886,7 +886,7 @@ "value": "application/json" } ], - "id": "94b9332e-6499-4e84-8e37-76f0da6b9b2f", + "id": "f7da98ba-bd29-4566-b5d1-5f7af899760e", "name": "200 response", "originalRequest": { "body": { @@ -970,7 +970,7 @@ } } ], - "id": "55e7657e-adf6-4591-b94f-6892e64df01e", + "id": "ba5dcf48-cc96-4eb5-b291-187deb64d4ae", "name": "/v1/compacts/:compact/jurisdictions/:jurisdiction/licenses/bulk-upload", "protocolProfileBehavior": { "disableBodyPruning": true @@ -1027,7 +1027,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"upload\": {\n \"fields\": {\n \"in971\": \"\"\n },\n \"url\": \"\"\n }\n}", + "body": "{\n \"upload\": {\n \"fields\": {\n \"do__1\": \"\",\n \"esse_8\": \"\",\n \"velit_9\": \"\",\n \"et_eca\": \"\"\n },\n \"url\": \"\"\n }\n}", "code": 200, "cookie": [], "header": [ @@ -1036,7 +1036,7 @@ "value": "application/json" } ], - "id": "e0c7306c-11f6-4093-baa7-d0ba095bd3e7", + "id": "9bff1128-49a5-4129-b6c9-7cd9c6b8b3de", "name": "200 response", "originalRequest": { "body": {}, @@ -1096,7 +1096,7 @@ "item": [ { "event": [], - "id": "de218e7d-f38b-4b5e-a853-a1159e16ceeb", + "id": "0b401553-44a7-4558-ba67-ad86670b8cbb", "name": "/v1/compacts/:compact/providers/query", "protocolProfileBehavior": { "disableBodyPruning": true @@ -1110,7 +1110,7 @@ "language": "json" } }, - "raw": "{\n \"query\": {\n \"providerId\": \"ccff1ab1-d6be-4814-a0bd-0c94fa320dbb\",\n \"jurisdiction\": \"va\",\n \"givenName\": \"\",\n \"familyName\": \"\",\n \"licenseNumber\": \"\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"key\": \"dateOfUpdate\",\n \"direction\": \"ascending\"\n }\n}" + "raw": "{\n \"query\": {\n \"providerId\": \"68691356-2c8a-40d3-89cf-b89183e229c8\",\n \"jurisdiction\": \"ky\",\n \"givenName\": \"\",\n \"familyName\": \"\",\n \"licenseNumber\": \"\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"key\": \"familyName\",\n \"direction\": \"ascending\"\n }\n}" }, "description": {}, "header": [ @@ -1154,7 +1154,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"pagination\": {\n \"prevLastKey\": {},\n \"lastKey\": {},\n \"pageSize\": \"\"\n },\n \"providers\": [\n {\n \"birthMonthDay\": \"16-30\",\n \"compact\": \"cosm\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"1559-11-30\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseJurisdiction\": \"az\",\n \"licenseStatus\": \"active\",\n \"providerId\": \"9140aa3d-3344-4520-8ed4-a433488dcf83\",\n \"type\": \"provider\",\n \"dateOfBirth\": \"2552-05-31\",\n \"suffix\": \"\",\n \"ssnLastFour\": \"3162\",\n \"middleName\": \"\"\n },\n {\n \"birthMonthDay\": \"06-02\",\n \"compact\": \"cosm\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"2112-06-28\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"licenseJurisdiction\": \"az\",\n \"licenseStatus\": \"inactive\",\n \"providerId\": \"d1ee34cd-6a17-422c-86f5-7c6115ce6aac\",\n \"type\": \"provider\",\n \"dateOfBirth\": \"2157-10-08\",\n \"suffix\": \"\",\n \"ssnLastFour\": \"9226\",\n \"middleName\": \"\"\n }\n ],\n \"sorting\": {\n \"key\": \"dateOfUpdate\",\n \"direction\": \"descending\"\n }\n}", + "body": "{\n \"pagination\": {\n \"prevLastKey\": {},\n \"lastKey\": {},\n \"pageSize\": \"\"\n },\n \"providers\": [\n {\n \"birthMonthDay\": \"01-07\",\n \"compact\": \"cosm\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"1558-01-23\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseJurisdiction\": \"tn\",\n \"licenseStatus\": \"active\",\n \"providerId\": \"58b1e082-9f3d-4557-be50-ddde20a55a74\",\n \"type\": \"provider\",\n \"dateOfBirth\": \"2205-02-31\",\n \"suffix\": \"\",\n \"ssnLastFour\": \"0623\",\n \"middleName\": \"\"\n },\n {\n \"birthMonthDay\": \"19-10\",\n \"compact\": \"cosm\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"2243-10-30\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseJurisdiction\": \"md\",\n \"licenseStatus\": \"active\",\n \"providerId\": \"0b358cfc-74be-4c11-8101-cc062ad9fbae\",\n \"type\": \"provider\",\n \"dateOfBirth\": \"1951-06-30\",\n \"suffix\": \"\",\n \"ssnLastFour\": \"2029\",\n \"middleName\": \"\"\n }\n ],\n \"sorting\": {\n \"key\": \"familyName\",\n \"direction\": \"ascending\"\n }\n}", "code": 200, "cookie": [], "header": [ @@ -1163,7 +1163,7 @@ "value": "application/json" } ], - "id": "e4c19f03-ed09-4708-a6a7-5f21bde8e7c3", + "id": "93c9577c-2511-4a7c-b4d1-e8222dd30057", "name": "200 response", "originalRequest": { "body": { @@ -1174,7 +1174,7 @@ "language": "json" } }, - "raw": "{\n \"query\": {\n \"providerId\": \"ccff1ab1-d6be-4814-a0bd-0c94fa320dbb\",\n \"jurisdiction\": \"va\",\n \"givenName\": \"\",\n \"familyName\": \"\",\n \"licenseNumber\": \"\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"key\": \"dateOfUpdate\",\n \"direction\": \"ascending\"\n }\n}" + "raw": "{\n \"query\": {\n \"providerId\": \"68691356-2c8a-40d3-89cf-b89183e229c8\",\n \"jurisdiction\": \"ky\",\n \"givenName\": \"\",\n \"familyName\": \"\",\n \"licenseNumber\": \"\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"key\": \"familyName\",\n \"direction\": \"ascending\"\n }\n}" }, "header": [ { @@ -1222,7 +1222,7 @@ "item": [ { "event": [], - "id": "c3addc9a-155e-4e39-a331-ac69c762b2c6", + "id": "cad0ba47-b4e3-45b2-81cc-07e3c1d69d46", "name": "/v1/compacts/:compact/providers/:providerId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -1277,7 +1277,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"birthMonthDay\": \"04-16\",\n \"compact\": \"cosm\",\n \"dateOfExpiration\": \"2519-07-31\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"az\",\n \"licenses\": [\n {\n \"compact\": \"cosm\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"1866-12-03\",\n \"dateOfIssuance\": \"2975-10-30\",\n \"dateOfRenewal\": \"2304-02-16\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"history\": [\n {\n \"compact\": \"cosm\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"oh\",\n \"previous\": {\n \"dateOfExpiration\": \"1246-10-30\",\n \"dateOfIssuance\": \"2441-11-30\",\n \"dateOfRenewal\": \"1977-12-31\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2689-11-31\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+32400846\",\n \"licenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"deactivation\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"cosmetologist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1977-12-14\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2987-10-31\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"1509-11-14\",\n \"phoneNumber\": \"+5350833196535\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"2897-06-06\",\n \"licenseStatus\": \"inactive\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n },\n {\n \"compact\": \"cosm\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"tn\",\n \"previous\": {\n \"dateOfExpiration\": \"2566-03-18\",\n \"dateOfIssuance\": \"1308-11-27\",\n \"dateOfRenewal\": \"2985-06-30\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2497-06-30\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+07312112731624\",\n \"licenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"renewal\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"cosmetologist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"1157-05-07\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2306-10-21\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2081-11-01\",\n \"phoneNumber\": \"+325444234528937\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"1401-10-02\",\n \"licenseStatus\": \"active\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n }\n ],\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"az\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"cosmetologist\",\n \"middleName\": \"\",\n \"providerId\": \"4294585d-3057-48c2-ac53-10c29bb1a75b\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"investigations\": [\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"ks\",\n \"licenseType\": \"\",\n \"providerId\": \"d99d813f-45ff-42af-a86f-a1ba3c8da1db\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"oh\",\n \"licenseType\": \"\",\n \"providerId\": \"86eb0f28-6c52-4f45-89b4-6d83aa34c29d\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"licenseNumber\": \"\",\n \"investigationStatus\": \"underInvestigation\",\n \"dateOfBirth\": \"2420-04-28\",\n \"ssnLastFour\": \"1694\",\n \"phoneNumber\": \"+76140281\",\n \"licenseStatusName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1540-11-20\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2310-05-14\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"oh\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"2b04ac21-ffa8-40a9-8f3b-914fd9b0b239\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1754-04-03\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1379-05-03\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1436-12-30\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ky\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"04531730-ed0d-4e8e-8890-1f51c4cf346d\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2997-09-05\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"compact\": \"cosm\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"2659-12-30\",\n \"dateOfIssuance\": \"1100-11-31\",\n \"dateOfRenewal\": \"1394-10-31\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"history\": [\n {\n \"compact\": \"cosm\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"md\",\n \"previous\": {\n \"dateOfExpiration\": \"2578-03-30\",\n \"dateOfIssuance\": \"1294-10-05\",\n \"dateOfRenewal\": \"1216-09-28\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1183-06-30\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+7953502865\",\n \"licenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"licenseDeactivation\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"cosmetologist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"ineligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2194-10-30\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2344-09-15\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2749-06-07\",\n \"phoneNumber\": \"+7433927495594\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"1087-10-25\",\n \"licenseStatus\": \"active\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n },\n {\n \"compact\": \"cosm\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"tn\",\n \"previous\": {\n \"dateOfExpiration\": \"2364-07-22\",\n \"dateOfIssuance\": \"2762-10-09\",\n \"dateOfRenewal\": \"1441-06-09\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2664-06-18\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+3108049697284\",\n \"licenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"licenseDeactivation\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"cosmetologist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1991-06-23\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2536-09-31\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2603-07-07\",\n \"phoneNumber\": \"+880072538007905\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"2430-03-30\",\n \"licenseStatus\": \"active\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n }\n ],\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"wa\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"cosmetologist\",\n \"middleName\": \"\",\n \"providerId\": \"97c56a33-d221-4e77-acf4-52914ff0580d\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"investigations\": [\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"ky\",\n \"licenseType\": \"\",\n \"providerId\": \"8983550e-f6c8-4f0f-8075-a66113450a7b\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"va\",\n \"licenseType\": \"\",\n \"providerId\": \"016ed490-38cb-41de-9c4f-60eaa1236c80\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"licenseNumber\": \"\",\n \"investigationStatus\": \"underInvestigation\",\n \"dateOfBirth\": \"2743-10-20\",\n \"ssnLastFour\": \"6640\",\n \"phoneNumber\": \"+9049577254\",\n \"licenseStatusName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1366-02-10\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2823-12-25\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"tn\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"a63cc01b-51e6-4e33-94b9-47193158a264\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2496-12-30\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1477-11-30\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2388-11-30\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"md\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"aab3acfc-702f-41db-b891-065c00ac8751\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2259-10-22\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"privileges\": [\n {\n \"administratorSetStatus\": \"active\",\n \"compact\": \"cosm\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1571-12-31\",\n \"history\": [\n {\n \"compact\": \"cosm\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"co\",\n \"previous\": {\n \"administratorSetStatus\": \"inactive\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1778-07-31\",\n \"licenseJurisdiction\": \"co\",\n \"compact\": \"cosm\",\n \"providerId\": \"4c5d75b9-cb9b-4cdc-bd17-b0c715538a14\",\n \"jurisdiction\": \"az\",\n \"type\": \"privilege\",\n \"status\": \"inactive\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"licenseDeactivation\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"cosmetologist\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"1767-02-30\",\n \"licenseJurisdiction\": \"md\",\n \"compact\": \"cosm\",\n \"providerId\": \"01e90700-65e2-42bf-aa22-c356c28bd36e\",\n \"jurisdiction\": \"oh\",\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"status\": \"active\"\n }\n },\n {\n \"compact\": \"cosm\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"ky\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1847-11-30\",\n \"licenseJurisdiction\": \"va\",\n \"compact\": \"cosm\",\n \"providerId\": \"eaf2f11c-e311-4fbf-8c8d-fdfe9e2a3cd1\",\n \"jurisdiction\": \"az\",\n \"type\": \"privilege\",\n \"status\": \"active\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"other\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"cosmetologist\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"2176-02-31\",\n \"licenseJurisdiction\": \"wa\",\n \"compact\": \"cosm\",\n \"providerId\": \"c0ab4674-4c6c-4419-b993-43868daca462\",\n \"jurisdiction\": \"oh\",\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"status\": \"active\"\n }\n }\n ],\n \"jurisdiction\": \"va\",\n \"licenseJurisdiction\": \"md\",\n \"licenseType\": \"cosmetologist\",\n \"providerId\": \"24ed94a7-6743-4005-b56b-1d0836961fd8\",\n \"status\": \"active\",\n \"type\": \"privilege\",\n \"investigationStatus\": \"underInvestigation\",\n \"investigations\": [\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"ky\",\n \"licenseType\": \"\",\n \"providerId\": \"e8303abf-69e5-47b5-a57b-9dbdfd9d55b5\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"ky\",\n \"licenseType\": \"\",\n \"providerId\": \"e64c61a4-7918-4161-a6d4-a6791904033d\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1080-06-21\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1772-06-15\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ks\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"b25d1419-6d5d-42e7-ad09-27e288bb8cb6\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2921-04-31\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1859-11-24\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1117-10-01\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"oh\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"e443c428-a00b-4b2c-9357-2beeba4b0e92\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1358-11-03\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"administratorSetStatus\": \"active\",\n \"compact\": \"cosm\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2833-11-01\",\n \"history\": [\n {\n \"compact\": \"cosm\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"wa\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1299-11-14\",\n \"licenseJurisdiction\": \"md\",\n \"compact\": \"cosm\",\n \"providerId\": \"98c096db-bcbb-4004-946d-0b21db3dbcc2\",\n \"jurisdiction\": \"wa\",\n \"type\": \"privilege\",\n \"status\": \"inactive\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"renewal\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"cosmetologist\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"2636-11-10\",\n \"licenseJurisdiction\": \"co\",\n \"compact\": \"cosm\",\n \"providerId\": \"eddda552-fcaa-4fd6-b3d5-ac10f2b0f7a8\",\n \"jurisdiction\": \"ky\",\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"status\": \"inactive\"\n }\n },\n {\n \"compact\": \"cosm\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"wa\",\n \"previous\": {\n \"administratorSetStatus\": \"inactive\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2883-07-30\",\n \"licenseJurisdiction\": \"va\",\n \"compact\": \"cosm\",\n \"providerId\": \"55d4ba21-4c3a-4270-bbc5-cc63a2302543\",\n \"jurisdiction\": \"co\",\n \"type\": \"privilege\",\n \"status\": \"active\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"deactivation\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"cosmetologist\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"1691-12-11\",\n \"licenseJurisdiction\": \"az\",\n \"compact\": \"cosm\",\n \"providerId\": \"c57d45ea-b92a-47e5-abfb-bc6ddd56a753\",\n \"jurisdiction\": \"tn\",\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"status\": \"inactive\"\n }\n }\n ],\n \"jurisdiction\": \"co\",\n \"licenseJurisdiction\": \"al\",\n \"licenseType\": \"cosmetologist\",\n \"providerId\": \"30752a16-51f7-4468-8c5b-3e6d1b9155ca\",\n \"status\": \"inactive\",\n \"type\": \"privilege\",\n \"investigationStatus\": \"underInvestigation\",\n \"investigations\": [\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"co\",\n \"licenseType\": \"\",\n \"providerId\": \"7f8aca96-5203-44b4-84f2-6712fe2d97fa\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"oh\",\n \"licenseType\": \"\",\n \"providerId\": \"85073bdd-0b09-43b8-adb3-bc8960df2831\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1658-04-12\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2697-02-09\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"md\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"8d4c6331-d019-41e1-99d9-0d43365ff26f\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2135-12-08\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"2244-03-08\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1441-11-31\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"tn\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"cbde5c24-d253-4ebc-96af-3e86486cf1b9\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1153-05-28\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"providerId\": \"a7385c3e-4fc1-4044-81ea-6c9f89b7413b\",\n \"type\": \"provider\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2527-10-08\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"ssnLastFour\": \"8658\",\n \"licenseStatus\": \"active\",\n \"middleName\": \"\"\n}", + "body": "{\n \"birthMonthDay\": \"13-12\",\n \"compact\": \"cosm\",\n \"dateOfExpiration\": \"1162-10-27\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"md\",\n \"licenses\": [\n {\n \"compact\": \"cosm\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"1748-10-28\",\n \"dateOfIssuance\": \"1380-10-03\",\n \"dateOfRenewal\": \"2755-06-03\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"history\": [\n {\n \"compact\": \"cosm\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"ky\",\n \"previous\": {\n \"dateOfExpiration\": \"1442-06-29\",\n \"dateOfIssuance\": \"2289-08-03\",\n \"dateOfRenewal\": \"1603-11-30\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1769-11-01\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+294715100\",\n \"licenseStatus\": \"active\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"expiration\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"cosmetologist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"1945-07-02\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"1692-03-31\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2188-12-25\",\n \"phoneNumber\": \"+28690665880218\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"2145-10-04\",\n \"licenseStatus\": \"active\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n },\n {\n \"compact\": \"cosm\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"tn\",\n \"previous\": {\n \"dateOfExpiration\": \"2770-12-07\",\n \"dateOfIssuance\": \"2760-12-20\",\n \"dateOfRenewal\": \"1409-10-31\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1046-10-02\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+95908841\",\n \"licenseStatus\": \"active\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"encumbrance\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"cosmetologist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"ineligible\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2859-11-29\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2122-12-22\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"1891-01-30\",\n \"phoneNumber\": \"+104354584\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"1067-03-30\",\n \"licenseStatus\": \"active\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n }\n ],\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"oh\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"esthetician\",\n \"middleName\": \"\",\n \"providerId\": \"02e485d4-8e85-422b-9902-ee5a076e501e\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"investigations\": [\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"al\",\n \"licenseType\": \"\",\n \"providerId\": \"0611e976-8b22-49ec-9115-91d968c5678e\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"az\",\n \"licenseType\": \"\",\n \"providerId\": \"ac923355-31dd-41cd-908e-3380f7f3a972\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"licenseNumber\": \"\",\n \"investigationStatus\": \"underInvestigation\",\n \"dateOfBirth\": \"1339-10-18\",\n \"ssnLastFour\": \"4772\",\n \"phoneNumber\": \"+607349906984\",\n \"licenseStatusName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1883-09-06\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2813-11-31\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ky\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"f69c9b2e-b369-4315-9ba2-4cad07ff7d3e\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2003-12-07\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1886-12-31\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1069-09-05\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"co\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"25c09f89-ff99-4a55-af99-365c48b3e2eb\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1868-12-10\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"compact\": \"cosm\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"2260-11-29\",\n \"dateOfIssuance\": \"1414-04-24\",\n \"dateOfRenewal\": \"2113-03-31\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"history\": [\n {\n \"compact\": \"cosm\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"co\",\n \"previous\": {\n \"dateOfExpiration\": \"1242-02-07\",\n \"dateOfIssuance\": \"2095-09-05\",\n \"dateOfRenewal\": \"2632-11-17\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2650-08-30\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+82247346\",\n \"licenseStatus\": \"active\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"expiration\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"esthetician\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1479-11-03\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"1439-11-31\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2290-03-29\",\n \"phoneNumber\": \"+23569520415\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"1438-10-08\",\n \"licenseStatus\": \"inactive\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n },\n {\n \"compact\": \"cosm\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"wa\",\n \"previous\": {\n \"dateOfExpiration\": \"1534-01-08\",\n \"dateOfIssuance\": \"2366-01-30\",\n \"dateOfRenewal\": \"2098-08-12\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"1911-12-11\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+6692858316\",\n \"licenseStatus\": \"active\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"encumbrance\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"esthetician\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"ineligible\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"1138-07-19\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2351-10-30\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2579-10-09\",\n \"phoneNumber\": \"+537683839466\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"1865-04-30\",\n \"licenseStatus\": \"inactive\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n }\n ],\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"ks\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"esthetician\",\n \"middleName\": \"\",\n \"providerId\": \"819785c9-cc4d-4498-91ed-1a7514e9df25\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"investigations\": [\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"tn\",\n \"licenseType\": \"\",\n \"providerId\": \"8b3b19e8-d724-4525-b0cb-4692b51a3e8f\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"ks\",\n \"licenseType\": \"\",\n \"providerId\": \"5ace5361-1234-49c5-9ab3-7bbaf2890e98\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"licenseNumber\": \"\",\n \"investigationStatus\": \"underInvestigation\",\n \"dateOfBirth\": \"2587-10-17\",\n \"ssnLastFour\": \"7501\",\n \"phoneNumber\": \"+25692983898462\",\n \"licenseStatusName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1121-10-21\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2857-08-08\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"co\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"4b29d962-5102-4386-815b-db49fc3ff45b\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2187-11-09\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"2084-04-31\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2596-06-02\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"oh\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"4da0a9c0-3ed3-47a2-a03f-80ca1485be75\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2280-04-30\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"privileges\": [\n {\n \"administratorSetStatus\": \"active\",\n \"compact\": \"cosm\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1650-10-30\",\n \"history\": [\n {\n \"compact\": \"cosm\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"va\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1271-09-01\",\n \"licenseJurisdiction\": \"az\",\n \"compact\": \"cosm\",\n \"providerId\": \"d6c3cffb-eb6d-446c-954c-f20d01fd6308\",\n \"jurisdiction\": \"al\",\n \"type\": \"privilege\",\n \"status\": \"active\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"other\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"esthetician\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"2267-03-30\",\n \"licenseJurisdiction\": \"ks\",\n \"compact\": \"cosm\",\n \"providerId\": \"1f813139-6046-44d9-b137-ec15888bc882\",\n \"jurisdiction\": \"ky\",\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"status\": \"inactive\"\n }\n },\n {\n \"compact\": \"cosm\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"al\",\n \"previous\": {\n \"administratorSetStatus\": \"inactive\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2043-11-31\",\n \"licenseJurisdiction\": \"al\",\n \"compact\": \"cosm\",\n \"providerId\": \"e9a5e1a9-b775-4b65-ac4c-78c37b502bb0\",\n \"jurisdiction\": \"al\",\n \"type\": \"privilege\",\n \"status\": \"inactive\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"encumbrance\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"cosmetologist\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"1780-12-19\",\n \"licenseJurisdiction\": \"tn\",\n \"compact\": \"cosm\",\n \"providerId\": \"5b65a238-3800-4893-b5de-14fb0219992e\",\n \"jurisdiction\": \"ky\",\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"status\": \"inactive\"\n }\n }\n ],\n \"jurisdiction\": \"tn\",\n \"licenseJurisdiction\": \"oh\",\n \"licenseType\": \"cosmetologist\",\n \"providerId\": \"2f12808e-ddf1-40ba-a927-f701ae395a30\",\n \"status\": \"active\",\n \"type\": \"privilege\",\n \"investigationStatus\": \"underInvestigation\",\n \"investigations\": [\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"md\",\n \"licenseType\": \"\",\n \"providerId\": \"3e2a9fd4-e600-44e7-a57e-4a65109a25de\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"oh\",\n \"licenseType\": \"\",\n \"providerId\": \"1dfc678a-da48-44b9-a410-2adab3ed2da8\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1320-03-07\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1531-11-12\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"tn\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"a342b6b8-a85d-42ff-a845-2cae57b19ef7\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2159-07-03\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"2279-01-30\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1833-11-30\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"oh\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"9f14499f-b9f0-4bea-a8ad-310d9c847248\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1411-03-09\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"administratorSetStatus\": \"inactive\",\n \"compact\": \"cosm\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1080-06-26\",\n \"history\": [\n {\n \"compact\": \"cosm\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"va\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2302-01-31\",\n \"licenseJurisdiction\": \"ky\",\n \"compact\": \"cosm\",\n \"providerId\": \"0e96f8da-f33f-4ce7-8b4e-c7737aed8660\",\n \"jurisdiction\": \"al\",\n \"type\": \"privilege\",\n \"status\": \"active\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"other\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"cosmetologist\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"1565-10-05\",\n \"licenseJurisdiction\": \"az\",\n \"compact\": \"cosm\",\n \"providerId\": \"7562d31b-deab-4463-8f0e-96c7eab3fe2a\",\n \"jurisdiction\": \"md\",\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"status\": \"inactive\"\n }\n },\n {\n \"compact\": \"cosm\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"al\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2652-05-21\",\n \"licenseJurisdiction\": \"oh\",\n \"compact\": \"cosm\",\n \"providerId\": \"8f5fb044-5f33-460c-8eb2-1a499708c7f1\",\n \"jurisdiction\": \"ky\",\n \"type\": \"privilege\",\n \"status\": \"inactive\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"licenseDeactivation\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"cosmetologist\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"2274-12-18\",\n \"licenseJurisdiction\": \"ky\",\n \"compact\": \"cosm\",\n \"providerId\": \"bbd27cd0-eade-482c-a1fa-87dd77c91fc7\",\n \"jurisdiction\": \"tn\",\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"status\": \"active\"\n }\n }\n ],\n \"jurisdiction\": \"md\",\n \"licenseJurisdiction\": \"ks\",\n \"licenseType\": \"cosmetologist\",\n \"providerId\": \"a0deec5c-78a1-4b88-a440-26b76520eb84\",\n \"status\": \"inactive\",\n \"type\": \"privilege\",\n \"investigationStatus\": \"underInvestigation\",\n \"investigations\": [\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"oh\",\n \"licenseType\": \"\",\n \"providerId\": \"0d7ce51f-ca97-4bb2-8d04-958c717eba10\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"tn\",\n \"licenseType\": \"\",\n \"providerId\": \"fafea83d-fdfa-4828-8d80-57d1d284310b\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1191-11-07\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2496-09-29\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"va\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"41ea242f-ac9e-4be6-bb84-e011fca959c4\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1895-06-20\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"2572-11-28\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2193-11-31\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"va\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"3f184c16-4820-4c49-82cc-530c8c25a643\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2674-08-30\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"providerId\": \"ae5c146b-b96d-424c-b30a-3cd876ffab7d\",\n \"type\": \"provider\",\n \"compactEligibility\": \"ineligible\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2811-09-27\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"ssnLastFour\": \"1415\",\n \"licenseStatus\": \"inactive\",\n \"middleName\": \"\"\n}", "code": 200, "cookie": [], "header": [ @@ -1286,7 +1286,7 @@ "value": "application/json" } ], - "id": "acf52902-2a08-4a62-a9f7-8579f9a80b31", + "id": "6a35f77d-733b-4e59-9be9-2e666234773c", "name": "200 response", "originalRequest": { "body": {}, @@ -1344,7 +1344,7 @@ "item": [ { "event": [], - "id": "2c7487da-07ea-4364-b219-1fc04abb52c5", + "id": "25de4fb2-348b-4328-882b-d1cc8cf13609", "name": "/v1/compacts/:compact/providers/:providerId/licenses/jurisdiction/:jurisdiction/licenseType/:licenseType/encumbrance", "protocolProfileBehavior": { "disableBodyPruning": true @@ -1358,7 +1358,7 @@ "language": "json" } }, - "raw": "{\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"encumbranceEffectiveDate\": \"1044-06-17\",\n \"encumbranceType\": \"fine\"\n}" + "raw": "{\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"encumbranceEffectiveDate\": \"2353-07-30\",\n \"encumbranceType\": \"fine\"\n}" }, "description": {}, "header": [ @@ -1447,7 +1447,7 @@ "value": "application/json" } ], - "id": "cec97712-0da6-4aa9-a4cc-05f4bdc98d04", + "id": "49e7abd9-1aab-4f1d-8ab6-1a92131696ab", "name": "200 response", "originalRequest": { "body": { @@ -1458,7 +1458,7 @@ "language": "json" } }, - "raw": "{\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"encumbranceEffectiveDate\": \"1044-06-17\",\n \"encumbranceType\": \"fine\"\n}" + "raw": "{\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"encumbranceEffectiveDate\": \"2353-07-30\",\n \"encumbranceType\": \"fine\"\n}" }, "header": [ { @@ -1509,7 +1509,7 @@ "item": [ { "event": [], - "id": "3f4a8ac1-ccda-4585-b53e-f72ae742af2a", + "id": "a7f8957e-c509-47b1-b28f-6db1c7a5f630", "name": "/v1/compacts/:compact/providers/:providerId/licenses/jurisdiction/:jurisdiction/licenseType/:licenseType/encumbrance/:encumbranceId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -1523,7 +1523,7 @@ "language": "json" } }, - "raw": "{\n \"effectiveLiftDate\": \"2949-09-08\"\n}" + "raw": "{\n \"effectiveLiftDate\": \"1810-11-01\"\n}" }, "description": {}, "header": [ @@ -1623,7 +1623,7 @@ "value": "application/json" } ], - "id": "0cee3fc2-9892-483f-9173-09517b9eacce", + "id": "30870140-107d-41f0-9c05-92d06f8223c1", "name": "200 response", "originalRequest": { "body": { @@ -1634,7 +1634,7 @@ "language": "json" } }, - "raw": "{\n \"effectiveLiftDate\": \"2949-09-08\"\n}" + "raw": "{\n \"effectiveLiftDate\": \"1810-11-01\"\n}" }, "header": [ { @@ -1692,7 +1692,7 @@ "item": [ { "event": [], - "id": "a93030db-b18a-4e02-96a9-7b686a8ad630", + "id": "34ff2083-eddb-4583-9754-0ce5675bab10", "name": "/v1/compacts/:compact/providers/:providerId/licenses/jurisdiction/:jurisdiction/licenseType/:licenseType/investigation", "protocolProfileBehavior": { "disableBodyPruning": true @@ -1795,7 +1795,7 @@ "value": "application/json" } ], - "id": "965f9c1a-eca9-4841-afac-047d010801c6", + "id": "80be1ff4-b49d-49f2-aa24-9ec881a91355", "name": "200 response", "originalRequest": { "body": { @@ -1857,7 +1857,7 @@ "item": [ { "event": [], - "id": "54749da8-f993-43e2-934b-ad24df414554", + "id": "073c75ea-4f53-416f-9a34-cf53c84485c3", "name": "/v1/compacts/:compact/providers/:providerId/licenses/jurisdiction/:jurisdiction/licenseType/:licenseType/investigation/:investigationId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -1871,7 +1871,7 @@ "language": "json" } }, - "raw": "{\n \"action\": \"close\",\n \"encumbrance\": {\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"encumbranceEffectiveDate\": \"2947-06-17\",\n \"encumbranceType\": \"reprimand\"\n }\n}" + "raw": "{\n \"action\": \"close\",\n \"encumbrance\": {\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"encumbranceEffectiveDate\": \"1241-05-01\",\n \"encumbranceType\": \"suspension\"\n }\n}" }, "description": {}, "header": [ @@ -1971,7 +1971,7 @@ "value": "application/json" } ], - "id": "a3f170da-9c12-4dbf-b1c3-df53c731544f", + "id": "01b9554d-be9a-4b2b-b666-1e699ac2d303", "name": "200 response", "originalRequest": { "body": { @@ -1982,7 +1982,7 @@ "language": "json" } }, - "raw": "{\n \"action\": \"close\",\n \"encumbrance\": {\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"encumbranceEffectiveDate\": \"2947-06-17\",\n \"encumbranceType\": \"reprimand\"\n }\n}" + "raw": "{\n \"action\": \"close\",\n \"encumbrance\": {\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"encumbranceEffectiveDate\": \"1241-05-01\",\n \"encumbranceType\": \"suspension\"\n }\n}" }, "header": [ { @@ -2070,7 +2070,7 @@ "item": [ { "event": [], - "id": "6f1183b9-148b-44f4-b393-74322dcc8236", + "id": "50fd8bce-65ee-4814-bcfe-3aec6f945394", "name": "/v1/compacts/:compact/providers/:providerId/privileges/jurisdiction/:jurisdiction/licenseType/:licenseType/encumbrance", "protocolProfileBehavior": { "disableBodyPruning": true @@ -2084,7 +2084,7 @@ "language": "json" } }, - "raw": "{\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"encumbranceEffectiveDate\": \"1044-06-17\",\n \"encumbranceType\": \"fine\"\n}" + "raw": "{\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"encumbranceEffectiveDate\": \"2353-07-30\",\n \"encumbranceType\": \"fine\"\n}" }, "description": {}, "header": [ @@ -2173,7 +2173,7 @@ "value": "application/json" } ], - "id": "d816a9a0-5449-40c4-9528-aef7716c9053", + "id": "3251d2e5-7206-4204-9057-22431e6a59dc", "name": "200 response", "originalRequest": { "body": { @@ -2184,7 +2184,7 @@ "language": "json" } }, - "raw": "{\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"encumbranceEffectiveDate\": \"1044-06-17\",\n \"encumbranceType\": \"fine\"\n}" + "raw": "{\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"encumbranceEffectiveDate\": \"2353-07-30\",\n \"encumbranceType\": \"fine\"\n}" }, "header": [ { @@ -2235,7 +2235,7 @@ "item": [ { "event": [], - "id": "4ea23ea2-7372-461e-b714-7108c250a7fe", + "id": "381fe7c7-3cd0-4e12-812b-4a8934c935f8", "name": "/v1/compacts/:compact/providers/:providerId/privileges/jurisdiction/:jurisdiction/licenseType/:licenseType/encumbrance/:encumbranceId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -2249,7 +2249,7 @@ "language": "json" } }, - "raw": "{\n \"effectiveLiftDate\": \"2949-09-08\"\n}" + "raw": "{\n \"effectiveLiftDate\": \"1810-11-01\"\n}" }, "description": {}, "header": [ @@ -2349,7 +2349,7 @@ "value": "application/json" } ], - "id": "520525d5-b25d-436b-8e41-6671bd7fa0f5", + "id": "32b982c2-3026-4d2f-a56d-5f06fc7ce730", "name": "200 response", "originalRequest": { "body": { @@ -2360,7 +2360,7 @@ "language": "json" } }, - "raw": "{\n \"effectiveLiftDate\": \"2949-09-08\"\n}" + "raw": "{\n \"effectiveLiftDate\": \"1810-11-01\"\n}" }, "header": [ { @@ -2418,7 +2418,7 @@ "item": [ { "event": [], - "id": "c4369dbc-58be-4230-96cb-714e2dad2176", + "id": "857069d8-ff0e-4483-a186-8ad18d82a970", "name": "/v1/compacts/:compact/providers/:providerId/privileges/jurisdiction/:jurisdiction/licenseType/:licenseType/investigation", "protocolProfileBehavior": { "disableBodyPruning": true @@ -2521,7 +2521,7 @@ "value": "application/json" } ], - "id": "5237cba8-57dd-4d39-a536-fe63dcd1a6fc", + "id": "308bcd04-72e9-4875-9aff-bd6083c931be", "name": "200 response", "originalRequest": { "body": { @@ -2583,7 +2583,7 @@ "item": [ { "event": [], - "id": "0c23167f-a74e-47ba-aa2c-3a022ca91bcc", + "id": "ccbf0022-bdc8-48fb-b0fe-d03d920813e1", "name": "/v1/compacts/:compact/providers/:providerId/privileges/jurisdiction/:jurisdiction/licenseType/:licenseType/investigation/:investigationId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -2597,7 +2597,7 @@ "language": "json" } }, - "raw": "{\n \"action\": \"close\",\n \"encumbrance\": {\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"encumbranceEffectiveDate\": \"2947-06-17\",\n \"encumbranceType\": \"reprimand\"\n }\n}" + "raw": "{\n \"action\": \"close\",\n \"encumbrance\": {\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"encumbranceEffectiveDate\": \"1241-05-01\",\n \"encumbranceType\": \"suspension\"\n }\n}" }, "description": {}, "header": [ @@ -2697,7 +2697,7 @@ "value": "application/json" } ], - "id": "d7187e4a-b52a-4b03-8ee8-77782694e099", + "id": "6e7f4f73-58fc-4799-9f2a-7de638b127b8", "name": "200 response", "originalRequest": { "body": { @@ -2708,7 +2708,7 @@ "language": "json" } }, - "raw": "{\n \"action\": \"close\",\n \"encumbrance\": {\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"encumbranceEffectiveDate\": \"2947-06-17\",\n \"encumbranceType\": \"reprimand\"\n }\n}" + "raw": "{\n \"action\": \"close\",\n \"encumbrance\": {\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"encumbranceEffectiveDate\": \"1241-05-01\",\n \"encumbranceType\": \"suspension\"\n }\n}" }, "header": [ { @@ -2781,7 +2781,7 @@ "item": [ { "event": [], - "id": "e39b3d1d-e8c9-4b7e-a263-53ae736c1c10", + "id": "9a677864-f818-4d0e-a1b1-25d6f09f2b89", "name": "/v1/compacts/:compact/providers/:providerId/ssn", "protocolProfileBehavior": { "disableBodyPruning": true @@ -2837,7 +2837,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"ssn\": \"059-06-1522\"\n}", + "body": "{\n \"ssn\": \"100-84-1716\"\n}", "code": 200, "cookie": [], "header": [ @@ -2846,7 +2846,7 @@ "value": "application/json" } ], - "id": "951fea8b-0c0c-4769-970d-9e61bef71ea4", + "id": "8ba643e7-950a-4619-9486-ca5d69b892cc", "name": "200 response", "originalRequest": { "body": {}, @@ -2899,7 +2899,7 @@ "item": [ { "event": [], - "id": "6128f536-5123-46cd-892c-69129e460fd0", + "id": "be703c23-2976-4eff-9fa4-ef3f4563e622", "name": "/v1/compacts/:compact/staff-users", "protocolProfileBehavior": { "disableBodyPruning": true @@ -2943,7 +2943,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"pagination\": {\n \"prevLastKey\": {},\n \"lastKey\": {},\n \"pageSize\": \"\"\n },\n \"users\": [\n {\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"dolore_b\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"ad_9d\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"ipsumf\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"seda1d\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"mollitb\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"adipisicing4c\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"voluptate2d\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"sed_11\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"reprehenderit1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"tempor94\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"quidc5\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"sunt505\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"Loremc3_\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"deserunt35\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"ex0_f\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"incididunt_80\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n },\n {\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"adipisicing_b27\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"mollitcd6\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"aliqua_6\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"minim_5\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"mollit64\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"sunt_7\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"velit_\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"ut1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"quibb5\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"eiusmod_3\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"do_9\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"nostrud0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"inactive\",\n \"userId\": \"\"\n }\n ]\n}", + "body": "{\n \"pagination\": {\n \"prevLastKey\": {},\n \"lastKey\": {},\n \"pageSize\": \"\"\n },\n \"users\": [\n {\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"Lorem7f\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"Excepteur7\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"enim_e\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"Excepteurc28\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"tempor__\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"qui7db\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"eu7\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"in_e77\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"Lorem8\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"proident_9\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"magnaaf\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"inactive\",\n \"userId\": \"\"\n },\n {\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"dolor227\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"occaecat5a\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"Lorem_6\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"commodo_0e\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n }\n ]\n}", "code": 200, "cookie": [], "header": [ @@ -2961,7 +2961,7 @@ "value": "" } ], - "id": "23ae873c-527f-4b64-a790-3d40e7ff94e5", + "id": "60d0df6e-2047-4ab8-859a-662961b7afd1", "name": "200 response", "originalRequest": { "body": {}, @@ -3000,7 +3000,7 @@ }, { "event": [], - "id": "33bcd202-3a54-4619-a667-fdbae0d9cded", + "id": "d07cc353-2ee9-4487-b8cf-6d434c94f68d", "name": "/v1/compacts/:compact/staff-users", "protocolProfileBehavior": { "disableBodyPruning": true @@ -3014,7 +3014,7 @@ "language": "json" } }, - "raw": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"adipisicing_62\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"dolor1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"magna_b8\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"qui_27b\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"sed_f\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" + "raw": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"voluptate2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"pariatur8\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"amet1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" }, "description": {}, "header": [ @@ -3057,7 +3057,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"Duis894\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"Utc\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"inf\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"dolore_4\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"eiusmod_c6\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"ipsum83\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"cillum_9e\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"amet_89\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n}", + "body": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"sit_f3\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"dolore410\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"dolorefe\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"quis593\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"nostrud8_\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"proident_c0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n}", "code": 200, "cookie": [], "header": [ @@ -3075,7 +3075,7 @@ "value": "" } ], - "id": "386da6f0-925e-4c15-931c-dae17c517bcf", + "id": "31824c98-5c6b-4530-a2cc-32e0493b9feb", "name": "200 response", "originalRequest": { "body": { @@ -3086,7 +3086,7 @@ "language": "json" } }, - "raw": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"adipisicing_62\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"dolor1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"magna_b8\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"qui_27b\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"sed_f\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" + "raw": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"voluptate2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"pariatur8\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"amet1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" }, "header": [ { @@ -3130,7 +3130,7 @@ "item": [ { "event": [], - "id": "cef0af7e-042a-480d-86c9-12c74d7235f2", + "id": "fd2751ef-b361-4fa6-95fd-0c2c8d4e68c3", "name": "/v1/compacts/:compact/staff-users/:userId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -3185,7 +3185,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"Duis894\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"Utc\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"inf\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"dolore_4\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"eiusmod_c6\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"ipsum83\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"cillum_9e\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"amet_89\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n}", + "body": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"sit_f3\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"dolore410\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"dolorefe\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"quis593\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"nostrud8_\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"proident_c0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n}", "code": 200, "cookie": [], "header": [ @@ -3203,7 +3203,7 @@ "value": "" } ], - "id": "68fdfe98-eef8-406a-abb6-9b4db6231034", + "id": "dc3e2317-7e88-4639-b8b4-a8712ce0a51f", "name": "200 response", "originalRequest": { "body": {}, @@ -3250,7 +3250,7 @@ "value": "application/json" } ], - "id": "e9ecfb94-522d-41a1-9550-6212355f0ada", + "id": "0b75e10a-2134-4b45-8bee-e916c327a062", "name": "404 response", "originalRequest": { "body": {}, @@ -3290,7 +3290,7 @@ }, { "event": [], - "id": "9060d66a-4468-4c1d-a133-ab2af2921096", + "id": "de36272a-f097-49c5-85bd-b2b4d0942e12", "name": "/v1/compacts/:compact/staff-users/:userId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -3354,7 +3354,7 @@ "value": "application/json" } ], - "id": "e457c4b3-4710-4818-8e29-d0e4c71c6c49", + "id": "512cae65-8486-4d18-8a9d-fdf562ed3912", "name": "200 response", "originalRequest": { "body": {}, @@ -3401,7 +3401,7 @@ "value": "application/json" } ], - "id": "f07b511f-f41a-4da1-adde-a09af526a98b", + "id": "aef5e7fb-73ff-4e9f-9a1f-f880c6074054", "name": "404 response", "originalRequest": { "body": {}, @@ -3441,7 +3441,7 @@ }, { "event": [], - "id": "004531eb-6f0f-4772-bb68-efcf918d1dd2", + "id": "89311527-1810-485f-adb9-4e08eac121c2", "name": "/v1/compacts/:compact/staff-users/:userId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -3455,7 +3455,7 @@ "language": "json" } }, - "raw": "{\n \"permissions\": {\n \"tempor2f\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"adipisicing_83\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"tempor2e4\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"non__\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"reprehenderit_8\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"fugiat_89\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"reprehenderit__\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"Excepteur_c2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"id_775\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" + "raw": "{\n \"permissions\": {\n \"sed__\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"et9\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"deserunt649\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"eu31e\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"labore307\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"Excepteur_fc\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"anim_99a\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"esse_47\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"minim12b\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" }, "description": {}, "header": [ @@ -3509,7 +3509,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"Duis894\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"Utc\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"inf\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"dolore_4\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"eiusmod_c6\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"ipsum83\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"cillum_9e\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"amet_89\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n}", + "body": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"sit_f3\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"dolore410\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"dolorefe\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"quis593\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"nostrud8_\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"proident_c0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n}", "code": 200, "cookie": [], "header": [ @@ -3527,7 +3527,7 @@ "value": "" } ], - "id": "994fa20e-6da8-4372-abe5-93217e84d785", + "id": "5be7fd31-0f34-46a3-ada6-5b349c67680a", "name": "200 response", "originalRequest": { "body": { @@ -3538,7 +3538,7 @@ "language": "json" } }, - "raw": "{\n \"permissions\": {\n \"tempor2f\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"adipisicing_83\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"tempor2e4\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"non__\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"reprehenderit_8\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"fugiat_89\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"reprehenderit__\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"Excepteur_c2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"id_775\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" + "raw": "{\n \"permissions\": {\n \"sed__\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"et9\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"deserunt649\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"eu31e\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"labore307\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"Excepteur_fc\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"anim_99a\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"esse_47\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"minim12b\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" }, "header": [ { @@ -3587,7 +3587,7 @@ "value": "application/json" } ], - "id": "226b485d-4022-4225-b981-5dd84129071a", + "id": "2c814712-0e23-4e8d-90d7-abf5f5d1e5aa", "name": "404 response", "originalRequest": { "body": { @@ -3598,7 +3598,7 @@ "language": "json" } }, - "raw": "{\n \"permissions\": {\n \"tempor2f\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"adipisicing_83\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"tempor2e4\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"non__\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"reprehenderit_8\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"fugiat_89\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"reprehenderit__\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"Excepteur_c2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"id_775\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" + "raw": "{\n \"permissions\": {\n \"sed__\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"et9\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"deserunt649\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"eu31e\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"labore307\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"Excepteur_fc\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"anim_99a\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"esse_47\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"minim12b\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" }, "header": [ { @@ -3643,7 +3643,7 @@ "item": [ { "event": [], - "id": "56ed4ca6-2caf-493a-84a8-26ed44c5137b", + "id": "941254d2-160d-4551-9c36-3eaa543d024c", "name": "/v1/compacts/:compact/staff-users/:userId/reinvite", "protocolProfileBehavior": { "disableBodyPruning": true @@ -3708,7 +3708,7 @@ "value": "application/json" } ], - "id": "c45f2abc-cd56-46b0-b1f5-c000da3a3188", + "id": "7b16e72f-5330-4a26-aa4c-72e80118f959", "name": "200 response", "originalRequest": { "body": {}, @@ -3756,7 +3756,7 @@ "value": "application/json" } ], - "id": "e2329876-e01c-4219-aeed-077d37a9514b", + "id": "3c214ac2-938b-46df-b5d5-2f3cf082832d", "name": "404 response", "originalRequest": { "body": {}, @@ -3821,7 +3821,7 @@ "item": [ { "event": [], - "id": "6a1a2b50-103e-46b3-82a1-a942119bff3e", + "id": "9c0b97d1-d0e6-4d2f-87cb-49926c6c81cb", "name": "/v1/flags/:flagId/check", "protocolProfileBehavior": { "disableBodyPruning": true @@ -3838,7 +3838,7 @@ "language": "json" } }, - "raw": "{\n \"context\": {\n \"userId\": \"\",\n \"customAttributes\": {\n \"Duis9c\": \"\"\n }\n }\n}" + "raw": "{\n \"context\": {\n \"userId\": \"\",\n \"customAttributes\": {\n \"ipsum3f\": \"\",\n \"enim_4d\": \"\"\n }\n }\n}" }, "description": {}, "header": [ @@ -3890,7 +3890,7 @@ "value": "application/json" } ], - "id": "f9be1fd7-e01d-48c4-ab7a-24bea0970651", + "id": "b2f5fd9c-1be3-44c6-ac44-3222b31c6e57", "name": "200 response", "originalRequest": { "body": { @@ -3901,7 +3901,7 @@ "language": "json" } }, - "raw": "{\n \"context\": {\n \"userId\": \"\",\n \"customAttributes\": {\n \"Duis9c\": \"\"\n }\n }\n}" + "raw": "{\n \"context\": {\n \"userId\": \"\",\n \"customAttributes\": {\n \"ipsum3f\": \"\",\n \"enim_4d\": \"\"\n }\n }\n}" }, "header": [ { @@ -3955,7 +3955,7 @@ "item": [ { "event": [], - "id": "b68b406d-aedd-4f82-b8c7-608c2c755c6e", + "id": "ae8dfc6d-4808-4578-9d4e-9f6f6a4fdd39", "name": "/v1/public/compacts/:compact/jurisdictions", "protocolProfileBehavior": { "disableBodyPruning": true @@ -4012,7 +4012,7 @@ "value": "application/json" } ], - "id": "2e5f8a9d-21a2-4d93-ba44-f3454c59cebc", + "id": "839b4f41-6d49-477d-8539-f12b97765d2c", "name": "200 response", "originalRequest": { "body": {}, @@ -4053,7 +4053,7 @@ "item": [ { "event": [], - "id": "41f44d08-cf37-45e3-8c7c-b6132a737b70", + "id": "e1fbb205-a354-496c-b77d-068f5d980eee", "name": "/v1/public/compacts/:compact/providers/query", "protocolProfileBehavior": { "disableBodyPruning": true @@ -4070,7 +4070,7 @@ "language": "json" } }, - "raw": "{\n \"query\": {\n \"providerId\": \"ccff1ab1-d6be-4814-a0bd-0c94fa320dbb\",\n \"jurisdiction\": \"va\",\n \"givenName\": \"\",\n \"familyName\": \"\",\n \"licenseNumber\": \"\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"key\": \"dateOfUpdate\",\n \"direction\": \"ascending\"\n }\n}" + "raw": "{\n \"query\": {\n \"providerId\": \"68691356-2c8a-40d3-89cf-b89183e229c8\",\n \"jurisdiction\": \"ky\",\n \"givenName\": \"\",\n \"familyName\": \"\",\n \"licenseNumber\": \"\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"key\": \"familyName\",\n \"direction\": \"ascending\"\n }\n}" }, "description": {}, "header": [ @@ -4115,7 +4115,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"pagination\": {\n \"prevLastKey\": {},\n \"lastKey\": {},\n \"pageSize\": \"\"\n },\n \"providers\": [\n {\n \"compact\": \"cosm\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"ky\",\n \"licenseNumber\": \"\",\n \"licenseType\": \"\",\n \"providerId\": \"680d969c-5325-4d33-9c11-7a6034e46b2a\"\n },\n {\n \"compact\": \"cosm\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"co\",\n \"licenseNumber\": \"\",\n \"licenseType\": \"\",\n \"providerId\": \"8974b525-6ef6-4f9a-b699-90cdbbee67c7\"\n }\n ],\n \"query\": {\n \"providerId\": \"c26f3d84-06e3-4e7d-b5ed-ed147da8977b\",\n \"jurisdiction\": \"md\",\n \"givenName\": \"\",\n \"familyName\": \"\",\n \"licenseNumber\": \"\"\n },\n \"sorting\": {\n \"key\": \"familyName\",\n \"direction\": \"ascending\"\n }\n}", + "body": "{\n \"pagination\": {\n \"prevLastKey\": {},\n \"lastKey\": {},\n \"pageSize\": \"\"\n },\n \"providers\": [\n {\n \"compact\": \"cosm\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"wa\",\n \"licenseNumber\": \"\",\n \"licenseType\": \"\",\n \"providerId\": \"90d7db58-884d-4988-9c77-b4339bdceb40\"\n },\n {\n \"compact\": \"cosm\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"oh\",\n \"licenseNumber\": \"\",\n \"licenseType\": \"\",\n \"providerId\": \"7e956e96-d348-4e8c-9f11-5a5e79adaadb\"\n }\n ],\n \"query\": {\n \"providerId\": \"d7a58db9-7feb-46fa-86d1-3f72b522e27d\",\n \"jurisdiction\": \"al\",\n \"givenName\": \"\",\n \"familyName\": \"\",\n \"licenseNumber\": \"\"\n },\n \"sorting\": {\n \"key\": \"dateOfUpdate\",\n \"direction\": \"ascending\"\n }\n}", "code": 200, "cookie": [], "header": [ @@ -4124,7 +4124,7 @@ "value": "application/json" } ], - "id": "98aaea29-287e-48fb-a9e2-61f9534a369d", + "id": "988d65c1-a607-4f7a-8aa3-82ae6ec05eb4", "name": "200 response", "originalRequest": { "body": { @@ -4135,7 +4135,7 @@ "language": "json" } }, - "raw": "{\n \"query\": {\n \"providerId\": \"ccff1ab1-d6be-4814-a0bd-0c94fa320dbb\",\n \"jurisdiction\": \"va\",\n \"givenName\": \"\",\n \"familyName\": \"\",\n \"licenseNumber\": \"\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"key\": \"dateOfUpdate\",\n \"direction\": \"ascending\"\n }\n}" + "raw": "{\n \"query\": {\n \"providerId\": \"68691356-2c8a-40d3-89cf-b89183e229c8\",\n \"jurisdiction\": \"ky\",\n \"givenName\": \"\",\n \"familyName\": \"\",\n \"licenseNumber\": \"\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"key\": \"familyName\",\n \"direction\": \"ascending\"\n }\n}" }, "header": [ { @@ -4176,7 +4176,7 @@ "item": [ { "event": [], - "id": "662bc6ab-1229-4ba6-bb04-32d80c7c425a", + "id": "7f5605d6-1f5c-4853-ad87-fade02f6fe93", "name": "/v1/public/compacts/:compact/providers/:providerId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -4235,7 +4235,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"compact\": \"cosm\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"oh\",\n \"providerId\": \"a1f51500-ed7a-4d11-9f33-142b26f47827\",\n \"type\": \"provider\",\n \"privileges\": [\n {\n \"administratorSetStatus\": \"inactive\",\n \"compact\": \"cosm\",\n \"dateOfExpiration\": \"1380-05-15\",\n \"jurisdiction\": \"va\",\n \"licenseJurisdiction\": \"co\",\n \"licenseType\": \"esthetician\",\n \"providerId\": \"792d412c-9500-43b8-8621-a9131b2efd33\",\n \"status\": \"inactive\",\n \"type\": \"privilege\",\n \"history\": [\n {\n \"compact\": \"cosm\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"az\",\n \"licenseType\": \"esthetician\",\n \"previous\": {\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"1694-11-11\",\n \"licenseJurisdiction\": \"az\"\n },\n \"providerId\": \"627e312e-94f7-4b87-a703-4548d39ef642\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"other\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"2887-07-13\",\n \"licenseJurisdiction\": \"tn\"\n }\n },\n {\n \"compact\": \"cosm\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"tn\",\n \"licenseType\": \"esthetician\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"2263-11-06\",\n \"licenseJurisdiction\": \"ks\"\n },\n \"providerId\": \"49920765-5ef7-442c-b865-c374eac9c364\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"deactivation\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"1687-12-09\",\n \"licenseJurisdiction\": \"tn\"\n }\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"2901-04-18\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1312-08-31\",\n \"jurisdiction\": \"va\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"7d4f181c-97e6-4490-838d-00c7144f0813\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"2136-12-05\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"2846-09-31\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1832-10-16\",\n \"jurisdiction\": \"al\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"980a24c2-1b91-455d-9b47-ff7770d6873f\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"2988-03-22\"\n }\n ]\n },\n {\n \"administratorSetStatus\": \"inactive\",\n \"compact\": \"cosm\",\n \"dateOfExpiration\": \"1315-01-28\",\n \"jurisdiction\": \"tn\",\n \"licenseJurisdiction\": \"az\",\n \"licenseType\": \"cosmetologist\",\n \"providerId\": \"18c55d91-5371-4bab-9aee-3bb9a1bfd573\",\n \"status\": \"inactive\",\n \"type\": \"privilege\",\n \"history\": [\n {\n \"compact\": \"cosm\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"az\",\n \"licenseType\": \"esthetician\",\n \"previous\": {\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"1747-11-26\",\n \"licenseJurisdiction\": \"al\"\n },\n \"providerId\": \"7277427c-f5a2-4293-94a7-c7018b8d8321\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"deactivation\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"1572-12-01\",\n \"licenseJurisdiction\": \"tn\"\n }\n },\n {\n \"compact\": \"cosm\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"co\",\n \"licenseType\": \"esthetician\",\n \"previous\": {\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"1748-07-31\",\n \"licenseJurisdiction\": \"md\"\n },\n \"providerId\": \"558502be-70f7-4955-9dda-b92b6c74f78d\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"other\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"1345-04-27\",\n \"licenseJurisdiction\": \"co\"\n }\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"2612-09-05\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2624-12-30\",\n \"jurisdiction\": \"ky\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"dcdeb3c2-60a7-4131-9eb9-c4f72a9bffc3\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"1091-12-06\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1568-10-11\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2471-09-11\",\n \"jurisdiction\": \"oh\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"6c03fb02-e459-4bd1-b591-36454853b002\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"2799-11-11\"\n }\n ]\n }\n ],\n \"middleName\": \"\",\n \"suffix\": \"\"\n}", + "body": "{\n \"compact\": \"cosm\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"wa\",\n \"providerId\": \"9d30e187-2ab4-433a-809b-4f8116c630cb\",\n \"type\": \"provider\",\n \"privileges\": [\n {\n \"administratorSetStatus\": \"active\",\n \"compact\": \"cosm\",\n \"dateOfExpiration\": \"1210-11-04\",\n \"jurisdiction\": \"wa\",\n \"licenseJurisdiction\": \"wa\",\n \"licenseType\": \"cosmetologist\",\n \"providerId\": \"5afe7161-4b34-420b-9453-aff56cfa13cf\",\n \"status\": \"active\",\n \"type\": \"privilege\"\n },\n {\n \"administratorSetStatus\": \"active\",\n \"compact\": \"cosm\",\n \"dateOfExpiration\": \"1707-04-02\",\n \"jurisdiction\": \"co\",\n \"licenseJurisdiction\": \"wa\",\n \"licenseType\": \"cosmetologist\",\n \"providerId\": \"b0e66df9-20cb-4c3e-a789-df503e09c6e0\",\n \"status\": \"inactive\",\n \"type\": \"privilege\"\n }\n ],\n \"licenses\": [\n {\n \"compact\": \"cosm\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"1971-09-31\",\n \"jurisdiction\": \"md\",\n \"licenseNumber\": \"\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"esthetician\",\n \"type\": \"license\"\n },\n {\n \"compact\": \"cosm\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"2731-04-31\",\n \"jurisdiction\": \"md\",\n \"licenseNumber\": \"\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"esthetician\",\n \"type\": \"license\"\n }\n ],\n \"middleName\": \"\",\n \"suffix\": \"\"\n}", "code": 200, "cookie": [], "header": [ @@ -4244,7 +4244,7 @@ "value": "application/json" } ], - "id": "f671781f-df23-42f1-a2ef-77550b3d9913", + "id": "6088a552-8581-4f24-9c2a-779fcda23bcc", "name": "200 response", "originalRequest": { "body": {}, @@ -4295,7 +4295,7 @@ "item": [ { "event": [], - "id": "6a335753-35f1-4c68-ba16-6674995282aa", + "id": "a84f5cd5-964c-41c5-8c8d-75ef9a0349fe", "name": "/v1/public/jurisdictions/live", "protocolProfileBehavior": { "disableBodyPruning": true @@ -4341,7 +4341,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"laborumdc\": [\n \"al\",\n \"al\"\n ]\n}", + "body": "{\n \"ut_3ec\": [\n \"ky\",\n \"va\"\n ],\n \"dolor3_f\": [\n \"tn\",\n \"az\"\n ]\n}", "code": 200, "cookie": [], "header": [ @@ -4350,7 +4350,7 @@ "value": "application/json" } ], - "id": "1d822625-0493-457a-a636-eac283fe709c", + "id": "cbc2b84f-8424-4f57-987e-7c3067b46d8d", "name": "200 response", "originalRequest": { "body": {}, @@ -4406,7 +4406,7 @@ "item": [ { "event": [], - "id": "d3347b74-a5bb-438c-91cc-d523fee53f53", + "id": "3f079b19-025c-4043-989e-566a4520b237", "name": "/v1/staff-users/me", "protocolProfileBehavior": { "disableBodyPruning": true @@ -4438,7 +4438,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"Duis894\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"Utc\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"inf\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"dolore_4\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"eiusmod_c6\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"ipsum83\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"cillum_9e\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"amet_89\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n}", + "body": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"sit_f3\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"dolore410\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"dolorefe\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"quis593\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"nostrud8_\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"proident_c0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n}", "code": 200, "cookie": [], "header": [ @@ -4456,7 +4456,7 @@ "value": "" } ], - "id": "b57fec75-1c80-4c77-b94e-72dbf7b9e15d", + "id": "e09174ec-4a47-4751-bbc2-212a4fa3dd89", "name": "200 response", "originalRequest": { "body": {}, @@ -4501,7 +4501,7 @@ "value": "application/json" } ], - "id": "2007d8cb-1bb4-4eb4-871d-79bc0763aa69", + "id": "cd8847fc-2c5c-4eaf-9168-36dd2eb572ab", "name": "404 response", "originalRequest": { "body": {}, @@ -4539,7 +4539,7 @@ }, { "event": [], - "id": "79edf4bf-bf3d-485f-81f0-b7ed0aa1938b", + "id": "0275e2a9-389f-42fe-aabd-ef5d95a62957", "name": "/v1/staff-users/me", "protocolProfileBehavior": { "disableBodyPruning": true @@ -4584,7 +4584,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"Duis894\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"Utc\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"inf\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"dolore_4\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"eiusmod_c6\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"ipsum83\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"cillum_9e\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"amet_89\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n}", + "body": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"sit_f3\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"dolore410\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"dolorefe\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"quis593\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"nostrud8_\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"proident_c0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n}", "code": 200, "cookie": [], "header": [ @@ -4602,7 +4602,7 @@ "value": "" } ], - "id": "b1c03b38-5741-4901-b108-52ec3d9428b8", + "id": "64569e6a-a6a9-4fcf-bfc4-5cbd53624ab9", "name": "200 response", "originalRequest": { "body": { @@ -4660,7 +4660,7 @@ "value": "application/json" } ], - "id": "098cedd8-0ad9-4f7e-9293-ee685a7f6e36", + "id": "dcf68eae-d03b-453f-8da1-744dd3a6c558", "name": "404 response", "originalRequest": { "body": { diff --git a/backend/cosmetology-app/docs/postman/postman-collection.json b/backend/cosmetology-app/docs/postman/postman-collection.json index 1898059d6..0ce52dede 100644 --- a/backend/cosmetology-app/docs/postman/postman-collection.json +++ b/backend/cosmetology-app/docs/postman/postman-collection.json @@ -10,7 +10,7 @@ "type": "bearer" }, "info": { - "_postman_id": "12e32f13-f30d-4689-a21a-b47cfc6f3da6", + "_postman_id": "e444fd71-91b5-46e4-bcac-fe1bb2ddf12a", "description": { "content": "", "type": "text/plain" @@ -410,7 +410,7 @@ "item": [ { "event": [], - "id": "83c4ba1f-6c1f-45e2-ae04-7757b214ac8e", + "id": "ae4dd3d5-9625-4003-b70c-6e0b1e0896d4", "name": "/v1/compacts/:compact/jurisdictions/:jurisdiction/licenses", "protocolProfileBehavior": { "disableBodyPruning": true @@ -424,7 +424,7 @@ "language": "json" } }, - "raw": "[\n {\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"1100-01-07\",\n \"dateOfExpiration\": \"2398-12-03\",\n \"dateOfIssuance\": \"1414-10-31\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseNumber\": \"\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"cosmetologist\",\n \"ssn\": \"133-07-7776\",\n \"homeAddressStreet2\": \"\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+51485269\",\n \"dateOfRenewal\": \"2283-10-30\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n },\n {\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2471-10-09\",\n \"dateOfExpiration\": \"1419-07-30\",\n \"dateOfIssuance\": \"1716-10-31\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseNumber\": \"\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"esthetician\",\n \"ssn\": \"533-42-6992\",\n \"homeAddressStreet2\": \"\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+877211196331\",\n \"dateOfRenewal\": \"1977-11-30\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n]" + "raw": "[\n {\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2047-09-31\",\n \"dateOfExpiration\": \"2778-12-30\",\n \"dateOfIssuance\": \"1961-10-22\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseNumber\": \"\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"cosmetologist\",\n \"ssn\": \"776-14-8717\",\n \"homeAddressStreet2\": \"\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+375005223091\",\n \"dateOfRenewal\": \"1874-11-30\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n },\n {\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"1822-04-31\",\n \"dateOfExpiration\": \"2511-11-31\",\n \"dateOfIssuance\": \"2096-09-28\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseNumber\": \"\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"esthetician\",\n \"ssn\": \"551-66-3213\",\n \"homeAddressStreet2\": \"\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+2352984283\",\n \"dateOfRenewal\": \"2319-11-05\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n]" }, "description": {}, "header": [ @@ -488,7 +488,7 @@ "value": "application/json" } ], - "id": "1e07cff3-9b10-48ed-ae1a-a4db185775b4", + "id": "3dc7d85f-73ff-4370-be60-47ab18257e0c", "name": "200 response", "originalRequest": { "body": { @@ -499,7 +499,7 @@ "language": "json" } }, - "raw": "[\n {\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"1100-01-07\",\n \"dateOfExpiration\": \"2398-12-03\",\n \"dateOfIssuance\": \"1414-10-31\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseNumber\": \"\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"cosmetologist\",\n \"ssn\": \"133-07-7776\",\n \"homeAddressStreet2\": \"\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+51485269\",\n \"dateOfRenewal\": \"2283-10-30\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n },\n {\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2471-10-09\",\n \"dateOfExpiration\": \"1419-07-30\",\n \"dateOfIssuance\": \"1716-10-31\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseNumber\": \"\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"esthetician\",\n \"ssn\": \"533-42-6992\",\n \"homeAddressStreet2\": \"\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+877211196331\",\n \"dateOfRenewal\": \"1977-11-30\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n]" + "raw": "[\n {\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2047-09-31\",\n \"dateOfExpiration\": \"2778-12-30\",\n \"dateOfIssuance\": \"1961-10-22\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseNumber\": \"\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"cosmetologist\",\n \"ssn\": \"776-14-8717\",\n \"homeAddressStreet2\": \"\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+375005223091\",\n \"dateOfRenewal\": \"1874-11-30\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n },\n {\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"1822-04-31\",\n \"dateOfExpiration\": \"2511-11-31\",\n \"dateOfIssuance\": \"2096-09-28\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseNumber\": \"\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"esthetician\",\n \"ssn\": \"551-66-3213\",\n \"homeAddressStreet2\": \"\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+2352984283\",\n \"dateOfRenewal\": \"2319-11-05\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n]" }, "header": [ { @@ -540,7 +540,7 @@ }, { "_postman_previewlanguage": "json", - "body": "{\n \"message\": \"\",\n \"errors\": {\n \"aliqua9\": {\n \"laborumd5\": [\n \"\",\n \"\"\n ],\n \"Ut_442\": [\n \"\",\n \"\"\n ]\n },\n \"ullamco1_\": {\n \"pariaturdfd\": [\n \"\",\n \"\"\n ]\n }\n }\n}", + "body": "{\n \"message\": \"\",\n \"errors\": {\n \"ullamco9\": {\n \"laboris6fd\": [\n \"\",\n \"\"\n ]\n }\n }\n}", "code": 400, "cookie": [], "header": [ @@ -549,7 +549,7 @@ "value": "application/json" } ], - "id": "1075166f-2bae-459b-9cf7-fde9a5b34817", + "id": "9209a379-9a94-4192-b60e-141d660e1b6a", "name": "400 response", "originalRequest": { "body": { @@ -560,7 +560,7 @@ "language": "json" } }, - "raw": "[\n {\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"1100-01-07\",\n \"dateOfExpiration\": \"2398-12-03\",\n \"dateOfIssuance\": \"1414-10-31\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseNumber\": \"\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"cosmetologist\",\n \"ssn\": \"133-07-7776\",\n \"homeAddressStreet2\": \"\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+51485269\",\n \"dateOfRenewal\": \"2283-10-30\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n },\n {\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2471-10-09\",\n \"dateOfExpiration\": \"1419-07-30\",\n \"dateOfIssuance\": \"1716-10-31\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseNumber\": \"\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"esthetician\",\n \"ssn\": \"533-42-6992\",\n \"homeAddressStreet2\": \"\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+877211196331\",\n \"dateOfRenewal\": \"1977-11-30\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n]" + "raw": "[\n {\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2047-09-31\",\n \"dateOfExpiration\": \"2778-12-30\",\n \"dateOfIssuance\": \"1961-10-22\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseNumber\": \"\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"cosmetologist\",\n \"ssn\": \"776-14-8717\",\n \"homeAddressStreet2\": \"\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+375005223091\",\n \"dateOfRenewal\": \"1874-11-30\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n },\n {\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"1822-04-31\",\n \"dateOfExpiration\": \"2511-11-31\",\n \"dateOfIssuance\": \"2096-09-28\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseNumber\": \"\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"esthetician\",\n \"ssn\": \"551-66-3213\",\n \"homeAddressStreet2\": \"\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+2352984283\",\n \"dateOfRenewal\": \"2319-11-05\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n]" }, "header": [ { @@ -631,7 +631,7 @@ } } ], - "id": "617853ff-a0af-4af9-8588-33a75e5c9f37", + "id": "94302ab8-108f-40dd-a5bb-01d1e6042939", "name": "/v1/compacts/:compact/jurisdictions/:jurisdiction/licenses/bulk-upload", "protocolProfileBehavior": { "disableBodyPruning": true @@ -688,7 +688,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"upload\": {\n \"fields\": {\n \"ipsum_477\": \"\",\n \"minim0e\": \"\",\n \"consequat_a\": \"\",\n \"veniam_58\": \"\"\n },\n \"url\": \"\"\n }\n}", + "body": "{\n \"upload\": {\n \"fields\": {\n \"ut_9c\": \"\",\n \"non_8f\": \"\"\n },\n \"url\": \"\"\n }\n}", "code": 200, "cookie": [], "header": [ @@ -697,7 +697,7 @@ "value": "application/json" } ], - "id": "9da731e7-e9bf-4c21-9bb7-5caf51949487", + "id": "d149ce75-f3ec-4640-a52e-95c04db4d14e", "name": "200 response", "originalRequest": { "body": {}, diff --git a/backend/cosmetology-app/docs/search-internal/postman/postman-collection.json b/backend/cosmetology-app/docs/search-internal/postman/postman-collection.json index ea4e4886c..39b9dd8b9 100644 --- a/backend/cosmetology-app/docs/search-internal/postman/postman-collection.json +++ b/backend/cosmetology-app/docs/search-internal/postman/postman-collection.json @@ -10,7 +10,7 @@ "type": "bearer" }, "info": { - "_postman_id": "6a4d3924-4d14-415f-96d9-31ea18c14bde", + "_postman_id": "1369ff3a-aabc-4f1d-bfde-c195fb7e91e7", "description": { "content": "", "type": "text/plain" @@ -407,7 +407,7 @@ "item": [ { "event": [], - "id": "3bdc2e00-cf1a-420f-9102-6fa65ddb2df7", + "id": "02ee167c-b449-48bc-ba9b-05599c65e9f6", "name": "/v1/compacts/:compact/providers/search", "protocolProfileBehavior": { "disableBodyPruning": true @@ -465,7 +465,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"providers\": [\n {\n \"birthMonthDay\": \"11-28\",\n \"compact\": \"cosm\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseJurisdiction\": \"oh\",\n \"licenseStatus\": \"inactive\",\n \"providerId\": \"4e5e54d8-25fd-434a-8a3c-ebcd619107c8\",\n \"type\": \"provider\",\n \"privileges\": [\n {\n \"administratorSetStatus\": \"active\",\n \"compact\": \"cosm\",\n \"dateOfExpiration\": \"1283-03-24\",\n \"jurisdiction\": \"az\",\n \"licenseJurisdiction\": \"al\",\n \"licenseType\": \"\",\n \"providerId\": \"e200de7a-6ccf-46af-b0bd-80d608efd32a\",\n \"status\": \"inactive\",\n \"type\": \"privilege\",\n \"investigationStatus\": \"underInvestigation\",\n \"investigations\": [\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"az\",\n \"licenseType\": \"\",\n \"providerId\": \"dacc63bc-87f2-492c-924f-65fb750640cb\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"co\",\n \"licenseType\": \"\",\n \"providerId\": \"e672027a-a455-49ce-a7d5-8ec9e71174fa\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"license\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1013-11-19\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2440-03-22\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"md\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"ed40bb57-424d-41fb-8754-b9b3f8c1b86f\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2020-04-14\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"license\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1822-07-05\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1554-12-12\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"tn\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"84bbb8ef-4cf9-4aec-838f-35b9ebc5f4e2\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2843-08-31\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"administratorSetStatus\": \"inactive\",\n \"compact\": \"cosm\",\n \"dateOfExpiration\": \"2898-10-09\",\n \"jurisdiction\": \"co\",\n \"licenseJurisdiction\": \"md\",\n \"licenseType\": \"\",\n \"providerId\": \"2deb9c93-98bf-4653-8531-ffcf1be9fb5a\",\n \"status\": \"inactive\",\n \"type\": \"privilege\",\n \"investigationStatus\": \"underInvestigation\",\n \"investigations\": [\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"az\",\n \"licenseType\": \"\",\n \"providerId\": \"0b7e195d-bf48-4ae6-8931-aa18653d357c\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"al\",\n \"licenseType\": \"\",\n \"providerId\": \"d1f89895-ad37-4632-81ce-b8c851f38df9\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"license\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1743-10-09\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2883-08-27\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"va\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"11c99e90-1b30-4bec-b007-dbbb9800f430\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1125-10-07\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"license\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1489-10-31\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1130-12-30\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"az\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"2e64934b-db3d-451d-b8e9-d7bd2673d39f\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2957-12-01\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"va\",\n \"licenses\": [\n {\n \"compact\": \"cosm\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"1595-10-23\",\n \"dateOfIssuance\": \"1594-07-30\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"ks\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"licenseNumber\": \"\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"\",\n \"providerId\": \"3d0b3496-1a34-44af-9c6d-893076bbf6c1\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"investigations\": [\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"va\",\n \"licenseType\": \"\",\n \"providerId\": \"b896749e-f421-4bc2-9eb8-64c82dabf0b5\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"co\",\n \"licenseType\": \"\",\n \"providerId\": \"f6d529f0-df70-4bc6-ad90-463cd813b3b1\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"dateOfRenewal\": \"2452-10-30\",\n \"investigationStatus\": \"underInvestigation\",\n \"phoneNumber\": \"+524805413579855\",\n \"licenseStatusName\": \"\",\n \"middleName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"privilege\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1396-06-02\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1806-08-13\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"al\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"8e02546b-fbbd-4d67-ad93-5cbe81128dec\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2943-01-04\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"privilege\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1917-10-07\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1870-11-10\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"az\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"9f472016-4c3f-48dc-a8b8-e146af94f758\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2246-11-05\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"compact\": \"cosm\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"1339-08-02\",\n \"dateOfIssuance\": \"2222-02-29\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"ks\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"\",\n \"providerId\": \"95986a0f-5368-4622-ac7c-49290179b48f\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"investigations\": [\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"md\",\n \"licenseType\": \"\",\n \"providerId\": \"44101c2d-b2b9-4238-8b9b-1ce91888277f\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"az\",\n \"licenseType\": \"\",\n \"providerId\": \"7aec1b97-60b5-42e9-afbd-44be7cf00fbf\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"dateOfRenewal\": \"1716-04-08\",\n \"investigationStatus\": \"underInvestigation\",\n \"phoneNumber\": \"+752037150196\",\n \"licenseStatusName\": \"\",\n \"middleName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"privilege\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1161-01-31\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1515-01-31\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ky\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"fca496e1-5c77-41b8-b734-7e7379f3e18f\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1718-09-30\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"license\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"2425-09-17\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2234-12-31\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"co\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"0d49c3a4-d6c1-405f-aea4-008e40dced79\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1854-12-02\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n },\n {\n \"birthMonthDay\": \"03-13\",\n \"compact\": \"cosm\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"licenseJurisdiction\": \"co\",\n \"licenseStatus\": \"active\",\n \"providerId\": \"9d189082-d9a9-430a-aa0a-d76d6ba467b2\",\n \"type\": \"provider\",\n \"privileges\": [\n {\n \"administratorSetStatus\": \"inactive\",\n \"compact\": \"cosm\",\n \"dateOfExpiration\": \"2526-12-28\",\n \"jurisdiction\": \"az\",\n \"licenseJurisdiction\": \"co\",\n \"licenseType\": \"\",\n \"providerId\": \"582e97c6-08ea-4057-af69-2274d27df67f\",\n \"status\": \"active\",\n \"type\": \"privilege\",\n \"investigationStatus\": \"underInvestigation\",\n \"investigations\": [\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"va\",\n \"licenseType\": \"\",\n \"providerId\": \"4f02d525-4755-4c18-8eb5-45d9c31eeb47\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"oh\",\n \"licenseType\": \"\",\n \"providerId\": \"4628b052-688f-4eaf-8b0d-deeef331e45f\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"privilege\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1382-07-02\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2907-06-05\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"al\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"8cbf7b79-3a70-47e7-8a73-800c54cdcd29\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1438-03-10\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"license\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"2568-12-20\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2378-11-31\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"va\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"ef16ed00-cdfa-4969-81e9-164a9eeb3524\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2190-12-20\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"administratorSetStatus\": \"active\",\n \"compact\": \"cosm\",\n \"dateOfExpiration\": \"1042-02-04\",\n \"jurisdiction\": \"co\",\n \"licenseJurisdiction\": \"oh\",\n \"licenseType\": \"\",\n \"providerId\": \"9d2aa59f-7194-4e86-a115-22136a08e7f2\",\n \"status\": \"inactive\",\n \"type\": \"privilege\",\n \"investigationStatus\": \"underInvestigation\",\n \"investigations\": [\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"md\",\n \"licenseType\": \"\",\n \"providerId\": \"7d4f7102-60b6-4d8d-b465-b651b2137ba1\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"md\",\n \"licenseType\": \"\",\n \"providerId\": \"f13aef15-666d-4274-9e7d-8edd7dee9617\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"license\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"2656-03-05\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2495-02-20\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"al\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"712cdfad-d066-486c-8a5b-5b7ccb0e866c\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2809-11-18\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"license\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1713-01-13\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2687-07-30\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"md\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"4900e42f-3bec-4e1f-bb1b-8c22b05f8bfb\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1773-11-20\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"az\",\n \"licenses\": [\n {\n \"compact\": \"cosm\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"1744-08-15\",\n \"dateOfIssuance\": \"2330-08-28\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"oh\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"licenseNumber\": \"\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"\",\n \"providerId\": \"e69fa2cb-a6e5-4d0b-ad8d-6e1c7c9be32f\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"investigations\": [\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"va\",\n \"licenseType\": \"\",\n \"providerId\": \"9e3dd0d3-175b-44c4-96d6-a6bbc2ee2e44\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"al\",\n \"licenseType\": \"\",\n \"providerId\": \"3e386e9b-ec15-49f5-a18b-9e9e270b29fd\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"dateOfRenewal\": \"2044-03-08\",\n \"investigationStatus\": \"underInvestigation\",\n \"phoneNumber\": \"+5303456155\",\n \"licenseStatusName\": \"\",\n \"middleName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"license\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"2857-03-26\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2489-09-17\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"va\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"31ee1f05-a0b0-4be3-b644-932f640c15d7\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1830-10-09\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"license\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"2493-03-12\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2546-11-18\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"co\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"05d8d94e-75e8-42d4-a002-2c382c85ba10\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2060-05-04\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"compact\": \"cosm\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"1884-09-07\",\n \"dateOfIssuance\": \"2130-09-07\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"az\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"licenseNumber\": \"\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"\",\n \"providerId\": \"8dd298ae-b64b-4c8a-80c5-28aee31ccaed\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"investigations\": [\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"tn\",\n \"licenseType\": \"\",\n \"providerId\": \"164f9b45-0097-4246-8e19-c65e3b213430\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"tn\",\n \"licenseType\": \"\",\n \"providerId\": \"019e741f-019a-4528-87ba-909cba6d93a5\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"dateOfRenewal\": \"2323-03-04\",\n \"investigationStatus\": \"underInvestigation\",\n \"phoneNumber\": \"+633155596720\",\n \"licenseStatusName\": \"\",\n \"middleName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"privilege\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"2977-10-11\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2921-10-04\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"az\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"9d30d02b-2952-4e59-96c8-1106a9b64b94\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2794-12-30\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"license\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1503-12-30\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2894-10-30\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"va\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"62414ec1-8a34-4a16-a754-ecbfed2bc0bf\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2924-01-02\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n }\n ],\n \"total\": {\n \"value\": \"\",\n \"relation\": \"gte\"\n },\n \"lastSort\": \"\"\n}", + "body": "{\n \"providers\": [\n {\n \"birthMonthDay\": \"16-02\",\n \"compact\": \"cosm\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseJurisdiction\": \"co\",\n \"licenseStatus\": \"active\",\n \"providerId\": \"983077ef-81b6-4e94-a38d-9ecfda81b86a\",\n \"type\": \"provider\",\n \"privileges\": [\n {\n \"administratorSetStatus\": \"inactive\",\n \"compact\": \"cosm\",\n \"dateOfExpiration\": \"2707-10-31\",\n \"jurisdiction\": \"al\",\n \"licenseJurisdiction\": \"md\",\n \"licenseType\": \"\",\n \"providerId\": \"eaa19666-0c94-40e4-a15b-db3ed72c3bb3\",\n \"status\": \"active\",\n \"type\": \"privilege\",\n \"investigationStatus\": \"underInvestigation\",\n \"investigations\": [\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"al\",\n \"licenseType\": \"\",\n \"providerId\": \"c45c1eed-682f-40cf-9586-62f4d524c01c\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"md\",\n \"licenseType\": \"\",\n \"providerId\": \"998f10c3-8571-4c5d-b26c-ba6934198c2b\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"privilege\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"2034-07-13\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1515-10-28\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"va\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"3f479d09-990a-4d9a-b7ba-41df74b00041\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2271-10-09\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"privilege\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1699-10-22\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2676-02-30\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ky\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"5cbf3e2c-da58-4ee0-b7ce-07dec8207bd6\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2681-04-18\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"administratorSetStatus\": \"active\",\n \"compact\": \"cosm\",\n \"dateOfExpiration\": \"2987-06-31\",\n \"jurisdiction\": \"co\",\n \"licenseJurisdiction\": \"oh\",\n \"licenseType\": \"\",\n \"providerId\": \"eae111bd-d3b8-448d-b01d-cc797b006fc0\",\n \"status\": \"inactive\",\n \"type\": \"privilege\",\n \"investigationStatus\": \"underInvestigation\",\n \"investigations\": [\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"va\",\n \"licenseType\": \"\",\n \"providerId\": \"e160d703-de3b-49c7-be24-331f6f3c000b\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"co\",\n \"licenseType\": \"\",\n \"providerId\": \"7fbcb526-c2ec-4d3c-8fd6-3c72870b61d1\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"license\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1170-02-31\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2792-01-31\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"wa\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"9afcaf64-67b0-418d-af53-c8096d813948\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2220-01-05\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"license\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1220-12-21\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2085-06-30\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ky\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"3cea388c-d4dc-45a1-9c48-caecd5433902\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2664-05-20\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"md\",\n \"licenses\": [\n {\n \"compact\": \"cosm\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"1635-05-30\",\n \"dateOfIssuance\": \"2279-12-06\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"va\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"licenseNumber\": \"\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"\",\n \"providerId\": \"f5ecbfb0-8245-4dce-bc5c-8e8c3fb720e3\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"investigations\": [\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"ks\",\n \"licenseType\": \"\",\n \"providerId\": \"1caf7375-85f8-40d4-9d88-1d5bc6478576\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"co\",\n \"licenseType\": \"\",\n \"providerId\": \"39eb05fc-2aca-4c31-ba27-24d53ab319f6\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"dateOfRenewal\": \"2768-02-20\",\n \"investigationStatus\": \"underInvestigation\",\n \"phoneNumber\": \"+17859210533\",\n \"licenseStatusName\": \"\",\n \"middleName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"privilege\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"2973-11-06\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2861-07-13\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"tn\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"e88c198f-5081-42f4-8f26-fa6e0d3640d0\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2162-03-10\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"license\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"2915-10-31\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2600-09-07\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"wa\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"5b0a05f2-b595-44d2-9735-1691df5f2068\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2740-12-31\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"compact\": \"cosm\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"1447-08-30\",\n \"dateOfIssuance\": \"2140-11-30\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"az\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"\",\n \"providerId\": \"2a06657c-43d8-4e1f-8cf0-d661da262204\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"investigations\": [\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"tn\",\n \"licenseType\": \"\",\n \"providerId\": \"8de6cacb-65ea-46b8-9349-f540f70e66ab\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"ky\",\n \"licenseType\": \"\",\n \"providerId\": \"f66dbdd5-ddbe-4e23-846c-c3b36082da8f\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"dateOfRenewal\": \"1091-11-01\",\n \"investigationStatus\": \"underInvestigation\",\n \"phoneNumber\": \"+266910525245\",\n \"licenseStatusName\": \"\",\n \"middleName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"license\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1801-03-31\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1899-03-29\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ks\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"05c59b30-09dc-484c-a37e-e238db0aa2e1\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1399-02-08\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"privilege\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1949-02-06\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2961-12-29\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"co\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"d5c72dd2-df42-47e5-9d12-f2a4b0cf4d33\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2645-06-06\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n },\n {\n \"birthMonthDay\": \"11-31\",\n \"compact\": \"cosm\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"licenseJurisdiction\": \"al\",\n \"licenseStatus\": \"inactive\",\n \"providerId\": \"3c413612-aff7-422f-9ae3-cac05b1d837f\",\n \"type\": \"provider\",\n \"privileges\": [\n {\n \"administratorSetStatus\": \"inactive\",\n \"compact\": \"cosm\",\n \"dateOfExpiration\": \"2530-12-06\",\n \"jurisdiction\": \"md\",\n \"licenseJurisdiction\": \"ky\",\n \"licenseType\": \"\",\n \"providerId\": \"d9498e8c-9005-4782-b574-6e6cf0e44011\",\n \"status\": \"inactive\",\n \"type\": \"privilege\",\n \"investigationStatus\": \"underInvestigation\",\n \"investigations\": [\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"co\",\n \"licenseType\": \"\",\n \"providerId\": \"76bb1feb-1b15-434e-935d-9be37563997b\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"az\",\n \"licenseType\": \"\",\n \"providerId\": \"064865aa-71b0-4e48-a07a-6c9a8bbdbd76\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"license\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1336-06-14\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1196-02-22\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"va\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"06dbbb61-3f81-4f45-b6fc-82443c4f419e\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1791-11-14\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"privilege\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1113-10-04\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1083-12-02\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"co\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"8d84550a-baec-4842-a5f8-3d1399b7afda\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2292-10-11\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"administratorSetStatus\": \"active\",\n \"compact\": \"cosm\",\n \"dateOfExpiration\": \"1226-12-06\",\n \"jurisdiction\": \"md\",\n \"licenseJurisdiction\": \"az\",\n \"licenseType\": \"\",\n \"providerId\": \"492f0fcd-f0f4-457f-b8da-7a7ee442bcac\",\n \"status\": \"active\",\n \"type\": \"privilege\",\n \"investigationStatus\": \"underInvestigation\",\n \"investigations\": [\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"oh\",\n \"licenseType\": \"\",\n \"providerId\": \"7599e0cf-2c34-4f9b-875c-5ab0ca531c4d\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"ky\",\n \"licenseType\": \"\",\n \"providerId\": \"e2057bce-3488-4ecc-83df-aec735abc462\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"license\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1411-09-30\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1107-02-07\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ky\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"088ed538-7672-4dd8-a192-d08bb7129261\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1999-09-30\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"privilege\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"2451-12-31\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2938-12-01\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"wa\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"612dae37-a887-4877-9ee1-c7f9da7e17cf\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1943-03-30\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"al\",\n \"licenses\": [\n {\n \"compact\": \"cosm\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"1630-06-11\",\n \"dateOfIssuance\": \"2424-03-03\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"md\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"licenseNumber\": \"\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"\",\n \"providerId\": \"ac33c991-d600-490c-bfca-5f2caac4f117\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"investigations\": [\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"va\",\n \"licenseType\": \"\",\n \"providerId\": \"11cc1dae-f66d-45dd-92a2-fdf7eed8bd86\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"ks\",\n \"licenseType\": \"\",\n \"providerId\": \"cac6a717-28ed-4398-8e70-bdb956bf8ee3\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"dateOfRenewal\": \"2872-03-09\",\n \"investigationStatus\": \"underInvestigation\",\n \"phoneNumber\": \"+2087609290\",\n \"licenseStatusName\": \"\",\n \"middleName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"privilege\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1858-12-25\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1711-12-28\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"wa\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"346a41e7-21f9-40f3-aa0a-8e6d8693d732\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1776-11-30\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"privilege\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1142-03-06\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2399-11-12\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"oh\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"4f9c5550-7026-4660-ad1c-bb825f4fe36d\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2138-02-26\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"compact\": \"cosm\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"1870-01-08\",\n \"dateOfIssuance\": \"2155-09-20\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"ks\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"licenseNumber\": \"\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"\",\n \"providerId\": \"bd51940e-807e-435d-b9fc-00bd6ad6f7bb\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"investigations\": [\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"az\",\n \"licenseType\": \"\",\n \"providerId\": \"9cb66796-f7f0-4340-9a03-93b2c4b14093\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"cosm\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"oh\",\n \"licenseType\": \"\",\n \"providerId\": \"04350816-776b-4cf7-bfbe-48a5d17f5432\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"dateOfRenewal\": \"1601-11-31\",\n \"investigationStatus\": \"underInvestigation\",\n \"phoneNumber\": \"+9770350103011\",\n \"licenseStatusName\": \"\",\n \"middleName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"privilege\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"2894-11-30\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1672-10-07\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"wa\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"f1476062-ec15-46b2-a931-50b4cd7cfbf0\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1514-10-30\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"license\",\n \"adverseActionId\": \"\",\n \"compact\": \"cosm\",\n \"creationDate\": \"1782-07-01\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1686-05-30\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"md\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"c59cfdee-1dde-4280-9b69-5f7747e9cfa1\",\n \"submittingUser\": \"\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2431-12-31\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n }\n ],\n \"total\": {\n \"value\": \"\",\n \"relation\": \"eq\"\n },\n \"lastSort\": \"\"\n}", "code": 200, "cookie": [], "header": [ @@ -474,7 +474,7 @@ "value": "application/json" } ], - "id": "d415a119-fe8a-46d5-92bc-13a4a2d3ee12", + "id": "9646725c-fe05-4bce-9b1f-3dadb5c4929b", "name": "200 response", "originalRequest": { "body": { From c0f4c69f724d4712c0abb66d394d74e39b07a0ec Mon Sep 17 00:00:00 2001 From: Landon Shumway Date: Fri, 27 Mar 2026 14:05:13 -0500 Subject: [PATCH 19/36] remove provider id access pattern from public query --- .../data_model/schema/provider/api.py | 26 +++++++++++++++++-- .../python/search/handlers/public_search.py | 4 +-- .../function/test_public_search_providers.py | 19 ++++++++++++++ 3 files changed, 45 insertions(+), 4 deletions(-) diff --git a/backend/cosmetology-app/lambdas/python/common/cc_common/data_model/schema/provider/api.py b/backend/cosmetology-app/lambdas/python/common/cc_common/data_model/schema/provider/api.py index 0b5a9f99d..dcf810fb4 100644 --- a/backend/cosmetology-app/lambdas/python/common/cc_common/data_model/schema/provider/api.py +++ b/backend/cosmetology-app/lambdas/python/common/cc_common/data_model/schema/provider/api.py @@ -226,9 +226,8 @@ class PublicLicenseSearchResponseSchema(ForgivingSchema): class QueryProvidersRequestSchema(CCRequestSchema): """ - Schema for query providers requests. + Schema for staff query providers requests. - This schema is used to validate incoming requests to both the staff and public query providers API endpoints. It corresponds to the V1QueryProvidersRequestModel in the API model. Serialization direction: @@ -267,6 +266,29 @@ class SortingSchema(ForgivingSchema): sorting = Nested(SortingSchema, required=False, allow_none=False) +class PublicQueryProvidersRequestSchema(CCRequestSchema): + """ + Request body for the public POST .../providers/query endpoint only. + + The query object allows only jurisdiction, givenName, familyName, and licenseNumber. + Pagination and sorting match QueryProvidersRequestSchema. + """ + + class PublicQuerySchema(CCRequestSchema): + """ + Nested schema for the query object within the request. + """ + + jurisdiction = Jurisdiction(required=False, allow_none=False) + givenName = String(required=False, allow_none=False, validate=Length(min=1, max=100)) + familyName = String(required=False, allow_none=False, validate=Length(min=1, max=100)) + licenseNumber = String(required=False, allow_none=False, validate=Length(min=1, max=100)) + + query = Nested(PublicQuerySchema, required=True, allow_none=False) + pagination = Nested(QueryProvidersRequestSchema.PaginationSchema, required=False, allow_none=False) + sorting = Nested(QueryProvidersRequestSchema.SortingSchema, required=False, allow_none=False) + + class SearchProvidersRequestSchema(CCRequestSchema): """ Schema for advanced search providers requests. diff --git a/backend/cosmetology-app/lambdas/python/search/handlers/public_search.py b/backend/cosmetology-app/lambdas/python/search/handlers/public_search.py index 24f1f5971..20f20d2de 100644 --- a/backend/cosmetology-app/lambdas/python/search/handlers/public_search.py +++ b/backend/cosmetology-app/lambdas/python/search/handlers/public_search.py @@ -5,7 +5,7 @@ from cc_common.config import config, logger from cc_common.data_model.schema.provider.api import ( PublicLicenseSearchResponseSchema, - QueryProvidersRequestSchema, + PublicQueryProvidersRequestSchema, ) from cc_common.exceptions import CCInvalidRequestException from cc_common.utils import api_handler @@ -110,7 +110,7 @@ def _public_query_licenses(event: dict, context: LambdaContext): # noqa: ARG001 def _parse_and_validate_public_query_body(event: dict) -> dict: try: - schema = QueryProvidersRequestSchema() + schema = PublicQueryProvidersRequestSchema() raw_body = event.get('body') or '{}' body = schema.loads(raw_body) except ValidationError as e: diff --git a/backend/cosmetology-app/lambdas/python/search/tests/function/test_public_search_providers.py b/backend/cosmetology-app/lambdas/python/search/tests/function/test_public_search_providers.py index 59016bef9..dd5d1ad05 100644 --- a/backend/cosmetology-app/lambdas/python/search/tests/function/test_public_search_providers.py +++ b/backend/cosmetology-app/lambdas/python/search/tests/function/test_public_search_providers.py @@ -318,6 +318,25 @@ def test_no_search_criteria_returns_400(self): body = json.loads(response['body']) self.assertIn('At least one of licenseNumber, jurisdiction, or familyName', body['message']) + def test_provider_id_in_query_returns_400(self): + """Public query must not accept query.providerId (blocked at schema validation).""" + from handlers.public_search import public_search_api_handler + + event = self._create_public_api_event( + 'cosm', + body={ + 'query': { + 'providerId': '89a6377e-c3a5-40e5-bca5-317ec854c570', + 'familyName': 'Doe', + }, + 'pagination': {'pageSize': 10}, + }, + ) + response = public_search_api_handler(event, self.mock_context) + self.assertEqual(400, response['statusCode']) + body = json.loads(response['body']) + self.assertIn('providerId', body['message']) + @patch('handlers.public_search.opensearch_client') def test_pagination_page_size_maps_to_size_and_search_after_from_last_key(self, mock_opensearch_client): """Test that pageSize maps to size and lastKey decodes to search_after.""" From 2cd28400d1a275a890ddab4c0dee34b3dd2c96b6 Mon Sep 17 00:00:00 2001 From: Landon Shumway Date: Tue, 31 Mar 2026 12:55:52 -0500 Subject: [PATCH 20/36] Add ability to reset indexes when populating documents --- .../handlers/manage_opensearch_indices.py | 218 +------------- .../handlers/populate_provider_documents.py | 35 ++- .../python/search/opensearch_client.py | 281 +++++++++++++++++- .../test_manage_opensearch_indices.py | 15 + 4 files changed, 331 insertions(+), 218 deletions(-) diff --git a/backend/cosmetology-app/lambdas/python/search/handlers/manage_opensearch_indices.py b/backend/cosmetology-app/lambdas/python/search/handlers/manage_opensearch_indices.py index 0c606ba4d..d707ac1fb 100644 --- a/backend/cosmetology-app/lambdas/python/search/handlers/manage_opensearch_indices.py +++ b/backend/cosmetology-app/lambdas/python/search/handlers/manage_opensearch_indices.py @@ -3,10 +3,7 @@ from cc_common.config import config, logger from cc_common.exceptions import CCInternalException from custom_resource_handler import CustomResourceHandler, CustomResourceResponse -from opensearch_client import OpenSearchClient - -# Initial index version for new deployments -INITIAL_INDEX_VERSION = 'v1' +from opensearch_client import INITIAL_INDEX_VERSION, OpenSearchClient # Readiness check configuration # OpenSearch domains may take time to become responsive after CloudFormation reports them as created. @@ -53,8 +50,7 @@ def on_create(self, properties: dict) -> CustomResourceResponse | None: index_name = f'compact_{compact}_providers_{INITIAL_INDEX_VERSION}' # Create alias name (e.g., compact_cosm_providers) alias_name = f'compact_{compact}_providers' - self._create_provider_index_with_alias( - client=client, + client.create_provider_index_with_alias( index_name=index_name, alias_name=alias_name, number_of_shards=number_of_shards, @@ -144,215 +140,5 @@ def _wait_for_domain_ready(self) -> OpenSearchClient: f'Last error: {last_exception}' ) - def _create_provider_index_with_alias( - self, - client: OpenSearchClient, - index_name: str, - alias_name: str, - number_of_shards: int, - number_of_replicas: int, - ) -> None: - """ - Create the provider index and alias in OpenSearch if they don't exist. - - :param client: The OpenSearch client - :param index_name: The versioned index name (e.g., compact_cosm_providers_v1) - :param alias_name: The alias name (e.g., compact_cosm_providers) - :param number_of_shards: Number of primary shards for the index - :param number_of_replicas: Number of replica shards for the index - """ - # Check if the alias already exists (meaning an index version is already set up) - if client.alias_exists(alias_name): - logger.info(f"Alias '{alias_name}' already exists. Skipping index and alias creation.") - return - - # Check if the index already exists (edge case: index exists but alias doesn't) - if client.index_exists(index_name): - logger.info(f"Index '{index_name}' already exists. Creating alias only.") - client.create_alias(index_name, alias_name) - logger.info(f"Alias '{alias_name}' -> '{index_name}' created successfully.") - return - - # Create the index with the specified configuration - logger.info(f"Creating index '{index_name}'...") - index_mapping = self._get_provider_index_mapping(number_of_shards, number_of_replicas) - client.create_index(index_name, index_mapping) - logger.info(f"Index '{index_name}' created successfully.") - - # Create the alias pointing to the new index - logger.info(f"Creating alias '{alias_name}' -> '{index_name}'...") - client.create_alias(index_name, alias_name) - logger.info(f"Alias '{alias_name}' -> '{index_name}' created successfully.") - - def _get_provider_index_mapping(self, number_of_shards: int, number_of_replicas: int) -> dict: - """ - Define the index mapping for provider documents. - - :param number_of_shards: Number of primary shards for the index - :param number_of_replicas: Number of replica shards for the index - :return: The index mapping dictionary - """ - # Nested schema for AdverseAction - adverse_action_properties = { - 'type': {'type': 'keyword'}, - 'adverseActionId': {'type': 'keyword'}, - 'compact': {'type': 'keyword'}, - 'jurisdiction': {'type': 'keyword'}, - 'providerId': {'type': 'keyword'}, - 'licenseType': {'type': 'keyword'}, - 'licenseTypeAbbreviation': {'type': 'keyword'}, - 'actionAgainst': {'type': 'keyword'}, - 'effectiveStartDate': {'type': 'date'}, - 'creationDate': {'type': 'date'}, - 'effectiveLiftDate': {'type': 'date'}, - 'dateOfUpdate': {'type': 'date'}, - 'encumbranceType': {'type': 'keyword'}, - 'clinicalPrivilegeActionCategories': {'type': 'keyword'}, - 'clinicalPrivilegeActionCategory': {'type': 'keyword'}, - 'submittingUser': {'type': 'keyword'}, - 'liftingUser': {'type': 'keyword'}, - } - - # Nested schema for Investigation - investigation_properties = { - 'type': {'type': 'keyword'}, - 'investigationId': {'type': 'keyword'}, - 'compact': {'type': 'keyword'}, - 'jurisdiction': {'type': 'keyword'}, - 'licenseType': {'type': 'keyword'}, - 'status': {'type': 'keyword'}, - 'dateOfUpdate': {'type': 'date'}, - } - - # Nested schema for License - license_properties = { - 'providerId': {'type': 'keyword'}, - 'type': {'type': 'keyword'}, - 'dateOfUpdate': {'type': 'date'}, - 'compact': {'type': 'keyword'}, - 'jurisdiction': {'type': 'keyword'}, - 'licenseType': {'type': 'keyword'}, - 'licenseStatusName': {'type': 'keyword'}, - 'licenseStatus': {'type': 'keyword'}, - 'jurisdictionUploadedLicenseStatus': {'type': 'keyword'}, - 'compactEligibility': {'type': 'keyword'}, - 'jurisdictionUploadedCompactEligibility': {'type': 'keyword'}, - 'licenseNumber': {'type': 'keyword'}, - 'givenName': { - 'type': 'text', - 'analyzer': 'custom_ascii_analyzer', - 'fields': {'keyword': {'type': 'keyword', 'ignore_above': 256}}, - }, - 'middleName': { - 'type': 'text', - 'analyzer': 'custom_ascii_analyzer', - 'fields': {'keyword': {'type': 'keyword', 'ignore_above': 256}}, - }, - 'familyName': { - 'type': 'text', - 'analyzer': 'custom_ascii_analyzer', - 'fields': {'keyword': {'type': 'keyword', 'ignore_above': 256}}, - }, - 'suffix': {'type': 'keyword'}, - 'dateOfIssuance': {'type': 'date'}, - 'dateOfRenewal': {'type': 'date'}, - 'dateOfExpiration': {'type': 'date'}, - 'dateOfBirth': {'type': 'date'}, - 'homeAddressStreet1': {'type': 'text'}, - 'homeAddressStreet2': {'type': 'text'}, - 'homeAddressCity': { - 'type': 'text', - 'analyzer': 'custom_ascii_analyzer', - 'fields': {'keyword': {'type': 'keyword', 'ignore_above': 256}}, - }, - 'homeAddressState': {'type': 'keyword'}, - 'homeAddressPostalCode': {'type': 'keyword'}, - 'emailAddress': {'type': 'keyword'}, - 'phoneNumber': {'type': 'keyword'}, - 'adverseActions': {'type': 'nested', 'properties': adverse_action_properties}, - 'investigations': {'type': 'nested', 'properties': investigation_properties}, - 'investigationStatus': {'type': 'keyword'}, - } - - # Nested schema for Privilege - privilege_properties = { - 'type': {'type': 'keyword'}, - 'providerId': {'type': 'keyword'}, - 'compact': {'type': 'keyword'}, - 'jurisdiction': {'type': 'keyword'}, - 'licenseJurisdiction': {'type': 'keyword'}, - 'licenseType': {'type': 'keyword'}, - 'dateOfIssuance': {'type': 'date'}, - 'dateOfRenewal': {'type': 'date'}, - 'dateOfExpiration': {'type': 'date'}, - 'dateOfUpdate': {'type': 'date'}, - 'adverseActions': {'type': 'nested', 'properties': adverse_action_properties}, - 'investigations': {'type': 'nested', 'properties': investigation_properties}, - 'administratorSetStatus': {'type': 'keyword'}, - 'compactTransactionId': {'type': 'keyword'}, - 'privilegeId': {'type': 'keyword'}, - 'status': {'type': 'keyword'}, - 'investigationStatus': {'type': 'keyword'}, - } - - return { - 'settings': { - 'index': { - 'number_of_shards': number_of_shards, - 'number_of_replicas': number_of_replicas, - }, - 'analysis': { - # this custom analyzer is recommended by Opensearch when you have international character - # sets, and you want to support searching by their closest ASCII equivalents. - # See https://docs.opensearch.org/latest/analyzers/token-filters/asciifolding/ - 'filter': {'custom_ascii_folding': {'type': 'asciifolding', 'preserve_original': True}}, - 'analyzer': { - 'custom_ascii_analyzer': { - 'type': 'custom', - 'tokenizer': 'standard', - 'filter': ['lowercase', 'custom_ascii_folding'], - } - }, - }, - }, - 'mappings': { - 'properties': { - # Top-level provider fields - 'providerId': {'type': 'keyword'}, - 'type': {'type': 'keyword'}, - 'dateOfUpdate': {'type': 'date'}, - 'compact': {'type': 'keyword'}, - 'licenseJurisdiction': {'type': 'keyword'}, - 'licenseStatus': {'type': 'keyword'}, - 'compactEligibility': {'type': 'keyword'}, - 'givenName': { - 'type': 'text', - 'analyzer': 'custom_ascii_analyzer', - 'fields': {'keyword': {'type': 'keyword', 'ignore_above': 256}}, - }, - 'middleName': { - 'type': 'text', - 'analyzer': 'custom_ascii_analyzer', - 'fields': {'keyword': {'type': 'keyword', 'ignore_above': 256}}, - }, - 'familyName': { - 'type': 'text', - 'analyzer': 'custom_ascii_analyzer', - 'fields': {'keyword': {'type': 'keyword', 'ignore_above': 256}}, - }, - 'suffix': {'type': 'keyword'}, - 'dateOfExpiration': {'type': 'date'}, - 'jurisdictionUploadedLicenseStatus': {'type': 'keyword'}, - 'jurisdictionUploadedCompactEligibility': {'type': 'keyword'}, - 'providerFamGivMid': {'type': 'keyword'}, - 'providerDateOfUpdate': {'type': 'date'}, - 'birthMonthDay': {'type': 'keyword'}, - # Nested arrays - 'licenses': {'type': 'nested', 'properties': license_properties}, - 'privileges': {'type': 'nested', 'properties': privilege_properties}, - } - }, - } - on_event = OpenSearchIndexManager('opensearch-index-manager') diff --git a/backend/cosmetology-app/lambdas/python/search/handlers/populate_provider_documents.py b/backend/cosmetology-app/lambdas/python/search/handlers/populate_provider_documents.py index b4904f24b..8fc98b102 100644 --- a/backend/cosmetology-app/lambdas/python/search/handlers/populate_provider_documents.py +++ b/backend/cosmetology-app/lambdas/python/search/handlers/populate_provider_documents.py @@ -19,6 +19,14 @@ "startingLastKey": {"pk": "...", "sk": "..."} } +Optional parameters: + +- resetIndexes: If true, deletes and recreates all compact provider indexes before + indexing (uses numberOfShards / numberOfReplicas). Run during low traffic; do not + combine with resumption (startingCompact / startingLastKey) for the same run. +- numberOfShards: Primary shard count for recreated indexes (default: 1). +- numberOfReplicas: Replica shard count for recreated indexes (default: 0). + Race Condition Consideration: A potential race condition can occur when running this function while provider data is being actively updated: @@ -39,7 +47,7 @@ from cc_common.config import config, logger from cc_common.exceptions import CCInternalException from marshmallow import ValidationError -from opensearch_client import OpenSearchClient +from opensearch_client import INITIAL_INDEX_VERSION, OpenSearchClient from utils import generate_provider_opensearch_documents # Batch size for DynamoDB pagination @@ -64,12 +72,37 @@ def populate_provider_documents(event: dict, context: LambdaContext): :param event: Lambda event with optional parameters: - startingCompact: The compact to start/resume processing from - startingLastKey: The DynamoDB pagination key to resume from + - resetIndexes: If true, delete and recreate all compact indexes first + - numberOfShards: Shards for recreated indexes (default 1) + - numberOfReplicas: Replicas for recreated indexes (default 0) :param context: Lambda context :return: Summary of indexing operation, including pagination info if incomplete """ data_client = config.data_client opensearch_client = OpenSearchClient() + reset_indexes = bool(event.get('resetIndexes', False)) + number_of_shards = int(event.get('numberOfShards', 1)) + number_of_replicas = int(event.get('numberOfReplicas', 0)) + + if reset_indexes: + logger.info( + 'resetIndexes=True: deleting and recreating all compact indexes', + number_of_shards=number_of_shards, + number_of_replicas=number_of_replicas, + ) + for compact in config.compacts: + alias_name = f'compact_{compact}_providers' + index_name = f'compact_{compact}_providers_{INITIAL_INDEX_VERSION}' + opensearch_client.delete_provider_index_with_alias(alias_name=alias_name) + opensearch_client.create_provider_index_with_alias( + index_name=index_name, + alias_name=alias_name, + number_of_shards=number_of_shards, + number_of_replicas=number_of_replicas, + ) + logger.info('Index reset complete. Proceeding with population.') + # Get optional pagination parameters from event for resumption (normal mode) starting_compact = event.get('startingCompact') starting_last_key = event.get('startingLastKey') diff --git a/backend/cosmetology-app/lambdas/python/search/opensearch_client.py b/backend/cosmetology-app/lambdas/python/search/opensearch_client.py index 166c4c740..668d7d46c 100644 --- a/backend/cosmetology-app/lambdas/python/search/opensearch_client.py +++ b/backend/cosmetology-app/lambdas/python/search/opensearch_client.py @@ -4,10 +4,13 @@ from cc_common.config import config, logger from cc_common.exceptions import CCInternalException, CCInvalidRequestException from opensearchpy import AWSV4SignerAuth, OpenSearch, RequestsHttpConnection -from opensearchpy.exceptions import ConnectionTimeout, RequestError, TransportError +from opensearchpy.exceptions import ConnectionTimeout, NotFoundError, RequestError, TransportError # Retry configuration for operations MAX_RETRY_ATTEMPTS = 5 + +# Initial index version for new deployments (must stay in sync with index naming in handlers) +INITIAL_INDEX_VERSION = 'v1' INITIAL_BACKOFF_SECONDS = 2 MAX_BACKOFF_SECONDS = 32 @@ -80,6 +83,282 @@ def create_alias(self, index_name: str, alias_name: str) -> None: operation_name=f'create_alias({alias_name} -> {index_name})', ) + def get_indices_for_alias(self, alias_name: str) -> list[str]: + """ + Return index names that the given alias points to. + + :param alias_name: The alias name to resolve + :return: List of concrete index names, or empty if the alias does not exist + """ + last_exception = None + backoff_seconds = INITIAL_BACKOFF_SECONDS + + for attempt in range(1, MAX_RETRY_ATTEMPTS + 1): + try: + response = self._client.indices.get_alias(name=alias_name) + return list(response.keys()) + except NotFoundError: + return [] + except (ConnectionTimeout, TransportError) as e: + last_exception = e + if attempt < MAX_RETRY_ATTEMPTS: + logger.warning( + 'Operation failed, retrying with backoff', + operation=f'get_indices_for_alias({alias_name})', + attempt=attempt, + max_attempts=MAX_RETRY_ATTEMPTS, + backoff_seconds=backoff_seconds, + error=str(e), + ) + time.sleep(backoff_seconds) + backoff_seconds = min(backoff_seconds * 2, MAX_BACKOFF_SECONDS) + else: + logger.error( + 'Operation failed after max retry attempts', + operation=f'get_indices_for_alias({alias_name})', + attempts=MAX_RETRY_ATTEMPTS, + error=str(e), + ) + + raise CCInternalException( + f'get_indices_for_alias({alias_name}) failed after {MAX_RETRY_ATTEMPTS} attempts. ' + f'Last error: {last_exception}' + ) + + def delete_index(self, index_name: str) -> None: + """ + Delete an index by name. Deleting an index removes any aliases to it. + + :param index_name: The index to delete + :raises CCInternalException: If all retry attempts fail + """ + self._execute_with_retry( + operation=lambda: self._client.indices.delete(index=index_name), + operation_name=f'delete_index({index_name})', + ) + + def create_provider_index_with_alias( + self, + index_name: str, + alias_name: str, + number_of_shards: int, + number_of_replicas: int, + ) -> None: + """ + Create the provider index and alias in OpenSearch if they don't exist. + + :param index_name: The versioned index name (e.g., compact_cosm_providers_v1) + :param alias_name: The alias name (e.g., compact_cosm_providers) + :param number_of_shards: Number of primary shards for the index + :param number_of_replicas: Number of replica shards for the index + """ + if self.alias_exists(alias_name): + logger.info(f"Alias '{alias_name}' already exists. Skipping index and alias creation.") + return + + if self.index_exists(index_name): + logger.info(f"Index '{index_name}' already exists. Creating alias only.") + self.create_alias(index_name, alias_name) + logger.info(f"Alias '{alias_name}' -> '{index_name}' created successfully.") + return + + logger.info(f"Creating index '{index_name}'...") + index_mapping = self._get_provider_index_mapping(number_of_shards, number_of_replicas) + self.create_index(index_name, index_mapping) + logger.info(f"Index '{index_name}' created successfully.") + + logger.info(f"Creating alias '{alias_name}' -> '{index_name}'...") + self.create_alias(index_name, alias_name) + logger.info(f"Alias '{alias_name}' -> '{index_name}' created successfully.") + + def delete_provider_index_with_alias(self, alias_name: str) -> None: + """ + Delete the versioned index (and its alias) for a provider index alias. + + Resolves underlying indices via the alias, then deletes them. If no alias + exists, attempts to delete the canonical versioned index name + ({alias_name}_{INITIAL_INDEX_VERSION}). + + :param alias_name: The alias name (e.g., compact_cosm_providers) + """ + if self.alias_exists(alias_name): + indices = self.get_indices_for_alias(alias_name) + for idx_name in indices: + logger.info(f"Deleting index '{idx_name}' (via alias '{alias_name}')...") + self.delete_index(idx_name) + logger.info(f"Index '{idx_name}' deleted.") + return + + versioned_index_name = f'{alias_name}_{INITIAL_INDEX_VERSION}' + if self.index_exists(versioned_index_name): + logger.info(f"No alias found; deleting index '{versioned_index_name}' directly...") + self.delete_index(versioned_index_name) + logger.info(f"Index '{versioned_index_name}' deleted.") + else: + logger.info(f"No alias or index found for '{alias_name}'. Nothing to delete.") + + def _get_provider_index_mapping(self, number_of_shards: int, number_of_replicas: int) -> dict: + """ + Define the index mapping for provider documents. + + :param number_of_shards: Number of primary shards for the index + :param number_of_replicas: Number of replica shards for the index + :return: The index mapping dictionary + """ + adverse_action_properties = { + 'type': {'type': 'keyword'}, + 'adverseActionId': {'type': 'keyword'}, + 'compact': {'type': 'keyword'}, + 'jurisdiction': {'type': 'keyword'}, + 'providerId': {'type': 'keyword'}, + 'licenseType': {'type': 'keyword'}, + 'licenseTypeAbbreviation': {'type': 'keyword'}, + 'actionAgainst': {'type': 'keyword'}, + 'effectiveStartDate': {'type': 'date'}, + 'creationDate': {'type': 'date'}, + 'effectiveLiftDate': {'type': 'date'}, + 'dateOfUpdate': {'type': 'date'}, + 'clinicalPrivilegeActionCategories': {'type': 'keyword'}, + 'clinicalPrivilegeActionCategory': {'type': 'keyword'}, + 'submittingUser': {'type': 'keyword'}, + 'liftingUser': {'type': 'keyword'}, + } + + investigation_properties = { + 'type': {'type': 'keyword'}, + 'investigationId': {'type': 'keyword'}, + 'compact': {'type': 'keyword'}, + 'jurisdiction': {'type': 'keyword'}, + 'licenseType': {'type': 'keyword'}, + 'status': {'type': 'keyword'}, + 'dateOfUpdate': {'type': 'date'}, + } + + license_properties = { + 'providerId': {'type': 'keyword'}, + 'type': {'type': 'keyword'}, + 'dateOfUpdate': {'type': 'date'}, + 'compact': {'type': 'keyword'}, + 'jurisdiction': {'type': 'keyword'}, + 'licenseType': {'type': 'keyword'}, + 'licenseStatusName': {'type': 'keyword'}, + 'licenseStatus': {'type': 'keyword'}, + 'jurisdictionUploadedLicenseStatus': {'type': 'keyword'}, + 'compactEligibility': {'type': 'keyword'}, + 'jurisdictionUploadedCompactEligibility': {'type': 'keyword'}, + 'licenseNumber': {'type': 'keyword'}, + 'givenName': { + 'type': 'text', + 'analyzer': 'custom_ascii_analyzer', + 'fields': {'keyword': {'type': 'keyword', 'ignore_above': 256}}, + }, + 'middleName': { + 'type': 'text', + 'analyzer': 'custom_ascii_analyzer', + 'fields': {'keyword': {'type': 'keyword', 'ignore_above': 256}}, + }, + 'familyName': { + 'type': 'text', + 'analyzer': 'custom_ascii_analyzer', + 'fields': {'keyword': {'type': 'keyword', 'ignore_above': 256}}, + }, + 'suffix': {'type': 'keyword'}, + 'dateOfIssuance': {'type': 'date'}, + 'dateOfRenewal': {'type': 'date'}, + 'dateOfExpiration': {'type': 'date'}, + 'dateOfBirth': {'type': 'date'}, + 'homeAddressStreet1': {'type': 'text'}, + 'homeAddressStreet2': {'type': 'text'}, + 'homeAddressCity': { + 'type': 'text', + 'analyzer': 'custom_ascii_analyzer', + 'fields': {'keyword': {'type': 'keyword', 'ignore_above': 256}}, + }, + 'homeAddressState': {'type': 'keyword'}, + 'homeAddressPostalCode': {'type': 'keyword'}, + 'emailAddress': {'type': 'keyword'}, + 'phoneNumber': {'type': 'keyword'}, + 'adverseActions': {'type': 'nested', 'properties': adverse_action_properties}, + 'investigations': {'type': 'nested', 'properties': investigation_properties}, + 'investigationStatus': {'type': 'keyword'}, + } + + privilege_properties = { + 'type': {'type': 'keyword'}, + 'providerId': {'type': 'keyword'}, + 'compact': {'type': 'keyword'}, + 'jurisdiction': {'type': 'keyword'}, + 'licenseJurisdiction': {'type': 'keyword'}, + 'licenseType': {'type': 'keyword'}, + 'dateOfIssuance': {'type': 'date'}, + 'dateOfRenewal': {'type': 'date'}, + 'dateOfExpiration': {'type': 'date'}, + 'dateOfUpdate': {'type': 'date'}, + 'adverseActions': {'type': 'nested', 'properties': adverse_action_properties}, + 'investigations': {'type': 'nested', 'properties': investigation_properties}, + 'administratorSetStatus': {'type': 'keyword'}, + 'compactTransactionId': {'type': 'keyword'}, + 'privilegeId': {'type': 'keyword'}, + 'status': {'type': 'keyword'}, + 'investigationStatus': {'type': 'keyword'}, + } + + return { + 'settings': { + 'index': { + 'number_of_shards': number_of_shards, + 'number_of_replicas': number_of_replicas, + }, + 'analysis': { + # Recommended by OpenSearch for international character sets; supports ASCII equivalents. + # See https://docs.opensearch.org/latest/analyzers/token-filters/asciifolding/ + 'filter': {'custom_ascii_folding': {'type': 'asciifolding', 'preserve_original': True}}, + 'analyzer': { + 'custom_ascii_analyzer': { + 'type': 'custom', + 'tokenizer': 'standard', + 'filter': ['lowercase', 'custom_ascii_folding'], + } + }, + }, + }, + 'mappings': { + 'properties': { + 'providerId': {'type': 'keyword'}, + 'type': {'type': 'keyword'}, + 'dateOfUpdate': {'type': 'date'}, + 'compact': {'type': 'keyword'}, + 'licenseJurisdiction': {'type': 'keyword'}, + 'licenseStatus': {'type': 'keyword'}, + 'compactEligibility': {'type': 'keyword'}, + 'givenName': { + 'type': 'text', + 'analyzer': 'custom_ascii_analyzer', + 'fields': {'keyword': {'type': 'keyword', 'ignore_above': 256}}, + }, + 'middleName': { + 'type': 'text', + 'analyzer': 'custom_ascii_analyzer', + 'fields': {'keyword': {'type': 'keyword', 'ignore_above': 256}}, + }, + 'familyName': { + 'type': 'text', + 'analyzer': 'custom_ascii_analyzer', + 'fields': {'keyword': {'type': 'keyword', 'ignore_above': 256}}, + }, + 'suffix': {'type': 'keyword'}, + 'dateOfExpiration': {'type': 'date'}, + 'jurisdictionUploadedLicenseStatus': {'type': 'keyword'}, + 'jurisdictionUploadedCompactEligibility': {'type': 'keyword'}, + 'providerFamGivMid': {'type': 'keyword'}, + 'providerDateOfUpdate': {'type': 'date'}, + 'birthMonthDay': {'type': 'keyword'}, + 'licenses': {'type': 'nested', 'properties': license_properties}, + 'privileges': {'type': 'nested', 'properties': privilege_properties}, + } + }, + } + def cluster_health(self) -> dict: """ Get the cluster health status. diff --git a/backend/cosmetology-app/lambdas/python/search/tests/function/test_manage_opensearch_indices.py b/backend/cosmetology-app/lambdas/python/search/tests/function/test_manage_opensearch_indices.py index 36fde869a..07c76304e 100644 --- a/backend/cosmetology-app/lambdas/python/search/tests/function/test_manage_opensearch_indices.py +++ b/backend/cosmetology-app/lambdas/python/search/tests/function/test_manage_opensearch_indices.py @@ -67,6 +67,21 @@ def _when_testing_mock_opensearch_client( else: mock_client_instance.index_exists.return_value = index_exists_return_value + # Index creation lives on OpenSearchClient; delegate so alias_exists / create_index / etc. stay observable. + from opensearch_client import OpenSearchClient + + def _real_get_mapping(number_of_shards, number_of_replicas): + return OpenSearchClient._get_provider_index_mapping( + mock_client_instance, number_of_shards, number_of_replicas + ) + + mock_client_instance._get_provider_index_mapping = _real_get_mapping + + def _real_create_provider_index(*args, **kwargs): + return OpenSearchClient.create_provider_index_with_alias(mock_client_instance, *args, **kwargs) + + mock_client_instance.create_provider_index_with_alias.side_effect = _real_create_provider_index + return mock_client_instance @patch('handlers.manage_opensearch_indices.OpenSearchClient') From 32557d053e86ecb9a0effd179cdadd59e499babd Mon Sep 17 00:00:00 2001 From: Landon Shumway Date: Tue, 31 Mar 2026 14:21:37 -0500 Subject: [PATCH 21/36] Grant populate provider documents lambda permission to reset --- .../populate_provider_documents_handler.py | 13 +++++++------ .../provider_search_domain.py | 11 ++++++++--- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/backend/cosmetology-app/stacks/search_persistent_stack/populate_provider_documents_handler.py b/backend/cosmetology-app/stacks/search_persistent_stack/populate_provider_documents_handler.py index ca78386ee..8f7989a27 100644 --- a/backend/cosmetology-app/stacks/search_persistent_stack/populate_provider_documents_handler.py +++ b/backend/cosmetology-app/stacks/search_persistent_stack/populate_provider_documents_handler.py @@ -47,7 +47,7 @@ def __init__( :param opensearch_domain: The reference to the OpenSearch domain resource :param vpc_stack: The VPC stack :param vpc_subnets: The VPC subnets for Lambda deployment - :param lambda_role: The IAM role for the Lambda function (should have OpenSearch write access) + :param lambda_role: The IAM role for the Lambda function (OpenSearch read/write for indexing and index reset) :param provider_table: The DynamoDB provider table :param compact_configuration_table: The DynamoDB compact configuration table (for live jurisdictions) :param alarm_topic: The SNS topic for alarms @@ -81,8 +81,9 @@ def __init__( alarm_topic=alarm_topic, ) - # Grant the handler write access to the OpenSearch domain - opensearch_domain.grant_write(self.handler) + # Grant read/write HTTP to the domain (same as index manager). resetIndexes and normal indexing need + # HEAD/GET for alias and index existence checks, plus PUT/POST for bulk index and DELETE for index reset. + opensearch_domain.grant_read_write(self.handler) # Grant the handler read access to the provider table and compact configuration table provider_table.grant_read_data(self.handler) @@ -95,9 +96,9 @@ def __init__( [ { 'id': 'AwsSolutions-IAM5', - 'reason': 'The grant_write method requires wildcard permissions on the OpenSearch domain to ' - 'write to indices. This is appropriate for a function that needs to bulk index ' - 'provider documents. The DynamoDB grant_read_data also requires index permissions.', + 'reason': 'The grant_read_write method requires wildcard permissions on the OpenSearch domain to ' + 'create, read, delete, and manage indices and aliases (including optional resetIndexes). This ' + 'matches the index manager custom resource pattern in index_manager.py.', }, ], ) diff --git a/backend/cosmetology-app/stacks/search_persistent_stack/provider_search_domain.py b/backend/cosmetology-app/stacks/search_persistent_stack/provider_search_domain.py index 3a6ee2aaa..785c407b3 100644 --- a/backend/cosmetology-app/stacks/search_persistent_stack/provider_search_domain.py +++ b/backend/cosmetology-app/stacks/search_persistent_stack/provider_search_domain.py @@ -68,7 +68,7 @@ def __init__( :param vpc_stack: The VPC stack containing network resources :param compact_abbreviations: List of compact abbreviations for index access policies :param alarm_topic: The SNS topic for capacity alarms - :param ingest_lambda_role: IAM role for the ingest Lambda function (write access) + :param ingest_lambda_role: IAM role for ingest and populate-provider Lambdas (OpenSearch read/write on indices) :param index_manager_lambda_role: IAM role for the index manager Lambda function (read/write access) :param search_api_lambda_role: IAM role for the search API Lambda function (read access) """ @@ -211,7 +211,9 @@ def __init__( # Grant lambda roles access to domain self.domain.grant_read(self._search_api_lambda_role) - self.domain.grant_write(self._ingest_lambda_role) + # Ingest role is shared by stream ingest and populate-provider; populate resetIndexes needs GET/HEAD/DELETE + # on indices/aliases in addition to POST/PUT (see ingest_access_policy). + self.domain.grant_read_write(self._ingest_lambda_role) self.domain.grant_read_write(self._index_manager_lambda_role) # Add CDK Nag suppressions @@ -229,7 +231,7 @@ def _configure_access_policies(self, compact_abbreviations: list[str]): Configure access policies for the OpenSearch domain. Creates IAM-based access policies that restrict access to specific Lambda roles: - - Ingest role: POST/PUT access to compact indices + - Ingest role: GET/HEAD/POST/PUT/DELETE on compact indices (bulk ingest, alias/index checks, index reset) - Index manager role: GET/HEAD/POST/PUT access for index management - Search API role: POST access restricted to _search endpoint only @@ -239,8 +241,11 @@ def _configure_access_policies(self, compact_abbreviations: list[str]): effect=Effect.ALLOW, principals=[self._ingest_lambda_role], actions=[ + 'es:ESHttpGet', + 'es:ESHttpHead', 'es:ESHttpPost', 'es:ESHttpPut', + 'es:ESHttpDelete', ], resources=[Fn.join('', [self.domain.domain_arn, '/compact*'])], ) From bca7ab53749b0f1fd8073690bef1e9bd360f618b Mon Sep 17 00:00:00 2001 From: Landon Shumway Date: Tue, 31 Mar 2026 21:34:15 -0500 Subject: [PATCH 22/36] Check for index under alias name --- .../lambdas/python/search/opensearch_client.py | 9 +++++++++ .../tests/function/test_manage_opensearch_indices.py | 5 +++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/backend/cosmetology-app/lambdas/python/search/opensearch_client.py b/backend/cosmetology-app/lambdas/python/search/opensearch_client.py index 668d7d46c..945f15912 100644 --- a/backend/cosmetology-app/lambdas/python/search/opensearch_client.py +++ b/backend/cosmetology-app/lambdas/python/search/opensearch_client.py @@ -155,6 +155,14 @@ def create_provider_index_with_alias( if self.alias_exists(alias_name): logger.info(f"Alias '{alias_name}' already exists. Skipping index and alias creation.") return + # Check if an index exists with the same name as the alias (this is most likely to happen in our development + # environments with only one data node. If the test OpenSearch Domain drops that node due to network failures + # aliases and indices will be lost and if the ingest pipeline inserts records before the aliases are recreated, + # OpenSearch will automatically create those indices under the alias name). + if self.index_exists(alias_name): + logger.info(f"Found index with alias name '{alias_name}'; deleting to allow alias creation...") + self.delete_index(alias_name) + logger.info(f"Index '{alias_name}' deleted.") if self.index_exists(index_name): logger.info(f"Index '{index_name}' already exists. Creating alias only.") @@ -218,6 +226,7 @@ def _get_provider_index_mapping(self, number_of_shards: int, number_of_replicas: 'creationDate': {'type': 'date'}, 'effectiveLiftDate': {'type': 'date'}, 'dateOfUpdate': {'type': 'date'}, + 'encumbranceType': {'type': 'keyword'}, 'clinicalPrivilegeActionCategories': {'type': 'keyword'}, 'clinicalPrivilegeActionCategory': {'type': 'keyword'}, 'submittingUser': {'type': 'keyword'}, diff --git a/backend/cosmetology-app/lambdas/python/search/tests/function/test_manage_opensearch_indices.py b/backend/cosmetology-app/lambdas/python/search/tests/function/test_manage_opensearch_indices.py index 07c76304e..49e7ec710 100644 --- a/backend/cosmetology-app/lambdas/python/search/tests/function/test_manage_opensearch_indices.py +++ b/backend/cosmetology-app/lambdas/python/search/tests/function/test_manage_opensearch_indices.py @@ -378,8 +378,9 @@ def test_on_create_creates_alias_only_when_index_exists_but_alias_does_not(self, # Assert that alias_exists was called for each compact self.assertEqual(1, mock_client_instance.alias_exists.call_count) - # Assert that index_exists was called for each compact - self.assertEqual(1, mock_client_instance.index_exists.call_count) + # Assert that index_exists was called for each compact, and to check if an index was misconfigured + # under the alias name + self.assertEqual(2, mock_client_instance.index_exists.call_count) # Assert that create_index was NOT called since indices already exist mock_client_instance.create_index.assert_not_called() From dddacd0e2cd6410ee8597ba0aef52b3204ccc500 Mon Sep 17 00:00:00 2001 From: Landon Shumway Date: Tue, 31 Mar 2026 21:54:35 -0500 Subject: [PATCH 23/36] linter/comments --- .../tests/function/test_manage_opensearch_indices.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/backend/cosmetology-app/lambdas/python/search/tests/function/test_manage_opensearch_indices.py b/backend/cosmetology-app/lambdas/python/search/tests/function/test_manage_opensearch_indices.py index 49e7ec710..a8f893ac1 100644 --- a/backend/cosmetology-app/lambdas/python/search/tests/function/test_manage_opensearch_indices.py +++ b/backend/cosmetology-app/lambdas/python/search/tests/function/test_manage_opensearch_indices.py @@ -67,15 +67,18 @@ def _when_testing_mock_opensearch_client( else: mock_client_instance.index_exists.return_value = index_exists_return_value - # Index creation lives on OpenSearchClient; delegate so alias_exists / create_index / etc. stay observable. + # We want to make assertions on the opensearch client calls that are made during index creation + # to ensure the alias/indices are created as expected. We also need to ensure we are checking against + # the actual index mapping that is used in the runtime logic. This points the mock to the actual + # function pointers in the opensearch_client client. from opensearch_client import OpenSearchClient def _real_get_mapping(number_of_shards, number_of_replicas): - return OpenSearchClient._get_provider_index_mapping( + return OpenSearchClient._get_provider_index_mapping( # noqa: SLF001 private-member-access mock_client_instance, number_of_shards, number_of_replicas ) - mock_client_instance._get_provider_index_mapping = _real_get_mapping + mock_client_instance._get_provider_index_mapping = _real_get_mapping # noqa: SLF001 private-member-access def _real_create_provider_index(*args, **kwargs): return OpenSearchClient.create_provider_index_with_alias(mock_client_instance, *args, **kwargs) From 520fa835ff29cd2e741aabdf4470b9f533988cfa Mon Sep 17 00:00:00 2001 From: Landon Shumway Date: Tue, 31 Mar 2026 22:09:57 -0500 Subject: [PATCH 24/36] Remove search filter constraints These constraints don't apply to OpenSearch queries, as we can search for all matches within the system without any search parameters --- .../python/search/handlers/public_search.py | 7 ---- .../function/test_public_search_providers.py | 32 +++++++++---------- 2 files changed, 16 insertions(+), 23 deletions(-) diff --git a/backend/cosmetology-app/lambdas/python/search/handlers/public_search.py b/backend/cosmetology-app/lambdas/python/search/handlers/public_search.py index 20f20d2de..ee770d1e4 100644 --- a/backend/cosmetology-app/lambdas/python/search/handlers/public_search.py +++ b/backend/cosmetology-app/lambdas/python/search/handlers/public_search.py @@ -117,13 +117,6 @@ def _parse_and_validate_public_query_body(event: dict) -> dict: logger.warning('Invalid public query request body', errors=e.messages) raise CCInvalidRequestException(f'Invalid request: {e.messages}') from e - query = body.get('query', {}) - if query.get('givenName') and not query.get('familyName'): - raise CCInvalidRequestException('familyName is required if givenName is provided') - - if not any((query.get('licenseNumber'), query.get('jurisdiction'), query.get('familyName'))): - raise CCInvalidRequestException('At least one of licenseNumber, jurisdiction, or familyName must be provided') - return body diff --git a/backend/cosmetology-app/lambdas/python/search/tests/function/test_public_search_providers.py b/backend/cosmetology-app/lambdas/python/search/tests/function/test_public_search_providers.py index dd5d1ad05..5c701ddb2 100644 --- a/backend/cosmetology-app/lambdas/python/search/tests/function/test_public_search_providers.py +++ b/backend/cosmetology-app/lambdas/python/search/tests/function/test_public_search_providers.py @@ -292,31 +292,31 @@ def test_invalid_sort_key_returns_400(self, mock_opensearch_client): self.assertIn('Invalid sort key', body['message']) mock_opensearch_client.search.assert_not_called() - def test_given_name_without_family_name_returns_400(self): - """Test that givenName without familyName returns 400.""" - from handlers.public_search import public_search_api_handler - - event = self._create_public_api_event( - 'cosm', - body={'query': {'givenName': 'John'}, 'pagination': {'pageSize': 10}}, - ) - response = public_search_api_handler(event, self.mock_context) - self.assertEqual(400, response['statusCode']) - body = json.loads(response['body']) - self.assertIn('familyName is required if givenName is provided', body['message']) - - def test_no_search_criteria_returns_400(self): + @patch('handlers.public_search.opensearch_client') + def test_no_search_criteria_returns_200(self, mock_opensearch_client): """Test that at least one of licenseNumber, jurisdiction, or familyName is required.""" from handlers.public_search import public_search_api_handler + mock_opensearch_client.search.return_value = { + 'hits': {'total': {'value': 0, 'relation': 'eq'}, 'hits': []}, + } + event = self._create_public_api_event( 'cosm', body={'query': {}, 'pagination': {'pageSize': 10}}, ) response = public_search_api_handler(event, self.mock_context) - self.assertEqual(400, response['statusCode']) + self.assertEqual(200, response['statusCode']) body = json.loads(response['body']) - self.assertIn('At least one of licenseNumber, jurisdiction, or familyName', body['message']) + self.assertEqual( + { + 'pagination': {'lastKey': None, 'pageSize': 10, 'prevLastKey': None}, + 'providers': [], + 'query': {}, + 'sorting': {'direction': 'ascending', 'key': 'familyName'}, + }, + body, + ) def test_provider_id_in_query_returns_400(self): """Public query must not accept query.providerId (blocked at schema validation).""" From 096f2e58f1a96447bfcd3fbcf17a51b09a988c7e Mon Sep 17 00:00:00 2001 From: Landon Shumway Date: Tue, 31 Mar 2026 22:29:02 -0500 Subject: [PATCH 25/36] PR feedback - set timeout --- .../lambdas/python/search/handlers/public_search.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/cosmetology-app/lambdas/python/search/handlers/public_search.py b/backend/cosmetology-app/lambdas/python/search/handlers/public_search.py index ee770d1e4..534111c7c 100644 --- a/backend/cosmetology-app/lambdas/python/search/handlers/public_search.py +++ b/backend/cosmetology-app/lambdas/python/search/handlers/public_search.py @@ -14,7 +14,7 @@ # Instantiate the OpenSearch client outside the handler to cache the connection between invocations # Set timeout to 20 seconds to give API gateway time to respond with response -opensearch_client = OpenSearchClient(timeout=25) +opensearch_client = OpenSearchClient(timeout=20) @api_handler From 2628c42fa4c484b4f4eafc495301e7cc6b9ca202 Mon Sep 17 00:00:00 2001 From: Landon Shumway Date: Tue, 31 Mar 2026 22:54:50 -0500 Subject: [PATCH 26/36] Prevent reset functionality in prod environment --- .../search/handlers/populate_provider_documents.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/backend/cosmetology-app/lambdas/python/search/handlers/populate_provider_documents.py b/backend/cosmetology-app/lambdas/python/search/handlers/populate_provider_documents.py index 8fc98b102..35db28b39 100644 --- a/backend/cosmetology-app/lambdas/python/search/handlers/populate_provider_documents.py +++ b/backend/cosmetology-app/lambdas/python/search/handlers/populate_provider_documents.py @@ -41,6 +41,16 @@ low traffic. Given that it is a one-time process to initially populate the table, the risk is low and if needed, this Lambda function can be run again to synchronize all the provider documents. + +Note that the resetIndexes parameter is intended for development environments +due to a limitation with how OpenSearch will randomly drop your data nodes if +you only have 1 in your cluster. If the OpenSearch Domain drops that node due +to network failures, aliases and indices will be lost and if the ingest pipeline +inserts records before the aliases are recreated, OpenSearch will automatically +create those indices under the alias name, but without the proper index mapping +which will break our search endpoints. This reset functionality allows devs in +test environments to reset those aliases/indices into a clean state before +populating all the provider records. """ from aws_lambda_powertools.utilities.typing import LambdaContext @@ -86,6 +96,9 @@ def populate_provider_documents(event: dict, context: LambdaContext): number_of_replicas = int(event.get('numberOfReplicas', 0)) if reset_indexes: + # this reset functionality is only intended for development environments + if config.environment_name == 'prod': + raise CCInternalException('resetIndexes is not supported in production environments') logger.info( 'resetIndexes=True: deleting and recreating all compact indexes', number_of_shards=number_of_shards, From 76cb22f8d3019bff93415f92feec9175dfbe8495 Mon Sep 17 00:00:00 2001 From: Landon Shumway Date: Tue, 31 Mar 2026 23:01:48 -0500 Subject: [PATCH 27/36] Update cosmetology python requirements to latest --- .../python/cognito-backup/requirements-dev.txt | 8 ++++---- .../lambdas/python/cognito-backup/requirements.txt | 4 ++-- .../lambdas/python/common/requirements-dev.txt | 12 ++++++------ .../lambdas/python/common/requirements.txt | 6 +++--- .../compact-configuration/requirements-dev.txt | 6 +++--- .../python/custom-resources/requirements-dev.txt | 6 +++--- .../lambdas/python/data-events/requirements-dev.txt | 6 +++--- .../python/disaster-recovery/requirements-dev.txt | 6 +++--- .../python/provider-data-v1/requirements-dev.txt | 6 +++--- .../lambdas/python/search/requirements-dev.txt | 6 +++--- .../lambdas/python/search/requirements.txt | 4 ++-- .../python/staff-user-pre-token/requirements-dev.txt | 6 +++--- .../lambdas/python/staff-users/requirements-dev.txt | 6 +++--- backend/cosmetology-app/requirements-dev.txt | 4 ++-- backend/cosmetology-app/requirements.txt | 6 +++--- 15 files changed, 46 insertions(+), 46 deletions(-) diff --git a/backend/cosmetology-app/lambdas/python/cognito-backup/requirements-dev.txt b/backend/cosmetology-app/lambdas/python/cognito-backup/requirements-dev.txt index a9830bddb..953aab1d0 100644 --- a/backend/cosmetology-app/lambdas/python/cognito-backup/requirements-dev.txt +++ b/backend/cosmetology-app/lambdas/python/cognito-backup/requirements-dev.txt @@ -6,11 +6,11 @@ # aws-lambda-powertools==3.26.0 # via -r lambdas/python/cognito-backup/requirements-dev.in -boto3==1.42.76 +boto3==1.42.80 # via # -r lambdas/python/cognito-backup/requirements-dev.in # moto -botocore==1.42.76 +botocore==1.42.80 # via # -r lambdas/python/cognito-backup/requirements-dev.in # boto3 @@ -53,7 +53,7 @@ py-partiql-parser==0.6.3 # via moto pycparser==3.0 # via cffi -pygments==2.19.2 +pygments==2.20.0 # via pytest pytest==9.0.2 # via -r lambdas/python/cognito-backup/requirements-dev.in @@ -65,7 +65,7 @@ pyyaml==6.0.3 # via # moto # responses -requests==2.33.0 +requests==2.33.1 # via # moto # responses diff --git a/backend/cosmetology-app/lambdas/python/cognito-backup/requirements.txt b/backend/cosmetology-app/lambdas/python/cognito-backup/requirements.txt index d09196eab..4b13b6c88 100644 --- a/backend/cosmetology-app/lambdas/python/cognito-backup/requirements.txt +++ b/backend/cosmetology-app/lambdas/python/cognito-backup/requirements.txt @@ -6,9 +6,9 @@ # aws-lambda-powertools==3.26.0 # via -r lambdas/python/cognito-backup/requirements.in -boto3==1.42.76 +boto3==1.42.80 # via -r lambdas/python/cognito-backup/requirements.in -botocore==1.42.76 +botocore==1.42.80 # via # -r lambdas/python/cognito-backup/requirements.in # boto3 diff --git a/backend/cosmetology-app/lambdas/python/common/requirements-dev.txt b/backend/cosmetology-app/lambdas/python/common/requirements-dev.txt index f5cc42655..6b818e51c 100644 --- a/backend/cosmetology-app/lambdas/python/common/requirements-dev.txt +++ b/backend/cosmetology-app/lambdas/python/common/requirements-dev.txt @@ -19,15 +19,15 @@ aws-sam-translator==1.103.0 # moto aws-xray-sdk==2.15.0 # via moto -boto3==1.42.76 +boto3==1.42.80 # via # aws-sam-translator # moto -boto3-stubs[full]==1.42.76 +boto3-stubs[full]==1.42.80 # via -r lambdas/python/common/requirements-dev.in -boto3-stubs-full==1.42.76 +boto3-stubs-full==1.42.80 # via boto3-stubs -botocore==1.42.76 +botocore==1.42.80 # via # aws-xray-sdk # boto3 @@ -139,9 +139,9 @@ referencing==0.37.0 # jsonschema-path # jsonschema-specifications # openapi-schema-validator -regex==2026.2.28 +regex==2026.3.32 # via cfn-lint -requests==2.33.0 +requests==2.33.1 # via # docker # moto diff --git a/backend/cosmetology-app/lambdas/python/common/requirements.txt b/backend/cosmetology-app/lambdas/python/common/requirements.txt index 80d4acacd..703414a25 100644 --- a/backend/cosmetology-app/lambdas/python/common/requirements.txt +++ b/backend/cosmetology-app/lambdas/python/common/requirements.txt @@ -10,9 +10,9 @@ argon2-cffi-bindings==25.1.0 # via argon2-cffi aws-lambda-powertools==3.26.0 # via -r lambdas/python/common/requirements.in -boto3==1.42.76 +boto3==1.42.80 # via -r lambdas/python/common/requirements.in -botocore==1.42.76 +botocore==1.42.80 # via # boto3 # s3transfer @@ -41,7 +41,7 @@ pycparser==3.0 # via cffi python-dateutil==2.9.0.post0 # via botocore -requests==2.33.0 +requests==2.33.1 # via -r lambdas/python/common/requirements.in s3transfer==0.16.0 # via boto3 diff --git a/backend/cosmetology-app/lambdas/python/compact-configuration/requirements-dev.txt b/backend/cosmetology-app/lambdas/python/compact-configuration/requirements-dev.txt index 18ec47fa2..a5fe8d15f 100644 --- a/backend/cosmetology-app/lambdas/python/compact-configuration/requirements-dev.txt +++ b/backend/cosmetology-app/lambdas/python/compact-configuration/requirements-dev.txt @@ -4,9 +4,9 @@ # # pip-compile --no-emit-index-url --no-strip-extras lambdas/python/compact-configuration/requirements-dev.in # -boto3==1.42.76 +boto3==1.42.80 # via moto -botocore==1.42.76 +botocore==1.42.80 # via # boto3 # moto @@ -47,7 +47,7 @@ pyyaml==6.0.3 # via # moto # responses -requests==2.33.0 +requests==2.33.1 # via # docker # moto diff --git a/backend/cosmetology-app/lambdas/python/custom-resources/requirements-dev.txt b/backend/cosmetology-app/lambdas/python/custom-resources/requirements-dev.txt index 9135054c4..530bcabe2 100644 --- a/backend/cosmetology-app/lambdas/python/custom-resources/requirements-dev.txt +++ b/backend/cosmetology-app/lambdas/python/custom-resources/requirements-dev.txt @@ -4,9 +4,9 @@ # # pip-compile --no-emit-index-url --no-strip-extras lambdas/python/custom-resources/requirements-dev.in # -boto3==1.42.76 +boto3==1.42.80 # via moto -botocore==1.42.76 +botocore==1.42.80 # via # boto3 # moto @@ -47,7 +47,7 @@ pyyaml==6.0.3 # via # moto # responses -requests==2.33.0 +requests==2.33.1 # via # docker # moto diff --git a/backend/cosmetology-app/lambdas/python/data-events/requirements-dev.txt b/backend/cosmetology-app/lambdas/python/data-events/requirements-dev.txt index 6a6828dad..85dc0cb06 100644 --- a/backend/cosmetology-app/lambdas/python/data-events/requirements-dev.txt +++ b/backend/cosmetology-app/lambdas/python/data-events/requirements-dev.txt @@ -4,9 +4,9 @@ # # pip-compile --no-emit-index-url --no-strip-extras lambdas/python/data-events/requirements-dev.in # -boto3==1.42.76 +boto3==1.42.80 # via moto -botocore==1.42.76 +botocore==1.42.80 # via # boto3 # moto @@ -47,7 +47,7 @@ pyyaml==6.0.3 # via # moto # responses -requests==2.33.0 +requests==2.33.1 # via # docker # moto diff --git a/backend/cosmetology-app/lambdas/python/disaster-recovery/requirements-dev.txt b/backend/cosmetology-app/lambdas/python/disaster-recovery/requirements-dev.txt index 3acabd513..0a241c3c2 100644 --- a/backend/cosmetology-app/lambdas/python/disaster-recovery/requirements-dev.txt +++ b/backend/cosmetology-app/lambdas/python/disaster-recovery/requirements-dev.txt @@ -4,9 +4,9 @@ # # pip-compile --no-emit-index-url --no-strip-extras lambdas/python/disaster-recovery/requirements-dev.in # -boto3==1.42.76 +boto3==1.42.80 # via moto -botocore==1.42.76 +botocore==1.42.80 # via # boto3 # moto @@ -47,7 +47,7 @@ pyyaml==6.0.3 # via # moto # responses -requests==2.33.0 +requests==2.33.1 # via # docker # moto diff --git a/backend/cosmetology-app/lambdas/python/provider-data-v1/requirements-dev.txt b/backend/cosmetology-app/lambdas/python/provider-data-v1/requirements-dev.txt index f6bc9a6f6..996847a2e 100644 --- a/backend/cosmetology-app/lambdas/python/provider-data-v1/requirements-dev.txt +++ b/backend/cosmetology-app/lambdas/python/provider-data-v1/requirements-dev.txt @@ -4,9 +4,9 @@ # # pip-compile --no-emit-index-url --no-strip-extras lambdas/python/provider-data-v1/requirements-dev.in # -boto3==1.42.76 +boto3==1.42.80 # via moto -botocore==1.42.76 +botocore==1.42.80 # via # boto3 # moto @@ -49,7 +49,7 @@ pyyaml==6.0.3 # via # moto # responses -requests==2.33.0 +requests==2.33.1 # via # docker # moto diff --git a/backend/cosmetology-app/lambdas/python/search/requirements-dev.txt b/backend/cosmetology-app/lambdas/python/search/requirements-dev.txt index 73d1914a4..5eb8e15ec 100644 --- a/backend/cosmetology-app/lambdas/python/search/requirements-dev.txt +++ b/backend/cosmetology-app/lambdas/python/search/requirements-dev.txt @@ -4,9 +4,9 @@ # # pip-compile --no-emit-index-url --no-strip-extras lambdas/python/search/requirements-dev.in # -boto3==1.42.76 +boto3==1.42.80 # via moto -botocore==1.42.76 +botocore==1.42.80 # via # boto3 # moto @@ -45,7 +45,7 @@ python-dateutil==2.9.0.post0 # moto pyyaml==6.0.3 # via responses -requests==2.33.0 +requests==2.33.1 # via # docker # moto diff --git a/backend/cosmetology-app/lambdas/python/search/requirements.txt b/backend/cosmetology-app/lambdas/python/search/requirements.txt index 444c4079f..807497ef2 100644 --- a/backend/cosmetology-app/lambdas/python/search/requirements.txt +++ b/backend/cosmetology-app/lambdas/python/search/requirements.txt @@ -12,7 +12,7 @@ charset-normalizer==3.4.6 # via requests events==0.5 # via opensearch-py -grpcio==1.78.0 +grpcio==1.80.0 # via opensearch-protobufs idna==3.11 # via requests @@ -24,7 +24,7 @@ protobuf==7.34.1 # via opensearch-protobufs python-dateutil==2.9.0.post0 # via opensearch-py -requests==2.33.0 +requests==2.33.1 # via opensearch-py six==1.17.0 # via python-dateutil diff --git a/backend/cosmetology-app/lambdas/python/staff-user-pre-token/requirements-dev.txt b/backend/cosmetology-app/lambdas/python/staff-user-pre-token/requirements-dev.txt index 692c16221..59786812f 100644 --- a/backend/cosmetology-app/lambdas/python/staff-user-pre-token/requirements-dev.txt +++ b/backend/cosmetology-app/lambdas/python/staff-user-pre-token/requirements-dev.txt @@ -4,9 +4,9 @@ # # pip-compile --no-emit-index-url --no-strip-extras lambdas/python/staff-user-pre-token/requirements-dev.in # -boto3==1.42.76 +boto3==1.42.80 # via moto -botocore==1.42.76 +botocore==1.42.80 # via # boto3 # moto @@ -47,7 +47,7 @@ pyyaml==6.0.3 # via # moto # responses -requests==2.33.0 +requests==2.33.1 # via # docker # moto diff --git a/backend/cosmetology-app/lambdas/python/staff-users/requirements-dev.txt b/backend/cosmetology-app/lambdas/python/staff-users/requirements-dev.txt index 559e40ce2..2091602ec 100644 --- a/backend/cosmetology-app/lambdas/python/staff-users/requirements-dev.txt +++ b/backend/cosmetology-app/lambdas/python/staff-users/requirements-dev.txt @@ -4,9 +4,9 @@ # # pip-compile --no-emit-index-url --no-strip-extras lambdas/python/staff-users/requirements-dev.in # -boto3==1.42.76 +boto3==1.42.80 # via moto -botocore==1.42.76 +botocore==1.42.80 # via # boto3 # moto @@ -53,7 +53,7 @@ pyyaml==6.0.3 # via # moto # responses -requests==2.33.0 +requests==2.33.1 # via # docker # moto diff --git a/backend/cosmetology-app/requirements-dev.txt b/backend/cosmetology-app/requirements-dev.txt index 63d3fee25..497c98fad 100644 --- a/backend/cosmetology-app/requirements-dev.txt +++ b/backend/cosmetology-app/requirements-dev.txt @@ -67,7 +67,7 @@ pluggy==1.6.0 # pytest-cov py-serializable==2.1.0 # via cyclonedx-python-lib -pygments==2.19.2 +pygments==2.20.0 # via # pytest # rich @@ -83,7 +83,7 @@ pytest==9.0.2 # pytest-cov pytest-cov==7.1.0 # via -r requirements-dev.in -requests==2.33.0 +requests==2.33.1 # via # cachecontrol # pip-audit diff --git a/backend/cosmetology-app/requirements.txt b/backend/cosmetology-app/requirements.txt index 2ee69e199..a7600ae4e 100644 --- a/backend/cosmetology-app/requirements.txt +++ b/backend/cosmetology-app/requirements.txt @@ -12,11 +12,11 @@ aws-cdk-asset-awscli-v1==2.2.263 # via aws-cdk-lib aws-cdk-asset-node-proxy-agent-v6==2.1.1 # via aws-cdk-lib -aws-cdk-aws-lambda-python-alpha==2.244.0a0 +aws-cdk-aws-lambda-python-alpha==2.246.0a0 # via -r requirements.in -aws-cdk-cloud-assembly-schema==52.2.0 +aws-cdk-cloud-assembly-schema==53.11.0 # via aws-cdk-lib -aws-cdk-lib==2.244.0 +aws-cdk-lib==2.246.0 # via # -r requirements.in # aws-cdk-aws-lambda-python-alpha From d068ac9057abbed58818426e9fcbc40b86fa7631 Mon Sep 17 00:00:00 2001 From: Landon Shumway Date: Wed, 1 Apr 2026 09:28:18 -0500 Subject: [PATCH 28/36] formatting --- .../python/search/handlers/populate_provider_documents.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/cosmetology-app/lambdas/python/search/handlers/populate_provider_documents.py b/backend/cosmetology-app/lambdas/python/search/handlers/populate_provider_documents.py index 35db28b39..30b35f0a1 100644 --- a/backend/cosmetology-app/lambdas/python/search/handlers/populate_provider_documents.py +++ b/backend/cosmetology-app/lambdas/python/search/handlers/populate_provider_documents.py @@ -47,9 +47,9 @@ you only have 1 in your cluster. If the OpenSearch Domain drops that node due to network failures, aliases and indices will be lost and if the ingest pipeline inserts records before the aliases are recreated, OpenSearch will automatically -create those indices under the alias name, but without the proper index mapping -which will break our search endpoints. This reset functionality allows devs in -test environments to reset those aliases/indices into a clean state before +create those indices under the alias name, but without the proper index mapping +which will break our search endpoints. This reset functionality allows devs in +test environments to reset those aliases/indices into a clean state before populating all the provider records. """ From f370eee369d7d08762e201ba017eb332493a5a47 Mon Sep 17 00:00:00 2001 From: Landon Shumway Date: Thu, 9 Apr 2026 15:22:14 -0500 Subject: [PATCH 29/36] PR feedback - cleanup tests/comments --- .../data_model/schema/provider/api.py | 3 +- .../test_manage_opensearch_indices.py | 7 +-- .../function/test_public_search_providers.py | 46 +------------------ 3 files changed, 7 insertions(+), 49 deletions(-) diff --git a/backend/cosmetology-app/lambdas/python/common/cc_common/data_model/schema/provider/api.py b/backend/cosmetology-app/lambdas/python/common/cc_common/data_model/schema/provider/api.py index dcf810fb4..52dbdcc2a 100644 --- a/backend/cosmetology-app/lambdas/python/common/cc_common/data_model/schema/provider/api.py +++ b/backend/cosmetology-app/lambdas/python/common/cc_common/data_model/schema/provider/api.py @@ -211,8 +211,7 @@ class ProviderPublicResponseSchema(ForgivingSchema): class PublicLicenseSearchResponseSchema(ForgivingSchema): """ - License object fields returned by the public query providers endpoint (OpenSearch-backed). - Jurisdiction is renamed to licenseJurisdiction for parity with JCC implementation. + License object fields returned by the public query providers endpoint. """ providerId = Raw(required=True, allow_none=False) diff --git a/backend/cosmetology-app/lambdas/python/search/tests/function/test_manage_opensearch_indices.py b/backend/cosmetology-app/lambdas/python/search/tests/function/test_manage_opensearch_indices.py index a8f893ac1..0b9593263 100644 --- a/backend/cosmetology-app/lambdas/python/search/tests/function/test_manage_opensearch_indices.py +++ b/backend/cosmetology-app/lambdas/python/search/tests/function/test_manage_opensearch_indices.py @@ -68,9 +68,10 @@ def _when_testing_mock_opensearch_client( mock_client_instance.index_exists.return_value = index_exists_return_value # We want to make assertions on the opensearch client calls that are made during index creation - # to ensure the alias/indices are created as expected. We also need to ensure we are checking against - # the actual index mapping that is used in the runtime logic. This points the mock to the actual - # function pointers in the opensearch_client client. + # to ensure the alias/indices are created with the expected mapping (see the assertions made in the + # test_on_create_creates_versioned_indices_and_aliases_for_all_compacts_when_none_exist test). + # This setup points the mock to the actual function pointers in the opensearch_client client so that + # we are not mocking the methods that set the index mapping. from opensearch_client import OpenSearchClient def _real_get_mapping(number_of_shards, number_of_replicas): diff --git a/backend/cosmetology-app/lambdas/python/search/tests/function/test_public_search_providers.py b/backend/cosmetology-app/lambdas/python/search/tests/function/test_public_search_providers.py index 5c701ddb2..77f9e7836 100644 --- a/backend/cosmetology-app/lambdas/python/search/tests/function/test_public_search_providers.py +++ b/backend/cosmetology-app/lambdas/python/search/tests/function/test_public_search_providers.py @@ -294,7 +294,7 @@ def test_invalid_sort_key_returns_400(self, mock_opensearch_client): @patch('handlers.public_search.opensearch_client') def test_no_search_criteria_returns_200(self, mock_opensearch_client): - """Test that at least one of licenseNumber, jurisdiction, or familyName is required.""" + """Test that caller can provide an empty query body and still get a successful response.""" from handlers.public_search import public_search_api_handler mock_opensearch_client.search.return_value = { @@ -404,13 +404,7 @@ def test_response_last_key_null_when_fewer_hits_than_page_size(self, mock_opense """When hit count is below pageSize, there are no more pages and lastKey is null.""" from handlers.public_search import public_search_api_handler - sort_four = [ - 'doe', - 'john', - '00000000-0000-0000-0000-000000000001', - '00000000-0000-0000-0000-000000000001#oh#cosmetologist', - ] - single_hit = self._create_mock_hit(sort_values=sort_four) + single_hit = self._create_mock_hit() mock_opensearch_client.search.return_value = { 'hits': {'total': {'value': 1, 'relation': 'eq'}, 'hits': [single_hit]}, } @@ -491,42 +485,6 @@ def test_unsupported_route_returns_400(self): self.assertEqual(400, response['statusCode']) self.assertIn('Unsupported method or resource', json.loads(response['body'])['message']) - @patch('handlers.public_search.opensearch_client') - def test_terminal_page_returns_last_key_null(self, mock_opensearch_client): - """When fewer hits than pageSize, lastKey must be null.""" - from handlers.public_search import public_search_api_handler - - mock_hits = [ - self._create_mock_hit( - provider_id='pid-1', - jurisdiction='oh', - license_number='L1', - sort_values=['doe', 'john', 'pid-1', 'pid-1#oh#cosmetologist'], - ), - self._create_mock_hit( - provider_id='pid-1', - jurisdiction='al', - license_number='L2', - sort_values=['doe', 'john', 'pid-1', 'pid-1#al#cosmetologist'], - ), - self._create_mock_hit( - provider_id='pid-2', - jurisdiction='oh', - license_number='L3', - sort_values=['doe', 'john', 'pid-2', 'pid-2#oh#cosmetologist'], - ), - ] - mock_opensearch_client.search.return_value = { - 'hits': {'total': {'value': 3, 'relation': 'eq'}, 'hits': mock_hits}, - } - event = self._create_public_api_event( - 'cosm', - body={'query': {'familyName': 'Doe'}, 'pagination': {'pageSize': 10}}, - ) - response = public_search_api_handler(event, self.mock_context) - body = json.loads(response['body']) - self.assertIsNone(body['pagination']['lastKey'], 'no more results -> lastKey null') - @patch('handlers.public_search.opensearch_client') def test_invalid_last_key_format_returns_400(self, mock_opensearch_client): """Malformed or invalid lastKey must return 400.""" From aebcc40483325e9f2507b6bdf307e346c5ced356 Mon Sep 17 00:00:00 2001 From: Landon Shumway Date: Thu, 9 Apr 2026 15:22:33 -0500 Subject: [PATCH 30/36] fix example in mock license script --- .../bin/generate_mock_license_csv_upload_file.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/cosmetology-app/bin/generate_mock_license_csv_upload_file.py b/backend/cosmetology-app/bin/generate_mock_license_csv_upload_file.py index d7554ad41..0523ac1c8 100755 --- a/backend/cosmetology-app/bin/generate_mock_license_csv_upload_file.py +++ b/backend/cosmetology-app/bin/generate_mock_license_csv_upload_file.py @@ -4,8 +4,8 @@ # The JSON file can be used for API testing or other purposes. # # Run from 'backend/compact-connect' like: -# bin/generate_mock_license_csv_upload_file.py --count 100 --compact octp --jurisdiction ne --format csv -# bin/generate_mock_license_csv_upload_file.py --count 100 --compact octp --jurisdiction ne --format json +# bin/generate_mock_license_csv_upload_file.py --count 100 --compact cosm --jurisdiction al --format csv +# bin/generate_mock_license_csv_upload_file.py --count 100 --compact cosm --jurisdiction al --format json import json import os import sys From 1c4d5c742728793f3cd5b0597b5df731dfc143af Mon Sep 17 00:00:00 2001 From: Landon Shumway Date: Thu, 9 Apr 2026 15:23:05 -0500 Subject: [PATCH 31/36] Remove irrelevant query provider smoke test --- .../tests/smoke/query_provider_smoke_tests.py | 214 ------------------ 1 file changed, 214 deletions(-) delete mode 100644 backend/cosmetology-app/tests/smoke/query_provider_smoke_tests.py diff --git a/backend/cosmetology-app/tests/smoke/query_provider_smoke_tests.py b/backend/cosmetology-app/tests/smoke/query_provider_smoke_tests.py deleted file mode 100644 index 8c11e1a3b..000000000 --- a/backend/cosmetology-app/tests/smoke/query_provider_smoke_tests.py +++ /dev/null @@ -1,214 +0,0 @@ -# ruff: noqa: S101 T201 we use asserts and print statements for smoke testing -import json - -import requests -from config import config, logger -from deepdiff import DeepDiff -from smoke_common import ( - SmokeTestFailureException, - call_provider_users_me_endpoint, - create_test_staff_user, - delete_test_staff_user, - get_staff_user_auth_headers, - load_smoke_test_env, -) - -# This script can be run locally to test the Query/Get Provider flow against a sandbox environment of the Compact -# Connect API. It requires that you have a provider user set up in the same compact of the sandbox environment. -# Your sandbox account must also be deployed with the "security_profile": "VULNERABLE" setting in your cdk.context.json -# file, which allows you to log in users using the boto3 Cognito client. - -# The staff user should be created **without** any 'readPrivate' permissions, as this flow is intended to test -# the general provider data retrieval flow. - -# To run this script, create a smoke_tests_env.json file in the same directory as this script using the -# 'smoke_tests_env_example.json' file as a template. - - -TEST_STAFF_USER_EMAIL = 'testStaffUserQuerySmokeTests@smokeTestFakeEmail.com' - - -def get_general_provider_user_data_smoke_test(): - """ - Verifies that a provider record can be fetched from the GET provider users endpoint with private fields sanitized. - - Step 1: Get the provider id of the provider user profile information. - Step 2: The staff user calls the GET provider users endpoint with the provider id. - Step 3: Verify the Provider response matches the profile. - """ - # Step 1: Get the provider id of the provider user profile information. - test_user_profile = call_provider_users_me_endpoint() - provider_id = provider_user_profile['providerId'] - compact = provider_user_profile['compact'] - - # Step 2: The staff user calls the GET provider users endpoint with the provider id. - staff_users_headers = get_staff_user_auth_headers(TEST_STAFF_USER_EMAIL) - - get_provider_response = requests.get( - url=config.api_base_url + f'/v1/compacts/{compact}/providers/{provider_id}', - headers=staff_users_headers, - timeout=10, - ) - - if get_provider_response.status_code != 200: - raise SmokeTestFailureException(f'Failed to query provider. Response: {get_provider_response.json()}') - logger.info('Received success response from GET endpoint') - - # Step 3: Verify the Provider response matches the profile. - get_provider_general_provider_object = get_provider_response.json() - - # verify the ssn is NOT in the response - if 'ssn' in get_provider_general_provider_object: - raise SmokeTestFailureException(f'unexpected ssn field returned. Response: {get_provider_response.json()}') - - # remove the fields from the user profile that are not in the query response - test_user_profile.pop('ssnLastFour', None) - test_user_profile.pop('dateOfBirth', None) - test_user_profile.pop('encumberedStatus', None) - for provider_license in test_user_profile['licenses']: - provider_license.pop('ssnLastFour', None) - provider_license.pop('dateOfBirth', None) - provider_license.pop('encumberedStatus', None) - for history_event in provider_license['history']: - history_event['previous'].pop('ssnLastFour', None) - history_event['previous'].pop('dateOfBirth', None) - history_event['previous'].pop('encumberedStatus', None) - - if get_provider_general_provider_object != test_user_profile: - formatted_test_user_profile = json.dumps(test_user_profile, sort_keys=True, indent=4) - formatted_get_provider_response = json.dumps(get_provider_general_provider_object, sort_keys=True, indent=4) - logger.error( - 'Provider object does not match the profile.', - provider_profile=formatted_test_user_profile, - get_provider_response=formatted_get_provider_response, - diff=DeepDiff(test_user_profile, get_provider_general_provider_object), - ) - raise SmokeTestFailureException('Get provider object response does not match the profile.') - logger.info('Successfully fetched expected provider records.') - - -def query_provider_user_smoke_test(): - """ - Verifies that a provider record can be queried . - - Step 1: Get the provider id of the provider user profile information. - Step 2: Have the staff user query for that provider using the profile information. - Step 3: Verify the Provider response matches the profile. - """ - - # Step 1: Get the provider id of the provider user profile information. - test_user_profile = call_provider_users_me_endpoint() - provider_id = provider_user_profile['providerId'] - compact = provider_user_profile['compact'] - - # Step 2: Have the staff user query for that provider using the profile information. - staff_users_headers = get_staff_user_auth_headers(TEST_STAFF_USER_EMAIL) - post_body = {'query': {'providerId': provider_id}} - - post_response = requests.post( - url=config.api_base_url + f'/v1/compacts/{compact}/providers/query', - headers=staff_users_headers, - json=post_body, - timeout=10, - ) - - if post_response.status_code != 200: - raise SmokeTestFailureException(f'Failed to query provider. Response: {post_response.json()}') - logger.info('Received success response from query endpoint') - # Step 3: Verify the Provider response matches the profile. - providers = post_response.json()['providers'] - if not providers: - raise SmokeTestFailureException(f'No providers returned by query. Response: {post_response.json()}') - - provider_object = providers[0] - - # verify the ssn is NOT in the response - if 'ssn' in provider_object: - raise SmokeTestFailureException(f'unexpected ssn field returned. Response: {post_response.json()}') - - # remove the fields from the user profile that are not in the query response - test_user_profile.pop('ssnLastFour', None) - test_user_profile.pop('dateOfBirth', None) - test_user_profile.pop('licenses') - test_user_profile.pop('privileges') - test_user_profile.pop('encumberedStatus', None) - - if provider_object != test_user_profile: - raise SmokeTestFailureException( - f'Provider list object does not match the profile.\n{DeepDiff(test_user_profile, provider_object)}' - ) - - logger.info('Successfully queried expected provider record.') - - -def get_provider_data_with_read_private_access_smoke_test(test_staff_user_id: str): - """ - Verifies that a staff user can read private fields of a provider record if they have the 'readPrivate' permission. - - Step 1: Update the staff user's permissions using the PATCH '/v1/staff-users/me/permissions' endpoint to include - the 'readPrivate' permission. - Step 2: Generate a new token and call the GET provider users endpoint with the new token. - Step 3: Verify the Provider response matches the profile. - """ - - # Step 1: Get the provider user profile information. - test_user_profile = call_provider_users_me_endpoint() - provider_id = provider_user_profile['providerId'] - compact = provider_user_profile['compact'] - # Step 1: Update the staff user's permissions using the PATCH '/v1/staff-users/me/permissions' endpoint. - staff_users_headers = get_staff_user_auth_headers(TEST_STAFF_USER_EMAIL) - patch_body = {'permissions': {'cosm': {'actions': {'readPrivate': True}}}} - patch_response = requests.patch( - url=config.api_base_url + f'/v1/compacts/{compact}/staff-users/{test_staff_user_id}', - headers=staff_users_headers, - json=patch_body, - timeout=10, - ) - - if patch_response.status_code != 200: - raise SmokeTestFailureException(f'Failed to PATCH staff user permissions. Response: {patch_response.json()}') - logger.info('Successfully updated staff user permissions.') - - # Step 2: Generate a new token and call the GET provider users endpoint with the new token. - staff_users_headers = get_staff_user_auth_headers(TEST_STAFF_USER_EMAIL) - get_provider_response = requests.get( - url=config.api_base_url + f'/v1/compacts/{compact}/providers/{provider_id}', - headers=staff_users_headers, - timeout=10, - ) - - if get_provider_response.status_code != 200: - raise SmokeTestFailureException(f'Failed to GET staff user. Response: {get_provider_response.json()}') - - logger.info('Received success response from GET endpoint') - - # Step 3: Verify the Provider response matches the profile. - provider_object = get_provider_response.json() - if provider_object != test_user_profile: - raise SmokeTestFailureException( - f'Provider object does not match the profile.\n{DeepDiff(test_user_profile, provider_object)}' - ) - - logger.info('Successfully fetched expected user profile.') - - -if __name__ == '__main__': - load_smoke_test_env() - provider_user_profile = call_provider_users_me_endpoint() - provider_compact = provider_user_profile['compact'] - # ensure the test staff user is in the same compact as the test provider user without 'readPrivate' permissions - test_user_sub = create_test_staff_user( - email=TEST_STAFF_USER_EMAIL, - compact=provider_compact, - jurisdiction='oh', - permissions={'actions': {'admin'}, 'jurisdictions': {'oh': {'write', 'admin'}}}, - ) - try: - get_general_provider_user_data_smoke_test() - query_provider_user_smoke_test() - get_provider_data_with_read_private_access_smoke_test(test_staff_user_id=test_user_sub) - logger.info('Query provider smoke tests passed') - except SmokeTestFailureException as e: - logger.error(f'Query provider smoke tests failed: {str(e)}') - finally: - delete_test_staff_user(TEST_STAFF_USER_EMAIL, user_sub=test_user_sub, compact=provider_compact) From 9824eefc288c5f800916673027dd9153efbcf2d4 Mon Sep 17 00:00:00 2001 From: Landon Shumway Date: Thu, 9 Apr 2026 15:49:57 -0500 Subject: [PATCH 32/36] PR feedback - validate path parameter --- .../python/search/handlers/public_search.py | 19 ++++++++++++++++++- .../function/test_public_search_providers.py | 15 +++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/backend/cosmetology-app/lambdas/python/search/handlers/public_search.py b/backend/cosmetology-app/lambdas/python/search/handlers/public_search.py index 534111c7c..37cf78db3 100644 --- a/backend/cosmetology-app/lambdas/python/search/handlers/public_search.py +++ b/backend/cosmetology-app/lambdas/python/search/handlers/public_search.py @@ -35,7 +35,10 @@ def public_search_api_handler(event: dict, context: LambdaContext): # noqa: ARG def _public_query_licenses(event: dict, context: LambdaContext): # noqa: ARG001 unused-argument - compact = event['pathParameters']['compact'] + path_params = event.get('pathParameters') or {} + compact_raw = path_params.get('compact') + compact = _normalize_and_validate_compact_path_parameter(compact_raw) + body = _parse_and_validate_public_query_body(event) query_obj = body.get('query', {}) pagination = body.get('pagination') or {} @@ -108,6 +111,20 @@ def _public_query_licenses(event: dict, context: LambdaContext): # noqa: ARG001 } +def _normalize_and_validate_compact_path_parameter(compact_raw: str | None) -> str: + """ + Strip and case-fold path compact for lookup; return the canonical value from config.compacts. + Rejects missing or unsupported values at the API boundary (400). + """ + if compact_raw is None or not str(compact_raw).strip(): + raise CCInvalidRequestException('Invalid or missing compact') + standardized_compact = str(compact_raw).lower().strip() + if standardized_compact not in config.compacts: + logger.info('Invalid compact provided in path parameter.', compact_path_parameter=standardized_compact) + raise CCInvalidRequestException('Unsupported compact') + return standardized_compact + + def _parse_and_validate_public_query_body(event: dict) -> dict: try: schema = PublicQueryProvidersRequestSchema() diff --git a/backend/cosmetology-app/lambdas/python/search/tests/function/test_public_search_providers.py b/backend/cosmetology-app/lambdas/python/search/tests/function/test_public_search_providers.py index 77f9e7836..e329f3cf2 100644 --- a/backend/cosmetology-app/lambdas/python/search/tests/function/test_public_search_providers.py +++ b/backend/cosmetology-app/lambdas/python/search/tests/function/test_public_search_providers.py @@ -273,6 +273,21 @@ def test_response_always_contains_sorting_field(self, mock_opensearch_client): self.assertIn('sorting', body) self.assertEqual({'key', 'direction'}, set(body['sorting'].keys())) + @patch('handlers.public_search.opensearch_client') + def test_unsupported_compact_returns_400(self, mock_opensearch_client): + """Path compact not in config.compacts returns 400 and does not call OpenSearch.""" + from handlers.public_search import public_search_api_handler + + event = self._create_public_api_event( + 'not-a-compact', + body={'query': {'familyName': 'Doe'}, 'pagination': {'pageSize': 10}}, + ) + response = public_search_api_handler(event, self.mock_context) + self.assertEqual(400, response['statusCode']) + body = json.loads(response['body']) + self.assertIn('compact', body['message'].lower()) + mock_opensearch_client.search.assert_not_called() + @patch('handlers.public_search.opensearch_client') def test_invalid_sort_key_returns_400(self, mock_opensearch_client): """Unknown sorting.key returns 400.""" From 7f00cf00e11be9ec7bc483c745de0ea920c8f099 Mon Sep 17 00:00:00 2001 From: Landon Shumway Date: Thu, 9 Apr 2026 16:17:29 -0500 Subject: [PATCH 33/36] PR feedback sort by inner license record --- .../lambdas/python/search/handlers/public_search.py | 7 +++++-- .../search/tests/function/test_public_search_providers.py | 8 ++++---- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/backend/cosmetology-app/lambdas/python/search/handlers/public_search.py b/backend/cosmetology-app/lambdas/python/search/handlers/public_search.py index 37cf78db3..ed65007f0 100644 --- a/backend/cosmetology-app/lambdas/python/search/handlers/public_search.py +++ b/backend/cosmetology-app/lambdas/python/search/handlers/public_search.py @@ -174,8 +174,11 @@ def _build_public_opensearch_sort(body: dict) -> list: match sort_key: case 'familyName': return [ - {'familyName.keyword': os_dir}, - {'givenName.keyword': os_dir}, + # we use nested sorting for familyName and givenName because the top level field is associated + # with the most recent issued license record, which if multiple licenses are issued for the same + # provider, the familyName and givenName may be different between the licenses. + {'licenses.familyName.keyword': {'order': os_dir, 'nested': {'path': 'licenses'}}}, + {'licenses.givenName.keyword': {'order': os_dir, 'nested': {'path': 'licenses'}}}, {'providerId': os_dir}, {'_id': 'asc'}, ] diff --git a/backend/cosmetology-app/lambdas/python/search/tests/function/test_public_search_providers.py b/backend/cosmetology-app/lambdas/python/search/tests/function/test_public_search_providers.py index e329f3cf2..512bb8d5b 100644 --- a/backend/cosmetology-app/lambdas/python/search/tests/function/test_public_search_providers.py +++ b/backend/cosmetology-app/lambdas/python/search/tests/function/test_public_search_providers.py @@ -165,8 +165,8 @@ def test_default_sort_is_family_name_ascending(self, mock_opensearch_client): call_body = mock_opensearch_client.search.call_args.kwargs['body'] sort = call_body['sort'] self.assertEqual(4, len(sort)) - self.assertEqual({'familyName.keyword': 'asc'}, sort[0]) - self.assertEqual({'givenName.keyword': 'asc'}, sort[1]) + self.assertEqual({'licenses.familyName.keyword': {'order': 'asc', 'nested': {'path': 'licenses'}}}, sort[0]) + self.assertEqual({'licenses.givenName.keyword': {'order': 'asc', 'nested': {'path': 'licenses'}}}, sort[1]) self.assertEqual({'providerId': 'asc'}, sort[2]) self.assertEqual({'_id': 'asc'}, sort[3]) body = json.loads(response['body']) @@ -194,8 +194,8 @@ def test_family_name_sort_descending(self, mock_opensearch_client): response = public_search_api_handler(event, self.mock_context) call_body = mock_opensearch_client.search.call_args.kwargs['body'] sort = call_body['sort'] - self.assertEqual({'familyName.keyword': 'desc'}, sort[0]) - self.assertEqual({'givenName.keyword': 'desc'}, sort[1]) + self.assertEqual({'licenses.familyName.keyword': {'order': 'desc', 'nested': {'path': 'licenses'}}}, sort[0]) + self.assertEqual({'licenses.givenName.keyword': {'order': 'desc', 'nested': {'path': 'licenses'}}}, sort[1]) self.assertEqual({'providerId': 'desc'}, sort[2]) self.assertEqual({'_id': 'asc'}, sort[3]) body = json.loads(response['body']) From 1c786206ad5adfdf9207ecf19b9c889ba39d3806 Mon Sep 17 00:00:00 2001 From: Landon Shumway Date: Thu, 9 Apr 2026 16:19:54 -0500 Subject: [PATCH 34/36] formatting --- .../lambdas/python/search/handlers/public_search.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/cosmetology-app/lambdas/python/search/handlers/public_search.py b/backend/cosmetology-app/lambdas/python/search/handlers/public_search.py index ed65007f0..d6bacd6ab 100644 --- a/backend/cosmetology-app/lambdas/python/search/handlers/public_search.py +++ b/backend/cosmetology-app/lambdas/python/search/handlers/public_search.py @@ -174,7 +174,7 @@ def _build_public_opensearch_sort(body: dict) -> list: match sort_key: case 'familyName': return [ - # we use nested sorting for familyName and givenName because the top level field is associated + # we use nested sorting for familyName and givenName because the top level field is associated # with the most recent issued license record, which if multiple licenses are issued for the same # provider, the familyName and givenName may be different between the licenses. {'licenses.familyName.keyword': {'order': os_dir, 'nested': {'path': 'licenses'}}}, From f839d5a60c09efbb1277f840ad34f79f601f101e Mon Sep 17 00:00:00 2001 From: Landon Shumway Date: Thu, 9 Apr 2026 16:30:02 -0500 Subject: [PATCH 35/36] Update nodemailer dep to latest --- backend/cosmetology-app/lambdas/nodejs/package.json | 2 +- backend/cosmetology-app/lambdas/nodejs/yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/backend/cosmetology-app/lambdas/nodejs/package.json b/backend/cosmetology-app/lambdas/nodejs/package.json index 22d753312..652c0ab90 100644 --- a/backend/cosmetology-app/lambdas/nodejs/package.json +++ b/backend/cosmetology-app/lambdas/nodejs/package.json @@ -49,7 +49,7 @@ "@aws-sdk/client-sesv2": "^3.901.0", "@aws-sdk/util-dynamodb": "^3.901.0", "@csg-org/email-builder": "^0.0.12", - "nodemailer": "^7.0.11", + "nodemailer": "^8.0.5", "zod": "^3.23.8" } } diff --git a/backend/cosmetology-app/lambdas/nodejs/yarn.lock b/backend/cosmetology-app/lambdas/nodejs/yarn.lock index 712c9cb92..5c2043be8 100644 --- a/backend/cosmetology-app/lambdas/nodejs/yarn.lock +++ b/backend/cosmetology-app/lambdas/nodejs/yarn.lock @@ -4610,10 +4610,10 @@ node-releases@^2.0.27: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.27.tgz#eedca519205cf20f650f61d56b070db111231e4e" integrity sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA== -nodemailer@^7.0.11: - version "7.0.13" - resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-7.0.13.tgz#74acaa55f0c6f9476384c29f27f53e467e8483cd" - integrity sha512-PNDFSJdP+KFgdsG3ZzMXCgquO7I6McjY2vlqILjtJd0hy8wEvtugS9xKRF2NWlPNGxvLCXlTNIae4serI7dinw== +nodemailer@^8.0.5: + version "8.0.5" + resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-8.0.5.tgz#2076fb2b5c1ccfe1c88f6e1aa47c0229ea642e0c" + integrity sha512-0PF8Yb1yZuQfQbq+5/pZJrtF6WQcjTd5/S4JOHs9PGFxuTqoB/icwuB44pOdURHJbRKX1PPoJZtY7R4VUoCC8w== normalize-path@^3.0.0: version "3.0.0" From 8c773babcaca06e83eadb3550efabd3518ccbf44 Mon Sep 17 00:00:00 2001 From: Landon Shumway Date: Thu, 9 Apr 2026 16:40:09 -0500 Subject: [PATCH 36/36] PR feedback - check missing jurisdiction with schema validation --- .../lambdas/python/search/handlers/public_search.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/backend/cosmetology-app/lambdas/python/search/handlers/public_search.py b/backend/cosmetology-app/lambdas/python/search/handlers/public_search.py index d6bacd6ab..80e173c13 100644 --- a/backend/cosmetology-app/lambdas/python/search/handlers/public_search.py +++ b/backend/cosmetology-app/lambdas/python/search/handlers/public_search.py @@ -78,9 +78,8 @@ def _public_query_licenses(event: dict, context: LambdaContext): # noqa: ARG001 # home state is stored under the 'jurisdiction' field on the license record, but # the frontend expects this to be labeled 'licenseJurisdiction' for parity with other # public search response schemas. - license_fields['licenseJurisdiction'] = license_fields.pop('jurisdiction') + license_fields['licenseJurisdiction'] = license_fields.pop('jurisdiction', None) sanitized = license_schema.load(license_fields) - sanitized.pop('jurisdiction', None) providers.append(sanitized) except ValidationError as e: logger.error(