|
34 | 34 | from http.server import HTTPServer, BaseHTTPRequestHandler |
35 | 35 | from socketserver import ThreadingMixIn |
36 | 36 |
|
37 | | -from flask import Flask, request, Response |
| 37 | +from collections import namedtuple |
| 38 | +from flask import Flask, current_app |
38 | 39 | import json |
39 | 40 | import os |
40 | 41 | import sys |
41 | 42 | import threading |
42 | 43 | import time |
43 | | -import werkzeug.exceptions as httpexceptions |
44 | 44 | from wsgiref.simple_server import WSGIRequestHandler |
45 | 45 |
|
46 | | -from mig.lib.coresvc.payloads import PayloadException, \ |
47 | | - PAYLOAD_POST_USER |
48 | | -from mig.shared.base import canonical_user, keyword_auto, force_native_str_rec |
49 | | -from mig.shared.useradm import fill_user, \ |
50 | | - create_user as useradm_create_user, search_users as useradm_search_users |
51 | 46 |
|
52 | | - |
53 | | -httpexceptions_by_code = { |
54 | | - exc.code: exc for exc in httpexceptions.__dict__.values() if hasattr(exc, 'code')} |
55 | | - |
56 | | - |
57 | | -def http_error_from_status_code(http_status_code, http_url, description=None): |
58 | | - return httpexceptions_by_code[http_status_code](description) |
59 | | - |
60 | | - |
61 | | -def json_reponse_from_status_code(http_status_code, content): |
62 | | - json_content = json.dumps(content) |
63 | | - return Response(json_content, http_status_code, { 'Content-Type': 'application/json' }) |
64 | | - |
65 | | - |
66 | | -def _create_user(configuration, payload): |
67 | | - user_dict = canonical_user( |
68 | | - configuration, payload, PAYLOAD_POST_USER._fields) |
69 | | - fill_user(user_dict) |
70 | | - force_native_str_rec(user_dict) |
71 | | - |
72 | | - try: |
73 | | - useradm_create_user(user_dict, configuration, keyword_auto, default_renew=True) |
74 | | - except: |
75 | | - raise http_error_from_status_code(500, None) |
76 | | - user_email = user_dict['email'] |
77 | | - objects = search_users(configuration, { |
78 | | - 'email': user_email |
79 | | - }) |
80 | | - if len(objects) != 1: |
81 | | - raise http_error_from_status_code(400, None) |
82 | | - return objects[0] |
83 | | - |
84 | | - |
85 | | -def search_users(configuration, search_filter): |
86 | | - _, hits = useradm_search_users(search_filter, configuration, keyword_auto) |
87 | | - return list((obj for _, obj in hits)) |
| 47 | +MigCtx = namedtuple('MigCtx', ['configuration']) |
88 | 48 |
|
89 | 49 |
|
90 | 50 | def _create_and_expose_server(server, configuration): |
91 | 51 | app = Flask('coreapi') |
92 | 52 |
|
93 | | - @app.get('/user') |
94 | | - def GET_user(): |
95 | | - raise http_error_from_status_code(400, None) |
96 | | - |
97 | | - @app.get('/user/<username>') |
98 | | - def GET_user_username(username): |
99 | | - return 'FOOBAR' |
100 | | - |
101 | | - @app.get('/user/find') |
102 | | - def GET_user_find(): |
103 | | - query_params = request.args |
104 | | - |
105 | | - objects = search_users(configuration, { |
106 | | - 'email': query_params['email'] |
107 | | - }) |
108 | | - |
109 | | - if len(objects) != 1: |
110 | | - raise http_error_from_status_code(404, None) |
111 | | - |
112 | | - return dict(objects=objects) |
113 | | - |
114 | | - @app.post('/user') |
115 | | - def POST_user(): |
116 | | - payload = request.get_json() |
117 | | - |
118 | | - try: |
119 | | - payload = PAYLOAD_POST_USER.ensure(payload) |
120 | | - except PayloadException as vr: |
121 | | - return http_error_from_status_code(400, None, vr.serialize()) |
| 53 | + with app.app_context(): |
| 54 | + current_app.migctx = MigCtx(configuration=configuration) |
122 | 55 |
|
123 | | - user = _create_user(configuration, payload) |
124 | | - return json_reponse_from_status_code(201, user) |
| 56 | + from .routes import user |
| 57 | + app.register_blueprint(user.bp) |
125 | 58 |
|
126 | 59 | return app |
127 | 60 |
|
|
0 commit comments