diff options
Diffstat (limited to 'routes/users.py')
-rw-r--r-- | routes/users.py | 186 |
1 files changed, 186 insertions, 0 deletions
diff --git a/routes/users.py b/routes/users.py new file mode 100644 index 0000000..add310c --- /dev/null +++ b/routes/users.py @@ -0,0 +1,186 @@ +""" +Routes - Users +""" +import json +from flask import ( + Blueprint, + Response, + request +) +from flask_jwt_extended import ( + jwt_required +) +from config import check_register +from database.models import UserModel +from mongoengine.errors import ( + FieldDoesNotExist, + NotUniqueError, + DoesNotExist, + ValidationError, + InvalidQueryError +) +from utils.decorators import superuser +from utils.errors import ( + user_already_exists_error, + internal_server_error, + schema_validation_error, + not_data_found, + disable_register_error +) +from werkzeug.security import generate_password_hash +from bson.objectid import ObjectId + + +users = Blueprint("users", __name__) + + +@users.route('/auth/signup', methods=['POST']) +def create_user(): + """Receive data for create user""" + try: + if check_register: + username = request.json['username'].lower() + email = request.json['email'] + password = generate_password_hash( + request.json['password'] + ) + admin = request.json["admin"] + user = UserModel( + username=username, + email=email, + password=password, + admin=admin + ).save() + else: + raise PermissionError("Registration disabled") + except PermissionError as e: + return disable_register_error(e) + except (FieldDoesNotExist, ValidationError) as e: + return schema_validation_error(e) + except NotUniqueError as e: + return user_already_exists_error(e) + except Exception as e: + return internal_server_error(e) + else: + data = { + '_id': str(user.id), + "username": user.username, + } + return Response( + response=json.dumps(data), + status=201, + mimetype="applications/json" + ) + + +@users.route('/users', methods=['GET']) +@jwt_required() +@superuser +def get_users(): + """Get all users""" + try: + response = UserModel.objects() + if len(response) > 0: + response = response.to_json() + else: + raise DoesNotExist + except DoesNotExist: + return not_data_found() + except Exception as e: + return internal_server_error(e) + else: + return Response( + response, + status=200, + mimetype="application/json" + ) + + +@users.route('/users/<query>', methods=['GET']) +@jwt_required() +@superuser +def get_user(query): + """Get all users""" + try: + if ObjectId.is_valid(query): + response = UserModel.objects.get(id=query) + else: + response = UserModel.objects.filter(username=query) + if len(response) > 0: + response = response.to_json() + else: + raise DoesNotExist + except DoesNotExist: + return not_data_found() + except Exception as e: + return internal_server_error(e) + else: + return Response( + response, + status=200, + mimetype="application/json" + ) + + +@users.route('/users/<id>', methods=['DELETE']) +@jwt_required() +@superuser +def delete_user(id): + """Delete user by id""" + try: + if ObjectId.is_valid(id): + user = UserModel.objects.get(id=id) + user.delete() + except DoesNotExist: + return not_data_found() + except Exception as e: + return internal_server_error(e) + else: + _user = str(user.id) + data = { + "msg": f"User: {_user}, was deleted" + } + return Response( + response=json.dumps(data), + status=200, + mimetype="application/json" + ) + + +@users.route('/users/<id>', methods=['PUT']) +@jwt_required() +@superuser +def put_user(id): + """Receive data for update user""" + try: + username = request.json['username'].lower() + email = request.json['email'] + password = generate_password_hash( + request.json['password'] + ) + admin = request.json["admin"] + + if ObjectId.is_valid(id): + user = UserModel.objects.get(id=id) + user.update( + username=username, + email=email, + password=password, + admin=admin + ) + except InvalidQueryError as e: + return schema_validation_error(e) + except NotUniqueError as e: + return user_already_exists_error(e) + except Exception as e: + return internal_server_error(e) + else: + _user = str(user.id) + data = { + "msg": f"User: {_user}, was updated" + } + return Response( + response=json.dumps(data), + status=201, + mimetype="applications/json" + ) |