aboutsummaryrefslogtreecommitdiffstats
path: root/routes
diff options
context:
space:
mode:
Diffstat (limited to 'routes')
-rw-r--r--routes/auth.py57
-rw-r--r--routes/heroes.py433
-rw-r--r--routes/users.py186
3 files changed, 676 insertions, 0 deletions
diff --git a/routes/auth.py b/routes/auth.py
new file mode 100644
index 0000000..bb3798e
--- /dev/null
+++ b/routes/auth.py
@@ -0,0 +1,57 @@
+"""
+Routes - Users
+"""
+import datetime
+import json
+from flask import (
+ Blueprint,
+ Response,
+ request
+)
+from flask_jwt_extended import create_access_token
+from database.models import UserModel
+from mongoengine.errors import (
+ FieldDoesNotExist,
+ NotUniqueError,
+ ValidationError
+)
+from utils.errors import (
+ unauthorized_error,
+ user_already_exists_error,
+ internal_server_error,
+ schema_validation_error
+)
+
+auth = Blueprint("auth", __name__)
+
+
+@auth.route('/auth/token', methods=['POST'])
+def login():
+ """Receive data for login"""
+ try:
+ body = request.get_json()
+ user = UserModel.objects.get(email=body.get('email'))
+ authorized = user.check_password(body.get('password'))
+ if not authorized:
+ raise PermissionError("Check your password or email")
+ expires = datetime.timedelta(days=7)
+ access_token = create_access_token(
+ identity=str(user.id),
+ expires_delta=expires
+ )
+ except PermissionError as e:
+ return unauthorized_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:
+ return Response(
+ response=json.dumps({
+ "token": access_token
+ }),
+ status=200,
+ mimetype="applications/json"
+ )
diff --git a/routes/heroes.py b/routes/heroes.py
new file mode 100644
index 0000000..9b631a5
--- /dev/null
+++ b/routes/heroes.py
@@ -0,0 +1,433 @@
+"""
+Routes - Heroes
+"""
+import json
+from flask import (
+ Blueprint,
+ Response,
+ request
+)
+from flask_jwt_extended import (
+ jwt_required,
+ get_jwt_identity
+)
+from database.models import (
+ PowerstatsModel,
+ BiographyModel,
+ AppearanceModel,
+ WorkModel,
+ ConnectionModel,
+ ImageModel,
+ HeroeModel,
+ UserModel
+)
+from mongoengine.errors import (
+ FieldDoesNotExist,
+ NotUniqueError,
+ DoesNotExist,
+ ValidationError,
+ InvalidQueryError
+)
+from utils.errors import (
+ heroe_already_exists_error,
+ updating_heroe_error,
+ internal_server_error,
+ schema_validation_error,
+ not_data_found
+)
+from utils.decorators import superuser
+from bson.objectid import ObjectId
+
+heroes = Blueprint("heroes", __name__)
+
+
+@heroes.route('/heroes', methods=['POST'])
+@jwt_required()
+@superuser
+def create_heroe():
+ """Receive data for create heroe"""
+ try:
+ user_id = get_jwt_identity()
+ user = UserModel.objects.get(id=user_id)
+ powerstats = PowerstatsModel(
+ intelligence=request.json['powerstats']['intelligence'],
+ strength=request.json['powerstats']['strength'],
+ speed=request.json['powerstats']['speed'],
+ durability=request.json['powerstats']['durability'],
+ power=request.json['powerstats']['power'],
+ combat=request.json['powerstats']['combat']
+ )
+ biography = BiographyModel(
+ fullname=request.json['biography']['full-name'],
+ alteregos=request.json['biography']['alter-egos'],
+ aliases=request.json['biography']['aliases'],
+ placeofbirth=request.json['biography']['place-of-birth'],
+ firstappearance=request.json['biography']['first-appearance'],
+ publisher=request.json['biography']['publisher'],
+ alignment=request.json['biography']['alignment']
+ )
+ appearance = AppearanceModel(
+ gender=request.json['appearance']['gender'],
+ race=request.json['appearance']['race'],
+ height=request.json['appearance']['height'],
+ weight=request.json['appearance']['weight'],
+ eyecolor=request.json['appearance']['eye-color'],
+ haircolor=request.json['appearance']['hair-color']
+ )
+ work = WorkModel(
+ occupation=request.json['work']['occupation'],
+ base=request.json['work']['base']
+ )
+ connections = ConnectionModel(
+ groupaffiliation=request.json['connections']['group-affiliation'],
+ relatives=request.json['connections']['relatives']
+ )
+ image = ImageModel(
+ url=request.json['image']['url']
+ )
+ heroe = HeroeModel(
+ name=request.json['name'].capitalize(),
+ powerstats=powerstats,
+ biography=biography,
+ appearance=appearance,
+ work=work,
+ connections=connections,
+ image=image,
+ added_by=user
+ ).save()
+ # update user collection
+ user.update(push__heroes=heroe)
+ user.save()
+ except (FieldDoesNotExist, ValidationError) as e:
+ return schema_validation_error(e)
+ except NotUniqueError as e:
+ return heroe_already_exists_error(e)
+ except Exception as e:
+ return internal_server_error(e)
+ else:
+ data = {
+ '_id': str(heroe.id),
+ "name": heroe.name,
+ }
+ return Response(
+ response=json.dumps(data),
+ status=201,
+ mimetype="applications/json"
+ )
+
+
+@heroes.route('/heroes', methods=['GET'])
+@jwt_required()
+def get_some_heroes():
+ """Get all heroes"""
+ try:
+ heroe = HeroeModel.objects()
+ if len(heroe) > 0:
+ response = heroe.exclude('added_by').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"
+ )
+
+
+@heroes.route('/heroes/<id>', methods=['GET'])
+@jwt_required()
+def get_some_heroe(id):
+ """Get heroe by id"""
+ try:
+ if ObjectId.is_valid(id):
+ heroe = HeroeModel.objects(id=id)
+ else:
+ raise DoesNotExist
+ if len(heroe) > 0:
+ data = heroe.exclude('added_by').to_json()
+ else:
+ raise DoesNotExist
+ except DoesNotExist:
+ return not_data_found()
+ except Exception as e:
+ return internal_server_error(e)
+ else:
+ return Response(
+ response=(data),
+ status=200,
+ mimetype="application/json"
+ )
+
+
+@heroes.route('/heroes/<id>/powerstats', methods=['GET'])
+@jwt_required()
+def get_powerstats_heroe(id):
+ """Get heroe by id"""
+ try:
+ if ObjectId.is_valid(id):
+ heroe = HeroeModel.objects.get(id=id).powerstats
+ else:
+ raise DoesNotExist
+ if len(heroe) > 0:
+ data = heroe.to_json()
+ else:
+ raise DoesNotExist
+ except DoesNotExist:
+ return not_data_found()
+ except Exception as e:
+ return internal_server_error(e)
+ else:
+ return Response(
+ response=(data),
+ status=200,
+ mimetype="application/json"
+ )
+
+
+@heroes.route('/heroes/<id>/biography', methods=['GET'])
+@jwt_required()
+def get_biography_heroe(id):
+ """Get heroe by id"""
+ try:
+ if ObjectId.is_valid(id):
+ heroe = HeroeModel.objects.get(id=id).biography
+ else:
+ raise DoesNotExist
+ if len(heroe) > 0:
+ data = heroe.to_json()
+ else:
+ raise DoesNotExist
+ except DoesNotExist:
+ return not_data_found()
+ except Exception as e:
+ return internal_server_error(e)
+ else:
+ return Response(
+ response=(data),
+ status=200,
+ mimetype="application/json"
+ )
+
+
+@heroes.route('/heroes/<id>/appearance', methods=['GET'])
+@jwt_required()
+def get_appearance_heroe(id):
+ """Get heroe by id"""
+ try:
+ if ObjectId.is_valid(id):
+ heroe = HeroeModel.objects.get(id=id).appearance
+ else:
+ raise DoesNotExist
+ if len(heroe) > 0:
+ data = heroe.to_json()
+ else:
+ raise DoesNotExist
+ except DoesNotExist:
+ return not_data_found()
+ except Exception as e:
+ return internal_server_error(e)
+ else:
+ return Response(
+ response=(data),
+ status=200,
+ mimetype="application/json"
+ )
+
+
+@heroes.route('/heroes/<id>/work', methods=['GET'])
+@jwt_required()
+def get_work_heroe(id):
+ """Get heroe by id"""
+ try:
+ if ObjectId.is_valid(id):
+ heroe = HeroeModel.objects.get(id=id).work
+ else:
+ raise DoesNotExist
+ if len(heroe) > 0:
+ data = heroe.to_json()
+ else:
+ raise DoesNotExist
+ except DoesNotExist:
+ return not_data_found()
+ except Exception as e:
+ return internal_server_error(e)
+ else:
+ return Response(
+ response=(data),
+ status=200,
+ mimetype="application/json"
+ )
+
+
+@heroes.route('/heroes/<id>/connections', methods=['GET'])
+@jwt_required()
+def get_connections_heroe(id):
+ """Get heroe by id"""
+ try:
+ if ObjectId.is_valid(id):
+ heroe = HeroeModel.objects.get(id=id).connections
+ else:
+ raise DoesNotExist
+ if len(heroe) > 0:
+ data = heroe.to_json()
+ else:
+ raise DoesNotExist
+ except DoesNotExist:
+ return not_data_found()
+ except Exception as e:
+ return internal_server_error(e)
+ else:
+ return Response(
+ response=(data),
+ status=200,
+ mimetype="application/json"
+ )
+
+
+@heroes.route('/heroes/<id>/image', methods=['GET'])
+@jwt_required()
+def get_image_heroe(id):
+ """Get heroe by id"""
+ try:
+ if ObjectId.is_valid(id):
+ heroe = HeroeModel.objects.get(id=id).image
+ else:
+ raise DoesNotExist
+ if len(heroe) > 0:
+ data = heroe.to_json()
+ else:
+ raise DoesNotExist
+ except DoesNotExist:
+ return not_data_found()
+ except Exception as e:
+ return internal_server_error(e)
+ else:
+ return Response(
+ response=(data),
+ status=200,
+ mimetype="application/json"
+ )
+
+
+@heroes.route('/heroes/search/<name>', methods=['GET'])
+@jwt_required()
+def get_some_heroe_name(name):
+ """Search heroe by name"""
+ try:
+ name = name.capitalize()
+ heroe = HeroeModel.objects.filter(name=name)
+ if len(heroe) > 0:
+ data = heroe.exclude('added_by').to_json()
+ else:
+ raise DoesNotExist
+ except DoesNotExist:
+ return not_data_found()
+ except Exception as e:
+ return internal_server_error(e)
+ else:
+ return Response(
+ response=(data),
+ status=200,
+ mimetype="application/json"
+ )
+
+
+@heroes.route('/heroes/<id>', methods=['DELETE'])
+@jwt_required()
+@superuser
+def delete_some_heroe(id):
+ """Delete heroe by id"""
+ try:
+ user_id = get_jwt_identity()
+ if ObjectId.is_valid(id):
+ heroe = HeroeModel.objects.get(id=id, added_by=user_id)
+ heroe.delete()
+ except DoesNotExist:
+ return not_data_found()
+ except Exception as e:
+ return internal_server_error(e)
+ else:
+ _heroe = str(heroe.id)
+ data = {
+ "msg": f"Heroe: {_heroe}, was deleted"
+ }
+ return Response(
+ response=json.dumps(data),
+ status=200,
+ mimetype="application/json"
+ )
+
+
+@heroes.route('/heroes/<id>', methods=['PUT'])
+@jwt_required()
+@superuser
+def put_heroe(id):
+ """Receive data for update heroe"""
+ try:
+ user_id = get_jwt_identity()
+ heroe = HeroeModel.objects.get(id=id, added_by=user_id)
+ powerstats = PowerstatsModel(
+ intelligence=request.json['powerstats']['intelligence'],
+ strength=request.json['powerstats']['strength'],
+ speed=request.json['powerstats']['speed'],
+ durability=request.json['powerstats']['durability'],
+ power=request.json['powerstats']['power'],
+ combat=request.json['powerstats']['combat']
+ )
+ biography = BiographyModel(
+ fullname=request.json['biography']['full-name'],
+ alteregos=request.json['biography']['alter-egos'],
+ aliases=request.json['biography']['aliases'],
+ placeofbirth=request.json['biography']['place-of-birth'],
+ firstappearance=request.json['biography']['first-appearance'],
+ publisher=request.json['biography']['publisher'],
+ alignment=request.json['biography']['alignment']
+ )
+ appearance = AppearanceModel(
+ gender=request.json['appearance']['gender'],
+ race=request.json['appearance']['race'],
+ height=request.json['appearance']['height'],
+ weight=request.json['appearance']['weight'],
+ eyecolor=request.json['appearance']['eye-color'],
+ haircolor=request.json['appearance']['hair-color']
+ )
+ work = WorkModel(
+ occupation=request.json['work']['occupation'],
+ base=request.json['work']['base']
+ )
+ connections = ConnectionModel(
+ groupaffiliation=request.json['connections']['group-affiliation'],
+ relatives=request.json['connections']['relatives']
+ )
+ image = ImageModel(
+ url=request.json['image']['url']
+ )
+ heroe.update(
+ name=request.json['name'].capitalize(),
+ powerstats=powerstats,
+ biography=biography,
+ appearance=appearance,
+ work=work,
+ connections=connections,
+ image=image
+ )
+ except InvalidQueryError as e:
+ return schema_validation_error(e)
+ except DoesNotExist as e:
+ return updating_heroe_error(e)
+ except Exception as e:
+ return internal_server_error(e)
+ else:
+ data = {
+ '_id': str(heroe.id),
+ "name": heroe.name,
+ }
+ return Response(
+ response=json.dumps(data),
+ status=201,
+ mimetype="applications/json"
+ )
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"
+ )