diff options
author | Jesús <heckyel@hyperbola.info> | 2022-03-22 00:39:40 +0800 |
---|---|---|
committer | Jesús <heckyel@hyperbola.info> | 2022-03-22 00:39:40 +0800 |
commit | 3fca03988b42adaf8e67cc7137dd1fdba327e197 (patch) | |
tree | ad39a5bc12a03c82b9a4fd980c1b92ca0a1dac93 /routes/heroes.py | |
download | heroeapi-3fca03988b42adaf8e67cc7137dd1fdba327e197.tar.lz heroeapi-3fca03988b42adaf8e67cc7137dd1fdba327e197.tar.xz heroeapi-3fca03988b42adaf8e67cc7137dd1fdba327e197.zip |
initial commit
Diffstat (limited to 'routes/heroes.py')
-rw-r--r-- | routes/heroes.py | 433 |
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" + ) |