""" 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/', 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/', 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/', 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" )