from flask import Blueprint, request
from app.services.user_service import get_user_by_id, create_user_section, get_user_section, update_user_section, update_user_class_status, update_user_settings, get_classes_by_user_id, get_all_users, delete_user, edit_user, get_user_class_status
from app.models.response import *
from flasgger import swag_from
from app.models.status_codes import StatusCodes
users_bp = Blueprint('users', __name__)
[docs]
@users_bp.route('/users/<user_id>', methods=['GET'])
@swag_from({
'tags': ['Users'],
'summary': 'TODO Get a specific user by ID',
'description': 'Retrieves user details based on the provided user ID.',
'parameters': [
{
'name': 'user_id',
'in': 'path',
'required': True,
'type': 'string',
'example': '123'
}
],
'responses': {
'200': {
'description': 'User found successfully',
'schema': {
'type': 'object',
'properties': {
'id': {'type': 'string'},
'name': {'type': 'string'},
'email': {'type': 'string'}
}
}
},
'404': {
'description': 'User not found',
'schema': {
'type': 'object',
'properties': {
'error': {'type': 'string'}
}
}
}
}
})
def get_user_route(user_id):
try:
user = get_user_by_id(user_id)
if not user:
return success_response(
f"User not found for id {user_id}",
None,
StatusCodes.NOT_FOUND
)
return success_response(
f"User for id {user_id}",
user.to_json(),
StatusCodes.OK
)
except Exception as e:
return error_response(
f"Error fetching user {user_id}: {e}",
None,
StatusCodes.SERVER_ERROR
)
[docs]
@users_bp.route('/users/<user_id>/status', methods=['PUT'])
def update_user_status_route(user_id):
try:
data = request.get_json()
new_status = data.get("status")
user_class_id = data.get("userClassId")
valid_statuses = {"ACTIVE", "SUSPENDED", "LOCKED"}
if new_status not in valid_statuses:
return error_response(
f"Invalid status '{new_status}'. Must be one of {valid_statuses}.",
None,
StatusCodes.BAD_REQUEST
)
update_user_class_status(user_id, new_status, user_class_id)
return success_response(
f"User status updated to '{new_status}' for user {user_id}",
None,
StatusCodes.OK
)
except Exception as e:
return error_response(
f"Error updating user status for {user_id}: {e}",
None,
StatusCodes.SERVER_ERROR
)
[docs]
@users_bp.route('/users/<user_id>/class-status', methods=['GET'])
@swag_from({
'tags': ['Users'],
'summary': 'TODO Get lock status of a specific user by ID',
'description': 'Retrieves lock status of a user based on the provided user ID.',
'parameters': [
{
'name': 'user_id',
'in': 'path',
'required': True,
'type': 'string',
'example': '123'
}
],
'responses': {
'200': {
'description': 'User lock status found successfully',
'schema': {
'type': 'object',
'properties': {
'id': {'type': 'string'},
'is_locked': {'type': 'boolean'}
}
}
},
'404': {
'description': 'User not found',
'schema': {
'type': 'object',
'properties': {
'error': {'type': 'string'}
}
}
}
}
})
def get_user_class_status_route(user_id):
try:
class_id = request.args.get('class_id')
print(f"Class ID: {class_id}")
user_class_status = get_user_class_status(user_id, class_id)
if not user_class_status:
return success_response(
f"User class status found for id {user_id}",
None,
StatusCodes.NOT_FOUND
)
print(user_class_status)
return success_response(
f"User class status for id {user_id}",
{ "user_class_status": user_class_status },
StatusCodes.OK
)
except Exception as e:
return error_response(
f"Error fetching user {user_id}: {e}",
None,
StatusCodes.SERVER_ERROR
)
[docs]
@users_bp.route('/users/<user_id>/sections', methods=['POST'])
def create_user_section_route(user_id):
try:
user_section_id = create_user_section(user_id)
return success_response(
f"User section created for user {user_id}",
{'user_section_id': user_section_id},
StatusCodes.CREATED
)
except Exception as e:
return error_response(
f"Error creating user section for {user_id}: {e}",
None,
StatusCodes.SERVER_ERROR
)
[docs]
@users_bp.route('/users/<user_id>/sections', methods=['GET'])
def get_user_section_route(user_id):
try:
class_id = request.args.get('class_id')
user_section_id = get_user_section(user_id, class_id)
return success_response(
f"User section retrieved or created for user {user_id}",
{'user_section_id': user_section_id},
StatusCodes.OK
)
except Exception as e:
return error_response(
f"Error retrieving or creating user section for {user_id}: {e}",
None,
StatusCodes.SERVER_ERROR
)
[docs]
@users_bp.route('/users/<user_id>/sections', methods=['PUT'])
def update_user_section_route(user_id):
try:
data = request.get_json()
user_section_id = data.get("userSectionId")
if not user_section_id:
return error_response(
"userSectionId is required",
None,
StatusCodes.BAD_REQUEST
)
new_status = data.get("status", "").upper()
valid_statuses = {"COMPLETE", "NEED_REVIEW"}
if new_status not in valid_statuses:
return error_response(
f"Invalid status '{new_status}'. Must be one of {valid_statuses}.",
None,
StatusCodes.BAD_REQUEST
)
update_user_section(new_status, user_section_id)
return success_response(
f"User section updated for user {user_id}",
None,
StatusCodes.OK
)
except Exception as e:
return error_response(
f"Error updating user section for {user_id}: {e}",
None,
StatusCodes.SERVER_ERROR
)
[docs]
@users_bp.route('/users/<user_id>/settings', methods=['PUT'])
def update_user_settings_route(user_id):
try:
new_settings = request.get_json()
if not new_settings:
return error_response(
"Error: Missing settings",
None,
StatusCodes.BAD_REQUEST
)
update_user_settings(user_id, new_settings)
return success_response(
f"User settings updated for id {user_id}",
None,
StatusCodes.OK
)
except Exception as e:
return error_response(
f"Error updating user settings {user_id}: {e}",
None,
StatusCodes.SERVER_ERROR
)
[docs]
@users_bp.route('/users/<user_id>/classes', methods=['GET'])
@swag_from({
'tags': ['Users'],
'summary': 'Get classes for a specific user',
'description': 'Retrieves all classes associated with the given user ID.',
'parameters': [
{
'name': 'user_id',
'in': 'path',
'required': True,
'type': 'string',
'example': '123'
}
],
'responses': {
'200': {
'description': 'Classes found successfully',
'schema': {
'type': 'array',
'items': {
'type': 'object',
'properties': {
'id': {'type': 'string'},
'class_title': {'type': 'string'},
'class_code': {'type': 'string'},
'class_hex_color': {'type': 'string'},
'class_image_cover': {'type': 'string'},
}
}
}
},
'404': {
'description': 'No classes found for the user',
'schema': {
'type': 'object',
'properties': {
'error': {'type': 'string'}
}
}
}
}
})
def get_user_classes_route(user_id):
try:
user_classes = get_classes_by_user_id(user_id)
if not user_classes:
return success_response(
f"No classes found for user id {user_id}",
[],
StatusCodes.NOT_FOUND
)
return success_response(
f"Classes for user id {user_id}",
user_classes,
StatusCodes.OK
)
except Exception as e:
return error_response(
f"Error fetching classes for user {user_id}: {e}",
None,
StatusCodes.SERVER_ERROR
)
[docs]
@users_bp.route('/users', methods=['GET'])
@swag_from({
'tags': ['Users'],
'summary': 'Get all users',
'description': 'Retrieves all users in the system.',
'responses': {
'200': {
'description': 'Users found successfully',
'schema': {
'type': 'array',
'items': {
'type': 'object',
'properties': {
'id': {'type': 'string'},
'name': {'type': 'string'},
'email': {'type': 'string'}
}
}
}
},
'404': {
'description': 'No users found',
'schema': {
'type': 'object',
'properties': {
'error': {'type': 'string'}
}
}
}
}
})
def get_all_users_route():
try:
users = get_all_users()
if not users:
return success_response(
"No users found",
[],
StatusCodes.NOT_FOUND
)
return success_response(
"All users",
users,
StatusCodes.OK
)
except Exception as e:
return error_response(
f"Error fetching all users: {e}",
None,
StatusCodes.SERVER_ERROR
)
[docs]
@users_bp.route('/users/<user_id>', methods=['DELETE'])
def delete_user_route(user_id):
try:
if not user_id:
return error_response(
"Error: Missing user ID",
False,
StatusCodes.BAD_REQUEST
)
delete_user(user_id)
return success_response(
f"User with ID {user_id} deleted successfully",
True,
StatusCodes.OK
)
except Exception as e:
return error_response(
f"Error deleting user {user_id}: {e}",
False,
StatusCodes.SERVER_ERROR
)
[docs]
@users_bp.route('/users/<user_id>', methods=['PUT'])
def update_user_route(user_id):
try:
data = request.get_json()
if not data:
return error_response(
"Error: Missing user data",
None,
StatusCodes.BAD_REQUEST
)
updated_user = edit_user(user_id, data)
return success_response(
f"User updated successfully for id {user_id}",
None,
StatusCodes.OK
)
except Exception as e:
return error_response(
f"Error updating user {user_id}: {e}",
None,
StatusCodes.SERVER_ERROR
)