Skip to content

File Uploads Files #452

@adityapat24

Description

@adityapat24

Goal

Create the file upload pipeline (signed URLs to GCS) and the reusable <FileUpload /> component. No real logic yet, stubs only.

Folders to create

  • src/app/api/v1/uploads/sign/
  • src/app/api/v1/uploads/[id]/
  • src/app/uploads-demo/
  • src/lib/uploads/
  • src/components/uploads/

Files to create

Routes

  • src/app/api/v1/uploads/sign/route.tsPOST: returns signed upload URL for GCS; stub returns 501
  • src/app/api/v1/uploads/[id]/route.tsGET: returns signed download URL for an uploaded file
  • src/app/uploads-demo/page.tsx — internal demo page that mounts <FileUpload /> so this ticket can be tested in isolation

Library

  • src/lib/uploads/gcs.ts — GCS client singleton, bucket config
  • src/lib/uploads/service.tscreateSignedUploadUrl(), createSignedDownloadUrl(), recordUpload()
  • src/lib/uploads/validation.ts — allowed MIME types, max size, filename sanitization
  • src/lib/uploads/types.tsUploadRecord, SignUploadRequest, SignUploadResponse types

Components

  • src/components/uploads/FileUpload.tsx — standalone component, demo page consumes it; documented public props in contract doc
  • src/components/uploads/FilePreview.tsx — shows uploaded file name + replace/remove actions
  • src/components/uploads/UploadProgress.tsx — progress bar during upload

Acceptance criteria

  • All folders and files listed above exist and the project compiles.
  • <FileUpload /> renders a placeholder dropzone on /uploads-demo with no real upload behavior.
  • Both API routes return 501.

Metadata

Metadata

Assignees

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions