# /controllers/user_controller.py from flask import jsonify, request, current_app from app.services import UserService from app.schemas import RegisterSchema from pydantic import ValidationError from app.schemas import ResponseSchema from app.exception import AlreadyExistException, DataNotFoundException from app.helpers import make_response from app.schemas.requests import ProfileUpdateSchema class UserController: def __init__(self, userService: UserService): self.user_service = userService def register(self): try: request_data = request.get_json() register_data = RegisterSchema(**request_data) self.user_service.register_user(register_data) return make_response("Register Success") except ValidationError as e: current_app.logger.error(f"Validation error: {e}") response = ResponseSchema(message="Invalid input", data=None, meta=None) return make_response("Invalid input", status_code=400) except AlreadyExistException as e: return make_response("User already exists", status_code=409) except Exception as e: current_app.logger.error( f"Error during Google login: {str(e)}", exc_info=True ) return make_response("Internal server error", status_code=500) def get_user_by_id(self, user_id): try: if not user_id: return make_response("User ID is required", status_code=400) user = self.user_service.get_user_by_id(user_id) if user: return make_response("User found", data=user) else: return make_response("User not found", status_code=404) except Exception as e: current_app.logger.error( f"Error while retrieving user: {str(e)}", exc_info=True ) return make_response( message="An internal server error occurred. Please try again later.", status_code=500, ) def update_profile(self): try: body = request.get_json() reqBody = ProfileUpdateSchema(**body) result = self.user_service.update_profile(reqBody) if result: return make_response(message="User profile updated successfully.") else: return make_response( message="Failed to update user profile. Please check the submitted data.", status_code=400, ) except DataNotFoundException as e: return make_response(message="User data not found.", status_code=404) except ValueError as e: return make_response( message=f"Invalid data provided: {str(e)}", status_code=400 ) except Exception as e: current_app.logger.error( f"Error while updating profile: {str(e)}", exc_info=True ) return make_response( message="An internal server error occurred. Please try again later.", status_code=500, ) def change_password(self): try: body = request.get_json() user_id = body.get("id") current_password = body.get("current_password") new_password = body.get("new_password") if not all([user_id, current_password, new_password]): return make_response( message="Missing required fields: id, current_password, new_password", status_code=400, ) result = self.user_service.change_password( user_id, current_password, new_password ) if result: return make_response(message="Password changed successfully.") else: return make_response( message="Failed to change password.", status_code=400, ) except DataNotFoundException as e: return make_response(message="User data not found.", status_code=404) except ValueError as e: return make_response(message=f"{str(e)}", status_code=400) except Exception as e: current_app.logger.error( f"Error while changing password: {str(e)}", exc_info=True ) return make_response( message="An internal server error occurred. Please try again later.", status_code=500, )