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

1 line
9.2 KiB
JavaScript

(()=>{var e={};e.id=6086,e.ids=[6086],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")},12412:e=>{"use strict";e.exports=require("assert")},26690:(e,r,s)=>{"use strict";s.d(r,{N:()=>i});var t=s(1926),o=s(10591);function n(e){let r=process.env[e];if(!r)throw Error(`Missing required environment variable: ${e}`);return r}async function a(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"}),s=await r.json();if(!r.ok){if("invalid_grant"===s.error||s.error_description?.includes("Session not active")||s.error_description?.includes("Token is not active"))return console.log("Keycloak session invalidated (likely logged out from iframe), marking token for removal"),{...e,error:"SessionNotActive"};throw s}return{...e,accessToken:s.access_token,refreshToken:s.refresh_token??e.refreshToken,idToken:e.idToken,accessTokenExpires:Date.now()+1e3*s.expires_in}}catch(r){if(console.error("Error refreshing access token:",r),r?.error==="invalid_grant"||r?.error_description?.includes("Session not active")||r?.error_description?.includes("Token is not active"))return{...e,error:"SessionNotActive"};return{...e,error:"RefreshAccessTokenError"}}}let i={providers:[(0,t.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 s=r.map(e=>e.replace(/^ROLE_/,"").toLowerCase());return console.log("Profile callback cleaned roles:",s),{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:s}}})],session:{strategy:"jwt",maxAge:2592e3},callbacks:{async jwt({token:e,account:r,profile:s}){if(r&&s){let t=(s.realm_access?.roles||[]).map(e=>e.replace(/^ROLE_/,"").toLowerCase());e.accessToken=r.access_token??"",e.refreshToken=r.refresh_token??"",e.idToken=r.id_token??"",e.accessTokenExpires=r.expires_at??0,e.sub=s.sub,e.role=t,e.username=s.preferred_username??"",e.first_name=s.given_name??"",e.last_name=s.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)}let t=e.accessTokenExpires;if(t&&Date.now()<t)return e;if(!e.refreshToken)return console.log("No refresh token available, cannot refresh"),{...e,accessToken:void 0,refreshToken:void 0,idToken:void 0,error:"NoRefreshToken"};let n=await a(e);return"SessionNotActive"===n.error?(console.log("Keycloak session invalidated, clearing token to force re-authentication"),{...n,accessToken:void 0,refreshToken:void 0,idToken:void 0}):"RefreshAccessTokenError"!==n.error||n.accessToken?n:(console.log("Refresh token invalid, clearing session to force re-authentication"),{...n,accessToken:void 0,refreshToken:void 0,idToken:void 0})},async session({session:e,token:r}){if("SessionNotActive"===r.error||"NoRefreshToken"===r.error||!r.accessToken||!r.refreshToken)return console.log("Session invalidated or tokens missing, user will be signed out",{error:r.error,hasAccessToken:!!r.accessToken,hasRefreshToken:!!r.refreshToken}),null;if(r.error)throw Error(r.error);let s=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:s,nextcloudInitialized:!1},e.accessToken=r.accessToken,e.idToken=r.idToken,e.refreshToken=r.refreshToken,e}},pages:{signIn:"/signin",error:"/signin"},debug:!1}},28354:e=>{"use strict";e.exports=require("util")},29294:e=>{"use strict";e.exports=require("next/dist/server/app-render/work-async-storage.external.js")},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")},63033:e=>{"use strict";e.exports=require("next/dist/server/app-render/work-unit-async-storage.external.js")},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")},92659:(e,r,s)=>{"use strict";s.r(r),s.d(r,{patchFetch:()=>h,routeModule:()=>m,serverHooks:()=>g,workAsyncStorage:()=>f,workUnitAsyncStorage:()=>k});var t={};s.r(t),s.d(t,{GET:()=>d});var o=s(96559),n=s(48088),a=s(37719),i=s(35426),l=s(26690),c=s(32190);let u=new Map;async function p(e){if(u.has(e))return u.get(e);try{console.log("Fetching Leantime user with token:",process.env.LEANTIME_TOKEN?"Token present":"Token missing");let r=await fetch("https://agilite.slm-lab.net/api/jsonrpc",{method:"POST",headers:{"Content-Type":"application/json","X-API-Key":process.env.LEANTIME_TOKEN||""},body:JSON.stringify({jsonrpc:"2.0",method:"leantime.rpc.Users.Users.getUserByEmail",id:1,params:{email:e}})});if(!r.ok)throw console.error("Failed to fetch user from Leantime:",{status:r.status,statusText:r.statusText}),Error(`Failed to fetch user from Leantime: ${r.status} ${r.statusText}`);let s=await r.json();if(console.log("Leantime user response:",s),!s.result||!1===s.result)return console.log("User not found in Leantime"),null;return u.set(e,s.result.id),setTimeout(()=>u.delete(e),3e5),s.result.id}catch(e){return console.error("Error getting Leantime user ID:",e),null}}async function d(e){try{let e=await (0,i.getServerSession)(l.N);if(console.log("Session:",e?"Present":"Missing"),!e)return c.NextResponse.json({error:"Unauthorized",message:"No session found. Please sign in."},{status:401});if(!e.user?.email)return c.NextResponse.json({error:"Unauthorized",message:"No email found in session. Please sign in again."},{status:401});console.log("User email:",e.user.email);let r=await p(e.user.email);if(console.log("Leantime user ID:",r),!r)return c.NextResponse.json({error:"User not found",message:"Could not find user in Leantime. Please check your email."},{status:404});console.log("Fetching tasks for user:",r);let s=await fetch("https://agilite.slm-lab.net/api/jsonrpc",{method:"POST",headers:{"Content-Type":"application/json","X-API-Key":process.env.LEANTIME_TOKEN||""},body:JSON.stringify({jsonrpc:"2.0",method:"leantime.rpc.Tickets.Tickets.getAll",id:1,params:{projectId:0,userId:r,status:"all",limit:100}})});if(!s.ok)throw console.error("Failed to fetch tasks:",{status:s.status,statusText:s.statusText}),Error(`Failed to fetch tasks: ${s.status} ${s.statusText}`);let t=await s.json();if(console.log("Tasks response:",t),!t.result)return c.NextResponse.json({projects:[]});console.log("Fetching projects");let o=await fetch("https://agilite.slm-lab.net/api/jsonrpc",{method:"POST",headers:{"Content-Type":"application/json","X-API-Key":process.env.LEANTIME_TOKEN||""},body:JSON.stringify({jsonrpc:"2.0",method:"leantime.rpc.Projects.getAll",id:1})});if(!o.ok)throw console.error("Failed to fetch projects:",{status:o.status,statusText:o.statusText}),Error(`Failed to fetch projects: ${o.status} ${o.statusText}`);let n=await o.json();console.log("Projects response:",n);let a=new Map;t.result.forEach(e=>{let r=n.result.find(r=>r.id===e.projectId),s=r?r.name:`Project ${e.projectId}`,t=e.projectId.toString();a.has(t)||a.set(t,{id:t,name:s,labels:[]});let o=a.get(t);if(!o.labels.find(r=>r.name===e.status)){let r,s;switch(e.status.toString()){case"1":r="NEW",s="bg-blue-100 text-blue-800";break;case"2":r="INPROGRESS",s="bg-yellow-100 text-yellow-800";break;case"3":r="DONE",s="bg-green-100 text-green-800";break;default:r="UNKNOWN",s="bg-gray-100 text-gray-800"}o.labels.push({id:`${t}-${e.status}`,name:e.status,statusType:r,class:s})}});let u=Array.from(a.values()).sort((e,r)=>e.name.localeCompare(r.name));return console.log("Final projects:",u),c.NextResponse.json({projects:u})}catch(e){return console.error("Error fetching status labels:",e),c.NextResponse.json({error:"Failed to fetch status labels",message:e instanceof Error?e.message:"Unknown error occurred"},{status:500})}}let m=new o.AppRouteRouteModule({definition:{kind:n.RouteKind.APP_ROUTE,page:"/api/leantime/status-labels/route",pathname:"/api/leantime/status-labels",filename:"route",bundlePath:"app/api/leantime/status-labels/route"},resolvedPagePath:"/Users/alma/Documents/NeahNew/app/api/leantime/status-labels/route.ts",nextConfigOutput:"",userland:t}),{workAsyncStorage:f,workUnitAsyncStorage:k,serverHooks:g}=m;function h(){return(0,a.patchFetch)({workAsyncStorage:f,workUnitAsyncStorage:k})}},94735:e=>{"use strict";e.exports=require("events")},96487:()=>{}};var r=require("../../../../webpack-runtime.js");r.C(e);var s=e=>r(r.s=e),t=r.X(0,[4243,5419,580],()=>s(92659));module.exports=t})();