1 line
21 KiB
JavaScript
1 line
21 KiB
JavaScript
(()=>{var e={};e.id=318,e.ids=[318],e.modules={3295:e=>{"use strict";e.exports=require("next/dist/server/app-render/after-task-async-storage.external.js")},3586:(e,r,s)=>{"use strict";s.r(r),s.d(r,{patchFetch:()=>N,routeModule:()=>h,serverHooks:()=>w,workAsyncStorage:()=>I,workUnitAsyncStorage:()=>D});var o={};s.r(o),s.d(o,{DELETE:()=>_,GET:()=>p,POST:()=>A});var t=s(96559),n=s(48088),a=s(37719),i=s(35426),l=s(26690),c=s(32190);async function u(e){console.log("=== DOLIBARR CREATE USER FUNCTION CALLED ===");try{if(!process.env.DOLIBARR_API_URL)return console.error("Missing DOLIBARR_API_URL environment variable"),{success:!1,error:"Dolibarr API URL not configured"};if(!process.env.DOLIBARR_API_KEY)return console.error("Missing DOLIBARR_API_KEY environment variable"),{success:!1,error:"Dolibarr API key not configured"};let r=process.env.DOLIBARR_API_URL.endsWith("/")?process.env.DOLIBARR_API_URL:`${process.env.DOLIBARR_API_URL}/`;console.log(`Creating Dolibarr user for ${e.email}`),console.log("Full API URL:",r+"users"),console.log("API Key (first 5 chars):",process.env.DOLIBARR_API_KEY.substring(0,5)+"...");let s={login:e.username,lastname:e.lastName,firstname:e.firstName,password:e.password,email:e.email,admin:0,employee:1,signature:`${e.firstName} ${e.lastName}`,note_private:"Created via API integration from platform",entity:1,status:1};console.log("Request body:",JSON.stringify(s,null,2));let o=await fetch(`${r}users`,{method:"POST",headers:{DOLAPIKEY:process.env.DOLIBARR_API_KEY,"Content-Type":"application/json"},body:JSON.stringify(s)});if(console.log("Dolibarr API response status:",o.status),!o.ok){let e=`HTTP error ${o.status}`;try{let r=await o.json();console.error("Dolibarr API error response full data:",r),e=r.error?.message||e,console.error("Dolibarr API error response:",e)}catch(r){console.error("Failed to parse Dolibarr error response");let e=await o.text();console.error("Raw error response:",e)}return{success:!1,error:`Failed to create Dolibarr user: ${e}`}}let t=await o.json();return console.log("Dolibarr user created successfully with ID:",t),console.log("=== END DOLIBARR CREATE USER FUNCTION ==="),{success:!0,id:t}}catch(e){return console.error("Error creating Dolibarr user:",e),e instanceof Error&&console.error("Error details:",{name:e.name,message:e.message,stack:e.stack}),console.log("=== END DOLIBARR CREATE USER FUNCTION WITH ERROR ==="),{success:!1,error:e instanceof Error?e.message:"Unknown error"}}}async function d(e){console.log("=== DOLIBARR CHECK USER FUNCTION CALLED ===");try{if(!process.env.DOLIBARR_API_URL||!process.env.DOLIBARR_API_KEY)return console.error("Missing Dolibarr API configuration"),{exists:!1};let r=process.env.DOLIBARR_API_URL.endsWith("/")?process.env.DOLIBARR_API_URL:`${process.env.DOLIBARR_API_URL}/`,s=`${r}users?sortfield=t.rowid&sortorder=ASC&limit=1&sqlfilters=(t.email:=:'${encodeURIComponent(e)}')`;console.log("Full search URL:",s);let o=await fetch(s,{method:"GET",headers:{DOLAPIKEY:process.env.DOLIBARR_API_KEY}});if(console.log("Dolibarr check user API response status:",o.status),!o.ok){console.error(`Error checking if Dolibarr user exists: HTTP ${o.status}`);try{let e=await o.text();console.error("Error response body:",e)}catch(e){console.error("Could not read error response body")}return{exists:!1}}let t=await o.json();if(console.log("Dolibarr user search response:",t),Array.isArray(t)&&t.length>0)return console.log("User found in Dolibarr with ID:",t[0].id),console.log("=== END DOLIBARR CHECK USER FUNCTION (USER FOUND) ==="),{exists:!0,id:t[0].id};return console.log("User not found in Dolibarr"),console.log("=== END DOLIBARR CHECK USER FUNCTION (USER NOT FOUND) ==="),{exists:!1}}catch(e){return console.error("Error checking if Dolibarr user exists:",e),e instanceof Error&&console.error("Error details:",{name:e.name,message:e.message,stack:e.stack}),console.log("=== END DOLIBARR CHECK USER FUNCTION WITH ERROR ==="),{exists:!1}}}async function m(e){console.log("=== DOLIBARR DELETE USER FUNCTION CALLED ===");try{if(!process.env.DOLIBARR_API_URL||!process.env.DOLIBARR_API_KEY)return console.error("Missing Dolibarr API configuration"),{success:!1,error:"Dolibarr API not configured"};let r=process.env.DOLIBARR_API_URL.endsWith("/")?process.env.DOLIBARR_API_URL:`${process.env.DOLIBARR_API_URL}/`,s=`${r}users/${e}`;console.log(`Deleting Dolibarr user with ID ${e}`),console.log("Full delete URL:",s);let o=await fetch(s,{method:"DELETE",headers:{DOLAPIKEY:process.env.DOLIBARR_API_KEY}});if(console.log("Dolibarr delete API response status:",o.status),!o.ok){console.error(`Error deleting Dolibarr user: HTTP ${o.status}`);try{let e=await o.text();console.error("Error response body:",e)}catch(e){console.error("Could not read error response body")}return{success:!1,error:`Failed to delete user in Dolibarr: HTTP ${o.status}`}}return console.log("Successfully deleted user from Dolibarr"),console.log("=== END DOLIBARR DELETE USER FUNCTION ==="),{success:!0}}catch(e){return console.error("Error deleting Dolibarr user:",e),e instanceof Error&&console.error("Error details:",{name:e.name,message:e.message,stack:e.stack}),console.log("=== END DOLIBARR DELETE USER FUNCTION WITH ERROR ==="),{success:!1,error:e instanceof Error?e.message:"Unknown error"}}}async function p(){let e=await (0,i.getServerSession)(l.N);if(!e)return c.NextResponse.json({error:"Non autoris\xe9"},{status:401});console.log("Session:",{accessToken:e.accessToken?.substring(0,20)+"...",user:e.user});try{let r=await fetch(`${process.env.KEYCLOAK_BASE_URL}/realms/${process.env.KEYCLOAK_REALM}/protocol/openid-connect/token`,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({grant_type:"client_credentials",client_id:process.env.KEYCLOAK_CLIENT_ID,client_secret:process.env.KEYCLOAK_CLIENT_SECRET})}),s=await r.json();if(console.log("Token response:",{ok:r.ok,status:r.status,data:s.access_token?"Token received":s}),!r.ok)return console.error("Failed to get token:",s),c.NextResponse.json([E(e)]);let o=await fetch(`${process.env.KEYCLOAK_BASE_URL}/admin/realms/${process.env.KEYCLOAK_REALM}/users?briefRepresentation=false`,{headers:{Authorization:`Bearer ${s.access_token}`,"Content-Type":"application/json"}});if(!o.ok)return console.error("Failed to fetch users:",await o.text()),c.NextResponse.json([E(e)]);let t=await o.json();console.log("Raw users data:",t.map(e=>({id:e.id,username:e.username,realm:e.realm,serviceAccountClientId:e.serviceAccountClientId})));let n=t.filter(e=>!e.serviceAccountClientId&&(!e.realm||e.realm===process.env.KEYCLOAK_REALM));console.log("Filtered users count:",n.length);let a=await Promise.all(n.map(async e=>{try{let r=await fetch(`${process.env.KEYCLOAK_BASE_URL}/admin/realms/${process.env.KEYCLOAK_REALM}/users/${e.id}/role-mappings/realm`,{headers:{Authorization:`Bearer ${s.access_token}`,"Content-Type":"application/json"}}),o=[];return r.ok&&(o=(await r.json()).filter(e=>!e.name.startsWith("default-roles-")&&!["offline_access","uma_authorization"].includes(e.name)).map(e=>e.name),console.log(`Roles for user ${e.username}:`,o)),{id:e.id,username:e.username,firstName:e.firstName||"",lastName:e.lastName||"",email:e.email,createdTimestamp:e.createdTimestamp,enabled:e.enabled,roles:o}}catch(r){return console.error(`Error fetching roles for user ${e.id}:`,r),{id:e.id,username:e.username,firstName:e.firstName||"",lastName:e.lastName||"",email:e.email,createdTimestamp:e.createdTimestamp,enabled:e.enabled,roles:[]}}}));return console.log("Final users data:",a.map(e=>({username:e.username,roles:e.roles}))),c.NextResponse.json(a)}catch(r){return console.error("Error:",r),c.NextResponse.json([E(e)])}}function E(e){return{id:e.user.id,username:e.user.username,firstName:e.user.first_name,lastName:e.user.last_name,email:e.user.email,createdTimestamp:Date.now(),roles:e.user.role||[]}}async function f(){try{let e=await fetch(`${process.env.KEYCLOAK_BASE_URL}/realms/${process.env.KEYCLOAK_REALM}/protocol/openid-connect/token`,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({grant_type:"client_credentials",client_id:process.env.KEYCLOAK_CLIENT_ID,client_secret:process.env.KEYCLOAK_CLIENT_SECRET})}),r=await e.json();if(!e.ok||!r.access_token)return console.error("Token Error:",r),null;return r.access_token}catch(e){return console.error("Token Error:",e),null}}async function R(e){try{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({method:"leantime.rpc.Users.Users.addUser",jsonrpc:"2.0",id:1,params:{values:{0:0,1:e.lastName,2:e.firstName,3:"20",4:"",5:"a",6:e.email,7:0,8:0,9:null,10:"",11:"",12:"",13:new Date().toISOString(),lastname:e.lastName,firstname:e.firstName,role:"20",profileId:"",status:"a",username:e.email,password:e.password,twoFAEnabled:0,clientId:0,clientName:null,jobTitle:"",jobLevel:"",department:"",modified:new Date().toISOString(),createdOn:new Date().toISOString(),source:"keycloak",notifications:1,settings:"{}"}}})}),s=await r.json();if(console.log("Leantime response:",s),!r.ok||!s.result)return console.error("Leantime user creation failed:",s),{success:!1,error:s.error?.message||"Failed to create user in Leantime"};return{success:!0}}catch(e){return console.error("Error creating Leantime user:",e),{success:!1,error:"Error creating user in Leantime"}}}async function A(e){if(!await (0,i.getServerSession)(l.N))return c.NextResponse.json({error:"Non autoris\xe9"},{status:401});try{var r;let s=await e.json();console.log("Creating user:",s);let o=(r=s.username,/^[a-zA-Z0-9][a-zA-Z0-9._-]{2,254}$/.test(r)?{isValid:!0}:{isValid:!1,error:"Le nom d'utilisateur doit commencer par une lettre ou un chiffre, ne contenir que des lettres, chiffres, points, tirets et underscores, et faire entre 3 et 255 caract\xe8res"});if(!o.isValid)return c.NextResponse.json({error:o.error},{status:400});let t=await f();if(!t)return c.NextResponse.json({error:"Erreur d'authentification"},{status:401});let n=await fetch(`${process.env.KEYCLOAK_BASE_URL}/admin/realms/${process.env.KEYCLOAK_REALM}/roles`,{headers:{Authorization:`Bearer ${t}`}});if(!n.ok){let e=await n.json();return console.error("Failed to fetch roles:",e),c.NextResponse.json({error:"Erreur lors de la r\xe9cup\xe9ration des r\xf4les"},{status:n.status})}let a=await n.json();console.log("Available roles:",a);let i=(s.roles||[]).filter(e=>a.some(r=>r.name===e));if(0===i.length)return c.NextResponse.json({error:"Aucun r\xf4le valide n'a \xe9t\xe9 sp\xe9cifi\xe9"},{status:400});let l=await fetch(`${process.env.KEYCLOAK_BASE_URL}/admin/realms/${process.env.KEYCLOAK_REALM}/users`,{method:"POST",headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"},body:JSON.stringify({username:s.username,enabled:!0,emailVerified:!0,firstName:s.firstName,lastName:s.lastName,email:s.email,credentials:[{type:"password",value:s.password,temporary:!1}]})});if(console.log("Keycloak create response:",{status:l.status,ok:l.ok}),!l.ok){let e=await l.json();if(console.error("Keycloak error:",e),e.errorMessage?.includes("User exists with same username"))return c.NextResponse.json({error:"Un utilisateur existe d\xe9j\xe0 avec ce nom d'utilisateur"},{status:400});if(e.errorMessage?.includes("User exists with same email"))return c.NextResponse.json({error:"Un utilisateur existe d\xe9j\xe0 avec cet email"},{status:400});return c.NextResponse.json({error:"Erreur cr\xe9ation utilisateur",details:e},{status:400})}let m=await fetch(`${process.env.KEYCLOAK_BASE_URL}/admin/realms/${process.env.KEYCLOAK_REALM}/users?username=${s.username}`,{headers:{Authorization:`Bearer ${t}`}}),p=(await m.json())[0];if(!p)return c.NextResponse.json({error:"Utilisateur cr\xe9\xe9 mais impossible de le r\xe9cup\xe9rer"},{status:500});let E=i.map(e=>a.find(r=>r.name===e)),A=await fetch(`${process.env.KEYCLOAK_BASE_URL}/admin/realms/${process.env.KEYCLOAK_REALM}/users/${p.id}/role-mappings/realm`,{method:"POST",headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"},body:JSON.stringify(E)});if(!A.ok){let e=await A.json();return console.error("Failed to add roles:",e),c.NextResponse.json({error:"Erreur lors de l'ajout des r\xf4les",details:e},{status:500})}let g=await R({username:s.username,firstName:s.firstName,lastName:s.lastName,email:s.email,password:s.password});g.success||console.error("Leantime user creation failed:",g.error),console.log("=== DOLIBARR INTEGRATION DIAGNOSTICS ==="),console.log("Role check values:",{allRoles:i,exactCase:{hasMediationExact:i.includes("Mediation"),hasExpressionExact:i.includes("Expression")},lowerCase:{hasMediationLower:i.includes("mediation"),hasExpressionLower:i.includes("expression")}}),console.log("Environment variables:",{dolibarrUrlExists:!!process.env.DOLIBARR_API_URL,dolibarrUrl:process.env.DOLIBARR_API_URL?`${process.env.DOLIBARR_API_URL.substring(0,10)}...`:"undefined",dolibarrKeyExists:!!process.env.DOLIBARR_API_KEY,dolibarrKeyFirstChars:process.env.DOLIBARR_API_KEY?`${process.env.DOLIBARR_API_KEY.substring(0,5)}...`:"undefined"});let L=i.includes("Mediation"),_=i.includes("Expression");console.log("Role check results:",{hasMediationRole:L,hasExpressionRole:_,shouldCreateInDolibarr:L||_});if(L||_){console.log(`User has special role (mediation: ${L}, expression: ${_}), creating in Dolibarr`);try{console.log("Checking if user already exists in Dolibarr with email:",s.email);let e=await d(s.email);if(e.exists)console.log(`User already exists in Dolibarr with ID: ${e.id}`),e.id;else{console.log("Creating new user account in Dolibarr with data:",{username:s.username,email:s.email,name:`${s.firstName} ${s.lastName}`});let e=await u({username:s.username,firstName:s.firstName,lastName:s.lastName,email:s.email,password:s.password});e.success?(console.log(`User account created in Dolibarr with ID: ${e.id}`),e.id):console.error("Dolibarr user account creation failed:",e.error)}}catch(e){console.error("Unexpected error during Dolibarr integration:",e)}}else console.log("User does not have mediation or expression role, skipping Dolibarr creation");return console.log("=== END DOLIBARR INTEGRATION DIAGNOSTICS ==="),c.NextResponse.json({success:!0,user:{...p,roles:i}})}catch(e){return console.error("Error creating user:",e),c.NextResponse.json({error:"Erreur serveur",details:e},{status:500})}}async function g(e){try{if(!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(e))return console.error("Invalid email format"),null;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({method:"leantime.rpc.Users.Users.getUserByEmail",jsonrpc:"2.0",id:1,params:{email:e}})}),s=await r.json();if(console.log("Leantime user lookup response status:",r.status),!r.ok||!s.result)return console.error("Failed to get Leantime user"),null;if(!1===s.result)return null;return s.result.id}catch(e){return console.error("Error getting Leantime user"),null}}async function L(e){try{let r=await g(e);if(!r)return{success:!1,error:"User not found in Leantime"};console.log(`Found Leantime user with ID: ${r}, proceeding with deletion`);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({method:"leantime.rpc.Users.Users.deleteUser",jsonrpc:"2.0",id:1,params:{id:r}})}),o=await s.json();if(console.log("Leantime delete response:",o),!s.ok||!o.result)return console.error("Leantime user deletion failed:",o),{success:!1,error:o.error?.message||"Failed to delete user in Leantime"};return{success:!0}}catch(e){return console.error("Error deleting Leantime user:",e),{success:!1,error:"Error deleting user in Leantime"}}}async function _(e){if(!await (0,i.getServerSession)(l.N))return c.NextResponse.json({error:"Non autoris\xe9"},{status:401});try{let{searchParams:r}=new URL(e.url),s=r.get("id"),o=r.get("email");if(!s||!o)return c.NextResponse.json({error:"ID utilisateur et email requis"},{status:400});console.log(`Deleting user: ID=${s}, email=${o}`);let t=await f();if(!t)return c.NextResponse.json({error:"Erreur d'authentification"},{status:401});let n=await fetch(`${process.env.KEYCLOAK_BASE_URL}/admin/realms/${process.env.KEYCLOAK_REALM}/users/${s}`,{method:"DELETE",headers:{Authorization:`Bearer ${t}`}});if(!n.ok){let e=await n.json();return console.error("Keycloak delete error:",e),c.NextResponse.json({error:"Erreur lors de la suppression de l'utilisateur",details:e},{status:n.status})}console.log("Successfully deleted user from Keycloak");let a=await L(o);a.success?console.log("Successfully deleted user from Leantime"):console.error("Leantime user deletion failed:",a.error),console.log(`Checking if user exists in Dolibarr with email: ${o}`);try{let e=await d(o);if(e.exists&&e.id){console.log(`User found in Dolibarr with ID: ${e.id}. Proceeding with deletion.`);let r=await m(e.id);r.success?console.log(`Successfully deleted user from Dolibarr with ID: ${e.id}`):console.error("Dolibarr user deletion failed:",r.error)}else console.log("User not found in Dolibarr, skipping Dolibarr deletion")}catch(e){console.error("Error during Dolibarr user deletion:",e)}return c.NextResponse.json({success:!0,message:"User deleted from all systems"})}catch(e){return console.error("Error deleting user:",e),c.NextResponse.json({error:"Erreur serveur",details:e},{status:500})}}let h=new t.AppRouteRouteModule({definition:{kind:n.RouteKind.APP_ROUTE,page:"/api/users/route",pathname:"/api/users",filename:"route",bundlePath:"app/api/users/route"},resolvedPagePath:"/Users/alma/Documents/NeahNew/app/api/users/route.ts",nextConfigOutput:"",userland:o}),{workAsyncStorage:I,workUnitAsyncStorage:D,serverHooks:w}=h;function N(){return(0,a.patchFetch)({workAsyncStorage:I,workUnitAsyncStorage:D})}},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 o=s(1926),t=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)throw s;return{...e,accessToken:s.access_token,refreshToken:s.refresh_token??e.refreshToken,accessTokenExpires:Date.now()+1e3*s.expires_in}}catch(r){return console.error("Error refreshing access token:",r),{...e,error:"RefreshAccessTokenError"}}}let i={providers:[(0,o.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 o=(s.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=s.sub,e.role=o,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,t.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:a(e)},async session({session:e,token:r}){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}},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")},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),o=r.X(0,[4243,5419,580],()=>s(3586));module.exports=o})(); |