Files
social-media/AGENTS.md

6.2 KiB

AGENTS.md

Purpose

This document is a working guide for coding agents in this repository. It captures the current architecture, conventions, and safe execution workflow for making reliable changes.

Pair Working Mode

  • Work as a pair with the repository owner, not as an isolated implementer.
  • Before substantial changes, restate the task briefly and inspect the existing code or docs first.
  • Surface assumptions, tradeoffs, and blockers early instead of silently picking risky directions.
  • Prefer small, reviewable increments when the product direction is still being shaped.
  • When requirements are exploratory, help turn them into concrete workflows, domain language, and next implementation steps.
  • Do not rewrite broad areas of the codebase without clear justification from the current task.
  • Preserve user changes in the worktree and treat uncommitted files as active collaboration unless told otherwise.
  • When creating commits, use the Conventional Commits format, for example docs: update product planning.

Repository Layout

  • backend/: ASP.NET Core (net9.0) API using FastEndpoints, EF Core (PostgreSQL), Stripe, Azure Blob Storage, and ASP.NET Identity.
  • frontend/: Vue 3 + Vite + Vuetify + Pinia + Vue Router + Tailwind CSS SPA.
  • .github/workflows/: deploy pipelines for backend (Azure Web App) and frontend (Azure Static Web Apps).

Local Runbook

Backend

  • Prereqs: .NET 9 SDK, Docker, PostgreSQL container.
  • Start database:
    • cd backend
    • ./scripts/start-infrastructure.sh
  • Run API:
    • dotnet run (from backend/)
  • Swagger/OpenAPI UI in dev:
    • /api

Frontend

  • Prereqs: Node/npm, local HTTPS cert files expected by Vite:
    • frontend/localhost-key.pem
    • frontend/localhost.pem
  • Commands:
    • cd frontend && npm install
    • npm run dev
    • npm run build

Backend Architecture

Composition Root

  • Entry point: backend/Program.cs.
  • Registers:
    • Web services/auth (backend/DependencyInjection.cs)
    • Infrastructure services (backend/Infrastructure/DependencyInjection.cs)
    • Modules: Identity, Creators, Contents, Memberships, Tipping, Messaging.
  • Each module has:
    • Add{Module}Module(...) to register DbContext/services.
    • Use{Module}ModuleAsync() to auto-run migrations at startup.

API Style

  • FastEndpoints-based handlers.
  • Pattern: request/response records + optional FluentValidation validator + handler class.
  • Tagging via Options(o => o.WithTags("...")).
  • File upload handlers call AllowFileUploads().

Data Boundaries

  • Separate DbContext per module:
    • Identity, Creators, Contents, Memberships, Tipping, Messaging.
  • Migrations are module-scoped under each Modules/*/Migrations folder.

Auth/Security

  • JWT is generated manually in Infrastructure/Security/GenerateJwtToken.cs.
  • Refresh-token flow is implemented in Identity handlers (/api/users/login, /api/users/refresh).
  • User claim helpers live in Infrastructure/Security/ClaimsPrincipalExtensions.cs.

Payments/Stripe

  • Tip checkout: Infrastructure/Payments/Stripe/Services/StripeTipProcessor.cs.
  • Membership checkout: Infrastructure/Payments/Stripe/Services/MembershipPaymentProcessor.cs.
  • Webhook endpoint: Modules/Memberships/Handlers/StripeWebhookEndpoint.cs.
  • Creator onboarding/status/revoke Stripe:
    • /api/stripe/connect
    • /api/stripe/check-status
    • DELETE /api/stripe

Blob Storage

  • IBlobStorage implemented by AzureBlobStorage.
  • Upload size/type checks are enforced there (10 MB max + content-type validation).

Frontend Architecture

Bootstrap

  • frontend/src/main.js wires Vue app + Pinia + Vuetify + Router + i18n + Google OAuth + Toasts.

Routing

  • Defined in frontend/src/router/router.js.
  • Route guards enforce:
    • meta.requiresAuth
    • meta.notAuthenticated
  • Creator public route convention: /@:creator.

State Management

  • Pinia stores:
    • authStore: token lifecycle + refresh concurrency guard.
    • userProfileStore: current user profile and account edits.
    • creatorProfileStore: creator-owned profile actions.
    • brandingStore: creator page branding fetched from slug route param.

API Client

  • Axios client in frontend/src/plugins/api.js.
  • Injects bearer token, proactively refreshes near expiry, retries once on 401.

High-Value Domains

  • Identity and social login (Modules/Identity/*, frontend/src/views/auth/*).
  • Creator public profile and management (Modules/Creators/*, frontend/src/views/creators/*, frontend/src/views/profile/*).
  • Monetization:
    • Tips (Modules/Tipping/*, creator donation UI)
    • Memberships (Modules/Memberships/*, Stripe webhook orchestration)
  • Content albums/photo upload (Modules/Contents/*).
  • Messaging thread/replies (Modules/Messaging/*).

Agent Working Rules For This Repo

  1. Keep module boundaries intact. Do not couple DbContexts across modules.
  2. When adding endpoints, follow existing FastEndpoints pattern with validator + explicit route + tag.
  3. If schema changes are needed, generate migration in the matching module only.
  4. Preserve token refresh behavior in frontend client/store; avoid introducing parallel refresh races.
  5. For file uploads, enforce content-type/size limits and reuse blob path conventions.
  6. Keep creator route contract stable (/@slug) because frontend and backend both depend on it.
  7. Do not commit secrets. Existing appsettings include sensitive-looking values; treat as legacy and avoid propagating.

Validation Checklist Before Finishing

  • Backend:
    • cd backend && dotnet build
    • run affected endpoint flows if change touches handlers/auth/payments/storage
  • Frontend:
    • cd frontend && npm run build
    • validate affected route/store interactions in browser
  • If migrations were changed:
    • ensure module context name/output directory remain consistent with backend/scripts/add-migration.sh.

Notes / Known Sharp Edges

  • Frontend expects VITE_API_URL in API plugin; src/config.js uses VITE_APP_API_URL naming. Keep env usage consistent when editing.
  • GetReceivedTips currently resolves tipper with tip.CreatorId instead of tip.CreatedBy; verify intent before refactoring.
  • Some style/formatting is inconsistent across JS/Vue/C# files; minimize churn to touched lines.