import logging
from datetime import datetime
from fastapi import APIRouter, Request
from fastapi.responses import HTMLResponse, RedirectResponse
from devplacepy.database import get_table
from devplacepy.templating import templates
from devplacepy.utils import generate_uid, get_current_user, require_user
logger = logging.getLogger(__name__)
router = APIRouter()
def get_projects_list(tab: str = "recent", search: str = "", user_uid: str = None):
projects = get_table("projects")
users = get_table("users")
all_projects = list(projects.all())
if user_uid:
all_projects = [p for p in all_projects if p["user_uid"] == user_uid]
if search:
search_lower = search.lower()
all_projects = [
p for p in all_projects
if search_lower in p.get("title", "").lower()
or search_lower in p.get("description", "").lower()
]
for p in all_projects:
author = users.find_one(uid=p["user_uid"])
p["author_name"] = author["username"] if author else "Unknown"
if tab == "released":
all_projects = [p for p in all_projects if p.get("status") == "Released"]
elif tab == "popular":
all_projects.sort(key=lambda p: int(p.get("stars", 0)), reverse=True)
elif tab == "new":
all_projects.sort(key=lambda p: p.get("created_at", ""), reverse=True)
else:
all_projects.sort(key=lambda p: p.get("created_at", ""), reverse=True)
return all_projects
@router.get("", response_class=HTMLResponse)
async def projects_page(
request: Request,
tab: str = "recent",
search: str = "",
user_uid: str = None,
):
user = get_current_user(request)
projects = get_projects_list(tab, search, user_uid)
users = get_table("users")
total_members = len(list(users.all()))
return templates.TemplateResponse("projects.html", {
"request": request,
"user": user,
"projects": projects,
"current_tab": tab,
"search": search,
"total_count": len(projects),
"total_members": total_members,
})
@router.post("/create")
async def create_project(request: Request):
user = require_user(request)
form = await request.form()
title = form.get("title", "").strip()
description = form.get("description", "").strip()
release_date = form.get("release_date", "")
demo_date = form.get("demo_date", "")
project_type = form.get("project_type", "software")
platforms = form.get("platforms", "").strip()
status = form.get("status", "In Development")
if not title or not description:
return RedirectResponse(url="/projects", status_code=302)
projects = get_table("projects")
uid = generate_uid()
projects.insert({
"uid": uid,
"user_uid": user["uid"],
"title": title,
"description": description,
"release_date": release_date or None,
"demo_date": demo_date or None,
"project_type": project_type,
"platforms": platforms,
"status": status,
"stars": 0,
"created_at": datetime.utcnow().isoformat(),
})
logger.info(f"Project {uid} created by {user['username']}")
return RedirectResponse(url="/projects", status_code=302)