Chepuhagram/srv/main.py

92 lines
3.0 KiB
Python

from fastapi import FastAPI
from fastapi.responses import FileResponse
from app.api.endpoints import users, auth, messages, media
from app.websocket.connection_manager import wsRouter
from fastapi.middleware.cors import CORSMiddleware
import os
import asyncio
from app.db import models
from app.core.config import config
app = FastAPI()
app.include_router(auth.authRouter)
app.include_router(users.usersRouter)
app.include_router(messages.messagesRouter)
app.include_router(media.mediaRouter)
app.include_router(wsRouter)
app.add_middleware(
CORSMiddleware,
allow_origins=config.ALLOWED_ORIGINS,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
@app.get("/check-update")
async def check_update():
return {
"latest_version": "2.0.1",
"apk_url": "https://api.chepuhagram.ru/get-update",
"force_update": False
}
@app.get("/get-update")
async def get_image():
file_path = "app-release.apk"
if not os.path.exists(file_path):
return {"error": "Файл не найден"}
return FileResponse(path=file_path, filename="chepuhagram-release.apk",
media_type="application/vnd.android.package-archive",)
@app.head("/get-update")
async def head_image():
file_path = "app-release.apk"
if not os.path.exists(file_path):
return {"error": "Файл не найден"}
return FileResponse(path=file_path, filename="chepuhagram-release.apk",
media_type="application/vnd.android.package-archive",)
@app.on_event("startup")
async def startup_event():
asyncio.create_task(cleanup_uploads())
if config.SERVER_ROLE == 'cloud':
asyncio.create_task(media.forward_pending_media_loop())
elif config.SERVER_ROLE == 'home':
asyncio.create_task(media.home_storage_maintenance_loop())
async def cleanup_uploads():
while True:
try:
db = models.SessionLocal()
# Получить все используемые file_id из avatar_file_id
file_ids = db.query(models.User.avatar_file_id).filter(models.User.avatar_file_id.isnot(None)).all()
used_files = set(f[0] for f in file_ids)
db.close()
# Проверить файлы в uploads
uploads_dir = 'uploads'
if os.path.exists(uploads_dir):
for filename in os.listdir(uploads_dir):
if filename.endswith('.enc'):
file_id = filename[:-4] # убрать .enc
if file_id not in used_files:
file_path = os.path.join(uploads_dir, filename)
os.remove(file_path)
print(f"Удален неиспользуемый файл: {file_path}")
except Exception as e:
print(f"Ошибка в cleanup: {e}")
await asyncio.sleep(300) # каждые 5 минут
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8587)