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

Commit a5ddcf7

Browse files
Correções gerais, versionamento de repositórios e serviços, implementação de restful para produts (rota de listagem)
1 parent b43db14 commit a5ddcf7

File tree

32 files changed

+560
-111
lines changed

32 files changed

+560
-111
lines changed

examples/lambda_api/app.py

Lines changed: 121 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@
22
33
This module contains the handler method
44
"""
5-
import boot
5+
import inspect
66
import os
77
import base64
8+
import boot
9+
from lambda_app.services.product_manager import ProductManager
810
from lambda_app.services.v1.healthcheck import HealthCheckSchema
911
from lambda_app.services.v1.healthcheck.resources import \
1012
MysqlConnectionHealthCheck, RedisConnectionHealthCheck, \
@@ -17,7 +19,8 @@
1719
from lambda_app.exceptions import ApiException
1820
from lambda_app.http_resources.request import ApiRequest
1921
from lambda_app.http_resources.response import ApiResponse
20-
from lambda_app.services.v1.ocoren_event_service import OcorenEventService
22+
from lambda_app.services.v1.ocoren_event_service import OcorenEventService as OcorenEventServiceV1
23+
from lambda_app.services.v1.product_service import ProductService as ProductServiceV1
2124
from lambda_app.vos.events import EventVO
2225
from lambda_app.logging import get_logger
2326
from lambda_app import APP_NAME, APP_VERSION, http_helper
@@ -33,7 +36,6 @@
3336
ENV = helper.get_environment()
3437
boot.load_dot_env(ENV)
3538

36-
3739
# config
3840
CONFIG = get_config()
3941
# debug
@@ -129,6 +131,101 @@ def openapi():
129131
body=html, status_code=200, headers=headers)
130132

131133

134+
@APP.route('/v1/product', methods=['GET'])
135+
def product_list():
136+
"""
137+
---
138+
get:
139+
summary: Product List
140+
parameters:
141+
- name: limit
142+
in: query
143+
description: "List limit"
144+
required: false
145+
schema:
146+
type: int
147+
example: 20
148+
- name: offset
149+
in: query
150+
description: "List offset"
151+
required: false
152+
schema:
153+
type: int
154+
example: 0
155+
- name: fields
156+
in: query
157+
description: "Filter fields with comma"
158+
required: false
159+
schema:
160+
type: string
161+
example:
162+
- name: order_by
163+
in: query
164+
description: "Ordination of list"
165+
required: false
166+
schema:
167+
type: string
168+
enum:
169+
- "asc"
170+
- "desc"
171+
- name: sort_by
172+
in: query
173+
description: "Sorting of the list"
174+
required: false
175+
schema:
176+
type: string
177+
example: id
178+
responses:
179+
200:
180+
description: Success response
181+
content:
182+
application/json:
183+
schema: ProductListResponseSchema
184+
"""
185+
request = ApiRequest().parse_request(APP)
186+
LOGGER.info('request: {}'.format(request))
187+
188+
status_code = 200
189+
response = ApiResponse(request)
190+
response.set_hateos(False)
191+
192+
manager = ProductManager(logger=LOGGER, product_service=ProductServiceV1(logger=LOGGER))
193+
manager.debug(DEBUG)
194+
try:
195+
response.set_data(manager.list(request))
196+
response.set_total(manager.count(request))
197+
except Exception as err:
198+
LOGGER.error(err)
199+
LOGGER.info('aq')
200+
error = ApiException(MessagesEnum.LIST_ERROR)
201+
status_code = 400
202+
if manager.exception:
203+
error = manager.exception
204+
response.set_exception(error)
205+
206+
return response.get_response(status_code)
207+
208+
209+
@APP.route('/v1/product/<uuid>', methods=['GET'])
210+
def product_get(uuid):
211+
pass
212+
213+
214+
@APP.route('/v1/product/<uuid>', methods=['POST'])
215+
def product_create():
216+
pass
217+
218+
219+
@APP.route('/v1/product/<uuid>', methods=['PUT'])
220+
def product_update():
221+
pass
222+
223+
224+
@APP.route('/v1/product/<uuid>', methods=['DELETE'])
225+
def product_delete():
226+
pass
227+
228+
132229
@APP.route('/v1/event/<event_type>', methods=['POST'])
133230
def event_create(event_type):
134231
"""
@@ -183,7 +280,7 @@ def event_create(event_type):
183280
# event_service = OcorenEventService()
184281
# else:
185282
# event_service = ProductEventService()
186-
event_service = OcorenEventService()
283+
event_service = OcorenEventServiceV1()
187284
service = EventManager(logger=LOGGER, event_service=event_service)
188285
result = service.process(event_vo)
189286
event_hash = event_vo.hash
@@ -329,8 +426,26 @@ def event_list(event_type):
329426
return response.get_response(status_code)
330427

331428

429+
# *************
332430
# doc
431+
# *************
333432
spec.path(view=alive, path="/alive", operations=get_doc(alive))
433+
# *************
434+
# product
435+
# *************
436+
spec.path(view=product_list,
437+
path="/v1/product", operations=get_doc(product_list))
438+
spec.path(view=product_get,
439+
path="/v1/product/{uuid}", operations=get_doc(product_get))
440+
spec.path(view=product_create,
441+
path="/v1/product/{uuid}", operations=get_doc(product_create))
442+
spec.path(view=product_update,
443+
path="/v1/product/{uuid}", operations=get_doc(product_update))
444+
spec.path(view=product_delete,
445+
path="/v1/product/{uuid}", operations=get_doc(product_delete))
446+
# *************
447+
# event
448+
# *************
334449
spec.path(view=event_list,
335450
path="/v1/event/{event_type}", operations=get_doc(event_list))
336451
spec.path(view=event_create,
@@ -339,5 +454,7 @@ def event_list(event_type):
339454
print_routes(APP, LOGGER)
340455
LOGGER.info('Running at {}'.format(os.environ['APP_ENV']))
341456

457+
# *************
342458
# generate de openapi.yml
459+
# *************
343460
generate_openapi_yml(spec, LOGGER, force=True)

examples/lambda_api/lambda_app/helper.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ def to_dict(obj, force_str=False):
7777

7878

7979
def to_json(obj):
80-
return json.dumps(obj)
80+
return json.dumps(obj, default=str)
8181

8282

8383
def debug_mode():

examples/lambda_api/lambda_app/http_resources/request.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,6 @@ def __getitem__(self, item):
5252
def __str__(self):
5353
return self.to_json()
5454

55-
def __repr__(self):
56-
return str(self.to_json())
57-
5855
def to_dict(self, force_str=False):
5956
data = helper.to_dict(self, force_str)
6057
data['_request'] = None
@@ -101,6 +98,12 @@ def parse_request(self, app):
10198
self.server_type = parsed_request.server_type
10299
self._request = request
103100

104-
# logger = helper.get_logger()
105-
# logger.info('Request: {}'.format(self.to_dict()))
106-
return self
101+
return self
102+
103+
@staticmethod
104+
def factory(method, host, path):
105+
api_request = ApiRequest()
106+
api_request.method = method
107+
api_request.host = host
108+
api_request.path = path
109+
return api_request

examples/lambda_api/lambda_app/http_resources/response.py

Lines changed: 36 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,13 @@ def __init__(self, api_request=None):
2727
self.next = {}
2828
self.last = {}
2929
self.limit = api_request.limit if api_request is not None else Pagination.LIMIT
30-
self.offset = api_request.offset if api_request is not None else Pagination.OFFSET
30+
self.offset = api_request.offset if api_request is not None else Pagination.OFFSET
3131
self.total = 0
3232
self.count = 0
3333

3434
self.api_request = api_request
3535

36-
def set_hateos(self, flag:bool):
36+
def set_hateos(self, flag: bool):
3737
self.hateos = flag
3838

3939
def set_data(self, data):
@@ -58,12 +58,18 @@ def get_response(self, status_code=None):
5858

5959
headers = self.headers
6060
status_code = self.status_code
61+
success = status_code == 200
62+
message = MessagesEnum.OK.message
63+
code = MessagesEnum.OK.code
64+
label = MessagesEnum.OK.label
65+
params = []
6166

6267
if self.exception is not None:
6368
if isinstance(self.exception, ApiException):
6469
code = self.exception.code
6570
label = self.exception.label
6671
message = self.exception.message
72+
params = self.exception.params
6773
else:
6874
message = self.data if not None else MessagesEnum.UNKNOWN_ERROR
6975
code = MessagesEnum.NOK.code
@@ -74,7 +80,8 @@ def get_response(self, status_code=None):
7480
"error": {
7581
"code": code,
7682
"label": label,
77-
"message": message
83+
"message": message,
84+
"params": params
7885
}
7986
}
8087

@@ -108,27 +115,31 @@ def get_response(self, status_code=None):
108115
"last": ""
109116
}
110117

111-
if self.hateos:
112-
body = {
113-
# data
114-
"data": self.data,
115-
# navigation
116-
"control": {
117-
"offset": self.offset,
118-
"limit": self.limit,
119-
"total": self.total,
120-
"count": self.count,
121-
},
122-
# hypermedia info
123-
"meta": self.meta,
124-
# hypermedia links
125-
"links": self.links
126-
}
127-
else:
128-
body = {
129-
# data
130-
"data": self.data
131-
}
118+
body = {
119+
# success
120+
"success": success,
121+
"label": label,
122+
"code": code,
123+
"message": message,
124+
"params": [],
125+
# data
126+
"data": self.data,
127+
# navigation
128+
"control": {
129+
"offset": self.offset,
130+
"limit": self.limit,
131+
"total": self.total,
132+
"count": self.count,
133+
},
134+
# hypermedia info
135+
"meta": self.meta,
136+
# hypermedia links
137+
"links": self.links
138+
}
139+
140+
if not self.hateos:
141+
del body["meta"]
142+
del body["links"]
132143

133144
if 'Content-Type' in headers and headers['Content-Type'] == 'application/json':
134145
body = helper.to_json(body)
@@ -143,11 +154,8 @@ def keys(self):
143154
def __str__(self):
144155
return self.to_json()
145156

146-
def __repr__(self):
147-
return self.to_json()
148-
149157
def to_dict(self, force_str=False):
150158
return helper.to_dict(self, force_str)
151159

152160
def to_json(self):
153-
return json.dumps(self.to_dict(force_str=False))
161+
return json.dumps(self.to_dict(force_str=False))

examples/lambda_api/lambda_app/openapi/api_schemas.py

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

77

8+
# ***************************
9+
# Product
10+
# ***************************
11+
class ProductSchema(Schema):
12+
sku = fields.Int(example=657705)
13+
quantity = fields.Int(example=1)
14+
uuid = fields.UUID(example="3d9f2fdb-f71a-4e6d-8fbf-72b12cc0c381")
15+
16+
17+
class ProductListResponseSchema(Schema):
18+
data = fields.List(fields.Nested(ProductSchema))
19+
control = fields.Nested(RequestControlSchema)
20+
meta = fields.Nested(MetaSchema)
21+
links = fields.List(fields.Nested(LinkSchema))
22+
23+
24+
# ***************************
25+
# Event
26+
# ***************************
27+
828
class EventSchema(Schema):
929
type = fields.Str()
1030
data = fields.Dict()
@@ -19,14 +39,10 @@ class OcorenSchema(Schema):
1939
pedido = fields.Str(example="Z1223321")
2040

2141

22-
class ProductSchema(Schema):
23-
sku = fields.Int(example=657705)
24-
quantity = fields.Int(example=1)
25-
26-
2742
class EventCreateRequest(OcorenSchema):
2843
pass
2944

45+
3046
class EventUpdateRequest(EventCreateRequest):
3147
pass
3248

0 commit comments

Comments
 (0)