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

Commit 2bcb10d

Browse files
Merge pull request #14 from madeiramadeirabr/api_restful
Api restful
2 parents 2c3b0af + 8c8613a commit 2bcb10d

File tree

272 files changed

+12710
-188
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

272 files changed

+12710
-188
lines changed

.gitignore

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,5 +55,4 @@ config/integration.en
5555
/examples/lambda_s3/vendor/*
5656
/examples/lambda_sns/vendor/*
5757
/examples/lambda_sqs/vendor/*
58-
59-
./vendor/*
58+
/vendor/

examples/lambda_api/.projectrc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@ PROJECT_NAME=template-serverless-lambda-python-lambda-api
22
NETWORK_NAME=service-python
33
APP_QUEUE=test-queue
44
APP_LAMBDA_NAME=lambda_api
5-
APP_LAMBDA_EVENT_SOURCE=false
5+
APP_LAMBDA_EVENT_SOURCE=false
6+
APP_PORT=5001

examples/lambda_api/app.py

Lines changed: 2 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
from lambda_app.exceptions import ApiException
1818
from lambda_app.http_resources.request import ApiRequest
1919
from lambda_app.http_resources.response import ApiResponse
20-
from lambda_app.services.v1.ocoren_event_service import OcorenEventService
20+
from lambda_app.services.v1.ocoren_event_service import OcorenEventService as OcorenEventServiceV1
2121
from lambda_app.vos.events import EventVO
2222
from lambda_app.logging import get_logger
2323
from lambda_app import APP_NAME, APP_VERSION, http_helper
@@ -184,7 +184,7 @@ def event_create(event_type):
184184
# event_service = OcorenEventService()
185185
# else:
186186
# event_service = ProductEventService()
187-
event_service = OcorenEventService()
187+
event_service = OcorenEventServiceV1()
188188
service = EventManager(logger=LOGGER, event_service=event_service)
189189
result = service.process(event_vo)
190190
event_hash = event_vo.hash
@@ -262,71 +262,15 @@ def event_list(event_type):
262262
LOGGER.info('event_type: {}'.format(event_type))
263263
LOGGER.info('request: {}'.format(request))
264264

265-
# event_tracker = EventTracker(logger)
266-
#
267265
status_code = 200
268266
response = ApiResponse(request)
269267
response.set_hateos(False)
270-
# try:
271-
# # event_type validation
272-
# if EventType.from_value(event_type) not in EventType.get_public_events():
273-
# exception = ApiException(MessagesEnum.EVENT_TYPE_UNKNOWN_ERROR)
274-
# exception.set_message_params([event_type])
275-
# raise exception
276-
#
277-
# event_vo = EventVO(event_type=event_type, data=request.where)
278-
# # if EventType.from_value(event_type) == EventType.OCOREN_EVENT:
279-
# # event_service = OcorenEventService()
280-
# # else:
281-
# # event_service = ProductEventService()
282-
# event_service = OcorenEventService()
283-
# service = EventManager(logger=logger, event_service=event_service)
284-
# result = service.process(event_vo)
285-
# event_hash = event_vo.hash
286-
#
287-
# event_tracker.track(event_hash, event_vo.to_dict())
288-
#
289-
# if result:
290-
# code = MessagesEnum.EVENT_REGISTERED_WITH_SUCCESS.code
291-
# label = MessagesEnum.EVENT_REGISTERED_WITH_SUCCESS.label
292-
# message = MessagesEnum.EVENT_REGISTERED_WITH_SUCCESS.message
293-
# params = None
294-
# else:
295-
# if isinstance(service.exception, ApiException):
296-
# raise service.exception
297-
# else:
298-
# raise ApiException(MessagesEnum.INTERNAL_SERVER_ERROR)
299-
# except Exception as err:
300-
# logger.error(err)
301-
# result = False
302-
# event_hash = None
303-
# if isinstance(err, ApiException):
304-
# api_ex = err
305-
# status_code = 400
306-
# else:
307-
# api_ex = ApiException(MessagesEnum.CREATE_ERROR)
308-
# status_code = 500
309-
#
310-
# code = api_ex.code
311-
# label = api_ex.label
312-
# message = api_ex.message
313-
# params = api_ex.params
314-
#
315-
# data = {
316-
# "result": result,
317-
# "event_hash": event_hash,
318-
# "code": code,
319-
# "label": label,
320-
# "message": message,
321-
# "params": params
322-
# }
323268

324269
data = {}
325270

326271
response.set_data(data)
327272
response.set_total(len(data))
328273

329-
# event_tracker.track(event_hash, data)
330274
return response.get_response(status_code)
331275

332276

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: 39 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,23 +58,31 @@ 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
7076
label = MessagesEnum.NOK.label
7177
message = MessagesEnum.NOK.message % message
7278

79+
# TODO rever
7380
body = {
7481
"error": {
7582
"code": code,
7683
"label": label,
77-
"message": message
84+
"message": message,
85+
"params": params
7886
}
7987
}
8088

@@ -108,27 +116,33 @@ def get_response(self, status_code=None):
108116
"last": ""
109117
}
110118

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-
}
119+
body = {
120+
# success
121+
"success": success,
122+
"label": label,
123+
"code": code,
124+
"message": message,
125+
"params": [],
126+
# data
127+
"data": self.data,
128+
# navigation
129+
"control": {
130+
"offset": self.offset,
131+
"limit": self.limit,
132+
"total": self.total,
133+
"count": self.count,
134+
},
135+
# hypermedia info
136+
"meta": self.meta,
137+
# hypermedia links
138+
"links": self.links
139+
}
140+
141+
if not self.hateos:
142+
del body["meta"]
143+
del body["links"]
144+
145+
# todo deletar o control na leitura de um item unico
132146

133147
if 'Content-Type' in headers and headers['Content-Type'] == 'application/json':
134148
body = helper.to_json(body)
@@ -143,11 +157,8 @@ def keys(self):
143157
def __str__(self):
144158
return self.to_json()
145159

146-
def __repr__(self):
147-
return self.to_json()
148-
149160
def to_dict(self, force_str=False):
150161
return helper.to_dict(self, force_str)
151162

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

examples/lambda_api/lambda_app/openapi/api_schemas.py

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,37 @@
22

33
from lambda_app.enums.messages import MessagesEnum
44
from lambda_app.http_resources.request_control import Pagination
5-
from lambda_app.openapi.schemas import DeletionSchema, RequestControlSchema, MetaSchema, LinkSchema
5+
from lambda_app.openapi.schemas import DeletionSchema, RequestControlSchema, MetaSchema, LinkSchema, ErrorSchema
66

77

8+
class DefaultListResponseSchema(Schema):
9+
success = fields.Bool(default=True)
10+
code = fields.Int(required=True)
11+
label = fields.Str()
12+
message = fields.Str()
13+
params = fields.List(fields.Str())
14+
15+
16+
# ***************************
17+
# Product
18+
# ***************************
19+
class ProductSchema(Schema):
20+
sku = fields.Int(example=657705)
21+
quantity = fields.Int(example=1)
22+
uuid = fields.UUID(example="3d9f2fdb-f71a-4e6d-8fbf-72b12cc0c381")
23+
24+
25+
class ProductListResponseSchema(DefaultListResponseSchema):
26+
data = fields.List(fields.Nested(ProductSchema))
27+
control = fields.Nested(RequestControlSchema)
28+
meta = fields.Nested(MetaSchema)
29+
links = fields.List(fields.Nested(LinkSchema))
30+
31+
32+
# ***************************
33+
# Event
34+
# ***************************
35+
836
class EventSchema(Schema):
937
type = fields.Str()
1038
data = fields.Dict()
@@ -19,25 +47,25 @@ class OcorenSchema(Schema):
1947
pedido = fields.Str(example="Z1223321")
2048

2149

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

53+
3054
class EventUpdateRequest(EventCreateRequest):
3155
pass
3256

3357

34-
class EventListResponseSchema(Schema):
58+
class EventListResponseSchema(DefaultListResponseSchema):
3559
data = fields.List(fields.Nested(EventSchema))
3660
control = fields.Nested(RequestControlSchema)
3761
meta = fields.Nested(MetaSchema)
3862
links = fields.List(fields.Nested(LinkSchema))
3963

4064

65+
class EventListErrorResponseSchema(ErrorSchema):
66+
pass
67+
68+
4169
class EventGetResponseSchema(Schema):
4270
data = fields.Nested(EventSchema)
4371
control = fields.Nested(RequestControlSchema)

examples/lambda_api/lambda_app/openapi/schemas.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,19 @@
44

55

66
class DeletionSchema(Schema):
7-
success = fields.Bool()
7+
success = fields.Bool(default=False)
88
code = fields.Int(required=True)
99
label = fields.Str()
1010
message = fields.Str()
1111
params = fields.List(fields.Str())
1212

1313

1414
class ErrorSchema(Schema):
15+
success = fields.Bool(default=False)
1516
code = fields.Int(required=True)
1617
label = fields.Str()
1718
message = fields.Str()
19+
params = fields.List(fields.Str())
1820

1921

2022
class RequestControlSchema(Schema):

examples/lambda_api/lambda_app/repositories/mysql/product_repository.py renamed to examples/lambda_api/lambda_app/repositories/v1/mysql/product_repository.py

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from lambda_app.database.mysql import get_connection
44
from lambda_app.http_resources.request_control import Order
55
from lambda_app.logging import get_logger
6-
from lambda_app.repositories.mysql import AbstractRepository
6+
from lambda_app.repositories.v1.mysql import AbstractRepository
77
from lambda_app.vos.product import ProductVO
88
import pymysql
99

@@ -82,8 +82,13 @@ def list(self, where: dict, offset=None, limit=None, fields: list = None, sort_b
8282

8383
if sort_by is None:
8484
sort_by = self.PK
85-
86-
sort_by = self.BASE_TABLE_ALIAS + '.' + sort_by
85+
elif isinstance(sort_by, list):
86+
sort_by_arr = []
87+
for v in sort_by:
88+
sort_by_arr.append(self.BASE_TABLE_ALIAS + '.' + v)
89+
sort_by = ",".join(sort_by_arr)
90+
else:
91+
sort_by = self.BASE_TABLE_ALIAS + '.' + sort_by
8792

8893
sql = "SELECT {} FROM {} as {}".format(fields, self.BASE_TABLE, self.BASE_TABLE_ALIAS)
8994

@@ -113,8 +118,13 @@ def count(self, where, sort_by=None, order_by=None):
113118

114119
if sort_by is None:
115120
sort_by = self.PK
116-
117-
sort_by = self.BASE_TABLE_ALIAS + '.' + sort_by
121+
elif isinstance(sort_by, list):
122+
sort_by_arr = []
123+
for v in sort_by:
124+
sort_by_arr.append(self.BASE_TABLE_ALIAS + '.' + v)
125+
sort_by = ",".join(sort_by_arr)
126+
else:
127+
sort_by = self.BASE_TABLE_ALIAS + '.' + sort_by
118128

119129
sql = "SELECT COUNT(1) as total FROM {} as {}".format(self.BASE_TABLE, self.BASE_TABLE_ALIAS)
120130

0 commit comments

Comments
 (0)