aiteamutils 0.2.76__tar.gz → 0.2.78__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aiteamutils
3
- Version: 0.2.76
3
+ Version: 0.2.78
4
4
  Summary: AI Team Utilities
5
5
  Project-URL: Homepage, https://github.com/yourusername/aiteamutils
6
6
  Project-URL: Issues, https://github.com/yourusername/aiteamutils/issues
@@ -24,15 +24,18 @@ class BaseColumn(Base):
24
24
  nullable=False
25
25
  )
26
26
  created_at: Mapped[datetime] = mapped_column(
27
+ TIMESTAMP(timezone=True),
27
28
  default=datetime.now(timezone.utc),
28
29
  index=True
29
30
  )
30
31
  updated_at: Mapped[datetime] = mapped_column(
32
+ TIMESTAMP(timezone=True),
31
33
  default=datetime.now(timezone.utc),
32
34
  onupdate=datetime.now(timezone.utc),
33
35
  index=True
34
36
  )
35
37
  deleted_at: Mapped[datetime] = mapped_column(
38
+ TIMESTAMP(timezone=True),
36
39
  default=None,
37
40
  nullable=True
38
41
  )
@@ -508,7 +508,7 @@ async def get_entity(
508
508
  ##################
509
509
  async def log_create(
510
510
  session: AsyncSession,
511
- model: str,
511
+ model: Type[ModelType],
512
512
  log_data: Dict[str, Any],
513
513
  request: Optional[Request] = None
514
514
  ) -> None:
@@ -1,18 +1,19 @@
1
1
  """보안 관련 유틸리티."""
2
2
  from datetime import datetime, timedelta, timezone
3
- from typing import Dict, Any, Optional, Literal, Callable, TYPE_CHECKING
3
+ from typing import Dict, Any, Optional, Literal, Callable, TYPE_CHECKING, TypeVar, Type
4
4
  from fastapi import Request, HTTPException, status
5
5
  from functools import wraps
6
6
  from jose import jwt, JWTError
7
7
  from passlib.context import CryptContext
8
8
  import logging
9
9
  from sqlalchemy.ext.asyncio import AsyncSession
10
-
10
+ from sqlalchemy.orm import DeclarativeBase
11
11
  from .exceptions import CustomException, ErrorCode
12
12
  from .enums import ActivityType
13
13
  from .database import log_create
14
14
 
15
15
  pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
16
+ ModelType = TypeVar("ModelType", bound=DeclarativeBase)
16
17
 
17
18
  # 전역 rate limit 상태 저장
18
19
  _rate_limits: Dict[str, Dict[str, Any]] = {}
@@ -133,7 +134,7 @@ def rate_limit(
133
134
  return decorator
134
135
 
135
136
  async def create_jwt_token(
136
- user_data: Dict[str, Any],
137
+ user_data: Type[ModelType],
137
138
  token_type: Literal["access", "refresh"],
138
139
  db_session: AsyncSession,
139
140
  token_settings: Dict[str, Any],
@@ -207,19 +208,18 @@ async def create_jwt_token(
207
208
 
208
209
  async def verify_jwt_token(
209
210
  token: str,
210
- expected_type: Optional[Literal["access", "refresh"]] = None
211
+ expected_type: Optional[Literal["access", "refresh"]] = None,
212
+ token_settings: Dict[str, Any] = None
211
213
  ) -> Dict[str, Any]:
212
214
  """JWT 토큰을 검증합니다."""
213
215
  try:
214
- settings = get_settings()
215
-
216
216
  # 토큰 디코딩
217
217
  payload = jwt.decode(
218
218
  token,
219
- settings.jwt_secret,
220
- algorithms=[settings.jwt_algorithm],
221
- audience=settings.token_audience,
222
- issuer=settings.token_issuer
219
+ token_settings["JWT_SECRET"],
220
+ algorithms=[token_settings["JWT_ALGORITHM"]],
221
+ audience=token_settings["TOKEN_AUDIENCE"],
222
+ issuer=token_settings["TOKEN_ISSUER"]
223
223
  )
224
224
 
225
225
  # 토큰 타입 검증
@@ -257,14 +257,16 @@ async def verify_jwt_token(
257
257
  original_error=e
258
258
  )
259
259
 
260
- def validate_token(token: str) -> Dict[str, Any]:
260
+ def validate_token(
261
+ token: str,
262
+ token_settings: Dict[str, Any] = None
263
+ ) -> Dict[str, Any]:
261
264
  """JWT 토큰을 검증하고 페이로드를 반환합니다."""
262
265
  try:
263
- settings = get_settings()
264
266
  payload = jwt.decode(
265
267
  token,
266
- settings.jwt_secret,
267
- algorithms=[settings.jwt_algorithm]
268
+ token_settings["JWT_SECRET"],
269
+ algorithms=[token_settings["JWT_ALGORITHM"]]
268
270
  )
269
271
  return payload
270
272
  except JWTError as e:
@@ -0,0 +1,2 @@
1
+ """버전 정보"""
2
+ __version__ = "0.2.78"
@@ -1,2 +0,0 @@
1
- """버전 정보"""
2
- __version__ = "0.2.76"
File without changes
File without changes
File without changes
File without changes