Skip to content

Commit 0504535

Browse files
committed
move the user routes into a separate file making us of flask Blueprint
provide access within those routes to the server-wide configuration using the documented "app_context" provisions
1 parent 580d656 commit 0504535

File tree

4 files changed

+96
-74
lines changed

4 files changed

+96
-74
lines changed

mig/lib/coresvc/respond.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
from flask import Response
2+
import json
3+
import werkzeug.exceptions as httpexceptions
4+
5+
httpexceptions_by_code = {
6+
exc.code: exc for exc in httpexceptions.__dict__.values() if hasattr(exc, "code")
7+
}
8+
9+
10+
def http_error_from_status_code(http_status_code, http_url, description=None):
11+
return httpexceptions_by_code[http_status_code](description)
12+
13+
14+
def json_reponse_from_status_code(http_status_code, content):
15+
json_content = json.dumps(content)
16+
return Response(
17+
json_content, http_status_code, {"Content-Type": "application/json"}
18+
)

mig/lib/coresvc/routes/__init__.py

Whitespace-only changes.

mig/lib/coresvc/routes/user.py

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
from flask import Blueprint, request, current_app
2+
3+
from mig.lib.coresvc.payloads import PayloadException, PAYLOAD_POST_USER
4+
from mig.lib.coresvc.respond import \
5+
http_error_from_status_code, \
6+
json_reponse_from_status_code
7+
from mig.shared.base import canonical_user, keyword_auto, force_native_str_rec
8+
from mig.shared.useradm import fill_user, \
9+
create_user as useradm_create_user, search_users as useradm_search_users
10+
11+
def _create_user(configuration, payload):
12+
user_dict = canonical_user(
13+
configuration, payload, PAYLOAD_POST_USER._fields)
14+
fill_user(user_dict)
15+
force_native_str_rec(user_dict)
16+
17+
try:
18+
useradm_create_user(user_dict, configuration, keyword_auto, default_renew=True)
19+
except:
20+
raise http_error_from_status_code(500, None)
21+
user_email = user_dict['email']
22+
objects = search_users(configuration, {
23+
'email': user_email
24+
})
25+
if len(objects) != 1:
26+
raise http_error_from_status_code(400, None)
27+
return objects[0]
28+
29+
30+
def search_users(configuration, search_filter):
31+
_, hits = useradm_search_users(search_filter, configuration, keyword_auto)
32+
return list((obj for _, obj in hits))
33+
34+
35+
bp = Blueprint('user', __name__)
36+
37+
38+
@bp.get('/user')
39+
def GET_user():
40+
raise http_error_from_status_code(400, None)
41+
42+
@bp.get('/user/<username>')
43+
def GET_user_username(username):
44+
return 'FOOBAR'
45+
46+
@bp.get('/user/find')
47+
def GET_user_find():
48+
configuration, = current_app.migctx
49+
query_params = request.args
50+
51+
objects = search_users(configuration, {
52+
'email': query_params['email']
53+
})
54+
55+
if len(objects) != 1:
56+
raise http_error_from_status_code(404, None)
57+
58+
return dict(objects=objects)
59+
60+
@bp.post('/user')
61+
def POST_user():
62+
configuration, = current_app.migctx
63+
payload = request.get_json()
64+
65+
try:
66+
payload = PAYLOAD_POST_USER.ensure(payload)
67+
except PayloadException as vr:
68+
return http_error_from_status_code(400, None, vr.serialize())
69+
70+
user = _create_user(configuration, payload)
71+
return json_reponse_from_status_code(201, user)

mig/lib/coresvc/server.py

Lines changed: 7 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -34,94 +34,27 @@
3434
from http.server import HTTPServer, BaseHTTPRequestHandler
3535
from socketserver import ThreadingMixIn
3636

37-
from flask import Flask, request, Response
37+
from collections import namedtuple
38+
from flask import Flask, current_app
3839
import json
3940
import os
4041
import sys
4142
import threading
4243
import time
43-
import werkzeug.exceptions as httpexceptions
4444
from wsgiref.simple_server import WSGIRequestHandler
4545

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
5146

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'])
8848

8949

9050
def _create_and_expose_server(server, configuration):
9151
app = Flask('coreapi')
9252

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)
12255

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)
12558

12659
return app
12760

0 commit comments

Comments
 (0)