import os from datetime import date, datetime, timedelta, timezone from typing import Any, Generic, Optional, TypeVar from dotenv import load_dotenv from jose import jwt from pydantic import BaseModel load_dotenv() T = TypeVar("T") class CommonResponse(BaseModel, Generic[T]): success: bool=True data: Optional[T] = None msg: str = "" def _json_default(value: Any): if isinstance(value, (datetime, date)): return value.isoformat() raise TypeError(f"{type(value).__name__} is not JSON serializable") def _json_safe_dict(data: dict) -> dict: return { key: _json_default(value) if isinstance(value, (datetime, date)) else value for key, value in data.items() } # = 60분 * 24시간 * 7일 def create_jwt_token(data: dict, expires_minutes: int = 60 * 24 * 365) -> str: secret_key = os.getenv("JWT_SECRET_KEY", "change-this-jwt-secret-key") algorithm = "HS256" now = datetime.now(timezone.utc) payload = { **_json_safe_dict(data), "iat": now, "exp": now + timedelta(minutes=expires_minutes), } return jwt.encode(payload, secret_key, algorithm=algorithm)