104 lines
3.9 KiB
Python
104 lines
3.9 KiB
Python
import os
|
|
import secrets
|
|
from datetime import datetime, timedelta
|
|
|
|
# Load .env file if present (docker-compose handles this in production)
|
|
_env_path = os.path.join(os.path.dirname(__file__), "..", ".env")
|
|
if os.path.isfile(_env_path):
|
|
with open(_env_path) as _f:
|
|
for _line in _f:
|
|
_line = _line.strip()
|
|
if _line and not _line.startswith("#") and "=" in _line:
|
|
_key, _, _value = _line.partition("=")
|
|
os.environ.setdefault(_key.strip(), _value.strip())
|
|
|
|
from fastapi import FastAPI
|
|
from fastapi.middleware.cors import CORSMiddleware
|
|
from fastapi.staticfiles import StaticFiles
|
|
|
|
from auth import hash_password
|
|
from database import Base, SessionLocal, engine, migrate
|
|
from models import Invitation, User
|
|
from routers.admin import router as admin_router
|
|
from routers.auth import router as auth_router
|
|
from routers.drinks import router as drinks_router
|
|
|
|
migrate()
|
|
Base.metadata.create_all(bind=engine)
|
|
|
|
app = FastAPI(title="Cellar API", version="1.0.0")
|
|
|
|
ALLOWED_ORIGINS = [
|
|
origin.strip()
|
|
for origin in os.environ.get("CORS_ORIGINS", "http://localhost:5173,http://localhost:3000").split(",")
|
|
if origin.strip()
|
|
]
|
|
|
|
app.add_middleware(
|
|
CORSMiddleware,
|
|
allow_origins=ALLOWED_ORIGINS,
|
|
allow_credentials=True,
|
|
allow_methods=["GET", "POST", "PUT", "DELETE"],
|
|
allow_headers=["Authorization", "Content-Type"],
|
|
)
|
|
|
|
app.include_router(admin_router)
|
|
app.include_router(auth_router)
|
|
app.include_router(drinks_router)
|
|
|
|
uploads_dir = os.path.join(os.path.dirname(__file__), "uploads")
|
|
os.makedirs(uploads_dir, exist_ok=True)
|
|
|
|
|
|
@app.get("/api/health")
|
|
def health_check():
|
|
return {"status": "ok"}
|
|
|
|
|
|
@app.on_event("startup")
|
|
def create_default_user():
|
|
admin_password = os.environ.get("ADMIN_PASSWORD")
|
|
if not admin_password:
|
|
admin_password = secrets.token_urlsafe(16)
|
|
print("╔══════════════════════════════════════════════════╗")
|
|
print("║ ADMIN_PASSWORD non défini dans l'environnement ║")
|
|
print("║ Un mot de passe aléatoire a été généré ║")
|
|
print("║ Configurez ADMIN_PASSWORD pour la production ║")
|
|
print("╚══════════════════════════════════════════════════╝")
|
|
|
|
db = SessionLocal()
|
|
try:
|
|
admin_exists = db.query(User).filter(
|
|
(User.username == "admin") | (User.email == "admin@cellar.local")
|
|
).first()
|
|
if not admin_exists:
|
|
try:
|
|
user = User(
|
|
username="admin",
|
|
email="admin@cellar.local",
|
|
hashed_password=hash_password(admin_password),
|
|
is_admin=True,
|
|
)
|
|
db.add(user)
|
|
db.flush()
|
|
|
|
invite = Invitation(
|
|
token=secrets.token_urlsafe(32),
|
|
created_by=user.id,
|
|
expires_at=datetime.utcnow() + timedelta(days=7),
|
|
)
|
|
db.add(invite)
|
|
db.commit()
|
|
|
|
print("╔══════════════════════════════════════════╗")
|
|
print("║ Premier démarrage - Compte créé ║")
|
|
print("║ Username : admin ║")
|
|
print("║ Password : (depuis ADMIN_PASSWORD ou ║")
|
|
print("║ mot de passe aléatoire) ║")
|
|
print("╚══════════════════════════════════════════╝")
|
|
except Exception:
|
|
db.rollback()
|
|
pass
|
|
finally:
|
|
db.close()
|