NeahNew/.next/server/app/api/storage/files/route.js
2025-05-06 23:01:34 +02:00

1 line
14 KiB
JavaScript

(()=>{var e={};e.id=7337,e.ids=[7337,9834],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")},11723:e=>{"use strict";e.exports=require("querystring")},12269:(e,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0})},12412:e=>{"use strict";e.exports=require("assert")},14182:(e,r,t)=>{"use strict";t.d(r,{$R:()=>l,Ui:()=>a,XB:()=>c,XR:()=>u,YE:()=>o,ZT:()=>p,b4:()=>d,oD:()=>i});var s=t(91043);t(11046);let o={endpoint:process.env.MINIO_S3_UPLOAD_BUCKET_URL,region:process.env.MINIO_AWS_REGION,bucket:process.env.MINIO_AWS_S3_UPLOAD_BUCKET_NAME,missionsBucket:process.env.MINIO_MISSIONS_BUCKET||"missions",accessKey:process.env.MINIO_ACCESS_KEY||process.env.AWS_ACCESS_KEY_ID,secretKey:process.env.MINIO_SECRET_KEY||process.env.AWS_SECRET_ACCESS_KEY},n={region:o.region,endpoint:o.endpoint,forcePathStyle:!0};o.accessKey&&o.secretKey&&Object.assign(n,{credentials:{accessKeyId:o.accessKey,secretAccessKey:o.secretKey}});let i=new s.S3Client(n);async function a(e,r){try{let t=`user-${e}/${r}/`;console.log(`Listing objects with prefix: ${t}`);let n=new s.ListObjectsV2Command({Bucket:o.bucket,Prefix:t,Delimiter:"/"}),a=await i.send(n);return a.Contents?.map(e=>({id:e.Key,title:e.Key?.split("/").pop()?.replace(".md","")||"",lastModified:e.LastModified?.toISOString(),size:e.Size,type:"file",mime:e.Key?.endsWith(".md")?"text/markdown":"application/octet-stream",etag:e.ETag})).filter(e=>!e.title.startsWith(".placeholder")&&""!==e.title)||[]}catch(e){throw console.error("Error listing objects:",e),e}}async function c(e){try{let r=new s.GetObjectCommand({Bucket:o.bucket,Key:e}),t=await i.send(r);return await t.Body?.transformToString()}catch(e){throw console.error("Error getting object content:",e),e}}async function l(e,r,t){try{if(console.log(`Attempting to upload to S3/Minio: ${e}`),!o.bucket)throw Error("S3 bucket name is not configured");let n=new s.PutObjectCommand({Bucket:o.bucket,Key:e,Body:r,ContentType:t||(e.endsWith(".md")?"text/markdown":"text/plain")});console.log(`S3 PutObject request prepared for ${e}`);let a=await i.send(n);return console.log(`S3 PutObject successful for ${e}, ETag: ${a.ETag}`),{id:e,title:e.split("/").pop()?.replace(".md","")||"",lastModified:new Date().toISOString(),size:r.length,type:"file",mime:t||(e.endsWith(".md")?"text/markdown":"text/plain"),etag:a.ETag}}catch(r){throw console.error(`Error putting object to S3/Minio (${e}):`,r),r?.name==="NoSuchBucket"&&console.error(`Bucket "${o.bucket}" does not exist. Please create it first.`),r}}async function u(e){try{let r=new s.DeleteObjectCommand({Bucket:o.bucket,Key:e});return await i.send(r),!0}catch(e){throw console.error("Error deleting object:",e),e}}async function p(e){try{console.log(`Creating folder structure for user: ${e}`);let r=[];for(let t of["notes","diary","health","contacts"])try{let s=`user-${e}/${t}/`;console.log(`Creating folder: ${s}`),await l(s,"","application/x-directory");let o=`user-${e}/${t}/.placeholder`;await l(o,"Folder placeholder","text/plain"),r.push(t)}catch(e){console.error(`Error creating folder ${t}:`,e)}return console.log(`Successfully created ${r.length} folders for user ${e}: ${r.join(", ")}`),!0}catch(e){throw console.error("Error creating folder structure:",e),e}}function d(e,r){if(!e)return"";if(e.startsWith("http"))return e;console.log("Generating public URL for:",e);let t=e.startsWith("/")?e.substring(1):e;if(t.startsWith("pages/")){let e=process.env.NEXT_PUBLIC_MINIO_BASE_URL||process.env.MINIO_PUBLIC_URL;if(e){let r=e.replace(/\/$/,""),s=`${r}/${t}`;return console.log("Generated special public URL for pages path:",s),s}}let s=r||o.bucket,n=o.endpoint?.replace(/\/$/,"");if(console.log("S3 Config for URL generation:",{endpoint:n,bucket:s,cleanPath:t}),!n)return console.warn("No S3/Minio endpoint configured, returning original path"),t;let i=`${n}/${s}/${t}`;return console.log("Generated public URL:",i),i}(async()=>{try{console.log("Testing Minio/S3 connection...");let e=new s.ListObjectsV2Command({Bucket:o.bucket,MaxKeys:1}),r=await i.send(e);console.log("Minio/S3 connection successful! Bucket exists and is accessible."),console.log(`Bucket details: ${o.bucket}, contains ${r.KeyCount||0} objects`)}catch(e){console.error("CRITICAL ERROR: Failed to connect to Minio/S3 server!"),console.error("File uploads will fail until this is resolved."),console.error("Error details:",e),console.error("Please check your S3/Minio configuration and server status.")}})(),o.endpoint&&o.bucket||(console.error("ERROR: Missing required S3 environment variables!"),console.error("Please make sure your .env file contains:"),console.error("- MINIO_S3_UPLOAD_BUCKET_URL"),console.error("- MINIO_AWS_S3_UPLOAD_BUCKET_NAME"),console.error("- MINIO_ACCESS_KEY or AWS_ACCESS_KEY_ID"),console.error("- MINIO_SECRET_KEY or AWS_SECRET_ACCESS_KEY")),console.log("S3 Configuration:",{endpoint:o.endpoint||"MISSING!",region:o.region||"MISSING!",bucket:o.bucket||"MISSING!",hasAccessKey:!!o.accessKey||"MISSING!",hasSecretKey:!!o.secretKey||"MISSING!"})},19854:(e,r,t)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var s={};Object.defineProperty(r,"default",{enumerable:!0,get:function(){return n.default}});var o=t(12269);Object.keys(o).forEach(function(e){!("default"===e||"__esModule"===e||Object.prototype.hasOwnProperty.call(s,e))&&(e in r&&r[e]===o[e]||Object.defineProperty(r,e,{enumerable:!0,get:function(){return o[e]}}))});var n=function(e,r){if(e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var t=i(r);if(t&&t.has(e))return t.get(e);var s={__proto__:null},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var n in e)if("default"!==n&&({}).hasOwnProperty.call(e,n)){var a=o?Object.getOwnPropertyDescriptor(e,n):null;a&&(a.get||a.set)?Object.defineProperty(s,n,a):s[n]=e[n]}return s.default=e,t&&t.set(e,s),s}(t(35426));function i(e){if("function"!=typeof WeakMap)return null;var r=new WeakMap,t=new WeakMap;return(i=function(e){return e?t:r})(e)}Object.keys(n).forEach(function(e){!("default"===e||"__esModule"===e||Object.prototype.hasOwnProperty.call(s,e))&&(e in r&&r[e]===n[e]||Object.defineProperty(r,e,{enumerable:!0,get:function(){return n[e]}}))})},21820:e=>{"use strict";e.exports=require("os")},26690:(e,r,t)=>{"use strict";t.d(r,{N:()=>a});var s=t(1926),o=t(10591);function n(e){let r=process.env[e];if(!r)throw Error(`Missing required environment variable: ${e}`);return r}async function i(e){try{let r=await fetch(`${process.env.KEYCLOAK_ISSUER}/protocol/openid-connect/token`,{headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({client_id:process.env.KEYCLOAK_CLIENT_ID,client_secret:process.env.KEYCLOAK_CLIENT_SECRET,grant_type:"refresh_token",refresh_token:e.refreshToken||""}),method:"POST"}),t=await r.json();if(!r.ok)throw t;return{...e,accessToken:t.access_token,refreshToken:t.refresh_token??e.refreshToken,accessTokenExpires:Date.now()+1e3*t.expires_in}}catch(r){return console.error("Error refreshing access token:",r),{...e,error:"RefreshAccessTokenError"}}}let a={providers:[(0,s.A)({clientId:n("KEYCLOAK_CLIENT_ID"),clientSecret:n("KEYCLOAK_CLIENT_SECRET"),issuer:n("KEYCLOAK_ISSUER"),authorization:{params:{scope:"openid profile email roles"}},profile(e){console.log("Keycloak profile callback:",{rawProfile:e,rawRoles:e.roles,realmAccess:e.realm_access,groups:e.groups});let r=e.realm_access?.roles||[];console.log("Profile callback raw roles:",r);let t=r.map(e=>e.replace(/^ROLE_/,"").toLowerCase());return console.log("Profile callback cleaned roles:",t),{id:e.sub,name:e.name??e.preferred_username,email:e.email,first_name:e.given_name??"",last_name:e.family_name??"",username:e.preferred_username??e.email?.split("@")[0]??"",role:t}}})],session:{strategy:"jwt",maxAge:2592e3},callbacks:{async jwt({token:e,account:r,profile:t}){if(r&&t){let s=(t.realm_access?.roles||[]).map(e=>e.replace(/^ROLE_/,"").toLowerCase());e.accessToken=r.access_token??"",e.refreshToken=r.refresh_token??"",e.accessTokenExpires=r.expires_at??0,e.sub=t.sub,e.role=s,e.username=t.preferred_username??"",e.first_name=t.given_name??"",e.last_name=t.family_name??""}else if(e.accessToken)try{let r=(0,o.s)(e.accessToken);r.realm_access?.roles&&(e.role=r.realm_access.roles.map(e=>e.replace(/^ROLE_/,"").toLowerCase()))}catch(e){console.error("Error decoding token:",e)}return Date.now()<1e3*e.accessTokenExpires?e:i(e)},async session({session:e,token:r}){if(r.error)throw Error(r.error);let t=Array.isArray(r.role)?r.role:[];return e.user={id:r.sub??"",email:r.email??null,name:r.name??null,image:null,username:r.username??"",first_name:r.first_name??"",last_name:r.last_name??"",role:t,nextcloudInitialized:!1},e.accessToken=r.accessToken,e}},pages:{signIn:"/signin",error:"/signin"},debug:!1}},27910:e=>{"use strict";e.exports=require("stream")},28354:e=>{"use strict";e.exports=require("util")},29021:e=>{"use strict";e.exports=require("fs")},29294:e=>{"use strict";e.exports=require("next/dist/server/app-render/work-async-storage.external.js")},29834:(e,r,t)=>{"use strict";t.r(r),t.d(r,{DELETE:()=>p,GET:()=>c,POST:()=>l,PUT:()=>u});var s=t(32190),o=t(19854),n=t(26690),i=t(14182);async function a(e){let r=await (0,o.getServerSession)(n.N);return r?.user?.id?{authorized:!0,userId:r.user.id}:(console.error("Unauthorized access attempt:",{url:e.url,method:e.method,headers:Object.fromEntries(e.headers)}),{authorized:!1,userId:null})}async function c(e){try{let{authorized:r,userId:t}=await a(e);if(!r||!t)return s.NextResponse.json({error:"Unauthorized"},{status:401});let{searchParams:o}=new URL(e.url),n=o.get("folder");if(!n)return s.NextResponse.json({error:"Folder parameter is required"},{status:400});let c=n.toLowerCase();console.log(`Listing files for user ${t} in folder: ${n} (normalized: ${c})`);let l=await (0,i.Ui)(t,n);return 0===l.length&&n!==c&&(console.log(`No files found with original case, trying lowercase: ${c}`),l=await (0,i.Ui)(t,c)),s.NextResponse.json(l)}catch(e){return console.error("Error listing files:",e),s.NextResponse.json({error:"Internal server error",details:e instanceof Error?e.message:String(e)},{status:500})}}async function l(e){try{let{authorized:r,userId:t}=await a(e);if(!r||!t)return s.NextResponse.json({error:"Unauthorized"},{status:401});let{title:o,content:n,folder:c}=await e.json().catch(()=>({}));if(!o||!n||!c)return s.NextResponse.json({error:"Missing required fields",received:{title:!!o,content:!!n,folder:!!c}},{status:400});let l=c.toLowerCase(),u=`user-${t}/${l}/${o}${o.endsWith(".md")?"":".md"}`;console.log("Creating file in S3:",{key:u,contentLength:n.length});let p=await (0,i.$R)(u,n);return s.NextResponse.json(p)}catch(e){return console.error("Error creating file:",e),s.NextResponse.json({error:"Internal server error",details:e instanceof Error?e.message:String(e)},{status:500})}}async function u(e){try{let r,{authorized:t,userId:o}=await a(e);if(!t||!o)return s.NextResponse.json({error:"Unauthorized"},{status:401});let{id:n,title:c,content:l,folder:u,mime:p}=await e.json().catch(()=>({}));if(n){if(!n.includes(`user-${o}/`))return s.NextResponse.json({error:"Unauthorized access to file"},{status:403});r=n}else{if(!c||!u)return s.NextResponse.json({error:"Missing required fields",received:{title:!!c,folder:!!u}},{status:400});let e=u.toLowerCase();r=`user-${o}/${e}/${c}${c.endsWith(".md")?"":".md"}`}console.log("Updating file in S3:",{key:r,contentLength:l?.length});let d=await (0,i.$R)(r,l,p);return s.NextResponse.json(d)}catch(e){return console.error("Error updating file:",e),s.NextResponse.json({error:"Internal server error",details:e instanceof Error?e.message:String(e)},{status:500})}}async function p(e){try{let{authorized:r,userId:t}=await a(e);if(!r||!t)return s.NextResponse.json({error:"Unauthorized"},{status:401});let{searchParams:o}=new URL(e.url),n=o.get("id");if(!n)return s.NextResponse.json({error:"Missing file id"},{status:400});if(!n.includes(`user-${t}/`))return s.NextResponse.json({error:"Unauthorized access to file"},{status:403});return console.log("Deleting file from S3:",{key:n}),await (0,i.XR)(n),s.NextResponse.json({success:!0})}catch(e){return console.error("Error deleting file:",e),s.NextResponse.json({error:"Internal server error",details:e instanceof Error?e.message:String(e)},{status:500})}}},33873:e=>{"use strict";e.exports=require("path")},44870:e=>{"use strict";e.exports=require("next/dist/compiled/next-server/app-route.runtime.prod.js")},55511:e=>{"use strict";e.exports=require("crypto")},55591:e=>{"use strict";e.exports=require("https")},57075:e=>{"use strict";e.exports=require("node:stream")},63033:e=>{"use strict";e.exports=require("next/dist/server/app-render/work-unit-async-storage.external.js")},72585:(e,r,t)=>{"use strict";t.r(r),t.d(r,{patchFetch:()=>p,routeModule:()=>a,serverHooks:()=>u,workAsyncStorage:()=>c,workUnitAsyncStorage:()=>l});var s=t(96559),o=t(48088),n=t(37719),i=t(29834);let a=new s.AppRouteRouteModule({definition:{kind:o.RouteKind.APP_ROUTE,page:"/api/storage/files/route",pathname:"/api/storage/files",filename:"route",bundlePath:"app/api/storage/files/route"},resolvedPagePath:"/Users/alma/Documents/NeahNew/app/api/storage/files/route.ts",nextConfigOutput:"",userland:i}),{workAsyncStorage:c,workUnitAsyncStorage:l,serverHooks:u}=a;function p(){return(0,n.patchFetch)({workAsyncStorage:c,workUnitAsyncStorage:l})}},73496:e=>{"use strict";e.exports=require("http2")},74075:e=>{"use strict";e.exports=require("zlib")},78335:()=>{},79428:e=>{"use strict";e.exports=require("buffer")},79551:e=>{"use strict";e.exports=require("url")},81630:e=>{"use strict";e.exports=require("http")},91043:e=>{"use strict";e.exports=require("@aws-sdk/client-s3")},94735:e=>{"use strict";e.exports=require("events")},96487:()=>{}};var r=require("../../../../webpack-runtime.js");r.C(e);var t=e=>r(r.s=e),s=r.X(0,[4243,5419,580,1046],()=>t(72585));module.exports=s})();