NeahNew/.next/server/app/api/missions/route.js
2026-01-02 14:32:36 +01:00

1 line
12 KiB
JavaScript

"use strict";(()=>{var e={};e.id=3659,e.ids=[3659],e.modules={3295:e=>{e.exports=require("next/dist/server/app-render/after-task-async-storage.external.js")},10846:e=>{e.exports=require("next/dist/compiled/next-server/app-page.runtime.prod.js")},11723:e=>{e.exports=require("querystring")},12412:e=>{e.exports=require("assert")},14182:(e,r,o)=>{o.d(r,{$R:()=>i,Ui:()=>c,XB:()=>a,XR:()=>l,YE:()=>s,ZT:()=>d,b4:()=>u,oD:()=>n});var t=o(91043);let s={endpoint:"https://dome-api.slm-lab.net",region:"us-east-1",bucket:process.env.S3_BUCKET||"pages",accessKey:"4aBT4CMb7JIMMyUtp4Pl",secretKey:"HGn39XhCIlqOjmDVzRK9MED2Fci2rYvDDgbLFElg"},n=new t.S3Client({region:s.region,endpoint:s.endpoint,credentials:{accessKeyId:s.accessKey,secretAccessKey:s.secretKey},forcePathStyle:!0});async function i(e,r,o){let i=new t.PutObjectCommand({Bucket:s.bucket,Key:e,Body:"string"==typeof r?Buffer.from(r,"utf-8"):r,ContentType:o||"text/plain"});return await n.send(i),{key:e}}async function a(e){try{let r=new t.GetObjectCommand({Bucket:s.bucket,Key:e}),o=await n.send(r);if(!o.Body)return null;let i=[];for await(let e of o.Body)i.push(e);return Buffer.concat(i).toString("utf-8")}catch(e){return console.error("Error getting object content:",e),null}}async function l(e){let r=new t.DeleteObjectCommand({Bucket:s.bucket,Key:e});await n.send(r)}async function c(e,r){let o=`user-${e}/${r}/`,i=new t.ListObjectsV2Command({Bucket:s.bucket,Prefix:o,Delimiter:"/"});return((await n.send(i)).Contents||[]).filter(e=>e.Key&&!e.Key.endsWith("/")&&!e.Key.includes(".placeholder")).map(e=>({key:e.Key,name:e.Key.split("/").pop()||e.Key,size:e.Size,lastModified:e.LastModified}))}function u(e,r){if(!e)return"";if(e.startsWith("http"))return e;let o=e.startsWith("/")?e.substring(1):e,t=s.endpoint?.replace(/\/$/,""),n=r||s.bucket;return t?`${t}/${n}/${o}`:o}async function d(e){for(let r of["notes","diary","health","contacts"])try{let o=`user-${e}/${r}/`;await i(o,"","application/x-directory");let t=`user-${e}/${r}/.placeholder`;await i(t,"Folder placeholder","text/plain"),console.log(`Created folder: ${o}`)}catch(o){console.error(`Error creating folder ${r} for user ${e}:`,o)}}},28354:e=>{e.exports=require("util")},29294:e=>{e.exports=require("next/dist/server/app-render/work-async-storage.external.js")},44870:e=>{e.exports=require("next/dist/compiled/next-server/app-route.runtime.prod.js")},55511:e=>{e.exports=require("crypto")},55591:e=>{e.exports=require("https")},63033:e=>{e.exports=require("next/dist/server/app-render/work-unit-async-storage.external.js")},74075:e=>{e.exports=require("zlib")},79428:e=>{e.exports=require("buffer")},79551:e=>{e.exports=require("url")},81630:e=>{e.exports=require("http")},82792:(e,r,o)=>{o.r(r),o.d(r,{patchFetch:()=>S,routeModule:()=>k,serverHooks:()=>N,workAsyncStorage:()=>b,workUnitAsyncStorage:()=>v});var t={};o.r(t),o.d(t,{GET:()=>h,POST:()=>w});var s=o(96559),n=o(48088),i=o(37719),a=o(32190),l=o(19854),c=o(26690),u=o(79464);class d{constructor(){this.webhookUrl=process.env.N8N_WEBHOOK_URL||"https://brain.slm-lab.net/webhook/mission-created",this.rollbackWebhookUrl=process.env.N8N_ROLLBACK_WEBHOOK_URL||"https://brain.slm-lab.net/webhook/mission-rollback",this.apiKey=process.env.N8N_API_KEY||"",this.apiKey||console.error("N8N_API_KEY is not set in environment variables")}async triggerMissionCreation(e){try{console.log("N8nService - Input data:",{hasServices:Array.isArray(e.services),services:e.services,hasGite:e.services?.includes("Gite"),missionProcessed:e.missionProcessed,config:e.config});let r={name:e.name,oddScope:Array.isArray(e.oddScope)?e.oddScope:[e.oddScope],niveau:e.niveau||"default",intention:e.intention?.trim()||"",missionType:e.missionType||"default",donneurDOrdre:e.donneurDOrdre||"default",projection:e.projection||"default",services:Array.isArray(e.services)?e.services:[],participation:e.participation||"default",profils:Array.isArray(e.profils)?e.profils:[],guardians:e.guardians||{},volunteers:Array.isArray(e.volunteers)?e.volunteers:[],creatorId:e.creatorId,config:{...e.config,N8N_API_KEY:this.apiKey,MISSION_API_URL:process.env.NEXT_PUBLIC_API_URL||"https://api.slm-lab.net/api"}};console.log("Sending cleaned data to n8n:",{name:r.name,creatorId:r.creatorId,oddScope:r.oddScope,niveau:r.niveau,intention:r.intention?.substring(0,100)+"...",missionType:r.missionType,donneurDOrdre:r.donneurDOrdre,projection:r.projection,services:r.services,participation:r.participation,profils:r.profils,hasGuardians:!!r.guardians,volunteersCount:r.volunteers.length,hasConfig:!!r.config,configKeys:r.config?Object.keys(r.config):[]}),console.log("Using webhook URL:",this.webhookUrl),console.log("API key present:",!!this.apiKey);let o=await fetch(this.webhookUrl,{method:"POST",headers:{"Content-Type":"application/json","x-api-key":this.apiKey},body:JSON.stringify(r)});if(console.log("Webhook response status:",o.status),console.log("Webhook response headers:",Object.fromEntries(o.headers.entries())),!o.ok){let e=await o.text();console.error("Webhook error response:",e);try{let r=JSON.parse(e);console.error("Parsed error response:",r)}catch(e){console.error("Error response is not JSON")}throw Error(`HTTP error! status: ${o.status}, body: ${e}`)}let t=await o.text();console.log("N8nService - Raw response:",t);try{let e=JSON.parse(t);if(console.log("Parsed workflow result:",JSON.stringify(e,null,2)),e.error||e.message?.includes("failed")){let r=e.message||e.error,o={gitRepo:r.includes("Git repository creation failed"),leantimeProject:r.includes("Leantime project creation failed"),docCollection:r.includes("Documentation collection creation failed"),rocketChatChannel:r.includes("RocketChat channel creation failed")};return{success:!0,results:{...e,failedServices:o}}}return{success:!0,results:e}}catch(e){return console.log("Response is not JSON, treating as workflow trigger confirmation"),{success:!0,results:{logoUrl:null,leantimeProjectId:null,outlineCollectionId:null,rocketChatChannelId:null,giteaRepositoryUrl:null}}}}catch(e){return console.error("Error triggering n8n workflow:",e),{success:!1,error:e instanceof Error?e.message:"Unknown error"}}}async triggerMissionRollback(e){try{console.log("Triggering n8n rollback workflow with data:",JSON.stringify(e,null,2)),console.log("Using rollback webhook URL:",this.rollbackWebhookUrl),console.log("API key present:",!!this.apiKey);let r=await fetch(this.rollbackWebhookUrl,{method:"POST",headers:{"Content-Type":"application/json","x-api-key":this.apiKey},body:JSON.stringify(e)});if(!r.ok){let e=await r.text();throw console.error("Rollback webhook error response:",e),Error(`HTTP error! status: ${r.status}, body: ${e}`)}let o=await r.json();return console.log("Received response from n8n rollback:",JSON.stringify(o,null,2)),{success:!0,results:o}}catch(e){return console.error("Error triggering n8n rollback workflow:",e),{success:!1,error:e instanceof Error?e.message:"Unknown error"}}}}var p=o(14182),g=o(91043),f=o(22039);async function m(e){let r=await (0,l.getServerSession)(c.N);return{authorized:!!r?.user,userId:r?.user?.id}}async function h(e){try{let{authorized:r,userId:o}=await m(e);if(!r||!o)return a.NextResponse.json({error:"Unauthorized"},{status:401});let{searchParams:t}=new URL(e.url),s=Number(t.get("limit")||"10"),n=Number(t.get("offset")||"0"),i=t.get("search"),l=t.get("name"),c={};i&&(c.OR=[{name:{contains:i,mode:"insensitive"}},{intention:{contains:i,mode:"insensitive"}}]),l&&(c.name=l);let d=await u.z.mission.findMany({where:c,skip:n,take:s,orderBy:{createdAt:"desc"},include:{creator:{select:{id:!0,email:!0}},missionUsers:{include:{user:{select:{id:!0,email:!0}}}},attachments:{select:{id:!0,filename:!0,filePath:!0,fileType:!0,fileSize:!0,createdAt:!0},orderBy:{createdAt:"desc"}}}}),p=await u.z.mission.count({where:c}),g=d.map(e=>(console.log("Processing mission logo:",{missionId:e.id,logo:e.logo,constructedUrl:e.logo?`/api/missions/image/${e.logo}`:null}),{...e,logoUrl:e.logo?`/api/missions/image/${e.logo}`:null,logo:e.logo,attachments:e.attachments?.map(e=>({...e,publicUrl:`/api/missions/image/${e.filePath}`}))||[]}));return a.NextResponse.json({missions:g,pagination:{total:p,offset:n,limit:s}})}catch(e){return console.error("Error listing missions:",e),a.NextResponse.json({error:"Internal server error",details:e instanceof Error?e.message:String(e)},{status:500})}}async function y(e){try{return await p.oD.send(new g.HeadObjectCommand({Bucket:"missions",Key:e.replace("missions/","")})),!0}catch(r){return console.error("Error verifying file:",e,r),!1}}async function w(e){let r=[];try{console.log("=== Mission Creation Started ===");let{authorized:o,userId:t}=await m(e);if(!o||!t)return a.NextResponse.json({error:"Unauthorized"},{status:401});let s=await e.json();if(console.log("Received request body:",JSON.stringify(s,null,2)),!s.name||!s.oddScope)return a.NextResponse.json({error:"Missing required fields",missingFields:["name","oddScope"].filter(e=>!s[e])},{status:400});let n={name:s.name,oddScope:s.oddScope,niveau:s.niveau,intention:s.intention,missionType:s.missionType,donneurDOrdre:s.donneurDOrdre,projection:s.projection,services:s.services,profils:s.profils,participation:s.participation,creatorId:t,logo:null};console.log("Creating mission with data:",JSON.stringify(n,null,2));let i=await u.z.mission.create({data:n});console.log("Mission created successfully:",JSON.stringify(i,null,2));let l=[];if(s.guardians)for(let[e,r]of Object.entries(s.guardians))r&&l.push({missionId:i.id,userId:r,role:e});if(s.volunteers&&s.volunteers.length>0)for(let e of s.volunteers)l.push({missionId:i.id,userId:e,role:"volontaire"});l.length>0&&(await u.z.missionUser.createMany({data:l}),console.log("Mission users created:",l));let c=null;if(s.logo?.data)try{let e=s.logo.data.split(",")[1],o=Buffer.from(e,"base64"),n=new File([o],s.logo.name||"logo.png",{type:s.logo.type||"image/png"}),{filePath:a}=await (0,f.vB)(t,i.id,n);c=a,r.push({type:"logo",path:a}),await u.z.mission.update({where:{id:i.id},data:{logo:a}}),console.log("Logo uploaded successfully:",{logoPath:c})}catch(e){throw console.error("Error uploading logo:",e),Error("Failed to upload logo")}if(s.attachments&&s.attachments.length>0)try{let e=s.attachments.map(async e=>{let o=e.data.split(",")[1],s=Buffer.from(o,"base64"),n=new File([s],e.name||"attachment",{type:e.type||"application/octet-stream"}),{filePath:a,filename:l,fileType:c,fileSize:d}=await (0,f.jY)(t,i.id,n);return r.push({type:"attachment",path:a}),u.z.attachment.create({data:{missionId:i.id,filename:l,filePath:a,fileType:c,fileSize:d,uploaderId:t}})});await Promise.all(e),console.log("Attachments uploaded successfully")}catch(e){throw console.error("Error uploading attachments:",e),Error("Failed to upload attachments")}try{if(c&&!await y(c))throw Error("Logo file not found in Minio");if(s.attachments?.length>0){let e=r.filter(e=>"attachment"===e.type).map(e=>y(e.path));if((await Promise.all(e)).some(e=>!e))throw Error("One or more attachment files not found in Minio")}console.log("=== Starting N8N Workflow ===");let e=new d,o={...s,creatorId:t,logoPath:c,config:{N8N_API_KEY:process.env.N8N_API_KEY,MISSION_API_URL:process.env.NEXT_PUBLIC_API_URL}};console.log("Sending to N8N:",JSON.stringify(o,null,2));let n=await e.triggerMissionCreation(o);if(console.log("N8N Workflow Result:",JSON.stringify(n,null,2)),!n.success)throw Error(n.error||"N8N workflow failed");return a.NextResponse.json({success:!0,mission:i,message:"Mission created successfully with all integrations"})}catch(e){throw console.error("Error in final verification or n8n:",e),e}}catch(e){for(let o of(console.error("Error in mission creation:",e),r))try{await p.oD.send(new g.DeleteObjectCommand({Bucket:"missions",Key:o.path.replace("missions/","")})),console.log("Cleaned up file:",o.path)}catch(e){console.error("Error cleaning up file:",o.path,e)}return a.NextResponse.json({error:"Failed to create mission",details:e instanceof Error?e.message:String(e)},{status:500})}}let k=new s.AppRouteRouteModule({definition:{kind:n.RouteKind.APP_ROUTE,page:"/api/missions/route",pathname:"/api/missions",filename:"route",bundlePath:"app/api/missions/route"},resolvedPagePath:"/Users/alma/Documents/NeahNew/app/api/missions/route.ts",nextConfigOutput:"",userland:t}),{workAsyncStorage:b,workUnitAsyncStorage:v,serverHooks:N}=k;function S(){return(0,i.patchFetch)({workAsyncStorage:b,workUnitAsyncStorage:v})}},91043:e=>{e.exports=require("@aws-sdk/client-s3")},94735:e=>{e.exports=require("events")},96330:e=>{e.exports=require("@prisma/client")}};var r=require("../../../webpack-runtime.js");r.C(e);var o=e=>r(r.s=e),t=r.X(0,[4243,5419,580,762,6300],()=>o(82792));module.exports=t})();