From f7a61bc7c6bbbf7c55879c870bf8246433ec86fe Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 24 Mar 2026 14:49:13 +0800 Subject: [PATCH] feat: create backend project structure Co-Authored-By: Claude Opus 4.6 --- imagecreator/backend/Dockerfile | 1 + imagecreator/backend/app/__init__.py | 1 + imagecreator/backend/app/api/__init__.py | 1 + imagecreator/backend/app/api/deps.py | 1 + imagecreator/backend/app/config.py | 31 +++++++++++++++++++ imagecreator/backend/app/core/__init__.py | 1 + imagecreator/backend/app/core/security.py | 1 + imagecreator/backend/app/database.py | 15 +++++++++ imagecreator/backend/app/main.py | 26 ++++++++++++++++ imagecreator/backend/app/models/__init__.py | 1 + imagecreator/backend/app/models/history.py | 1 + imagecreator/backend/app/models/user.py | 1 + imagecreator/backend/app/schemas/__init__.py | 1 + imagecreator/backend/app/schemas/auth.py | 1 + imagecreator/backend/app/schemas/history.py | 1 + imagecreator/backend/app/schemas/image.py | 1 + imagecreator/backend/app/schemas/user.py | 1 + imagecreator/backend/app/services/__init__.py | 1 + imagecreator/backend/app/services/auth.py | 1 + imagecreator/backend/app/services/image.py | 1 + imagecreator/backend/app/services/llm.py | 1 + imagecreator/backend/requirements.txt | 15 +++++++++ 22 files changed, 105 insertions(+) create mode 100644 imagecreator/backend/Dockerfile create mode 100644 imagecreator/backend/app/__init__.py create mode 100644 imagecreator/backend/app/api/__init__.py create mode 100644 imagecreator/backend/app/api/deps.py create mode 100644 imagecreator/backend/app/config.py create mode 100644 imagecreator/backend/app/core/__init__.py create mode 100644 imagecreator/backend/app/core/security.py create mode 100644 imagecreator/backend/app/database.py create mode 100644 imagecreator/backend/app/main.py create mode 100644 imagecreator/backend/app/models/__init__.py create mode 100644 imagecreator/backend/app/models/history.py create mode 100644 imagecreator/backend/app/models/user.py create mode 100644 imagecreator/backend/app/schemas/__init__.py create mode 100644 imagecreator/backend/app/schemas/auth.py create mode 100644 imagecreator/backend/app/schemas/history.py create mode 100644 imagecreator/backend/app/schemas/image.py create mode 100644 imagecreator/backend/app/schemas/user.py create mode 100644 imagecreator/backend/app/services/__init__.py create mode 100644 imagecreator/backend/app/services/auth.py create mode 100644 imagecreator/backend/app/services/image.py create mode 100644 imagecreator/backend/app/services/llm.py create mode 100644 imagecreator/backend/requirements.txt diff --git a/imagecreator/backend/Dockerfile b/imagecreator/backend/Dockerfile new file mode 100644 index 0000000..f66f91d --- /dev/null +++ b/imagecreator/backend/Dockerfile @@ -0,0 +1 @@ +# TODO: Dockerfile will be implemented in a later task diff --git a/imagecreator/backend/app/__init__.py b/imagecreator/backend/app/__init__.py new file mode 100644 index 0000000..3f9d593 --- /dev/null +++ b/imagecreator/backend/app/__init__.py @@ -0,0 +1 @@ +"""ImageCreator backend application.""" diff --git a/imagecreator/backend/app/api/__init__.py b/imagecreator/backend/app/api/__init__.py new file mode 100644 index 0000000..24b043b --- /dev/null +++ b/imagecreator/backend/app/api/__init__.py @@ -0,0 +1 @@ +"""API module.""" diff --git a/imagecreator/backend/app/api/deps.py b/imagecreator/backend/app/api/deps.py new file mode 100644 index 0000000..f58cfb3 --- /dev/null +++ b/imagecreator/backend/app/api/deps.py @@ -0,0 +1 @@ +"""API dependencies placeholder.""" diff --git a/imagecreator/backend/app/config.py b/imagecreator/backend/app/config.py new file mode 100644 index 0000000..df8553b --- /dev/null +++ b/imagecreator/backend/app/config.py @@ -0,0 +1,31 @@ +from pydantic_settings import BaseSettings +from functools import lru_cache + +class Settings(BaseSettings): + # Database + DATABASE_URL: str = "postgresql://user:pass@localhost:5432/imagecreator" + + # JWT + SECRET_KEY: str = "your-secret-key-change-in-production" + ALGORITHM: str = "HS256" + ACCESS_TOKEN_EXPIRE_MINUTES: int = 30 + REFRESH_TOKEN_EXPIRE_DAYS: int = 7 + + # CORS + CORS_ORIGINS: list[str] = ["http://localhost:3000"] + + # LLM API Keys + GEMINI_API_KEY: str = "" + OPENAI_API_KEY: str = "" + + # Image storage + IMAGE_STORAGE_PATH: str = "/app/uploads" + + class Config: + env_file = ".env" + +@lru_cache() +def get_settings(): + return Settings() + +settings = get_settings() diff --git a/imagecreator/backend/app/core/__init__.py b/imagecreator/backend/app/core/__init__.py new file mode 100644 index 0000000..8051c87 --- /dev/null +++ b/imagecreator/backend/app/core/__init__.py @@ -0,0 +1 @@ +"""Core module.""" diff --git a/imagecreator/backend/app/core/security.py b/imagecreator/backend/app/core/security.py new file mode 100644 index 0000000..97e5022 --- /dev/null +++ b/imagecreator/backend/app/core/security.py @@ -0,0 +1 @@ +"""Security utilities placeholder.""" diff --git a/imagecreator/backend/app/database.py b/imagecreator/backend/app/database.py new file mode 100644 index 0000000..f4bcb85 --- /dev/null +++ b/imagecreator/backend/app/database.py @@ -0,0 +1,15 @@ +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker, declarative_base + +from app.config import settings + +engine = create_engine(settings.DATABASE_URL, pool_pre_ping=True) +SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) +Base = declarative_base() + +def get_db(): + db = SessionLocal() + try: + yield db + finally: + db.close() diff --git a/imagecreator/backend/app/main.py b/imagecreator/backend/app/main.py new file mode 100644 index 0000000..4115ab3 --- /dev/null +++ b/imagecreator/backend/app/main.py @@ -0,0 +1,26 @@ +from fastapi import FastAPI +from fastapi.middleware.cors import CORSMiddleware + +from app.api import auth, users, images, history +from app.config import settings +from app.database import engine +from app.models import user, history as history_model + +app = FastAPI(title="ImageCreator API", version="1.0.0") + +app.add_middleware( + CORSMiddleware, + allow_origins=settings.CORS_ORIGINS, + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], +) + +app.include_router(auth.router, prefix="/api/auth", tags=["auth"]) +app.include_router(users.router, prefix="/api/users", tags=["users"]) +app.include_router(images.router, prefix="/api/images", tags=["images"]) +app.include_router(history.router, prefix="/api/history", tags=["history"]) + +@app.get("/health") +def health_check(): + return {"status": "ok"} diff --git a/imagecreator/backend/app/models/__init__.py b/imagecreator/backend/app/models/__init__.py new file mode 100644 index 0000000..e03cc62 --- /dev/null +++ b/imagecreator/backend/app/models/__init__.py @@ -0,0 +1 @@ +"""Models module.""" diff --git a/imagecreator/backend/app/models/history.py b/imagecreator/backend/app/models/history.py new file mode 100644 index 0000000..b8154c5 --- /dev/null +++ b/imagecreator/backend/app/models/history.py @@ -0,0 +1 @@ +"""History model placeholder.""" diff --git a/imagecreator/backend/app/models/user.py b/imagecreator/backend/app/models/user.py new file mode 100644 index 0000000..f373cac --- /dev/null +++ b/imagecreator/backend/app/models/user.py @@ -0,0 +1 @@ +"""User model placeholder.""" diff --git a/imagecreator/backend/app/schemas/__init__.py b/imagecreator/backend/app/schemas/__init__.py new file mode 100644 index 0000000..21312d2 --- /dev/null +++ b/imagecreator/backend/app/schemas/__init__.py @@ -0,0 +1 @@ +"""Schemas module.""" diff --git a/imagecreator/backend/app/schemas/auth.py b/imagecreator/backend/app/schemas/auth.py new file mode 100644 index 0000000..62643bf --- /dev/null +++ b/imagecreator/backend/app/schemas/auth.py @@ -0,0 +1 @@ +"""Auth schemas placeholder.""" diff --git a/imagecreator/backend/app/schemas/history.py b/imagecreator/backend/app/schemas/history.py new file mode 100644 index 0000000..5fdb0ea --- /dev/null +++ b/imagecreator/backend/app/schemas/history.py @@ -0,0 +1 @@ +"""History schemas placeholder.""" diff --git a/imagecreator/backend/app/schemas/image.py b/imagecreator/backend/app/schemas/image.py new file mode 100644 index 0000000..6b91196 --- /dev/null +++ b/imagecreator/backend/app/schemas/image.py @@ -0,0 +1 @@ +"""Image schemas placeholder.""" diff --git a/imagecreator/backend/app/schemas/user.py b/imagecreator/backend/app/schemas/user.py new file mode 100644 index 0000000..f084ffd --- /dev/null +++ b/imagecreator/backend/app/schemas/user.py @@ -0,0 +1 @@ +"""User schemas placeholder.""" diff --git a/imagecreator/backend/app/services/__init__.py b/imagecreator/backend/app/services/__init__.py new file mode 100644 index 0000000..5949e0b --- /dev/null +++ b/imagecreator/backend/app/services/__init__.py @@ -0,0 +1 @@ +"""Services module.""" diff --git a/imagecreator/backend/app/services/auth.py b/imagecreator/backend/app/services/auth.py new file mode 100644 index 0000000..cfb10da --- /dev/null +++ b/imagecreator/backend/app/services/auth.py @@ -0,0 +1 @@ +"""Auth service placeholder.""" diff --git a/imagecreator/backend/app/services/image.py b/imagecreator/backend/app/services/image.py new file mode 100644 index 0000000..b1eefe8 --- /dev/null +++ b/imagecreator/backend/app/services/image.py @@ -0,0 +1 @@ +"""Image service placeholder.""" diff --git a/imagecreator/backend/app/services/llm.py b/imagecreator/backend/app/services/llm.py new file mode 100644 index 0000000..7ec364a --- /dev/null +++ b/imagecreator/backend/app/services/llm.py @@ -0,0 +1 @@ +"""LLM service placeholder.""" diff --git a/imagecreator/backend/requirements.txt b/imagecreator/backend/requirements.txt new file mode 100644 index 0000000..35fe8af --- /dev/null +++ b/imagecreator/backend/requirements.txt @@ -0,0 +1,15 @@ +fastapi==0.109.0 +uvicorn[standard]==0.27.0 +sqlalchemy==2.0.25 +psycopg2-binary==2.9.9 +python-jose[cryptography]==3.3.0 +passlib[bcrypt]==1.7.4 +python-multipart==0.0.6 +pydantic==2.5.3 +pydantic-settings==2.1.0 +google-genai==0.8.0 +openai==1.12.0 +aiofiles==23.2.1 +httpx==0.26.0 +pytest==8.0.0 +pytest-asyncio==0.23.4