diff --git a/.gitignore b/.gitignore index 4ca745a..3f3c67f 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,6 @@ app/**/*.pyo .env .venv + + +logs/ diff --git a/app/configs/logger_config.py b/app/configs/logger_config.py index 60bbd33..087a56f 100644 --- a/app/configs/logger_config.py +++ b/app/configs/logger_config.py @@ -16,20 +16,39 @@ class LoggerConfig: if not os.path.exists(LoggerConfig.LOG_DIR): os.makedirs(LoggerConfig.LOG_DIR) - # Separate loggers for different levels - LoggerConfig._setup_logger(app.logger, "info.log", logging.INFO) - LoggerConfig._setup_logger(app.logger, "error.log", logging.ERROR) - LoggerConfig._setup_logger(app.logger, "warning.log", logging.WARNING) + # Remove default handlers to prevent duplicate logging + for handler in app.logger.handlers[:]: + app.logger.removeHandler(handler) + # Create separate loggers + info_logger = LoggerConfig._setup_logger( + "info_logger", "info.log", logging.INFO, logging.WARNING + ) + error_logger = LoggerConfig._setup_logger( + "error_logger", "error.log", logging.ERROR, logging.CRITICAL + ) + warning_logger = LoggerConfig._setup_logger( + "warning_logger", "warning.log", logging.WARNING, logging.WARNING + ) + + # Attach handlers to Flask app logger + app.logger.addHandler(info_logger) + app.logger.addHandler(error_logger) + app.logger.addHandler(warning_logger) + + app.logger.setLevel(logging.DEBUG) # Set lowest level to capture all logs app.logger.info("Logger has been initialized for Flask application.") @staticmethod - def _setup_logger(logger, filename, level): + def _setup_logger(name, filename, level, max_level): """Helper method to configure loggers for specific levels.""" + logger = logging.getLogger(name) + logger.setLevel(level) log_file_path = os.path.join(LoggerConfig.LOG_DIR, filename) log_handler = RotatingFileHandler(log_file_path, maxBytes=100000, backupCount=3) log_handler.setLevel(level) log_formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s") log_handler.setFormatter(log_formatter) - + log_handler.addFilter(lambda record: level <= record.levelno <= max_level) logger.addHandler(log_handler) + return log_handler diff --git a/app/controllers/auth_controller.py b/app/controllers/auth_controller.py index 4f7d927..09a1012 100644 --- a/app/controllers/auth_controller.py +++ b/app/controllers/auth_controller.py @@ -4,6 +4,7 @@ from schemas.basic_response_schema import ResponseSchema from schemas.google_login_schema import GoogleLoginSchema from schemas import LoginSchema from services import UserService, AuthService +from core import AuthException class AuthController: @@ -38,7 +39,6 @@ class AuthController: ) return jsonify(response.model_dump()), 401 - # Jika berhasil, kembalikan data user tanpa meta response = ResponseSchema( message="Login successful", data=user_info, @@ -51,6 +51,11 @@ class AuthController: response = ResponseSchema(message="Invalid input", data=None, meta=None) return jsonify(response.model_dump()), 400 + except AuthException as e: + current_app.logger.error(f"Auth error: {e}") + response = ResponseSchema(message=e, data=None, meta=None) + return jsonify(response.model_dump()), 400 + except Exception as e: current_app.logger.error( f"Error during Google login: {str(e)}", exc_info=True diff --git a/app/repositories/user_repository.py b/app/repositories/user_repository.py index 906461b..9e0048f 100644 --- a/app/repositories/user_repository.py +++ b/app/repositories/user_repository.py @@ -25,8 +25,9 @@ class UserRepository: return user def get_by_google_id(self, google_id: str) -> Optional[UserEntity]: - user = self.collection.find_one({"google_id": google_id}) - return user + user_data = self.collection.find_one({"google_id": google_id}) + + return UserEntity(**user_data) if user_data else None def insert_user(self, user_data: UserEntity) -> str: """Menambahkan pengguna baru ke dalam database dan mengembalikan ID pengguna.""" diff --git a/app/services/auth_service.py b/app/services/auth_service.py index f7fac39..699e11f 100644 --- a/app/services/auth_service.py +++ b/app/services/auth_service.py @@ -5,6 +5,7 @@ from google.oauth2 import id_token from google.auth.transport import requests from configs import Config from core import AuthException +from flask import current_app class AuthService: @@ -26,6 +27,7 @@ class AuthService: existing_user = self.user_repository.get_by_google_id(google_id) if existing_user: + current_app.logger.info(f"User {existing_user.email} already exists ") if existing_user.email == email: return existing_user return AuthException("Email not match") diff --git a/logs/info.log b/logs/info.log index 0b927e5..e69de29 100644 --- a/logs/info.log +++ b/logs/info.log @@ -1,3 +0,0 @@ -2025-03-19 11:48:56,950 - INFO - Logger has been initialized for Flask application. -2025-03-19 11:49:01,795 - INFO - Logger has been initialized for Flask application. -2025-03-19 11:49:06,664 - INFO - Logger has been initialized for Flask application.