aboutsummaryrefslogtreecommitdiffstats
path: root/routes/heroes.py
diff options
context:
space:
mode:
authorJesús <heckyel@hyperbola.info>2022-03-22 00:39:40 +0800
committerJesús <heckyel@hyperbola.info>2022-03-22 00:39:40 +0800
commit3fca03988b42adaf8e67cc7137dd1fdba327e197 (patch)
treead39a5bc12a03c82b9a4fd980c1b92ca0a1dac93 /routes/heroes.py
downloadheroeapi-3fca03988b42adaf8e67cc7137dd1fdba327e197.tar.lz
heroeapi-3fca03988b42adaf8e67cc7137dd1fdba327e197.tar.xz
heroeapi-3fca03988b42adaf8e67cc7137dd1fdba327e197.zip
initial commit
Diffstat (limited to 'routes/heroes.py')
-rw-r--r--routes/heroes.py433
1 files changed, 433 insertions, 0 deletions
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"
+ )