From 3814fdef232b51ad2948cdac878c8df66d14b0b1 Mon Sep 17 00:00:00 2001 From: Andrey Dolgolev Date: Tue, 27 Jul 2021 18:08:40 +0300 Subject: [PATCH 1/4] Add initial subscription backend. --- backend/moonstream/data.py | 34 ++++++++- backend/moonstream/routes/subscriptions.py | 83 +++++++++++++++++++--- backend/moonstream/settings.py | 2 +- 3 files changed, 108 insertions(+), 11 deletions(-) diff --git a/backend/moonstream/data.py b/backend/moonstream/data.py index aba1ca8b..85c902b2 100644 --- a/backend/moonstream/data.py +++ b/backend/moonstream/data.py @@ -1,11 +1,41 @@ """ Pydantic schemas for the Moonstream HTTP API """ -from typing import List +from enum import Enum +from typing import List, Optional + from pydantic import BaseModel, Field +class SubscriptionTypeResourceData(BaseModel): + id: str + name: str + description: str + subscription_plan_id: Optional[str] = None + active: bool = False + + +class SubscriptionTypesListResponce(BaseModel): + subscriptions: List[SubscriptionTypeResourceData] = Field(default_factory=list) + + +class SubscriptionResourceData(BaseModel): + id: str + address: str + color: str + label: str + user_id: str + subscription_type_id: str + + +class CreateSubscriptionRequest(BaseModel): + address: str + color: str + label: str + subscription_type_id: str + + class PingResponse(BaseModel): """ Schema for ping response @@ -40,4 +70,4 @@ class SubscriptionResponse(BaseModel): class SubscriptionsListResponse(BaseModel): - subscriptions: List[SubscriptionResponse] = Field(default_factory=list) + subscriptions: List[SubscriptionResourceData] = Field(default_factory=list) diff --git a/backend/moonstream/routes/subscriptions.py b/backend/moonstream/routes/subscriptions.py index 22ea4b34..72937df4 100644 --- a/backend/moonstream/routes/subscriptions.py +++ b/backend/moonstream/routes/subscriptions.py @@ -2,7 +2,7 @@ The Moonstream subscriptions HTTP API """ import logging -from typing import Dict +from typing import Dict, List from bugout.data import BugoutResource, BugoutResources from bugout.exceptions import BugoutResponseException @@ -49,18 +49,47 @@ whitelist_paths.update(DOCS_PATHS) app.add_middleware(BroodAuthMiddleware, whitelist=whitelist_paths) -@app.post("/", tags=["subscriptions"], response_model=data.SubscriptionResponse) +@app.post("/", tags=["subscriptions"], response_model=data.SubscriptionResourceData) async def add_subscription_handler( - request: Request, subscription_data: data.SubscriptionRequest = Body(...) -) -> data.SubscriptionResponse: + request: Request, subscription_data: data.CreateSubscriptionRequest = Body(...) +) -> data.SubscriptionResourceData: """ Add subscription to blockchain stream data for user. """ + token = request.state.token + + params = {"type": "subscription_type"} + + # request availble subscriptions + try: + subscription_resources: BugoutResources = bc.list_resources( + token=token, params=params + ) + except BugoutResponseException as e: + raise HTTPException(status_code=e.status_code, detail=e.detail) + except Exception as e: + raise HTTPException(status_code=500) + + # allowed subscriptions + subscription_ids_list = [ + resource.resource_data["id"] for resource in subscription_resources.resources + ] + + if subscription_data.subscription_type_id not in subscription_ids_list: + raise HTTPException( + status_code=403, detail="Subscription type is not avilable." + ) + user = request.state.user + + # chek if that contract not already setted up + resource_data = {"user_id": str(user.id)} resource_data.update(subscription_data) + try: + resource: BugoutResource = bc.create_resource( token=token, application_id=MOONSTREAM_APPLICATION_ID, @@ -70,9 +99,14 @@ async def add_subscription_handler( raise HTTPException(status_code=e.status_code, detail=e.detail) except Exception as e: raise HTTPException(status_code=500) - return data.SubscriptionResponse( + + return data.SubscriptionResourceData( + id=str(resource.id), user_id=resource.resource_data["user_id"], - blockchain=resource.resource_data["blockchain"], + address=resource.resource_data["address"], + color=resource.resource_data["color"], + label=resource.resource_data["label"], + subscription_type_id=resource.resource_data["subscription_type_id"], ) @@ -86,15 +120,48 @@ async def get_subscriptions_handler(request: Request) -> data.SubscriptionsListR try: resources: BugoutResources = bc.list_resources(token=token, params=params) except BugoutResponseException as e: + if e.detail == "Resources not found": + return data.SubscriptionsListResponse(subscriptions=[]) raise HTTPException(status_code=e.status_code, detail=e.detail) except Exception as e: raise HTTPException(status_code=500) + return data.SubscriptionsListResponse( subscriptions=[ - data.SubscriptionResponse( + data.SubscriptionResourceData( + id=str(resource.id), user_id=resource.resource_data["user_id"], - blockchain=resource.resource_data["blockchain"], + address=resource.resource_data["address"], + color=resource.resource_data["color"], + label=resource.resource_data["label"], + subscription_type_id=resource.resource_data["subscription_type_id"], ) for resource in resources.resources ] ) + + +@app.get( + "/types", tags=["subscriptions"], response_model=data.SubscriptionTypesListResponce +) +async def get_available_subscriptions_type( + request: Request, +) -> data.SubscriptionTypesListResponce: + + """ + Get available's subscriptions types. + """ + token = request.state.token + params = {"type": "subscription_type"} + try: + resources: BugoutResources = bc.list_resources(token=token, params=params) + except BugoutResponseException as e: + raise HTTPException(status_code=e.status_code, detail=e.detail) + except Exception as e: + raise HTTPException(status_code=500) + return data.SubscriptionTypesListResponce( + subscriptions=[ + data.SubscriptionTypeResourceData.validate(resource.resource_data) + for resource in resources.resources + ] + ) diff --git a/backend/moonstream/settings.py b/backend/moonstream/settings.py index c524be5a..714908d7 100644 --- a/backend/moonstream/settings.py +++ b/backend/moonstream/settings.py @@ -3,7 +3,7 @@ import os from bugout.app import Bugout # Bugout -bugout_client = Bugout() +bugout_client = Bugout(brood_api_url="http://127.0.0.1:7474", spire_api_url="http://127.0.0.1:7475") MOONSTREAM_APPLICATION_ID = os.environ.get("MOONSTREAM_APPLICATION_ID") if MOONSTREAM_APPLICATION_ID is None: From 7acb7e5c118e91e41a40ea6de037429c98f54ebb Mon Sep 17 00:00:00 2001 From: Andrey Dolgolev Date: Tue, 27 Jul 2021 19:51:32 +0300 Subject: [PATCH 2/4] Add delete. --- backend/moonstream/routes/subscriptions.py | 42 ++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/backend/moonstream/routes/subscriptions.py b/backend/moonstream/routes/subscriptions.py index 72937df4..3c2959ac 100644 --- a/backend/moonstream/routes/subscriptions.py +++ b/backend/moonstream/routes/subscriptions.py @@ -6,7 +6,7 @@ from typing import Dict, List from bugout.data import BugoutResource, BugoutResources from bugout.exceptions import BugoutResponseException -from fastapi import Body, FastAPI, HTTPException, Request +from fastapi import Body, FastAPI, HTTPException, Request, Form from fastapi.middleware.cors import CORSMiddleware from .. import data @@ -51,11 +51,21 @@ app.add_middleware(BroodAuthMiddleware, whitelist=whitelist_paths) @app.post("/", tags=["subscriptions"], response_model=data.SubscriptionResourceData) async def add_subscription_handler( - request: Request, subscription_data: data.CreateSubscriptionRequest = Body(...) + request: Request, # subscription_data: data.CreateSubscriptionRequest = Body(...) + address: str = Form(...), + color: str = Form(...), + label: str = Form(...), + subscription_type_id: str = Form(...), ) -> data.SubscriptionResourceData: """ Add subscription to blockchain stream data for user. """ + subscription_data = data.CreateSubscriptionRequest( + address=address, + color=color, + label=label, + subscription_type_id=subscription_type_id, + ) token = request.state.token @@ -110,6 +120,34 @@ async def add_subscription_handler( ) +@app.delete( + "/{subscription_id}", + tags=["subscriptions"], + response_model=data.SubscriptionResourceData, +) +async def delete_subscription_handler(request: Request, subscription_id: str): + """ + Delete subscriptions. + """ + + token = request.state.token + try: + deleted_resource = bc.delete_resource(token=token, resource_id=subscription_id) + except BugoutResponseException as e: + raise HTTPException(status_code=e.status_code, detail=e.detail) + except Exception as e: + raise HTTPException(status_code=500) + + return data.SubscriptionResourceData( + id=str(deleted_resource.id), + user_id=deleted_resource.resource_data["user_id"], + address=deleted_resource.resource_data["address"], + color=deleted_resource.resource_data["color"], + label=deleted_resource.resource_data["label"], + subscription_type_id=deleted_resource.resource_data["subscription_type_id"], + ) + + @app.get("/", tags=["subscriptions"], response_model=data.SubscriptionsListResponse) async def get_subscriptions_handler(request: Request) -> data.SubscriptionsListResponse: """ From b6cf0f079c8f715736f346ecef568872d2a27349 Mon Sep 17 00:00:00 2001 From: Andrey Dolgolev Date: Tue, 27 Jul 2021 19:53:50 +0300 Subject: [PATCH 3/4] black formating. --- backend/moonstream/settings.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/backend/moonstream/settings.py b/backend/moonstream/settings.py index 714908d7..2bbaf572 100644 --- a/backend/moonstream/settings.py +++ b/backend/moonstream/settings.py @@ -3,7 +3,9 @@ import os from bugout.app import Bugout # Bugout -bugout_client = Bugout(brood_api_url="http://127.0.0.1:7474", spire_api_url="http://127.0.0.1:7475") +bugout_client = Bugout( + brood_api_url="http://127.0.0.1:7474", spire_api_url="http://127.0.0.1:7475" +) MOONSTREAM_APPLICATION_ID = os.environ.get("MOONSTREAM_APPLICATION_ID") if MOONSTREAM_APPLICATION_ID is None: From 9a70468e7ecd70fc8e2cf98d9922568ecd50f7fa Mon Sep 17 00:00:00 2001 From: Andrey Dolgolev Date: Tue, 27 Jul 2021 19:57:12 +0300 Subject: [PATCH 4/4] Remove not required enviroments. --- backend/moonstream/settings.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/backend/moonstream/settings.py b/backend/moonstream/settings.py index 2bbaf572..c524be5a 100644 --- a/backend/moonstream/settings.py +++ b/backend/moonstream/settings.py @@ -3,9 +3,7 @@ import os from bugout.app import Bugout # Bugout -bugout_client = Bugout( - brood_api_url="http://127.0.0.1:7474", spire_api_url="http://127.0.0.1:7475" -) +bugout_client = Bugout() MOONSTREAM_APPLICATION_ID = os.environ.get("MOONSTREAM_APPLICATION_ID") if MOONSTREAM_APPLICATION_ID is None: