22
33This module contains the handler method
44"""
5- import boot
6- import os
75import base64
8- from lambda_app .services .v1 .healthcheck import HealthCheckSchema , HealthCheckResult
9- from lambda_app .services .v1 .healthcheck .resources import \
10- MysqlConnectionHealthCheck , RedisConnectionHealthCheck , \
11- SQSConnectionHealthCheck , SelfConnectionHealthCheck
12- from lambda_app .services .v1 .healthcheck_service import HealthCheckService
13- from lambda_app .config import get_config
14- from lambda_app .enums .events import EventType
15- from lambda_app .enums .messages import MessagesEnum
16- from lambda_app .events .tracker import EventTracker
17- from lambda_app .exceptions import ApiException
18- from lambda_app .http_resources .request import ApiRequest
19- from lambda_app .http_resources .response import ApiResponse
20- from lambda_app .services .v1 .ocoren_event_service import OcorenEventService as OcorenEventServiceV1
21- from lambda_app .vos .events import EventVO
22- from lambda_app .logging import get_logger
23- from lambda_app import APP_NAME , APP_VERSION , http_helper
24- from lambda_app .helper import open_vendor_file , print_routes
25- from lambda_app .http_helper import CUSTOM_DEFAULT_HEADERS
26- from lambda_app .lambda_flask import LambdaFlask
27- from lambda_app .openapi import spec , get_doc , generate_openapi_yml
28- from lambda_app .openapi import api_schemas
29- from lambda_app .services .event_manager import EventManager
30- from lambda_app import helper
31-
32- # load env
33- ENV = helper .get_environment ()
34- boot .load_dot_env (ENV )
6+ import os
7+
8+ import boot
9+ from flambda_app import APP_NAME , APP_VERSION , http_helper
10+ from flambda_app import helper
11+ from flambda_app .config import get_config
12+ from flambda_app .enums .events import EventType
13+ from flambda_app .enums .messages import MessagesEnum
14+ from flambda_app .events .tracker import EventTracker
15+ from flambda_app .exceptions import ApiException
16+ from flambda_app .flambda import Flambda
17+ from flambda_app .helper import open_vendor_file , print_routes
18+ from flambda_app .http_helper import CUSTOM_DEFAULT_HEADERS
19+ from flambda_app .http_resources .request import ApiRequest
20+ from flambda_app .http_resources .response import ApiResponse
21+ from flambda_app .logging import get_logger , set_debug_mode
22+ from flambda_app .openapi import api_schemas
23+ from flambda_app .openapi import spec , get_doc , generate_openapi_yml
24+ from flambda_app .services .event_manager import EventManager
25+ from flambda_app .services .healthcheck_manager import HealthCheckManager
26+ from flambda_app .services .v1 .ocoren_event_service import OcorenEventService as OcorenEventServiceV1
27+ from flambda_app .vos .events import EventVO
28+
29+ # load directly by boot
30+ ENV = boot .get_environment ()
31+ # boot.load_dot_env(ENV)
3532
3633
3734# config
3835CONFIG = get_config ()
3936# debug
4037DEBUG = helper .debug_mode ()
41- # logger
42- LOGGER = get_logger ()
4338
44- APP = LambdaFlask (__name__ )
39+ # keep in this order, the app generic stream handler will be removed
40+ APP = Flambda (APP_NAME )
41+ # Logger
42+ LOGGER = get_logger (force = True )
43+ # override the APP logger
44+ APP .logger = LOGGER
45+ # override the log configs
46+ if DEBUG :
47+ # override to the level desired
48+ set_debug_mode (LOGGER )
49+
50+ API_ROOT = os .environ ['API_ROOT' ] if 'API_ROOT' in os .environ else None
51+ API_ROOT_ENDPOINT = API_ROOT if API_ROOT != "" else '/'
4552
4653
47- @APP .route ('/' )
54+ @APP .route (API_ROOT_ENDPOINT )
4855def index ():
4956 """
5057 API Root path
@@ -55,11 +62,7 @@ def index():
5562 return http_helper .create_response (body = body , status_code = 200 )
5663
5764
58- # general vars
59- APP_QUEUE = CONFIG .APP_QUEUE
60-
61-
62- @APP .route ('/alive' )
65+ @APP .route (API_ROOT + '/alive' )
6366def alive ():
6467 """
6568 Health check path
@@ -76,41 +79,79 @@ def alive():
7679 content:
7780 application/json:
7881 schema: HealthCheckSchema
82+ 424:
83+ description: Failed dependency response
84+ content:
85+ application/json:
86+ schema: HealthCheckSchema
87+ 503:
88+ description: Service unavailable response
89+ content:
90+ application/json:
91+ schema: HealthCheckSchema
7992 """
80- service = HealthCheckService ()
81- service .add_check ("self" , SelfConnectionHealthCheck (LOGGER , CONFIG ), [])
82- service .add_check (
83- "mysql" , MysqlConnectionHealthCheck (LOGGER , CONFIG ), ["db" ])
84- service .add_check ("redis" , RedisConnectionHealthCheck (
85- LOGGER , CONFIG ), ["redis" ])
86- service .add_check ("queue" , SQSConnectionHealthCheck (
87- LOGGER , CONFIG ), ["queue" ])
88- service .add_check ("internal" , lambda : HealthCheckResult .unhealthy ("connect" ), ["example" ])
93+ service = HealthCheckManager ()
94+ return service .check ()
8995
90- return service .get_response ()
9196
92-
93- @APP .route ('/favicon-32x32.png' )
97+ @APP .route (API_ROOT + '/favicon-32x32.png' )
9498def favicon ():
9599 headers = CUSTOM_DEFAULT_HEADERS .copy ()
96100 headers ['Content-Type' ] = "image/png"
97- data = base64 .b64decode (
98- 'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAkFBMVEUAAAAQM0QWNUYWNkYXNkYALjo'
99- 'WNUYYOEUXN0YaPEUPMUAUM0QVNUYWNkYWNUYWNUUWNUYVNEYWNkYWNUYWM0eF6i0XNkchR0OB5SwzZj'
100- '9wyTEvXkA3az5apTZ+4C5DgDt31C9frjU5bz5uxTI/eDxzzjAmT0IsWUEeQkVltzR62S6D6CxIhzpKi'
101- 'jpJiDpOkDl4b43lAAAAFXRSTlMAFc304QeZ/vj+ECB3xKlGilPXvS2Ka/h0AAABfklEQVR42oVT2XaC'
102- 'MBAdJRAi7pYJa2QHxbb//3ctSSAUPfa+THLmzj4DBvZpvyauS9b7kw3PWDkWsrD6fFQhQ9dZLfVbC5M'
103- '88CWCPERr+8fLZodJ5M8QJbjbGL1H2M1fIGfEm+wJN+bGCSc6EXtNS/8FSrq2VX6YDv++XLpJ8SgDWM'
104- 'nwqznGo6alcTbIxB2CHKn8VFikk2mMV2lEnV+CJd9+jJlxXmMr5dW14YCqwgbFpO8FNvJxwwM4TPWPo'
105- '5QalEsRMAcusXpi58/QUEWPL0AK1ThM5oQCUyXPoPINkdd922VBw4XgTV9zDGWWFrgjIQs4vwvOg6xr'
106- '+6gbCTqE+DYhlMGX0CF2OknK5gQ2JrkDh/W6TOEbYDeVecKbJtyNXiCfGmW7V93J2hDus1bDfhxWbIZ'
107- 'VYDXITA7Lo6E0Ktgg9eB4KWuR44aj7ppBVPazhQH7/M/KgWe9X1qAg8XypT6nxIMJH+T94QCsLvj29I'
108- 'YwZxyO9/F8vCbO9tX5/wDGjEZ7vrgFZwAAAABJRU5ErkJggg==' )
109- return http_helper .create_response (
110- body = data , status_code = 200 , headers = headers )
111-
112-
113- @APP .route ('/docs' )
101+ data = 'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAkFBMVEUAAAAQM0QWNUYWNkYXNkYALjoWNUYYOEUXN0YaPEUPMUAUM0QVN' \
102+ 'UYWNkYWNUYWNUUWNUYVNEYWNkYWNUYWM0eF6i0XNkchR0OB5SwzZj9wyTEvXkA3az5apTZ+4C5DgDt31C9frjU5bz5uxTI/eDxzzjAmT0' \
103+ 'IsWUEeQkVltzR62S6D6CxIhzpKijpJiDpOkDl4b43lAAAAFXRSTlMAFc304QeZ/vj+ECB3xKlGilPXvS2Ka/h0AAABfklEQVR42oVT2Xa' \
104+ 'CMBAdJRAi7pYJa2QHxbb//3ctSSAUPfa+THLmzj4DBvZpvyauS9b7kw3PWDkWsrD6fFQhQ9dZLfVbC5M88CWCPERr+8fLZodJ5M8QJbjb' \
105+ 'GL1H2M1fIGfEm+wJN+bGCSc6EXtNS/8FSrq2VX6YDv++XLpJ8SgDWMnwqznGo6alcTbIxB2CHKn8VFikk2mMV2lEnV+CJd9+jJlxXmMr5' \
106+ 'dW14YCqwgbFpO8FNvJxwwM4TPWPo5QalEsRMAcusXpi58/QUEWPL0AK1ThM5oQCUyXPoPINkdd922VBw4XgTV9zDGWWFrgjIQs4vwvOg6' \
107+ 'xr+6gbCTqE+DYhlMGX0CF2OknK5gQ2JrkDh/W6TOEbYDeVecKbJtyNXiCfGmW7V93J2hDus1bDfhxWbIZVYDXITA7Lo6E0Ktgg9eB4KWu' \
108+ 'R44aj7ppBVPazhQH7/M/KgWe9X1qAg8XypT6nxIMJH+T94QCsLvj29IYwZxyO9/F8vCbO9tX5/wDGjEZ7vrgFZwAAAABJRU5ErkJggg=='
109+
110+ if helper .is_running_on_lambda ():
111+ data_b64 = {
112+ 'headers' : headers ,
113+ 'statusCode' : 200 ,
114+ 'body' : data ,
115+ 'isBase64Encoded' : True
116+ }
117+ data = helper .to_json (data_b64 )
118+ headers = {"Content-Type" : "application/json" }
119+ else :
120+ data = base64 .b64decode (data )
121+
122+ return http_helper .create_response (body = data , status_code = 200 , headers = headers )
123+
124+
125+ @APP .route (API_ROOT + '/favicon-16x16.png' )
126+ def favicon16 ():
127+ headers = CUSTOM_DEFAULT_HEADERS .copy ()
128+ headers ['Content-Type' ] = "image/png"
129+ data = 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABNVBMVEVisTRhsTReqzVbpTVXoDdVnTdSlzh' \
130+ 'RljgvXkAuXUAtWkErV0EzZj40Zj85bz0lTkMkTUMkT0MmTUIkS0IjTEIhSUMkS0IkTEIkTUIlTUIkTkMlTkMcQUQcP0UfQ0QdQ0QfREQg' \
131+ 'RUMiSUMiSUMjSkInU0EkTEMmUEEiR0IiSEMpVkErWT8kTUElTUIUNkYVNEQVMkcRM0QSNUYQMUIMMUkVK0AAJEkAM00AMzMAAAAAAACF6' \
132+ 'i2E6SyD6CyC5i2B5Sx/4i6A4S593S583S520jB00DByyjFxyTFwyDFvxjJtxTFtxDFswzJrwDJqvzJpvjNouzNoujNnuDNLjTlKijpKiT' \
133+ 'pEfztDfzxAeT0+dz05bj44bT44bj82aj81aD8zZT8bPUUbPkUcP0UcPUUeQ0UfREQgRkRgJREvAAAAO3RSTlP09PX19vX39u7u7/Dq6uf' \
134+ 'h4eDg4+Pf3Nvb2tnY2NvPv7y6rKupqaGZlpSOiYWETDEkHh0fFQwHCgUBAAcHrskAAADYSURBVHjaPc/ZLkNRGIbhz26KjVJpqSKGtjHP' \
135+ 'c9a7W7OEEhtBjDWUO3XghqQSwVrNTp+j///OXhlrLpdJdg9MLblbxqwPd5RLUDpOjK66YWMwTqRpaM0OhZbo3dskljea9+HyAevxHtoWV' \
136+ 'AjhfQtr5w3CSfUE8BrgvEDQpxRc3eyfH5wenlQuIO39Sb9x/8uv+bXvmPSjbABPRZznIkGvxkOo7mJtV+FsQsutcFvBuruG9kWZMY+G5p' \
137+ 'zxlMp/KPKZSUs2cLrzyMWVEyP1OGtlNpvs6p+p5/8DzUo5hMDku9EAAAAASUVORK5CYII='
138+
139+ if helper .is_running_on_lambda ():
140+ data_b64 = {
141+ 'headers' : headers ,
142+ 'statusCode' : 200 ,
143+ 'body' : data ,
144+ 'isBase64Encoded' : True
145+ }
146+ data = helper .to_json (data_b64 )
147+ headers = {"Content-Type" : "application/json" }
148+ else :
149+ data = base64 .b64decode (data )
150+
151+ return http_helper .create_response (body = data , status_code = 200 , headers = headers )
152+
153+
154+ @APP .route (API_ROOT + '/docs' )
114155def docs ():
115156 headers = CUSTOM_DEFAULT_HEADERS .copy ()
116157 headers ['Content-Type' ] = "text/html"
@@ -120,7 +161,7 @@ def docs():
120161 body = html , status_code = 200 , headers = headers )
121162
122163
123- @APP .route ('/openapi.yml' )
164+ @APP .route (API_ROOT + '/openapi.yml' )
124165def openapi ():
125166 headers = CUSTOM_DEFAULT_HEADERS .copy ()
126167 headers ['Content-Type' ] = "text/yaml"
@@ -130,7 +171,7 @@ def openapi():
130171 body = html , status_code = 200 , headers = headers )
131172
132173
133- @APP .route ('/v1/event/<event_type>' , methods = ['POST' ])
174+ @APP .route (API_ROOT + '/v1/event/<event_type>' , methods = ['POST' ])
134175def event_create (event_type ):
135176 """
136177 :param event_type:
@@ -274,15 +315,22 @@ def event_list(event_type):
274315 return response .get_response (status_code )
275316
276317
318+ # *************
277319# doc
278- spec .path (view = alive , path = "/alive" , operations = get_doc (alive ))
320+ # *************
321+ spec .path (view = alive , path = API_ROOT + "/alive" , operations = get_doc (alive ))
322+ # *************
323+ # event
324+ # *************
279325spec .path (view = event_list ,
280- path = "/v1/event/{event_type}" , operations = get_doc (event_list ))
326+ path = API_ROOT + "/v1/event/{event_type}" , operations = get_doc (event_list ))
281327spec .path (view = event_create ,
282- path = "/v1/event/{event_type}" , operations = get_doc (event_create ))
328+ path = API_ROOT + "/v1/event/{event_type}" , operations = get_doc (event_create ))
283329
284330print_routes (APP , LOGGER )
285- LOGGER .info ('Running at {}' .format (os . environ [ 'APP_ENV' ] ))
331+ LOGGER .info ('Running at {}' .format (ENV ))
286332
287333# generate de openapi.yml
288334generate_openapi_yml (spec , LOGGER , force = True )
335+
336+ api_schemas .register ()
0 commit comments