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.

116 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(
  21. required_auth=Auth.TOKEN, required_role=Role.USER)
  22. def get_users() -> APIResponse:
  23. """
  24. Get a list of users.
  25. :return: a paginated list of users
  26. """
  27. page, per_page = get_pagination_params(request.args)
  28. user_page = user_service.get_users(page, per_page)
  29. if user_page is not None:
  30. return APIResponse(APIPage.from_page(user_page), 200)
  31. return abort(404)
  32. @USER_BLUEPRINT.route('/<name>', methods=['GET'])
  33. @return_json
  34. @authentication_middleware.require(
  35. required_auth=Auth.TOKEN, required_role=Role.USER)
  36. def get_user(name: str) -> APIResponse:
  37. """
  38. Get a user.
  39. :return: user if exists, else 404
  40. """
  41. user = user_service.find_by_name(name)
  42. if user is not None:
  43. return APIResponse(user, 200)
  44. return abort(404)
  45. @USER_BLUEPRINT.route('/<name>', methods=['PATCH'])
  46. @return_json
  47. @authentication_middleware.require(
  48. required_auth=Auth.TOKEN, required_role=Role.USER)
  49. def patch_user(name: str) -> APIResponse:
  50. """
  51. Patch a user.
  52. :return: user if patched, 4xx error on patching issue, 404 on nonexistent
  53. """
  54. user = user_service.find_by_name(name)
  55. if user is not None:
  56. user_patch: User = transformation_service.deserialize_model(
  57. User, request.json)
  58. patched_user = patch_service.patch(
  59. g.user, user, user_patch, get_patch_fields(request.json))
  60. return APIResponse(patched_user, 200)
  61. return abort(404)
  62. @USER_BLUEPRINT.route('', methods=['POST'])
  63. @return_json
  64. @authentication_middleware.require(
  65. required_auth=Auth.TOKEN, required_role=Role.ADMIN)
  66. def register_user() -> APIResponse:
  67. """
  68. Register a user with the service.
  69. :return: The newly registered User
  70. """
  71. new_user: User = transformation_service.deserialize_model(
  72. User, request.json)
  73. requested_password = None
  74. if 'password' in request.json:
  75. requested_password = request.json['password'].strip()
  76. registered_user = user_service.register(
  77. name=new_user.name,
  78. password=requested_password,
  79. role=new_user.role
  80. )
  81. return APIResponse(payload=registered_user, status=200)
  82. @USER_BLUEPRINT.route('/<name>', methods=['DELETE'])
  83. @return_json
  84. @authentication_middleware.require(
  85. required_auth=Auth.TOKEN, required_role=Role.ADMIN)
  86. def delete_user(name: str) -> APIResponse:
  87. """
  88. Delete a user with the service.
  89. :return: The newly registered User
  90. """
  91. user = user_service.find_by_name(name)
  92. if user is not None:
  93. user_service.delete(user)
  94. return APIResponse(
  95. APIMessage(True, 'Successfully Deleted'), status=200)
  96. return abort(404)