diff options
Diffstat (limited to 'server/szurubooru/api/users.py')
| -rw-r--r-- | server/szurubooru/api/users.py | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/server/szurubooru/api/users.py b/server/szurubooru/api/users.py new file mode 100644 index 0000000..ead769b --- /dev/null +++ b/server/szurubooru/api/users.py @@ -0,0 +1,81 @@ +''' Users public API. ''' + +import re +import falcon +from szurubooru.services.errors import IntegrityError + +def _serialize_user(user): + return { + 'id': user.user_id, + 'name': user.name, + 'email': user.email, # TODO: secure this + 'accessRank': user.access_rank, + 'creationTime': user.creation_time, + 'lastLoginTime': user.last_login_time, + 'avatarStyle': user.avatar_style + } + +class UserListApi(object): + ''' API for lists of users. ''' + def __init__(self, config, auth_service, user_service): + self._config = config + self._auth_service = auth_service + self._user_service = user_service + + def on_get(self, request, response): + ''' Retrieves a list of users. ''' + self._auth_service.verify_privilege(request.context.user, 'users:list') + request.context.result = {'message': 'Searching for users'} + + def on_post(self, request, response): + ''' Creates a new user. ''' + self._auth_service.verify_privilege(request.context.user, 'users:create') + name_regex = self._config['service']['user_name_regex'] + password_regex = self._config['service']['password_regex'] + + try: + name = request.context.request['name'] + password = request.context.request['password'] + email = request.context.request['email'].strip() + if not email: + email = None + except KeyError as ex: + raise falcon.HTTPBadRequest( + 'Malformed data', 'Field %r not found' % ex.args[0]) + + if not re.match(name_regex, name): + raise falcon.HTTPBadRequest( + 'Malformed data', + 'Name must validate %r expression' % name_regex) + + if not re.match(password_regex, password): + raise falcon.HTTPBadRequest( + 'Malformed data', + 'Password must validate %r expression' % password_regex) + + session = request.context.session + try: + user = self._user_service.create_user(session, name, password, email) + session.commit() + except: + raise IntegrityError('User %r already exists.' % name) + request.context.result = {'user': _serialize_user(user)} + +class UserDetailApi(object): + ''' API for individual users. ''' + def __init__(self, config, auth_service, user_service): + self._config = config + self._auth_service = auth_service + self._user_service = user_service + + def on_get(self, request, response, user_name): + ''' Retrieves an user. ''' + self._auth_service.verify_privilege(request.context.user, 'users:view') + session = request.context.session + user = self._user_service.get_by_name(session, user_name) + request.context.result = {'user': _serialize_user(user)} + + def on_put(self, request, response, user_name): + ''' Updates an existing user. ''' + self._auth_service.verify_privilege(request.context.user, 'users:edit') + request.context.result = {'message': 'Updating user ' + user_name} |