aboutsummaryrefslogtreecommitdiffstats
path: root/routes/users.py
diff options
context:
space:
mode:
Diffstat (limited to 'routes/users.py')
-rw-r--r--routes/users.py186
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"
+ )