Skip to content

Add Devpost project import and judge project directory #526

Description

@DVidal1205

Goal

Add the first Forge project/judging slice: officer-managed Devpost project
imports and a permission-gated project directory for judges.

Product scope

Officer project management

  • Add an officer-only /admin/projects surface.
  • Let an officer select an existing hackathon and upload a Devpost project CSV.
  • Treat each import as an authoritative full replacement of that hackathon's
    imported project inventory.
  • Import submitted projects only; skip drafts and incomplete projects.
  • Derive hackathon challenges from Devpost opt-in prize values and apply a
    General challenge to every project.
  • Let officers edit approved imported project/team fields.
  • Let officers soft-delete one project at a time after confirmation.
  • Let officers restore individually soft-deleted projects.

Judge project directory

  • Add /judge/projects for authenticated users with IS_JUDGE; preserve the
    existing IS_OFFICER bypass.
  • Automatically show the currently active hackathon.
  • Let officers preview the judge experience outside the active window using the
    hackathon with the nearest upcoming start date.
  • Show title, Devpost link, prize categories, and challenges in the table.
  • Support title search, sorting, established Forge pagination, and filters for
    challenge, prize/category, and participant count.
  • Open a responsive project-detail modal with Markdown description, approved
    links and technologies, challenge/category data, team names, emails, schools,
    and submission time.

Import constraints

Devpost exports are variable-width and may repeat submission URLs while
expanding team-member data. The importer must produce one project per submission
URL without losing the associated team members. Event-specific questionnaire
answers are not imported for judge display.

An active hackathon satisfies start <= now <= end. Imported opt-in labels are
kept as supplied rather than merged by capitalization, whitespace, or
punctuation equivalence. A replacement import also replaces the selected
hackathon's imported challenge list, while every imported project receives the
General challenge.

The import result reports imported projects, excluded drafts, collapsed
duplicate URLs, and malformed or rejected records. Officers may edit title,
URLs, description, categories, challenge assignments, technologies,
universities, team roster/contact fields, and participant count after import.
Discord handles and all other event-specific questionnaire fields are ignored.

Accepted technical direction

  • Replace the unused legacy project/challenge/submission/judge/judgment model;
    there is no production data requiring compatibility.
  • Introduce durable project, project-member, challenge, and project/challenge
    join records scoped to a hackathon.
  • Use a protected multipart upload route backed by an API-owned import service
    and an established CSV parser.
  • Validate the complete file and replace the selected hackathon's inventory in
    one transaction; do not introduce a separate pool, queue, or staging system.
  • Enforce judge/officer access on every project read and officer access on every
    mutation.
  • Audit import, edit, delete, and restore without copying raw CSV or contact PII
    into audit metadata.
  • Remove the unused legacy judging tables, including auth_judge_session.
  • Enforce a 25 MiB multipart upload limit, store declared participant count
    independently from roster rows, and store/display normalized URLs only.

Out of scope

  • Scoring, feedback, or judge responses
  • Judge assignments, rooms, or judging sessions
  • Ranking and winner selection
  • Hacker-to-project matching
  • Public project gallery
  • Devpost API synchronization
  • Batch project deletion outside replacement import
  • Merge conflict resolution or preservation of manual edits across re-import

Planning artifacts

The feature contract is being developed under
.forge/features/project-judging/. Implementation must wait for approval of
the spec, SRD, and test cases.

Artifact status

The product spec and technical SRD are approved. Importer-focused test cases are
proposed for owner approval; implementation waits for approval of the complete
artifact bundle.

Metadata

Metadata

Assignees

Labels

APIChange modifies code in the global API/tRPC packageBladeChange modifies code in Blade appDatabaseChange modifies code in the DB packageFeatureNew Feature or RequestMajorBig change - 2+ reviewers required

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions