Skip to content

Multi Model

Use Case 6: Multi-Model Service with Registration

Scenario: Complete microservice with multiple related models.

Python
from mongo_ops import (
    MongoConnectionManager,
    BaseDocument,
    BaseRepository,
    ModelRegistry
)
from fastapi import FastAPI
from contextlib import asynccontextmanager

# Define Models
class User(BaseDocument):
    username: str
    email: str
    role: str = "user"

class Post(BaseDocument):
    title: str
    content: str
    author_id: str
    likes: int = 0

class Comment(BaseDocument):
    post_id: str
    user_id: str
    content: str

# Define Repositories
class UserRepository(BaseRepository[User]):
    def __init__(self):
        super().__init__("users", User)

class PostRepository(BaseRepository[Post]):
    def __init__(self):
        super().__init__("posts", Post)

class CommentRepository(BaseRepository[Comment]):
    def __init__(self):
        super().__init__("comments", Comment)

# Register all models
ModelRegistry.register("users", User, indexes=[("email", 1), ("username", 1)])
ModelRegistry.register("posts", Post, indexes=[("author_id", 1), ("created_at", -1)])
ModelRegistry.register("comments", Comment, indexes=[("post_id", 1), ("user_id", 1)])

# Setup FastAPI with lifespan
@asynccontextmanager
async def lifespan(app: FastAPI):
    await MongoConnectionManager.connect(
        uri="mongodb://localhost:27017",
        db_name="social_app"
    )
    await ModelRegistry.initialize_all()
    yield
    await MongoConnectionManager.disconnect()

app = FastAPI(lifespan=lifespan)

# Initialize repositories
user_repo = UserRepository()
post_repo = PostRepository()
comment_repo = CommentRepository()

# Endpoints
@app.post("/users/", response_model=User)
async def create_user(user: User):
    return await user_repo.create(user)

@app.post("/posts/", response_model=Post)
async def create_post(post: Post):
    return await post_repo.create(post)

@app.post("/comments/", response_model=Comment)
async def create_comment(comment: Comment):
    return await comment_repo.create(comment)