def submit_service_for_approval(self, payload): service = ServiceFactory().create_service_entity_model( self.org_uuid, self.service_uuid, payload, ServiceStatus.APPROVAL_PENDING.value) service = ServiceRepository().save_service( self.username, service, ServiceStatus.APPROVAL_PENDING.value) return service.to_response()
def save_service(self, payload): service = ServiceFactory().create_service_entity_model( self.org_uuid, self.service_uuid, payload, ServiceStatus.DRAFT.value) service = ServiceRepository().save_service(self.username, service, ServiceStatus.DRAFT.value) return service.to_response()
def save_service(self, payload): service = ServicePublisherRepository( ).get_service_for_given_service_uuid(self._org_uuid, self._service_uuid) service.service_id = payload["service_id"] service.proto = payload.get("proto", {}) service.short_description = payload.get("short_description", "") service.description = payload.get("description", "") service.project_url = payload.get("project_url", "") service.contributors = ServicePublisherService. \ _get_valid_service_contributors(contributors=payload.get("contributors", [])) service.tags = payload.get("tags", []) service.mpe_address = payload.get("mpe_address", "") groups = [] for group in payload["groups"]: service_group = ServiceFactory.create_service_group_entity_model( self._org_uuid, self._service_uuid, group) groups.append(service_group) service.groups = groups service.service_state.transaction_hash = payload.get( "transaction_hash", None) service = ServicePublisherRepository().save_service( self._username, service, ServiceStatus.APPROVED.value) comment = payload.get("comments", {}).get(UserType.SERVICE_PROVIDER.value, "") if len(comment) > 0: self._save_service_comment(support_type="SERVICE_APPROVAL", user_type="SERVICE_PROVIDER", comment=comment) return service.to_dict()
def get_service_state_with_status(self, status): service_state_db = self.session.query(ServiceState).filter( ServiceState.state == status).all() service_state = ServiceFactory.convert_service_state_from_db_list( service_state_db) self.session.commit() return service_state
def save_service(self, username, service, state): service_group_db_model = [ ServiceFactory().convert_service_group_entity_model_to_db_model( group) for group in service.groups ] try: self.session.query(ServiceGroup).filter( ServiceGroup.org_uuid == service.org_uuid).filter( ServiceGroup.service_uuid == service.uuid).delete( synchronize_session='fetch') self.session.commit() except Exception as e: self.session.rollback() raise e try: service_db = self.session.query(Service).filter( Service.org_uuid == service.org_uuid).filter( Service.uuid == service.uuid).first() service_db.display_name = service.display_name service_db.service_id = service.service_id service_db.metadata_uri = service.metadata_uri service_db.proto = service.proto service_db.short_description = service.short_description service_db.description = service.description service_db.project_url = service.project_url service_db.assets = service.assets service_db.rating = service.rating service_db.ranking = service.ranking service_db.contributors = service.contributors service_db.tags = service.tags service_db.mpe_address = service.mpe_address service_db.updated_on = dt.utcnow() service_db.groups = service_group_db_model service_db.service_state.state = state service_db.service_state.transaction_hash = service.service_state.transaction_hash service_db.service_state.updated_by = username service_db.service_state.updated_on = dt.utcnow() self.session.commit() except Exception as e: self.session.rollback() raise e if not service_db: return None service = ServiceFactory().convert_service_db_model_to_entity_model( service_db) return service
def save_service(self, payload): service = ServiceFactory().create_service_entity_model( self._org_uuid, self._service_uuid, payload, ServiceStatus.DRAFT.value) service = ServicePublisherRepository().save_service( self._username, service, ServiceStatus.DRAFT.value) comments = payload.get("comments", {}).get(UserType.SERVICE_PROVIDER.value, "") if bool(comments): service_provider_comment = service_factory. \ create_service_comment_entity_model(org_uuid=self._org_uuid, service_uuid=self._service_uuid, support_type="SERVICE_APPROVAL", user_type="SERVICE_PROVIDER", commented_by=self._username, comment=comments) ServicePublisherRepository().save_service_comments( service_provider_comment) service.comments = self.get_service_comments() return service.to_dict()
def get_service_for_given_service_uuid(self, org_uuid, service_uuid): try: service_db = self.session.query(Service).filter( Service.org_uuid == org_uuid).filter( Service.uuid == service_uuid).first() service = ServiceFactory( ).convert_service_db_model_to_entity_model(service_db) self.session.commit() except Exception as e: self.session.rollback() raise e return service
def save_transaction_hash_for_published_service(self, payload): service = ServiceRepository().get_service_for_given_service_uuid( self.org_uuid, self.service_uuid) if service.service_state.state == ServiceStatus.APPROVED.value: service.service_state = \ ServiceFactory().create_service_state_entity_model( self.org_uuid, self.service_uuid, ServiceStatus.PUBLISH_IN_PROGRESS.value, payload.get("transaction_hash", "")) ServiceRepository().save_service( self.username, service, ServiceStatus.PUBLISH_IN_PROGRESS.value) return StatusCode.OK
def get_service_state(self, status): try: services_state_db = self.session.query(ServiceState).filter( ServiceState.state == status).all() self.session.commit() except SQLAlchemyError as error: self.session.rollback() raise error services_state = [] for service_state_db in services_state_db: service_state = ServiceFactory.convert_service_state_from_db( service_state_db) services_state.append(service_state) return services_state
def get_list_of_service_pending_for_approval(self, limit): try: raw_services_data = self.session.query(Service) \ .join(ServiceState, Service.uuid == ServiceState.service_uuid).filter( ServiceState.state == ServiceStatus.APPROVAL_PENDING.value).limit(limit) services = [] for service in raw_services_data: services.append( ServiceFactory().convert_service_db_model_to_entity_model( service)) self.session.commit() except Exception as e: self.session.rollback() raise e return services
def save_service_attributes(self, payload): VALID_PATCH_ATTRIBUTE = ["groups"] service_db = ServicePublisherRepository( ).get_service_for_given_service_uuid(self._org_uuid, self._service_uuid) service = ServiceFactory.convert_service_db_model_to_entity_model( service_db) for attribute, value in payload.items(): if attribute in VALID_PATCH_ATTRIBUTE: if attribute == "groups": service.groups = [ ServiceFactory.create_service_group_entity_model( self._org_uuid, self._service_uuid, group) for group in payload.get("groups", []) ] else: raise Exception( "Patching of other attributes not allowed as of now") saved_service = ServicePublisherRepository().save_service( self._username, service, service.service_state.state) return saved_service.to_dict()
def get_services_for_organization(self, org_uuid, payload): try: services_db = self.session.query(Service). \ filter(getattr(Service, payload["search_attribute"]).like("%" + payload["search_string"] + "%")). \ filter(Service.org_uuid == org_uuid). \ order_by(getattr(getattr(Service, payload["sort_by"]), payload["order_by"])()). \ slice(payload["offset"], payload["limit"]).all() self.session.commit() except Exception as e: self.session.rollback() raise e services = [] for service in services_db: services.append( ServiceFactory().convert_service_db_model_to_entity_model( service)) return services
def get_last_service_comment(self, org_uuid, service_uuid, support_type, user_type): try: service_comment_db = self.session.query(ServiceComment) \ .filter(ServiceComment.org_uuid == org_uuid). \ filter(ServiceComment.service_uuid == service_uuid). \ filter(ServiceComment.support_type == support_type). \ filter(ServiceComment.user_type == user_type). \ order_by(ServiceComment.created_on.desc()).first() service_comment = ServiceFactory( ).convert_service_comment_db_model_to_entity_model( service_comment_db) self.session.commit() except Exception as e: self.session.rollback() raise e return service_comment
def get_offchain_service_config(self, org_uuid, service_uuid): try: sql_query = sqlalchemy.text( f"select * from offchain_service_config where service_uuid = '{service_uuid}' and org_uuid = '{org_uuid}'" ) result = self.session.execute(sql_query) result_as_list = result.fetchall() print(f"offchain configs :: {result_as_list}") except SQLAlchemyError as error: self.session.rollback() raise error offchain_service_config = ServiceFactory( ).convert_offchain_service_config_db_model_to_entity_model( org_uuid=org_uuid, service_uuid=service_uuid, offchain_service_configs_db=result_as_list) return offchain_service_config
def get_service_for_given_service_id_and_org_id(self, org_id, service_id): try: organization = self.session.query(Organization).filter( Organization.org_id == org_id).first() if not organization: raise Exception( f"No organization found for org_id:{org_id} service_id:{service_id}" ) org_uuid = organization.uuid service_db = self.session.query(Service).filter( Service.org_uuid == org_uuid).filter( Service.service_id == service_id).first() service = ServiceFactory( ).convert_service_db_model_to_entity_model(service_db) self.session.commit() except Exception as e: self.session.rollback() raise e return org_uuid, service
def get_service_for_given_service_id_and_org_id(self, org_id, service_id): try: service_db = self.session.query(Service). \ join(Organization, Service.org_uuid == Organization.uuid). \ filter(Organization.org_id == org_id). \ filter(Service.service_id == service_id). \ first() self.session.commit() except Exception as e: self.session.rollback() raise e if service_db: service = ServiceFactory( ).convert_service_db_model_to_entity_model(service_db) return service.org_uuid, service organization = org_repo.get_organization(org_id=org_id) if organization: return organization.uuid, None raise Exception( f"No organization found for org_id:{org_id} service_id:{service_id}" )
def test_service_to_metadata(self): payload = { "service_id": "sdfadsfd1", "display_name": "new_service_123", "short_description": "sadfasd", "description": "dsada", "project_url": "df", "proto": {}, "assets": { "proto_files": { "url": "https://ropsten-marketplace-service-assets.s3.amazonaws.com/9887ec2e099e4afd92c4a052737eaa97/services/7420bf47989e4afdb1797d1bba8090aa/proto/20200327130256_proto_files.zip", "ipfs_hash": "QmUfDprFisFeaRnmLEqks1AFN6iam5MmTh49KcomXHEiQY" }, "hero_image": { "url": "https://ropsten-marketplace-service-assets.s3.amazonaws.com/9887ec2e099e4afd92c4a052737eaa97/services/7420bf47989e4afdb1797d1bba8090aa/assets/20200323130126_asset.png", "ipfs_hash": "" }, "demo_files": { "url": "https://ropsten-marketplace-service-assets.s3.amazonaws.com/9887ec2e099e4afd92c4a052737eaa97/services/7420bf47989e4afdb1797d1bba8090aa/component/20200401121414_component.zip", "ipfs_hash": "QmUfDprFisFeaRnmLEqks1AFN6iam5MmTh49KcomXHEiQY" } }, "contributors": [{ "name": "df", "email_id": "" }], "groups": [{ "group_name": "default_group", "group_id": "a+8V4tUs+DBnZfxoh2vBHVv1pAt8pkCac8mpuKFltTo=", "free_calls": 23, "free_call_signer_address": "0x7DF35C98f41F3Af0df1dc4c7F7D4C19a71Dd059F", "pricing": [{ "default": True, "price_model": "fixed_price", "price_in_cogs": 1 }], "endpoints": { "https://example-service-a.singularitynet.io:8085": { "valid": False } }, "test_endpoints": ["https://example-service-a.singularitynet.io:8085"], "daemon_addresses": ["https://example-service-a.singularitynet.io:8085"] }], "tags": ["adsf"], "comments": { "SERVICE_PROVIDER": "", "SERVICE_APPROVER": "<div></div>" }, "mpe_address": "0x8fb1dc8df86b388c7e00689d1ecb533a160b4d0c" } service = ServiceFactory.create_service_entity_model( "", "", payload, ServiceStatus.APPROVED.value) service_metadata = service.to_metadata() assert service_metadata == { "version": 1, "display_name": "new_service_123", "encoding": "", "service_type": "", "model_ipfs_hash": "", "mpe_address": "0x8fb1dc8df86b388c7e00689d1ecb533a160b4d0c", "groups": [{ "free_calls": 23, "free_call_signer_address": "0x7DF35C98f41F3Af0df1dc4c7F7D4C19a71Dd059F", "daemon_addresses": ["https://example-service-a.singularitynet.io:8085"], "pricing": [{ "default": True, "price_model": "fixed_price", "price_in_cogs": 1 }], "endpoints": ["https://example-service-a.singularitynet.io:8085"], "group_id": "a+8V4tUs+DBnZfxoh2vBHVv1pAt8pkCac8mpuKFltTo=", "group_name": "default_group" }], "service_description": { "url": "df", "short_description": "sadfasd", "description": "dsada" }, "media": [{ "order": 1, "url": "https://ropsten-marketplace-service-assets.s3.amazonaws.com/9887ec2e099e4afd92c4a052737eaa97/services/7420bf47989e4afdb1797d1bba8090aa/assets/20200323130126_asset.png", "file_type": "image", "asset_type": "hero_image", "alt_text": "" }], 'tags': ['adsf'], "contributors": [{ "name": "df", "email_id": "" }] }
def add_service(self, service, username): service_db_model = ServiceFactory( ).convert_service_entity_model_to_db_model(username, service) self.add_item(service_db_model)
def create_service(self, payload): service_uuid = uuid4().hex service = ServiceFactory().create_service_entity_model( self._org_uuid, service_uuid, payload, ServiceStatus.DRAFT.value) ServicePublisherRepository().add_service(service, self._username) return {"org_uuid": self._org_uuid, "service_uuid": service_uuid}
from registry.infrastructure.repositories.organization_repository import OrganizationPublisherRepository from registry.infrastructure.repositories.service_publisher_repository import ServicePublisherRepository patch_all() ALLOWED_ATTRIBUTES_FOR_SERVICE_SEARCH = ["display_name"] DEFAULT_ATTRIBUTE_FOR_SERVICE_SEARCH = "display_name" ALLOWED_ATTRIBUTES_FOR_SERVICE_SORT_BY = ["ranking", "service_id"] DEFAULT_ATTRIBUTES_FOR_SERVICE_SORT_BY = "ranking" ALLOWED_ATTRIBUTES_FOR_SERVICE_ORDER_BY = ["asc", "desc"] DEFAULT_ATTRIBUTES_FOR_SERVICE_ORDER_BY = "desc" DEFAULT_OFFSET = 0 DEFAULT_LIMIT = 0 BUILD_FAILURE_CODE = 0 logger = get_logger(__name__) service_factory = ServiceFactory() boto_util = BotoUtils(region_name=REGION_NAME) class ServicePublisherService: def __init__(self, username, org_uuid, service_uuid): self._username = username self._org_uuid = org_uuid self._service_uuid = service_uuid self.obj_service_publisher_domain_service = ServicePublisherDomainService( username, org_uuid, service_uuid) def service_build_status_notifier(self, org_id, service_id, build_status): if build_status == BUILD_FAILURE_CODE: BUILD_FAIL_MESSAGE = "Build failed please check your components"
def _process_service_data(self, org_id, service_id, service_metadata, transaction_hash, metadata_uri): org_uuid, existing_service = self._get_existing_service_details( org_id, service_id) service_uuid = str(uuid4()) display_name = service_metadata.get("display_name", "") description_dict = service_metadata.get("service_description", {}) short_description = description_dict.get("short_description", "") description = description_dict.get("description", "") project_url = description_dict.get("url", "") proto = { "encoding": service_metadata.get("encoding", ""), "service_type": service_metadata.get("service_type", ""), "model_ipfs_hash": service_metadata.get("model_ipfs_hash", "") } assets = service_metadata.get("assets", {}) mpe_address = service_metadata.get("mpe_address", "") metadata_uri = "ipfs://" + metadata_uri contributors = service_metadata.get("contributors", []) tags_data = service_metadata.get("tags", []) state = \ ServiceFactory.create_service_state_entity_model(org_uuid, service_uuid, getattr(ServiceStatus, "PUBLISHED_UNAPPROVED").value) self._add_validation_attribute_to_endpoint( service_metadata.get("groups", [])) groups = [ ServiceFactory.create_service_group_entity_model( org_uuid, service_uuid, group) for group in service_metadata.get("groups", []) ] if existing_service: existing_service.display_name = display_name existing_service.short_description = short_description existing_service.description = description existing_service.project_url = project_url existing_service.proto = proto existing_service.assets = ServiceFactory.parse_service_metadata_assets( assets, existing_service.assets) existing_service.mpe_address = mpe_address existing_service.metadata_uri = metadata_uri existing_service.contributors = contributors existing_service.tags = tags_data existing_service.groups = [ ServiceFactory.create_service_group_entity_model( org_uuid, existing_service.uuid, group) for group in service_metadata.get("groups", []) ] recieved_service = Service(org_uuid, str(uuid4()), service_id, display_name, short_description, description, project_url, proto, assets, DEFAULT_SERVICE_RANKING, {}, contributors, tags_data, mpe_address, metadata_uri, groups, state) if not existing_service: self._service_repository.add_service(recieved_service, BLOCKCHAIN_USER) elif existing_service.service_state.transaction_hash is None: self._service_repository.save_service(BLOCKCHAIN_USER, existing_service, ServiceStatus.DRAFT.value) elif existing_service.service_state.transaction_hash != transaction_hash: # TODO: Implement major & minor changes self._service_repository.save_service(BLOCKCHAIN_USER, existing_service, ServiceStatus.DRAFT.value) elif existing_service.service_state.transaction_hash == transaction_hash: self.__curate_service_in_marketplace(service_id, org_id, curated=True) self._service_repository.save_service( BLOCKCHAIN_USER, existing_service, ServiceStatus.PUBLISHED.value)