class CollateralList(PaginatedListAPI): serializer = CollateralSerializer() id = StringParam("Id filter") debt_id = StringParam("debt_id filter") token = StringParam("token filter") ## oracle = StringParam("oracle filter") liquidation_ratio = StringParam("liquidation_ratio filter") balance_ration = StringParam("balance_ration filter") burn_fee = StringParam("burn_fee filter") reward_fee = StringParam("reward_fee filter") amount = StringParam("amount filter") status = StringParam("status filter") def list(self, params, meta, **kwargs): filter_params = params.copy() filter_params.pop("indent") page_size = filter_params.pop("page_size") page = filter_params.pop("page") offset = page * page_size all_objects = Collateral.objects.filter(**filter_params) count_objects = all_objects.count() meta["resource_count"] = count_objects return all_objects.skip(offset).limit(page_size)
class EventsResource(ListResource, PaginatedMixin): owner = StringParam('owner id of events') start_gt = StringParam('minimum date of event start') start_lt = StringParam('maximum date of event\'s start') order = StringParam('field to order events by', 'start') def list(self, params, meta): query = { 'owner__id': params.get('owner'), 'start__gt': params.get('start_gt'), 'start__lt': params.get('start_lt'), } events = Event.objects(**make_queryset(query)).order_by( params.get('order')) paginated_events = events.skip( params['page'] * params['page_size']).limit(params['page_size']) if events.count() > (params['page'] + 1) * params['page_size']: meta['has_more'] = True else: meta['has_more'] = False event_schema = EventSchema(many=True) result = event_schema.dump(paginated_events) self.add_pagination_meta(params, meta) return result.data @authentication_required def on_post(self, req, resp): create_schema = CreateEventSchema() data, errors = create_schema.load(json.load(req.bounded_stream)) if errors: raise falcon.HTTPBadRequest('Missing data', errors) context_user = { 'id': req.context['user']['id'], 'name': req.context['user']['name'], } event = Event(owner=context_user, ) for key, value in data.items(): setattr(event, key, value) try: event.save() except ValidationError as err: raise falcon.HTTPBadRequest('Invalid data', err.to_dict()) event_schema = EventSchema() event_result = event_schema.dump(event) resp.body = json.dumps(event_result.data) resp.status = falcon.HTTP_201
class EmailTrackingResource(SaasBase, ListAPI): allow_in_public_doc = False serializer = EmailSerializer() receiver = StringParam("Filter mail by email address") account_id = StringParam("Filter mail by account_id") provider_mail_id = StringParam("Filter mail by mailgun mail id") def __repr__(self): return "Get Email Information" def resource_name(self): return "EmailTrackingResource" @require_roles(roles=[ERoles.manager]) def list(self, params, meta, **kwargs): params.pop("indent") return self.db.email_filter(**params)
class CommitList(PaginatedListAPI): serializer = CommitSerializer() id_loan = StringParam("id_loan filter") opcode = StringParam("opcode filter") proof = StringParam("proof filter") address = StringParam("address filter") def list(self, params, meta, **kwargs): filter_params = params.copy() filter_params.pop("indent") page_size = filter_params.pop("page_size") page = filter_params.pop("page") offset = page * page_size all_objects = Commit.objects.filter(**filter_params) count_objects = all_objects.count() meta["resource_count"] = count_objects return all_objects.skip(offset).limit(page_size)
class StateList(PaginatedListAPI): serializer = StateSerializer() status = StringParam("Status filter") def list(self, params, meta, **kwargs): filter_params = params.copy() filter_params.pop("indent") page_size = filter_params.pop("page_size") page = filter_params.pop("page") offset = page * page_size all_objects = State.objects.filter(**filter_params) count_objects = all_objects.count() meta["resource_count"] = count_objects return all_objects.skip(offset).limit(page_size)
class CatList(PaginatedListCreateAPI): """ List of all cats in our API """ serializer = CatSerializer() breed = StringParam("set this param to filter cats by breed") def list(self, params, meta, **kwargs): if 'breed' in params: filtered = [ cat for cat in CATS_STORAGE if cat['breed'] == params['breed'] ] return filtered else: return CATS_STORAGE def create(self, params, meta, validated, **kwargs): validated['id'] = new_id() CATS_STORAGE.append(validated) return validated
class LoanList(PaginatedListAPI): serializer = LoanSerializer() open = BoolParam("Open filter") approved = BoolParam("Approved filter") cosigner = StringParam("Cosigner filter") cosigner__ne = StringParam("Cosigner not filter") model = StringParam("Model filter") model__ne = StringParam("Model not filter") creator = StringParam("Creator filter") creator__ne = StringParam("Creator not filter") oracle = StringParam("Oracle filter") oracle__ne = StringParam("Oracle not filter") borrower = StringParam("Borrower filter") borrower__ne = StringParam("Borrower not filter") callback = StringParam("Callback filter") canceled = BoolParam("Canceled filter") status = StringParam("Status Filter") lender = StringParam("Lender filter") lender__ne = StringParam("Lender not filter") currency = StringParam("Currency filter") currency__ne = StringParam("Currency not filter") expiration__lt = StringParam("Expiration lt") expiration__lte = StringParam("Expiration lte") expiration__gt = StringParam("Expiration gt") expiration__gte = StringParam("Expiration gte") amount__lt = StringParam("Amount lt") amount__lte = StringParam("Amount lte") amount__gt = StringParam("Amount gt") amount__gte = StringParam("Amount gte") created__lt = StringParam("Created lt") created__lte = StringParam("Created lte") created__gt = StringParam("Created gt") created__gte = StringParam("Created gte") def list(self, params, meta, **kwargs): # Filtering -> Ordering -> Limiting filter_params = params.copy() filter_params.pop("indent") page_size = filter_params.pop("page_size") page = filter_params.pop("page") offset = page * page_size all_objects = Loan.objects.filter(**filter_params) count_objects = all_objects.count() meta["resource_count"] = count_objects return all_objects.skip(offset).limit(page_size)
def test_string_param(): param = StringParam(details="stringy stringy") assert param.value("foo") == "foo"
class DebtList(PaginatedListAPI): serializer = DebtSerializer() error = BoolParam("Error filter") model = StringParam("Model filter") model__ne = StringParam("Model not filter") creator = StringParam("Creator filter") creator__ne = StringParam("Creator not filter") oracle = StringParam("Oracle filter") oracle__ne = StringParam("Oracle not filter") balance__lt = StringParam("Balance lt") balance__lte = StringParam("Balance lte") balance__gt = StringParam("Balance gt") balance__gte = StringParam("Balance gte") created__lt = StringParam("Created lt") created__lte = StringParam("Created lt") created__gt = StringParam("Created gt") created__gte = StringParam("Created gte") def list(self, params, meta, **kwargs): # Filtering -> Ordering -> Limiting filter_params = params.copy() filter_params.pop("indent") page_size = filter_params.pop("page_size") page = filter_params.pop("page") offset = page * page_size all_objects = Debt.objects.filter(**filter_params) count_objects = all_objects.count() meta["resource_count"] = count_objects return all_objects.skip(offset).limit(page_size)
class DerrivedResource(SomeResource): # note: we toggle 'required' to check if was properly overriden bar = StringParam(details="overridden parameter", required=True)
class SomeResource(Resource): foo = StringParam(details="give me foo", required=False) bar = StringParam(details="give me bar", required=False)
class SomeResource(Resource): required_param = StringParam(details="some param", required=True) optional_param = StringParam(details="some param", required=False)
class ParametrizedResource(TestResource): foo = StringParam(details="required foo!", required=True)
class LogTrackingResource(SaasBase, PaginatedListAPI): """ Log Tracking Resource #### GET Retrieve logs with level_name, function_name, page_size ang page params. Only manager user use these resource. page_size default value is 10. page default value is 0. #### Request: ```bash #bash curl \\ --request GET \\ --header "Content-Type: application/json" \\ --header "AUTHORIZATION: 0sOEQfyptM0ZG7kJYkNxmswp_p5y9iX5t61KI1qH83w" \\ https://api_baseurl/api/v1/log-tracking?level_name=ERROR&page_size=5&page=1&function_name=find_redis_role ``` ```python #pyhon import requests import json header = { "Content-Type": "application/json", "AUTHORIZATION": "0sOEQfyptM0ZG7kJYkNxmswp_p5y9iX5t61KI1qH83w" } req = requests.get("https://api_baseurl/api/v1/log-tracking?level_name=ERROR&page_size=5&page=1&function_name=find_redis_role", header=header) ``` #### Response: 200 OK. ```json { "content": [ { "amount": "7", "creationTime": "2018-02-06 15:55:51.628340", "description": "NOAUTH Authentication required.", "functionName": "find_redis_role", "id": "ba37d570c3364a0abf6681133552ed06", "levelName": "ERROR" } ], "meta": { "next": "page=2&page_size=5", "page": 1, "page_size": 5, "params": { "function_name": "find_redis_role", "indent": 0, "level_name": "ERROR", "page": 1, "page_size": 5 }, "prev": "page=0&page_size=5" } } ``` """ allow_in_public_doc = False serializer = LogTrackingSerializer() level_name = StringParam( "Filter logs by log level. Log level type : WARNING, ERROR", validators=[log_level_validator]) function_name = StringParam("Filter logs by function_name") def __repr__(self): return "Log Tracking" def resource_name(self): return "LogTrackingResource" @require_roles(roles=[ERoles.manager]) def list(self, params, meta, **kwargs): page_size = params["page_size"] page = params["page"] filter_params = { key: value for key, value in params.items() if key not in ['page_size', 'page', 'indent'] } logs = self.db.paginated_filter(model=Log, order_field=Log.creation_time, page_size=page_size, page=page, **filter_params) if self.db.count(Log, **filter_params) > (page_size + 1) * page: meta['has_more'] = True return logs
class CompleteLoanList(PaginatedListAPI): serializer = CompleteLoanSerializer() open = BoolParam("Open filter") approved = BoolParam("Approved filter") cosigner = StringParam("Cosigner filter") cosigner__ne = StringParam("Cosigner not filter") model = StringParam("Model filter") model__ne = StringParam("Model not filter") creator = StringParam("Creator filter") creator__ne = StringParam("Creator not filter") oracle = StringParam("Oracle filter") oracle__ne = StringParam("Oracle not filter") borrower = StringParam("Borrower filter") borrower__ne = StringParam("Borrower not filter") callback = StringParam("Callback filter") canceled = BoolParam("Canceled filter") status = StringParam("Status Filter") lender = StringParam("Lender filter") lender__ne = StringParam("Lender not filter") currency = StringParam("Currency filter") currency__ne = StringParam("Currency not filter") expiration__lt = StringParam("Expiration lt") expiration__lte = StringParam("Expiration lte") expiration__gt = StringParam("Expiration gt") expiration__gte = StringParam("Expiration gte") amount__lt = StringParam("Amount lt") amount__lte = StringParam("Amount lte") amount__gt = StringParam("Amount gt") amount__gte = StringParam("Amount gte") created__lt = StringParam("Created lt") created__lte = StringParam("Created lte") created__gt = StringParam("Created gt") created__gte = StringParam("Created gte") def list(self, params, meta, **kwargs): # Filtering -> Ordering -> Limiting filter_params = params.copy() filter_params.pop("indent") page_size = filter_params.pop("page_size") page = filter_params.pop("page") offset = page * page_size all_objects = Loan.objects.filter(**filter_params) count_objects = all_objects.count() meta["resource_count"] = count_objects loan_filtered = all_objects.skip(offset).limit(page_size) complete_loans = loan_filtered.aggregate( [ {"$lookup": {"from": "debt", "localField": "_id", "foreignField": "_id", "as": "debt"}}, {"$lookup": {"from": "config", "localField": "_id", "foreignField": "_id", "as": "config"}}, {"$lookup": {"from": "state", "localField": "_id", "foreignField": "_id", "as": "state"}}, {"$lookup": {"from": "collateral", "localField": "_id", "foreignField": "debt_id", "as": "collaterals"}}, { "$unwind": { "path": "$debt", "preserveNullAndEmptyArrays": True }}, { "$unwind": { "path": "$state", "preserveNullAndEmptyArrays": True }}, { "$unwind": { "path": "$config", "preserveNullAndEmptyArrays": True }}, { "$project": { "id": 1, "open": 1, "approved": 1, "position": 1, "expiration": 1, "amount": 1, "cosigner": 1, "model": 1, "creator": 1, "oracle": 1, "borrower": 1, "callback": 1, "salt": 1, "loanData": 1, "created": 1, "descriptor": 1, "currency": 1, "lender": 1, "status": 1, "canceled": 1, "debt": 1, "state": 1, "collaterals": 1, "config": "$config.data", "id": 1, "open": 1 } } ] ) return list(complete_loans)
class SomeResource(Resource): foo = StringParam(details="give me foo", many=True)
class ResourceWithDefaults(Resource): foo = StringParam(details="foo with defaults", default="default") bar = StringParam(details="bar w/o default")
class CatList(PaginatedListCreateAPI): def allowed_methods(self): """Return list of allowed HTTP methods on this resource. This is only for purpose of making resource description. Returns: list: list of allowed HTTP method names (uppercase) """ alloweds = [] map = { "GET": ["retrieve", "list"], "POST": ["create"], "PUT": ["update"], "PATCH": ["create_bulk"], "DELETE": ["delete"], "HEAD": ["on_head"], "OPTIONS": ["on_options"]} for method in map.keys(): attr_list = [getattr(self, m, False) for m in map[method]] if any(attr_list): for attr in attr_list: if attr and attr.__doc__ != "Not Implemented": alloweds.append(method) return alloweds """ Get a unique message identified by `message_id`. > Warning > > This resource is available only version 1. Please be sure the body is empty. You can not > send extra parameters like, `title`, `body`, `receiver`, etc. Message response is a json string containing message details, such as: ```json { "title": "Hello World!", "body": "This message is sent by someone who you might know or maybe not!", "id": "FH4DJ90HF1USD9879SIPXAZ" } ``` > Warning > > Response always contains `id`, `title` and `body` and optionally `receiver`, `sender`. > Do not send `sender` while using API version 2.0. > > See here new paragraph starts. Warning ends and regular API explanation goes on here. Message is any ### Code Examples: ```bash curl \\ --request POST \\ --header "Content-Type: application/json; charset=utf-8" \\ --header "Authorization: Basic a42069f7b356f2e9189a88d1a4c7fa647b223cd8c81580b673c3ae37f7e4e102" \\ --data-binary "{\"project_id\": \"b4392fdb-b6cd-4f3c-82f3-dacf0b3d6432\", \\ \"body\": {\"tr\": \"Hello World\"}, \\ \"message_tag\": [\"receieved\"]}" \\ https://zopsm.io/api/v1/message ``` ```python import requests import json header = {"Content-Type": "application/json; charset=utf-8", "Authorization": "Basic a42069f7b356f2e9189a88d1a4c7fa647b223cd8c81580b673c3ae37f7e4e102"} payload = {"project_id": "b4392fdb-b6cd-4f3c-82f3-dacf0b3d6432", "message_tag": ["receieved"], "body": {"tr": "Hello World!"}} req = requests.post("https://zopsm.io/api/v1/messages", headers=header, data=json.dumps(payload)) print(req.status_code, req.reason) ``` ### Possible Errors Alognside with generic ones, endpoint can respond with costum errors below: - __Message Not Found__: Probably you try to get a deleted or non-existent message. - __Illegal Operand__: Please check definition of sets, they must be declared as shown in fields table. """ serializer = CatSerializer() breed = StringParam("set this param to filter cats by breed") def list(self, params, meta, **kwargs): if 'breed' in params: filtered = [ cat for cat in CATS_STORAGE if cat['breed'] == params['breed'] ] return filtered else: return CATS_STORAGE def create(self, params, meta, **kwargs): """Not Implemented""" pass def create_bulk(self, params, meta, **kwargs): """Not Implemented""" pass