61 lines
1.8 KiB
Python
61 lines
1.8 KiB
Python
|
|
from typing import List, Optional
|
||
|
|
from datetime import datetime
|
||
|
|
import secrets
|
||
|
|
from sqlalchemy.orm import Session
|
||
|
|
|
||
|
|
from app.models.api_key import APIKey
|
||
|
|
from app.schemas.api_key import APIKeyCreate, APIKeyUpdate
|
||
|
|
|
||
|
|
class APIKeyService:
|
||
|
|
@staticmethod
|
||
|
|
def get_api_keys(db: Session, user_id: int, skip: int = 0, limit: int = 100) -> List[APIKey]:
|
||
|
|
return (
|
||
|
|
db.query(APIKey)
|
||
|
|
.filter(APIKey.user_id == user_id)
|
||
|
|
.offset(skip)
|
||
|
|
.limit(limit)
|
||
|
|
.all()
|
||
|
|
)
|
||
|
|
|
||
|
|
@staticmethod
|
||
|
|
def create_api_key(db: Session, user_id: int, name: str) -> APIKey:
|
||
|
|
api_key = APIKey(
|
||
|
|
key=f"sk-{secrets.token_hex(32)}",
|
||
|
|
name=name,
|
||
|
|
user_id=user_id,
|
||
|
|
is_active=True
|
||
|
|
)
|
||
|
|
db.add(api_key)
|
||
|
|
db.commit()
|
||
|
|
db.refresh(api_key)
|
||
|
|
return api_key
|
||
|
|
|
||
|
|
@staticmethod
|
||
|
|
def get_api_key(db: Session, api_key_id: int) -> Optional[APIKey]:
|
||
|
|
return db.query(APIKey).filter(APIKey.id == api_key_id).first()
|
||
|
|
|
||
|
|
@staticmethod
|
||
|
|
def get_api_key_by_key(db: Session, key: str) -> Optional[APIKey]:
|
||
|
|
return db.query(APIKey).filter(APIKey.key == key).first()
|
||
|
|
|
||
|
|
@staticmethod
|
||
|
|
def update_api_key(db: Session, api_key: APIKey, update_data: APIKeyUpdate) -> APIKey:
|
||
|
|
for field, value in update_data.model_dump(exclude_unset=True).items():
|
||
|
|
setattr(api_key, field, value)
|
||
|
|
db.add(api_key)
|
||
|
|
db.commit()
|
||
|
|
db.refresh(api_key)
|
||
|
|
return api_key
|
||
|
|
|
||
|
|
@staticmethod
|
||
|
|
def delete_api_key(db: Session, api_key: APIKey) -> None:
|
||
|
|
db.delete(api_key)
|
||
|
|
db.commit()
|
||
|
|
|
||
|
|
@staticmethod
|
||
|
|
def update_last_used(db: Session, api_key: APIKey) -> APIKey:
|
||
|
|
api_key.last_used_at = datetime.utcnow()
|
||
|
|
db.add(api_key)
|
||
|
|
db.commit()
|
||
|
|
db.refresh(api_key)
|
||
|
|
return api_key
|