in aws-frauddetector-detector/src/aws_frauddetector_detector/handler_workers.py [0:0]
def execute_create_detector_handler_work(session: SessionProxy, model: models.ResourceModel, progress: ProgressEvent):
afd_client = client_helpers.get_afd_client(session)
# For contract_create_duplicate, we need to fail if the resource already exists
get_detectors_works, _ = validation_helpers.check_if_get_detectors_succeeds(afd_client, model.DetectorId)
if get_detectors_works:
raise exceptions.AlreadyExists("detector", model.DetectorId)
# For contract_invalid_create, fail if any read-only properties are present
if model.Arn is not None or model.CreatedTime is not None or model.LastUpdatedTime is not None:
raise exceptions.InvalidRequest("Error occurred: cannot create read-only properties.")
# Validate existence of referenced resources, validate and create inline resources (except for Rules, Detector, DV)
# Also check existence of external models
# TODO: split out creation from validation
create_worker_helpers.validate_dependencies_for_detector_create(afd_client, model)
# Create Detector, Rules, Detector Version ID
model_helpers.put_detector_for_model(afd_client, model)
rule_dicts = create_worker_helpers.create_rules_for_detector_resource(afd_client, model)
detector_version_response = create_worker_helpers.create_detector_version_for_detector_resource(
afd_client, model, rule_dicts
)
# The DV will be created as draft by default, so if the desired status is not draft, update DV status
if model.DetectorVersionStatus != DRAFT_STATUS:
api_helpers.call_update_detector_version_status(
frauddetector_client=afd_client,
detector_id=model.DetectorId,
detector_version_id=detector_version_response.get("detectorVersionId", "1"), # version here should be 1
status=model.DetectorVersionStatus,
)
# after satisfying all contract tests and AFD requirements, get the resulting model
model = read_worker_helpers.validate_detector_exists_and_return_detector_resource_model(afd_client, model)
progress.resourceModel = model
progress.status = OperationStatus.SUCCESS
LOG.info(f"Returning Progress with status: {progress.status}")
return progress