· 5 years ago · Jun 29, 2020, 10:58 PM
1from uri.user import *
2
3import flask
4from modern_paste import app
5
6import config
7import constants.api
8import database.user
9from flask_login import current_user
10from flask_login import login_user
11from api.decorators import require_form_args
12from api.decorators import require_login_api
13from util.exception import *
14
15
16@app.route(UserCreateURI.path, methods=['POST'])
17@require_form_args(['username', 'password'])
18def create_new_user():
19 """
20 API endpoint for creating a new user.
21 """
22 if not config.ENABLE_USER_REGISTRATION:
23 return (
24 flask.jsonify(constants.api.USER_REGISTRATION_DISABLED_FAILURE),
25 constants.api.USER_REGISTRATION_DISABLED_FAILURE_CODE,
26 )
27
28 data = flask.request.get_json()
29 try:
30 new_user = database.user.create_new_user(
31 username=data['username'],
32 password=data['password'],
33 signup_ip=flask.request.remote_addr,
34 name=data.get('name'),
35 email=data.get('email'),
36 )
37 login_user(new_user)
38 return flask.jsonify({
39 constants.api.RESULT: constants.api.RESULT_SUCCESS,
40 constants.api.MESSAGE: None,
41 'username': new_user.username,
42 'name': new_user.name,
43 'email': new_user.email,
44 }), constants.api.SUCCESS_CODE
45 except UsernameNotAvailableException:
46 return flask.jsonify({
47 constants.api.RESULT: constants.api.RESULT_FAULURE,
48 constants.api.MESSAGE: 'Username is not available',
49 constants.api.FAILURE: 'username_not_available_failure',
50 }), constants.api.INCOMPLETE_PARAMS_FAILURE_CODE
51 except InvalidEmailException:
52 return flask.jsonify({
53 constants.api.RESULT: constants.api.RESULT_FAULURE,
54 constants.api.MESSAGE: 'Email address {email_addr} is invalid'.format(email_addr=data.get('email')),
55 constants.api.FAILURE: 'invalid_email_failure',
56 }), constants.api.INCOMPLETE_PARAMS_FAILURE_CODE
57 except:
58 return flask.jsonify(constants.api.UNDEFINED_FAILURE), constants.api.UNDEFINED_FAILURE_CODE
59
60
61@app.route(UserUpdateDetailsURI.path, methods=['POST'])
62@require_login_api
63def update_user_details():
64 """
65 Update the user profile of the currently logged-in user.
66 """
67 data = {
68 field: value
69 for field, value in flask.request.get_json().items()
70 if value
71 }
72 try:
73 if data.get('new_password') and (not data.get('current_password') or not database.user.authenticate_user(current_user.username, data.get('current_password'))):
74 return flask.jsonify({
75 constants.api.RESULT: constants.api.RESULT_FAULURE,
76 constants.api.MESSAGE: 'Attempting to change user password and either current password was not '
77 'supplied or is incorrect',
78 constants.api.FAILURE: 'auth_failure',
79 }), constants.api.AUTH_FAILURE_CODE
80 new_user = database.user.update_user_details(
81 user_id=current_user.user_id,
82 name=data.get('name'),
83 email=data.get('email'),
84 new_password=data.get('new_password'),
85 )
86 return flask.jsonify({
87 constants.api.RESULT: constants.api.RESULT_SUCCESS,
88 constants.api.MESSAGE: None,
89 'name': new_user.name,
90 'email': new_user.email,
91 }), constants.api.SUCCESS_CODE
92 except InvalidEmailException:
93 return flask.jsonify({
94 constants.api.RESULT: constants.api.RESULT_FAULURE,
95 constants.api.MESSAGE: 'Email address {email_addr} is invalid'.format(email_addr=data.get('email')),
96 constants.api.FAILURE: 'invalid_email_failure',
97 }), constants.api.INCOMPLETE_PARAMS_FAILURE_CODE
98 except:
99 return flask.jsonify(constants.api.UNDEFINED_FAILURE), constants.api.UNDEFINED_FAILURE_CODE
100
101
102@app.route(UserDeactivateURI.path, methods=['POST'])
103@require_login_api
104def deactivate_user():
105 """
106 Deactivate the currently logged-in user.
107 """
108 try:
109 database.user.deactivate_user(current_user.user_id)
110 return flask.jsonify({
111 constants.api.RESULT: constants.api.RESULT_SUCCESS,
112 constants.api.MESSAGE: None,
113 'username': current_user.username,
114 }), constants.api.SUCCESS_CODE
115 except:
116 return flask.jsonify(constants.api.UNDEFINED_FAILURE), constants.api.UNDEFINED_FAILURE_CODE
117
118
119@app.route(UserAPIKeyRegenerateURI.path, methods=['POST'])
120@require_login_api
121def api_key_regenerate():
122 """
123 Generate a new API key for the currently logged-in user.
124 """
125 try:
126 return flask.jsonify({
127 constants.api.RESULT: constants.api.RESULT_SUCCESS,
128 constants.api.MESSAGE: None,
129 'api_key': database.user.generate_new_api_key(current_user.user_id).api_key,
130 }), constants.api.SUCCESS_CODE
131 except:
132 return flask.jsonify(constants.api.UNDEFINED_FAILURE), constants.api.UNDEFINED_FAILURE_CODE
133
134
135@app.route(CheckUsernameAvailabilityURI.path, methods=['POST'])
136@require_form_args(['username'])
137def check_username_availability():
138 """
139 Check if the specified username is available for registration.
140 """
141 data = flask.request.get_json()
142 try:
143 return flask.jsonify({
144 'username': data['username'],
145 'is_available': database.user.is_username_available(data['username']),
146 }), constants.api.SUCCESS_CODE
147 except:
148 return flask.jsonify(constants.api.UNDEFINED_FAILURE), constants.api.UNDEFINED_FAILURE_CODE
149
150
151@app.route(ValidateEmailAddressURI.path, methods=['POST'])
152@require_form_args(['email'])
153def validate_email_address():
154 """
155 Check if the provided email address is valid.
156 """
157 data = flask.request.get_json()
158 try:
159 return flask.jsonify({
160 'email': data['email'],
161 'is_valid': database.user.is_email_address_valid(data['email']),
162 }), constants.api.SUCCESS_CODE
163 except:
164 return flask.jsonify(constants.api.UNDEFINED_FAILURE), constants.api.UNDEFINED_FAILURE_CODE