초기 커밋

This commit is contained in:
2026-03-01 07:44:19 +09:00
commit 09359f30be
146 changed files with 6120 additions and 0 deletions

0
app/db/__init__.py Normal file
View File

22
app/db/base.py Normal file
View File

@@ -0,0 +1,22 @@
from __future__ import annotations
from datetime import datetime
from sqlalchemy import func
from sqlmodel import Field, SQLModel
class TimestampMixin(SQLModel):
created_at: datetime = Field(
default_factory=datetime.utcnow,
sa_column_kwargs={"server_default": func.now()},
)
updated_at: datetime = Field(
default_factory=datetime.utcnow,
sa_column_kwargs={"server_default": func.now(), "onupdate": func.now()},
)
class SoftDeleteMixin(SQLModel):
is_deleted: bool = Field(default=False)
deleted_at: datetime | None = Field(default=None)

42
app/db/mariadb.py Normal file
View File

@@ -0,0 +1,42 @@
from __future__ import annotations
from collections.abc import AsyncGenerator
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
from sqlalchemy.orm import sessionmaker
from sqlmodel import SQLModel
from app.core.config import settings
async_engine = create_async_engine(
settings.MARIADB_DSN,
echo=settings.DEBUG,
pool_pre_ping=True,
pool_size=10,
max_overflow=20,
)
AsyncSessionLocal = sessionmaker(
bind=async_engine,
class_=AsyncSession,
expire_on_commit=False,
)
async def init_mariadb() -> None:
async with async_engine.begin() as conn:
await conn.run_sync(SQLModel.metadata.create_all)
async def close_mariadb() -> None:
await async_engine.dispose()
async def get_db() -> AsyncGenerator[AsyncSession, None]:
async with AsyncSessionLocal() as session:
try:
yield session
await session.commit()
except Exception:
await session.rollback()
raise

37
app/db/mongodb.py Normal file
View File

@@ -0,0 +1,37 @@
from __future__ import annotations
from beanie import init_beanie
from motor.motor_asyncio import AsyncIOMotorClient, AsyncIOMotorDatabase
from app.core.config import settings
mongo_client: AsyncIOMotorClient | None = None
mongo_db: AsyncIOMotorDatabase | None = None
async def init_mongodb() -> None:
global mongo_client, mongo_db
mongo_client = AsyncIOMotorClient(settings.MONGODB_URL)
mongo_db = mongo_client[settings.MONGODB_DATABASE]
from app.models.mongodb.analytics_result import AnalyticsResult
from app.models.mongodb.device_log import DeviceLog
from app.models.mongodb.notification import Notification
from app.models.mongodb.telemetry import TelemetryData
await init_beanie(
database=mongo_db,
document_models=[DeviceLog, TelemetryData, AnalyticsResult, Notification],
)
async def close_mongodb() -> None:
global mongo_client
if mongo_client:
mongo_client.close()
def get_mongo_db() -> AsyncIOMotorDatabase:
assert mongo_db is not None, "MongoDB not initialized"
return mongo_db

27
app/db/redis.py Normal file
View File

@@ -0,0 +1,27 @@
from __future__ import annotations
from redis.asyncio import Redis, from_url
from app.core.config import settings
redis_client: Redis | None = None
async def init_redis() -> None:
global redis_client
redis_client = from_url(
settings.REDIS_URL,
encoding="utf-8",
decode_responses=True,
)
async def close_redis() -> None:
global redis_client
if redis_client:
await redis_client.close()
def get_redis() -> Redis:
assert redis_client is not None, "Redis not initialized"
return redis_client