A multipurpose python flask API server and administration SPA
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

111 lines
3.4 KiB

  1. """User API blueprint and endpoint definitions."""
  2. from flask import Blueprint, abort, request, g
  3. from corvus.api.decorators import return_json
  4. from corvus.api.model import APIResponse, APIMessage, APIPage
  5. from corvus.middleware import authentication_middleware
  6. from corvus.middleware.authentication_middleware import Auth
  7. from corvus.model import User
  8. from corvus.service import (
  9. patch_service,
  10. transformation_service,
  11. user_service
  12. )
  13. from corvus.service.patch_service import get_patch_fields
  14. from corvus.service.role_service import Role
  15. from corvus.utility.pagination_utility import get_pagination_params
  16. USER_BLUEPRINT = Blueprint(
  17. name='user', import_name=__name__, url_prefix='/user')
  18. @USER_BLUEPRINT.route('', methods=['GET'])
  19. @return_json
  20. @authentication_middleware.require(required_auth=Auth.TOKEN, required_role=Role.USER)
  21. def get_users() -> APIResponse:
  22. """
  23. Get a list of users.
  24. :return: a paginated list of users
  25. """
  26. page, per_page = get_pagination_params(request.args)
  27. user_page = user_service.get_users(page, per_page)
  28. if user_page is not None:
  29. return APIResponse(APIPage.from_page(user_page), 200)
  30. return abort(404)
  31. @USER_BLUEPRINT.route('/<name>', methods=['GET'])
  32. @return_json
  33. @authentication_middleware.require(required_auth=Auth.TOKEN, required_role=Role.USER)
  34. def get_user(name: str) -> APIResponse:
  35. """
  36. Get a user.
  37. :return: user if exists, else 404
  38. """
  39. user = user_service.find_by_name(name)
  40. if user is not None:
  41. return APIResponse(user, 200)
  42. return abort(404)
  43. @USER_BLUEPRINT.route('/<name>', methods=['PATCH'])
  44. @return_json
  45. @authentication_middleware.require(required_auth=Auth.TOKEN, required_role=Role.USER)
  46. def patch_user(name: str) -> APIResponse:
  47. """
  48. Patch a user.
  49. :return: user if patched, 4xx error on patching issue, 404 on nonexistent
  50. """
  51. user = user_service.find_by_name(name)
  52. if user is not None:
  53. user_patch: User = transformation_service.deserialize_model(
  54. User, request.json)
  55. patched_user = patch_service.patch(
  56. g.user, user, user_patch, get_patch_fields(request.json))
  57. return APIResponse(patched_user, 200)
  58. return abort(404)
  59. @USER_BLUEPRINT.route('', methods=['POST'])
  60. @return_json
  61. @authentication_middleware.require(required_auth=Auth.TOKEN, required_role=Role.ADMIN)
  62. def register_user() -> APIResponse:
  63. """
  64. Register a user with the service.
  65. :return: The newly registered User
  66. """
  67. new_user: User = transformation_service.deserialize_model(
  68. User, request.json)
  69. requested_password = None
  70. if 'password' in request.json:
  71. requested_password = request.json['password'].strip()
  72. registered_user = user_service.register(
  73. name=new_user.name,
  74. password=requested_password,
  75. role=new_user.role
  76. )
  77. return APIResponse(payload=registered_user, status=200)
  78. @USER_BLUEPRINT.route('/<name>', methods=['DELETE'])
  79. @return_json
  80. @authentication_middleware.require(required_auth=Auth.TOKEN, required_role=Role.ADMIN)
  81. def delete_user(name: str) -> APIResponse:
  82. """
  83. Delete a user with the service.
  84. :return: The newly registered User
  85. """
  86. user = user_service.find_by_name(name)
  87. if user is not None:
  88. user_service.delete(user)
  89. return APIResponse(
  90. APIMessage(True, 'Successfully Deleted'), status=200)
  91. return abort(404)