makearmy-app/.next/server/app/api/submit/project/route.js
2025-09-22 10:37:53 -04:00

1 line
No EOL
5.7 KiB
JavaScript

(()=>{var e={};e.id=2860,e.ids=[2860],e.modules={3295:e=>{"use strict";e.exports=require("next/dist/server/app-render/after-task-async-storage.external.js")},10846:e=>{"use strict";e.exports=require("next/dist/compiled/next-server/app-page.runtime.prod.js")},29294:e=>{"use strict";e.exports=require("next/dist/server/app-render/work-async-storage.external.js")},33145:(e,t,r)=>{"use strict";r.d(t,{Kk:()=>l,Me:()=>h,QM:()=>f,bY:()=>g,co:()=>y,pN:()=>a});let i=process.env.DIRECTUS_URL,s=process.env.DIRECTUS_TOKEN_SUBMIT,n=process.env.DIRECTUS_PROJECTS_COLLECTION||"projects";function a(e){return Math.round(1024*e*1024)}async function o(e){let t=await e.text(),r=null;try{r=t?JSON.parse(t):null}catch{}return{json:r,text:t}}async function l(e,t){let r=await fetch(`${i}${e}`,{...t,headers:{Accept:"application/json",Authorization:`Bearer ${s}`,...t?.headers||{}}}),{json:n,text:a}=await o(r);if(!r.ok)throw Error(`Directus error ${r.status}: ${a||r.statusText}`);return n??{}}i||console.warn("[directus] Missing DIRECTUS_URL"),s||console.warn("[directus] Missing DIRECTUS_TOKEN_SUBMIT");let u=new Map,d=null,p=0;async function c(){try{let e=await l("/folders?fields=id,name,parent.id,parent.name&limit=500");return e?.data??[]}catch(e){return console.warn("[directus] fetchAllFolders failed:",e?.message||e),null}}async function m(e){let t;if(!e)return;if(u.has(e))return u.get(e);let r=Date.now();(!d||r-p>6e4)&&(d=await c(),p=r);let i=d;if(!i)return void u.set(e,void 0);let s=e.split("/").map(e=>e.trim()).filter(Boolean),[n,a]=s,o=(e,t)=>String(e??"").toLowerCase()===String(t??"").toLowerCase();t=s.length>=2?i.find(e=>o(e.name,a)&&o(e.parent?.name??"",n)):i.find(e=>o(e.name,s[0]));let l=t?.id?String(t.id):void 0;return u.set(e,l),l}async function f(e,t,r){let n=new FormData;n.set("file",e,t),n.set("filename_download",t),r?.title&&n.set("title",r.title);let a=r?.folderId;!a&&r?.folderNamePath&&(a=await m(r.folderNamePath)),a&&n.set("folder",a);let l=await fetch(`${i}/files`,{method:"POST",headers:{Authorization:`Bearer ${s}`,Accept:"application/json"},body:n}),{json:u,text:d}=await o(l);if(!l.ok)throw Error(`File upload failed: status=${l.status} ${l.statusText} body=${(d||"").slice(0,400)||"<empty>"}`);let p=u?.data?.id??u?.id;if(!p)throw Error("File upload succeeded but no id returned");return{id:String(p)}}async function g(e,t){return l(`/items/${e}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)})}async function h(e){return l(`/items/${n}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)})}async function y(e,t){return l(`/items/${n}/${e}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)})}},44870:e=>{"use strict";e.exports=require("next/dist/compiled/next-server/app-route.runtime.prod.js")},63033:e=>{"use strict";e.exports=require("next/dist/server/app-render/work-unit-async-storage.external.js")},78335:()=>{},93421:(e,t,r)=>{"use strict";r.r(t),r.d(t,{patchFetch:()=>S,routeModule:()=>h,serverHooks:()=>x,workAsyncStorage:()=>y,workUnitAsyncStorage:()=>w});var i={};r.r(i),r.d(i,{POST:()=>g,runtime:()=>f});var s=r(96559),n=r(48088),a=r(37719),o=r(32190),l=r(33145);let u=Number(process.env.FILE_MAX_MB||25),d=(0,l.pN)(u),p=new Map,c=1e3*Number(process.env.RATE_LIMIT_WINDOW||60),m=Number(process.env.RATE_LIMIT_MAX||15),f="nodejs";async function g(e){try{let t,r=e.headers.get("x-forwarded-for")?.split(",")[0]?.trim()||"0.0.0.0";if(!function(e){let t=Date.now(),r=p.get(e);return!r||t>r.resetAt?(p.set(e,{c:1,resetAt:t+c}),!0):!(r.c>=m)&&(r.c+=1,!0)}(r))return o.NextResponse.json({error:"Rate limited"},{status:429});if(!(e.headers.get("content-type")||"").includes("multipart/form-data"))return o.NextResponse.json({error:"Expected multipart/form-data"},{status:400});let i=await e.formData(),s=String(i.get("title")||"").trim(),n=String(i.get("uploader")||"").trim(),a=String(i.get("category")||"").trim(),f=String(i.get("body")||i.get("description")||"").trim();if(!s||!n||!f)return o.NextResponse.json({error:"Missing required fields: title, uploader, body"},{status:400});let g=[],h=i.get("tags");if("string"==typeof h&&h.trim())try{let e=JSON.parse(h);g=Array.isArray(e)?e.map(e=>String(e).trim()).filter(Boolean):h.split(",").map(e=>e.trim()).filter(Boolean)}catch{g=h.split(",").map(e=>e.trim()).filter(Boolean)}let y=i.get("license")&&String(i.get("license")).trim()||void 0,w=i.get("image");if(w&&"object"==typeof w&&"size"in w){if(w.size>d)return o.NextResponse.json({error:`Hero image exceeds ${u} MB`},{status:400});t=(await (0,l.QM)(w,w.name||"project-image")).id}let x=i.getAll("files").filter(Boolean),S=[];for(let e of x.slice(0,20)){if(e.size>d)return o.NextResponse.json({error:`One of the files exceeds ${u} MB`},{status:400});let t=await (0,l.QM)(e,e.name||"attachment");S.push(t.id)}let{data:j}=await (0,l.Me)({title:s,body:f,uploader:n,category:a,tags:g,...y?{license:y}:{},status:"pending",submitted_via:"makearmy-app",submitted_at:new Date().toISOString()}),T={};return t&&(T.p_image=t),S.length&&(T.p_files=S.map(e=>({directus_files_id:e}))),Object.keys(T).length&&await (0,l.co)(j.id,T),o.NextResponse.json({ok:!0,id:j.id})}catch(e){return o.NextResponse.json({error:e?.message||"Unknown error"},{status:500})}}let h=new s.AppRouteRouteModule({definition:{kind:n.RouteKind.APP_ROUTE,page:"/api/submit/project/route",pathname:"/api/submit/project",filename:"route",bundlePath:"app/api/submit/project/route"},resolvedPagePath:"/app/app/api/submit/project/route.ts",nextConfigOutput:"",userland:i}),{workAsyncStorage:y,workUnitAsyncStorage:w,serverHooks:x}=h;function S(){return(0,a.patchFetch)({workAsyncStorage:y,workUnitAsyncStorage:w})}},96487:()=>{}};var t=require("../../../../webpack-runtime.js");t.C(e);var r=e=>t(t.s=e),i=t.X(0,[7719,580],()=>r(93421));module.exports=i})();