Skip to content
This repository was archived by the owner on May 23, 2023. It is now read-only.

Commit 1cc2c0a

Browse files
Lambda API - Criado método para a comunicação com a SQS que consequentemente vai disparar a lambda de SQS
1 parent 2881e25 commit 1cc2c0a

File tree

16 files changed

+472
-75
lines changed

16 files changed

+472
-75
lines changed

examples/lambda_api/app.py

Lines changed: 114 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,18 @@
11
import base64
22
import os
3-
from lambda_app.boot import load_dot_env
3+
from lambda_app.boot import load_dot_env,register_vendor
4+
register_vendor()
45

56
# load env
67
from lambda_app.config import get_config
8+
from lambda_app.enums.events import EventType
9+
from lambda_app.enums.messages import MessagesEnum
10+
from lambda_app.events.tracker import EventTracker
11+
from lambda_app.exceptions import ApiException
12+
from lambda_app.http_resources.request import ApiRequest
13+
from lambda_app.http_resources.response import ApiResponse
14+
from lambda_app.services.v1.ocoren_event_service import OcorenEventService
15+
from lambda_app.vos.events import EventVO
716

817
env = os.environ['ENVIRONMENT_NAME'] if 'ENVIRONMENT_NAME' in os.environ else None
918
load_dot_env(env)
@@ -15,6 +24,7 @@
1524
from lambda_app.lambda_flask import LambdaFlask
1625
from lambda_app.openapi import spec, get_doc, generate_openapi_yml
1726
from lambda_app.openapi import api_schemas
27+
from lambda_app.services.event_manager import EventManager
1828

1929
# config
2030
config = get_config()
@@ -87,8 +97,111 @@ def openapi():
8797
return http_helper.create_response(body=html, status_code=200, headers=headers)
8898

8999

100+
@app.route('/v1/event/<event_type>', methods=['POST'])
101+
def event_create(event_type):
102+
"""
103+
:param event_type:
104+
:return:
105+
---
106+
post:
107+
summary: Create event
108+
parameters:
109+
- in: path
110+
name: event_type
111+
description: "Event type"
112+
required: true
113+
schema:
114+
type: string
115+
example: ocoren-event
116+
requestBody:
117+
description: 'Event to be created'
118+
required: true
119+
content:
120+
application/json:
121+
schema: EventCreateRequest
122+
responses:
123+
200:
124+
content:
125+
application/json:
126+
schema: EventCreateResponseSchema
127+
4xx:
128+
content:
129+
application/json:
130+
schema: EventCreateErrorResponseSchema
131+
"""
132+
request = ApiRequest().parse_request(app)
133+
logger.info('event_type: {}'.format(event_type))
134+
logger.info('request: {}'.format(request))
135+
136+
event_tracker = EventTracker(logger)
137+
138+
status_code = 200
139+
response = ApiResponse(request)
140+
response.set_hateos(False)
141+
try:
142+
# event_type validation
143+
if EventType.from_value(event_type) not in EventType.get_public_events():
144+
exception = ApiException(MessagesEnum.EVENT_TYPE_UNKNOWN_ERROR)
145+
exception.set_message_params([event_type])
146+
raise exception
147+
148+
event_vo = EventVO(event_type=event_type, data=request.where)
149+
# if EventType.from_value(event_type) == EventType.OCOREN_EVENT:
150+
# event_service = OcorenEventService()
151+
# else:
152+
# event_service = ProductEventService()
153+
event_service = OcorenEventService()
154+
service = EventManager(logger=logger, event_service=event_service)
155+
result = service.process(event_vo)
156+
event_hash = event_vo.hash
157+
158+
event_tracker.track(event_hash, event_vo.to_dict())
159+
160+
if result:
161+
code = MessagesEnum.EVENT_REGISTERED_WITH_SUCCESS.code
162+
label = MessagesEnum.EVENT_REGISTERED_WITH_SUCCESS.label
163+
message = MessagesEnum.EVENT_REGISTERED_WITH_SUCCESS.message
164+
params = None
165+
else:
166+
if isinstance(service.exception, ApiException):
167+
raise service.exception
168+
else:
169+
raise ApiException(MessagesEnum.INTERNAL_SERVER_ERROR)
170+
except Exception as err:
171+
logger.error(err)
172+
result = False
173+
event_hash = None
174+
if isinstance(err, ApiException):
175+
api_ex = err
176+
status_code = 400
177+
else:
178+
api_ex = ApiException(MessagesEnum.CREATE_ERROR)
179+
status_code = 500
180+
181+
code = api_ex.code
182+
label = api_ex.label
183+
message = api_ex.message
184+
params = api_ex.params
185+
186+
data = {
187+
"result": result,
188+
"event_hash": event_hash,
189+
"code": code,
190+
"label": label,
191+
"message": message,
192+
"params": params
193+
}
194+
195+
response.set_data(data)
196+
197+
event_tracker.track(event_hash, data)
198+
return response.get_response(status_code)
199+
200+
90201
# doc
91202
spec.path(view=alive, path="/alive", operations=get_doc(alive))
203+
# spec.path(view=event_list, path="/v1/event/{event_type}", operations=get_doc(event_list))
204+
spec.path(view=event_create, path="/v1/event/{event_type}", operations=get_doc(event_create))
92205

93206
print_routes(app, logger)
94207
logger.info('Running at {}'.format(os.environ['APP_ENV']))

examples/lambda_api/docker-compose.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,12 @@ services:
4242
- "9070:9070"
4343
- "8080:8080"
4444
environment:
45-
SERVICES: sqs,lambda,cloudwatch
45+
SERVICES: sqs,lambda,cloudwatch,s3
4646
DOCKER_HOST: unix:///var/run/docker.sock
4747
PORT_WEB_UI: 9070
48-
LAMBDA_EXECUTOR: docker
48+
#LAMBDA_EXECUTOR: docker # está dando erro via docker
49+
LAMBDA_EXECUTOR: local
4950
DEBUG: 1
50-
HOSTNAME: localstack
5151
HOSTNAME_EXTERNAL: localstack
5252
networks:
5353
- service-python

examples/lambda_api/env/development.env

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ REGION_NAME=us-east-1
66
SQS_ENDPOINT=http://0.0.0.0:4566
77
SQS_LOCALSTACK=http://0.0.0.0:4566
88
APP_QUEUE=http://0.0.0.0:4566/000000000000/test-queue
9-
API_SERVER=https://localhost:5000
9+
API_SERVER=http://localhost:5000
1010
API_SERVER_DESCRIPTION=Staging server
1111
LOCAL_API_SERVER=http://localhost:5000
1212
LOCAL_API_SERVER_DESCRIPTION=Development server

examples/lambda_api/lambda_app/config.py

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,6 @@ class Configuration:
2828
DB = ""
2929

3030
APP_QUEUE = ""
31-
APP_SALES_QUEUE = ""
32-
APP_DECISION_QUEUE = ""
33-
APP_RULES_QUEUE = ""
3431

3532
REDIS_HOST = ""
3633
REDIS_PORT = 6379
@@ -55,10 +52,6 @@ def __init__(self):
5552
self.DB = os.getenv("DB") if 'DB' in os.environ else self.DB
5653

5754
self.APP_QUEUE = os.getenv("APP_QUEUE") if 'APP_QUEUE' in os.environ else self.APP_QUEUE
58-
self.APP_SALES_QUEUE = os.getenv("APP_SALES_QUEUE") if 'APP_SALES_QUEUE' in os.environ else self.APP_SALES_QUEUE
59-
self.APP_DECISION_QUEUE = os.getenv(
60-
"APP_DECISION_QUEUE") if 'APP_DECISION_QUEUE' in os.environ else self.APP_DECISION_QUEUE
61-
self.APP_RULES_QUEUE = os.getenv("APP_RULES_QUEUE") if 'APP_RULES_QUEUE' in os.environ else self.APP_RULES_QUEUE
6255

6356
self.REDIS_HOST = os.getenv("REDIS_HOST") if 'REDIS_HOST' in os.environ else self.REDIS_HOST
6457
self.REDIS_PORT = os.getenv("REDIS_PORT") if 'REDIS_PORT' in os.environ else self.REDIS_PORT
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
2+
from lambda_app.enums import CustomStringEnum
3+
4+
5+
class EventType(CustomStringEnum):
6+
UNKNOWN = 'unknown'
7+
OCOREN_EVENT = 'ocoren-event'
8+
9+
@classmethod
10+
def get_public_events(cls):
11+
return [cls.OCOREN_EVENT]
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
from lambda_app.logging import get_logger
2+
3+
4+
class EventTracker:
5+
def __init__(self, logger=None):
6+
"""
7+
# This cant import get_config
8+
:param logger:
9+
"""
10+
# logger
11+
self.logger = logger if logger is not None else get_logger()
12+
# last_exception
13+
self.exception = None
14+
15+
def track(self, event_hash, event_data):
16+
self.logger.info('Track event: {} - {}'.format(event_hash, event_data))
17+
18+
def track_error(self, event_hash, event_data, exception):
19+
self.logger.error('Track event: {} - {} - {}'.format(event_hash, event_data, exception))

examples/lambda_api/lambda_app/http_resources/request.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22
import json
33
import uuid
44

5-
from flask_app import helper
6-
from flask_app.http_resources.request_control import Pagination, Order
7-
from flask_app.http_resources.parsers.flask_request_parser import FlaskRequestParser
5+
from lambda_app import helper
6+
from lambda_app.http_resources.request_control import Pagination, Order
7+
from lambda_app.http_resources.parsers.flask_request_parser import FlaskRequestParser
88
from flask import request
99

1010

examples/lambda_api/lambda_app/http_resources/response.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import json
22

33
from flask import Response
4-
from flask_app import helper
5-
from flask_app.enums.messages import MessagesEnum
6-
from flask_app.exceptions import ApiException
7-
from flask_app.http_resources.request_control import Pagination
8-
from flask_app.http_helper import CUSTOM_DEFAULT_HEADERS
4+
from lambda_app import helper
5+
from lambda_app.enums.messages import MessagesEnum
6+
from lambda_app.exceptions import ApiException
7+
from lambda_app.http_resources.request_control import Pagination
8+
from lambda_app.http_helper import CUSTOM_DEFAULT_HEADERS
99

1010

1111
class ApiResponse:

examples/lambda_api/lambda_app/openapi/api_schemas.py

Lines changed: 58 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -5,62 +5,67 @@
55
from lambda_app.openapi.schemas import DeletionSchema, RequestControlSchema, MetaSchema, LinkSchema
66

77

8-
# class EventSchema(Schema):
9-
# type = fields.Str()
10-
# data = fields.Dict()
11-
# date = fields.DateTime(example="2021-05-03T19:41:36.315842-03:00")
12-
# hash = fields.Str(example="406cce9743906f7b8d7dd5d5c5d8c95d820eeefd72a3a554a4a726d022d8fa19")
8+
class EventSchema(Schema):
9+
type = fields.Str()
10+
data = fields.Dict()
11+
date = fields.DateTime(example="2021-05-03T19:41:36.315842-03:00")
12+
hash = fields.Str(example="406cce9743906f7b8d7dd5d5c5d8c95d820eeefd72a3a554a4a726d022d8fa19")
13+
14+
15+
class OcorenSchema(Schema):
16+
chavenfe = fields.Str(example="32210206107255000134550010001712551245826554")
17+
ocor = fields.Str(example="MOTIVO DO CANCELAMENTO")
18+
origem = fields.Str(example="SAC/EAGLE")
19+
pedido = fields.Str(example="Z1223321")
1320

1421

1522
class ProductSchema(Schema):
1623
sku = fields.Int(example=657705)
1724
quantity = fields.Int(example=1)
1825

19-
#
20-
# class EventCreateRequest(Schema):
21-
# order_id = fields.Int(example=134569)
22-
# products = fields.List(fields.Nested(ProductSchema))
23-
#
24-
#
25-
# class EventUpdateRequest(EventCreateRequest):
26-
# pass
27-
#
28-
#
29-
# class EventListResponseSchema(Schema):
30-
# data = fields.List(fields.Nested(EventSchema))
31-
# control = fields.Nested(RequestControlSchema)
32-
# meta = fields.Nested(MetaSchema)
33-
# links = fields.List(fields.Nested(LinkSchema))
34-
#
35-
#
36-
# class EventGetResponseSchema(Schema):
37-
# data = fields.Nested(EventSchema)
38-
# control = fields.Nested(RequestControlSchema)
39-
# meta = fields.Nested(MetaSchema)
40-
# links = fields.List(fields.Nested(LinkSchema))
41-
#
42-
#
43-
# class EventCreateResponseSchema(Schema):
44-
# result = fields.Bool(example=True)
45-
# event_hash = fields.Str(example="c82bf3ee20dd2f4ae7109e52d313a3190f1a85ba3362c54d3eb6257bd0c4d69d")
46-
# code = fields.Int(example=MessagesEnum.EVENT_REGISTERED_WITH_SUCCESS.code)
47-
# label = fields.String(example=MessagesEnum.EVENT_REGISTERED_WITH_SUCCESS.label)
48-
# message = fields.String(example=MessagesEnum.EVENT_REGISTERED_WITH_SUCCESS.message)
49-
# params = fields.List(fields.Str())
50-
#
51-
#
52-
# class EventCreateErrorResponseSchema(Schema):
53-
# result = fields.Bool(example=False)
54-
# event_hash = fields.Str(example=None)
55-
# code = fields.Int(example=MessagesEnum.EVENT_TYPE_UNKNOWN_ERROR.code)
56-
# label = fields.String(example=MessagesEnum.EVENT_TYPE_UNKNOWN_ERROR.label)
57-
# message = fields.String(example=MessagesEnum.EVENT_TYPE_UNKNOWN_ERROR.message)
58-
# params = fields.List(fields.Str())
59-
#
60-
#
61-
# class EventUpdateResponseSchema(EventGetResponseSchema):
62-
# pass
63-
#
64-
#
65-
# class EventDeleteResponseSchema(EventGetResponseSchema):
66-
# data = fields.Nested(DeletionSchema)
26+
27+
class EventCreateRequest(OcorenSchema):
28+
pass
29+
30+
class EventUpdateRequest(EventCreateRequest):
31+
pass
32+
33+
34+
class EventListResponseSchema(Schema):
35+
data = fields.List(fields.Nested(EventSchema))
36+
control = fields.Nested(RequestControlSchema)
37+
meta = fields.Nested(MetaSchema)
38+
links = fields.List(fields.Nested(LinkSchema))
39+
40+
41+
class EventGetResponseSchema(Schema):
42+
data = fields.Nested(EventSchema)
43+
control = fields.Nested(RequestControlSchema)
44+
meta = fields.Nested(MetaSchema)
45+
links = fields.List(fields.Nested(LinkSchema))
46+
47+
48+
class EventCreateResponseSchema(Schema):
49+
result = fields.Bool(example=True)
50+
event_hash = fields.Str(example="c82bf3ee20dd2f4ae7109e52d313a3190f1a85ba3362c54d3eb6257bd0c4d69d")
51+
code = fields.Int(example=MessagesEnum.EVENT_REGISTERED_WITH_SUCCESS.code)
52+
label = fields.String(example=MessagesEnum.EVENT_REGISTERED_WITH_SUCCESS.label)
53+
message = fields.String(example=MessagesEnum.EVENT_REGISTERED_WITH_SUCCESS.message)
54+
params = fields.List(fields.Str())
55+
56+
57+
class EventCreateErrorResponseSchema(Schema):
58+
result = fields.Bool(example=False)
59+
event_hash = fields.Str(example=None)
60+
code = fields.Int(example=MessagesEnum.EVENT_TYPE_UNKNOWN_ERROR.code)
61+
label = fields.String(example=MessagesEnum.EVENT_TYPE_UNKNOWN_ERROR.label)
62+
message = fields.String(example=MessagesEnum.EVENT_TYPE_UNKNOWN_ERROR.message)
63+
params = fields.List(fields.Str())
64+
65+
66+
class EventUpdateResponseSchema(EventGetResponseSchema):
67+
pass
68+
69+
70+
class EventDeleteResponseSchema(EventGetResponseSchema):
71+
data = fields.Nested(DeletionSchema)

0 commit comments

Comments
 (0)