@@ -72,6 +72,7 @@ def __init__(self, fetch_user):
7272 Rule ('/1/functions/_ops/metadatas' , endpoint = 'ops_meta_data' ),
7373 Rule ('/1.1/functions/_ops/metadatas' , endpoint = 'ops_meta_data' ),
7474 ])
75+ self .cloud_codes = {}
7576
7677 def __call__ (self , environ , start_response ):
7778 self .process_session (environ )
@@ -124,22 +125,22 @@ def dispatch_request(self, environ):
124125
125126 try :
126127 if endpoint == 'cloud_function' :
127- result = {'result' : dispatch_cloud_func (app_params , decode_object = False , ** values )}
128+ result = {'result' : dispatch_cloud_func (self . cloud_codes , app_params , decode_object = False , ** values )}
128129 elif endpoint == 'rpc_function' :
129- result = {'result' : dispatch_cloud_func (app_params , decode_object = True , ** values )}
130+ result = {'result' : dispatch_cloud_func (self . cloud_codes , app_params , decode_object = True , ** values )}
130131 elif endpoint == 'cloud_hook' :
131- result = dispatch_cloud_hook (app_params , ** values )
132+ result = dispatch_cloud_hook (self . cloud_codes , app_params , ** values )
132133 elif endpoint == 'on_verified' :
133- result = {'result' : dispatch_on_verified (app_params , ** values )}
134+ result = {'result' : dispatch_on_verified (self . cloud_codes , app_params , ** values )}
134135 elif endpoint == 'on_login' :
135- result = {'result' : dispatch_on_login (app_params , ** values )}
136+ result = {'result' : dispatch_on_login (self . cloud_codes , app_params , ** values )}
136137 elif endpoint == 'ops_meta_data' :
137138 from .authorization import MASTER_KEY
138139 if request .environ .get ('_app_params' , {}).get ('master_key' ) != MASTER_KEY :
139140 raise LeanEngineError (code = 401 , message = 'Unauthorized.' )
140- result = {'result' : dispatch_ops_meta_data ()}
141+ result = {'result' : dispatch_ops_meta_data (self . cloud_codes )}
141142 elif endpoint == 'on_bigquery' :
142- result = {'result' : dispatch_on_bigquery (app_params , ** values )}
143+ result = {'result' : dispatch_on_bigquery (self . cloud_codes , app_params , ** values )}
143144 else :
144145 raise ValueError # impossible
145146 return Response (json .dumps (result ), mimetype = 'application/json' )
@@ -157,6 +158,12 @@ def dispatch_request(self, environ):
157158 mimetype = 'application/json'
158159 )
159160
161+ def update_cloud_codes (self , engine_cloud_codes ):
162+ already_register_func_name = set (self .cloud_codes .keys ()).intersection (set (engine_cloud_codes .keys ()))
163+ if already_register_func_name :
164+ is_are = "is" if len (already_register_func_name ) == 1 else "are"
165+ raise RuntimeError ("cloud function: {0} {1} already registerd." .format ("," .join (already_register_func_name ), is_are ))
166+ self .cloud_codes .update (engine_cloud_codes )
160167
161168hook_name_mapping = {
162169 'beforeSave' : '__before_save_for_' ,
@@ -167,10 +174,9 @@ def dispatch_request(self, environ):
167174 'afterDelete' : '__after_delete_for_' ,
168175}
169176
170- _cloud_codes = {}
177+ root_engine = None
171178
172-
173- def register_cloud_func (func_or_func_name ):
179+ def register_cloud_func (_cloud_codes , func_or_func_name ):
174180 if isinstance (func_or_func_name , string_types ):
175181 func_name = func_or_func_name
176182 def inner_func (func ):
@@ -188,7 +194,7 @@ def inner_func(func):
188194 return func
189195
190196
191- def dispatch_cloud_func (app_params , func_name , decode_object , params ):
197+ def dispatch_cloud_func (_cloud_codes , app_params , func_name , decode_object , params ):
192198 # let's check realtime hook sign first
193199 realtime_hook_funcs = [
194200 '_messageReceived' , '_receiversOffline' , '_messageSent' , '_conversationStart' , '_conversationStarted' ,
@@ -221,7 +227,7 @@ def dispatch_cloud_func(app_params, func_name, decode_object, params):
221227 return result
222228
223229
224- def register_cloud_hook (class_name , hook_name ):
230+ def register_cloud_hook (_cloud_codes , class_name , hook_name ):
225231 # hack the hook name
226232 hook_name = hook_name_mapping [hook_name ] + class_name
227233
@@ -230,7 +236,6 @@ def register_cloud_hook(class_name, hook_name):
230236
231237 def new_func (func ):
232238 _cloud_codes [hook_name ] = func
233-
234239 return new_func
235240
236241
@@ -247,7 +252,7 @@ def new_func(func):
247252after_delete = functools .partial (register_cloud_hook , hook_name = 'afterDelete' )
248253
249254
250- def dispatch_cloud_hook (app_params , class_name , hook_name , params ):
255+ def dispatch_cloud_hook (_cloud_codes , app_params , class_name , hook_name , params ):
251256 from .authorization import HOOK_KEY
252257 current_hook_key = app_params .get ('hook_key' )
253258 if not current_hook_key or current_hook_key != HOOK_KEY :
@@ -288,7 +293,7 @@ def dispatch_cloud_hook(app_params, class_name, hook_name, params):
288293 return obj .dump ()
289294
290295
291- def register_on_verified (verify_type ):
296+ def register_on_verified (_cloud_codes , verify_type ):
292297 if verify_type not in set (['sms' , 'email' ]):
293298 raise RuntimeError ('verify_type must be sms or email' )
294299
@@ -301,7 +306,7 @@ def new_func(func):
301306 return new_func
302307
303308
304- def dispatch_on_verified (app_params , verify_type , params ):
309+ def dispatch_on_verified (_cloud_codes , app_params , verify_type , params ):
305310 func_name = '__on_verified_' + verify_type
306311 from .authorization import HOOK_KEY
307312 hook_key = app_params .get ('hook_key' )
@@ -317,15 +322,15 @@ def dispatch_on_verified(app_params, verify_type, params):
317322 return func (user )
318323
319324
320- def register_on_login (func ):
325+ def register_on_login (_cloud_codes , func ):
321326 func_name = '__on_login__User'
322327
323328 if func_name in _cloud_codes :
324329 raise RuntimeError ('on login is already registered' )
325330 _cloud_codes [func_name ] = func
326331
327332
328- def dispatch_on_login (app_params , params ):
333+ def dispatch_on_login (_cloud_codes , app_params , params ):
329334 from .authorization import HOOK_KEY
330335 current_hook_key = app_params .get ('hook_key' )
331336 if not current_hook_key or current_hook_key != HOOK_KEY :
@@ -341,11 +346,11 @@ def dispatch_on_login(app_params, params):
341346 return func (user )
342347
343348
344- def dispatch_ops_meta_data ():
349+ def dispatch_ops_meta_data (_cloud_codes ):
345350 return list (_cloud_codes .keys ())
346351
347352
348- def register_on_bigquery (event ):
353+ def register_on_bigquery (_cloud_codes , event ):
349354 if event == 'end' :
350355 func_name = '__on_complete_bigquery_job'
351356 else :
@@ -358,7 +363,7 @@ def inner_func(func):
358363 return inner_func
359364
360365
361- def dispatch_on_bigquery (app_params , event , params ):
366+ def dispatch_on_bigquery (_cloud_codes , app_params , event , params ):
362367 if event == 'onComplete' :
363368 func_name = '__on_complete_bigquery_job'
364369 else :
0 commit comments