Update generated backend for blog_app with entities: posts, comments, tags, user

This commit is contained in:
Backend IM Bot 2025-03-21 10:58:48 +01:00
parent ba552aff74
commit b940724847
12 changed files with 56 additions and 63 deletions

View File

@ -1,5 +1,3 @@
Here's the `dependencies.py` file for the `app/api/core/dependencies/` directory:
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from app.api.db.database import SessionLocal from app.api.db.database import SessionLocal

View File

@ -1,12 +1,13 @@
import time from time import time
from starlette.middleware.base import BaseHTTPMiddleware from starlette.middleware.base import BaseHTTPMiddleware
from starlette.requests import Request from starlette.requests import Request
from starlette.responses import Response from starlette.responses import Response
from loguru import logger from loguru import logger
class ActivityTrackerMiddleware(BaseHTTPMiddleware): class ActivityTrackerMiddleware(BaseHTTPMiddleware):
async def dispatch(self, request: Request, call_next): async def dispatch(self, request: Request, call_next):
start_time = time.time() start_time = time()
response = await call_next(request) response: Response = await call_next(request)
process_time = time.time() - start_time process_time = time() - start_time
logger.info(f'{request.method} {request.url} - Process Time: {process_time:.6f} seconds') logger.info(f"Processed {request.method} {request.url} in {process_time:.4f} seconds")
return response return response

View File

@ -1,25 +1,16 @@
Here's the `comments.py` file for the `app/api/v1/models/` directory of the `blog_app_h23t0` FastAPI backend:
from sqlalchemy import Column, ForeignKey, Integer, String, Text from sqlalchemy import Column, ForeignKey, Integer, String, Text
from sqlalchemy.orm import relationship
from app.api.db.database import Base from app.api.db.database import Base
class Comments(Base): class Comments(Base):
__tablename__ = 'comments' __tablename__ = 'comments'
id = Column(Integer, primary_key=True, index=True) id = Column(Integer, primary_key=True, index=True)
post_id = Column(Integer, ForeignKey('posts.id'), nullable=False) post_id = Column(Integer, ForeignKey('posts.id'))
user_id = Column(Integer, ForeignKey('users.id'), nullable=False) user_id = Column(Integer, ForeignKey('users.id'))
comment_text = Column(Text, nullable=False) comment_text = Column(Text)
created_at = Column(String, nullable=False) created_at = Column(Integer)
updated_at = Column(String, nullable=True) updated_at = Column(Integer)
Explanation: post = relationship('Post', back_populates='comments')
user = relationship('User', back_populates='comments')
1. The necessary imports from `sqlalchemy` are included: `Column`, `ForeignKey`, `Integer`, `String`, and `Text`.
5. The following columns are defined:
- `id`: An integer primary key column with an index.
- `post_id`: An integer column representing a foreign key to the `posts` table, marked as non-nullable.
- `user_id`: An integer column representing a foreign key to the `users` table, marked as non-nullable.
- `comment_text`: A text column for storing the comment content, marked as non-nullable.
- `created_at`: A string column for storing the comment creation timestamp, marked as non-nullable.
- `updated_at`: A string column for storing the comment update timestamp, nullable (allowing `None` values).

View File

@ -1,7 +1,13 @@
from sqlalchemy import Column, ForeignKey, Integer, String, Text from sqlalchemy import Column, ForeignKey, Integer, String, Text
from sqlalchemy.orm import relationship
from app.api.db.database import Base from app.api.db.database import Base
class Posts(Base): class Posts(Base):
__tablename__ = 'posts' __tablename__ = 'posts'
id = Column(Integer, primary_key=True, index=True) id = Column(Integer, primary_key=True, index=True)
title = Column(String)
content = Column(Text)
user_id = Column(Integer, ForeignKey('users.id'))
user = relationship('User', back_populates='posts')

View File

@ -1,7 +1,12 @@
from sqlalchemy import Column, ForeignKey, Integer, String, Text from sqlalchemy import Column, ForeignKey, Integer, String, Text
from sqlalchemy.orm import relationship
from app.api.db.database import Base from app.api.db.database import Base
class Tags(Base): class Tags(Base):
__tablename__ = 'tags' __tablename__ = 'tags'
id = Column(Integer, primary_key=True, index=True) id = Column(Integer, primary_key=True, index=True)
name = Column(String, nullable=False, unique=True)
description = Column(Text)
posts = relationship("Post", back_populates="tags", secondary="post_tags")

View File

@ -1,27 +1,14 @@
Here's the `user.py` file for the `app/api/v1/models/` directory in the `blog_app` FastAPI backend:
from sqlalchemy import Column, ForeignKey, Integer, String, Text from sqlalchemy import Column, ForeignKey, Integer, String, Text
from sqlalchemy.orm import relationship
from app.api.db.database import Base from app.api.db.database import Base
class User(Base): class User(Base):
__tablename__ = "user" __tablename__ = 'user'
id = Column(Integer, primary_key=True, index=True) id = Column(Integer, primary_key=True, index=True)
username = Column(String, unique=True, nullable=False) email = Column(String, unique=True, index=True)
email = Column(String, unique=True, nullable=False) hashed_password = Column(String)
password_hash = Column(String, nullable=False) is_active = Column(Integer, default=1)
full_name = Column(String) full_name = Column(String)
bio = Column(Text)
profile_pic = Column(String)
Explanation: posts = relationship("Post", back_populates="author")
1. We import the necessary classes from `sqlalchemy` for defining the database columns: `Column`, `ForeignKey`, `Integer`, `String`, and `Text`.
5. We define the following columns for the `User` model:
- `id`: An integer primary key column with an index.
- `username`: A string column that must be unique and cannot be null.
- `email`: A string column that must be unique and cannot be null.
- `password_hash`: A string column that cannot be null (for storing the hashed password).
- `full_name`: An optional string column for the user's full name.
- `bio`: An optional text column for the user's biography.
- `profile_pic`: An optional string column for the user's profile picture URL.

View File

@ -1,2 +1,3 @@
from fastapi import APIRouter from fastapi import APIRouter
router = APIRouter()
router = APIRouter()

View File

@ -1,10 +1,11 @@
from pydantic import BaseModel from pydantic import BaseModel
class CommentsBase(BaseModel): class CommentsBase(BaseModel):
pass body: str
class Comments(BaseModel): class Comments(CommentsBase):
id: int id: int
post_id: int
class Config: class Config:
orm_mode = True orm_mode = True

View File

@ -1,10 +1,9 @@
from pydantic import BaseModel from pydantic import BaseModel
class PostsBase(BaseModel): class PostsBase(BaseModel):
pass title: str
content: str
class Posts(BaseModel):
id: int
class Posts(PostsBase):
class Config: class Config:
orm_mode = True orm_mode = True

View File

@ -1,10 +1,11 @@
from pydantic import BaseModel from pydantic import BaseModel
class TagsBase(BaseModel): class TagsBase(BaseModel):
pass name: str
class Tags(BaseModel): class Tags(TagsBase):
id: int id: int
name: str
class Config: class Config:
orm_mode = True orm_mode = True

View File

@ -1,10 +1,11 @@
from pydantic import BaseModel from pydantic import BaseModel
class UserBase(BaseModel): class UserBase(BaseModel):
pass email: str
class User(BaseModel): class User(UserBase):
id: int id: int
is_active: bool
class Config: class Config:
orm_mode = True orm_mode = True

10
main.py
View File

@ -2,9 +2,11 @@ from fastapi import FastAPI
from app.api.db.database import engine, Base from app.api.db.database import engine, Base
from app.api.v1.routes import router from app.api.v1.routes import router
from app.api.core.middleware.activity_tracker import ActivityTrackerMiddleware from app.api.core.middleware.activity_tracker import ActivityTrackerMiddleware
app = FastAPI() app = FastAPI()
app.add_middleware(ActivityTrackerMiddleware) app.add_middleware(ActivityTrackerMiddleware)
app.include_router(router, prefix='/v1') app.include_router(router, prefix="/v1")
@app.on_event('startup')
def startup(): @app.on_event("startup")
Base.metadata.create_all(bind=engine) def startup_event():
Base.metadata.create_all(bind=engine)