def patch()

in src/lambdas/r8s_api_handler/processors/shape_rule_processor.py [0:0]


    def patch(self, event):
        _LOG.debug(f'Update shape rule event: {event}')

        validate_params(event, (PARENT_ID_ATTR, ID_ATTR,))

        parent_id = event.get(PARENT_ID_ATTR)
        parent = self.parent_service.get_parent_by_id(
            parent_id=parent_id
        )
        self._validate_parent(parent=parent)

        rule_id = event.get(ID_ATTR)
        applications = self.application_service. \
            resolve_application(event=event)

        if not applications:
            _LOG.warning(f'No application for cloud found.')
            return build_response(
                code=RESPONSE_BAD_REQUEST_CODE,
                content=f'No application for cloud found.'
            )
        app_ids = [app.application_id for app in applications]
        if not parent or parent.application_id not in app_ids:
            _LOG.warning(f'No parent found matching given query.')
            return build_response(
                code=RESPONSE_BAD_REQUEST_CODE,
                content=f'No parent found matching given query.'
            )

        parent_meta = self.parent_service.get_parent_meta(
            parent=parent
        )
        shape_rule = self.parent_service.get_shape_rule(
            parent_meta=parent_meta,
            rule_id=rule_id
        )
        if not shape_rule:
            _LOG.error(f'Shape rule \'{rule_id}\' does not exist in '
                       f'parent \'{parent_id}\'')
            return build_response(
                code=RESPONSE_RESOURCE_NOT_FOUND_CODE,
                content=f'Shape rule \'{rule_id}\' does not exist in '
                        f'parent \'{parent_id}\''
            )
        self.parent_service.update_shape_rule(
            shape_rule=shape_rule,
            action=event.get(RULE_ACTION_ATTR),
            field=event.get(FIELD_ATTR),
            condition=event.get(CONDITION_ATTR),
            value=event.get(VALUE_ATTR)
        )
        _LOG.debug(f'Shape rule updated')

        errors = self._validate(shape_rule=shape_rule)
        if errors:
            _LOG.error(f'Shape rule is invalid: {", ".join(errors)}')
            return build_response(
                code=RESPONSE_BAD_REQUEST_CODE,
                content=f'Shape rule is invalid: {", ".join(errors)}'
            )

        self.parent_service.update_shape_rule_in_parent(
            parent_meta=parent_meta,
            shape_rule=shape_rule
        )
        _LOG.debug(f'Shape rule updated in parent '
                   f'\'{parent.parent_id}\' meta')

        self.parent_service.save(parent=parent)
        _LOG.debug(f'Parent \'{parent.parent_id}\' saved')

        shape_rule_dto = self.parent_service.get_shape_rule_dto(
            shape_rule=shape_rule)

        _LOG.debug(f'Response: {shape_rule_dto}')

        return build_response(
            code=RESPONSE_OK_CODE,
            content=shape_rule_dto
        )