Open-Generative-AI/lib/muapiUpload.js
Anuragp22 1b12df90ef feat(batch): trainers + studios CRUD with /batch shell UI
Slice 2 of the batch feature. Marketing team can now upload the six
trainer images and the studio image once and reuse them across every
future batch.

Backend
-------
- lib/muapiUpload.js: Node-side wrapper around POST
  /api/v1/upload_file with FormData + x-api-key. Mirrors
  packages/studio/src/muapi.js:131-178 but uses native fetch +
  FormData (no XHR).
- lib/batchAuth.js: shared getApiKey() — header > cookie > env fallback.
- lib/localUploadStore.js: writes a local backup of every uploaded
  asset to /data/uploads/{trainers,studios}/<id>.<ext> on the
  uploads_data volume, so we can re-upload to MuAPI if their CDN
  ever expires the URL.
- app/api/trainers/route.js + [id]/route.js: GET list, POST multipart
  (uploads to MuAPI then persists), DELETE (refuses if any active job
  references the row).
- app/api/studios/route.js + [id]/route.js: identical shape.

UI
--
- app/batch/page.js: leaf route mounting BatchShell.
- components/batch/BatchShell.jsx: 3-tab dark-theme shell
  (Batches / Trainers / Studios) with the same MuAPI key gate as
  StandaloneShell (reuses ApiKeyModal + the muapi_key cookie).
- components/batch/AssetLibrary.jsx + AddAssetModal.jsx: shared grid +
  upload modal driving both tabs from one component.
- components/batch/TrainersTab.jsx, StudiosTab.jsx: thin wrappers.
- components/batch/BatchesTab.jsx: placeholder for slice 3.

Stub packages (upstream submodules unavailable)
-----------------------------------------------
The ai-agent and workflow-ui submodules referenced in .gitmodules
return 404 (Anil-matcha/workflow-ui and jaiprasad04/ai-agent are
deleted/private). next build couldn't resolve their imports.

- Removed the dead .gitmodules entries.
- Added local stubs at packages/ai-agent and packages/workflow-ui
  that export no-op components rendering "feature unavailable" so
  the build succeeds. The /agents/* and Workflows tab show that
  notice; the studios our marketing team actually uses
  (Image / Video / Lip Sync / Cinema) keep working since they
  live in the studio package which we have.

Docker / dev workflow
---------------------
- Dockerfile: run prisma generate during the builder stage, copy
  prisma/ and lib/ into the runner stage so migrations and shared
  helpers are present at runtime.
- docker-compose.override.yml (new): dev-mode overrides — mounts
  source, runs as root to dodge node_modules permission issues with
  the prod nextjs user, runs prisma generate + migrate deploy +
  next dev. Worker container is a placeholder until slice 4 lands.
- The full stack (postgres + web + worker) now boots with
  `docker compose up -d` and serves /batch on http://localhost:3000.
2026-04-23 07:32:49 +05:30

31 lines
803 B
JavaScript

const MUAPI_BASE = 'https://api.muapi.ai';
export async function uploadFileToMuapi(apiKey, file) {
if (!apiKey) {
throw new Error('Missing MuAPI API key');
}
if (!file) {
throw new Error('Missing file');
}
const form = new FormData();
form.append('file', file);
const res = await fetch(`${MUAPI_BASE}/api/v1/upload_file`, {
method: 'POST',
headers: { 'x-api-key': apiKey },
body: form,
});
if (!res.ok) {
const text = await res.text().catch(() => '');
throw new Error(`MuAPI upload failed: ${res.status} ${text.slice(0, 200)}`);
}
const data = await res.json();
const url = data.url || data.file_url || data?.data?.url;
if (!url) {
throw new Error(`MuAPI upload returned no URL: ${JSON.stringify(data).slice(0, 200)}`);
}
return url;
}