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, project_type: 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 project_type: all_projects = [p for p in all_projects if p.get("project_type") == project_type] 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, project_type: str = None, ): user = get_current_user(request) projects = get_projects_list(tab, search, user_uid, project_type) 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)