Edit: /tmp/tsx-0/17887-12db59e46a0b584dd1a1368480d0fcee95cb4ecd (13690B)
{"code":"__filename=\"/opt/canhelp/apps/api/src/lib/google-oauth.ts\";(()=>{\n\"use strict\";var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDescriptor;var __getOwnPropNames=Object.getOwnPropertyNames;var __hasOwnProp=Object.prototype.hasOwnProperty;var __name=(target,value)=>__defProp(target,\"name\",{value,configurable:true});var __export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:true})};var __copyProps=(to,from,except,desc)=>{if(from&&typeof from===\"object\"||typeof from===\"function\"){for(let key of __getOwnPropNames(from))if(!__hasOwnProp.call(to,key)&&key!==except)__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable})}return to};var __toCommonJS=mod=>__copyProps(__defProp({},\"__esModule\",{value:true}),mod);var google_oauth_exports={};__export(google_oauth_exports,{disconnectCalendar:()=>disconnectCalendar,exchangeCode:()=>exchangeCode,getCalendarAuthUrl:()=>getCalendarAuthUrl,getCalendarStatus:()=>getCalendarStatus,getOAuthClient:()=>getOAuthClient,importBusyTimes:()=>importBusyTimes,pushAvailabilityChange:()=>pushAvailabilityChange,runFirstImport:()=>runFirstImport,storeCalendarToken:()=>storeCalendarToken});module.exports=__toCommonJS(google_oauth_exports);var import_googleapis=require(\"googleapis\");var import_db=require(\"../db.js\");var import_db2=require(\"@canhelp/db\");var import_drizzle_orm=require(\"drizzle-orm\");function getOAuthClient(){return new import_googleapis.google.auth.OAuth2(process.env.GOOGLE_CLIENT_ID,process.env.GOOGLE_CLIENT_SECRET,process.env.GOOGLE_CALENDAR_REDIRECT_URI)}__name(getOAuthClient,\"getOAuthClient\");function getCalendarAuthUrl(state){const client=getOAuthClient();return client.generateAuthUrl({access_type:\"offline\",prompt:\"consent\",scope:[\"openid\",\"email\",\"profile\",\"https://www.googleapis.com/auth/calendar.events\"],state})}__name(getCalendarAuthUrl,\"getCalendarAuthUrl\");async function exchangeCode(code){const client=getOAuthClient();const{tokens}=await client.getToken(code);let googleUserId=null;let email=null;if(tokens.id_token){try{const ticket=await client.verifyIdToken({idToken:tokens.id_token,audience:process.env.GOOGLE_CLIENT_ID});const payload=ticket.getPayload();googleUserId=payload?.sub??null;email=payload?.email??null}catch{}}return{tokens,googleUserId,email}}__name(exchangeCode,\"exchangeCode\");async function storeCalendarToken(userId,tokens,googleUserId,email){const data={accessToken:tokens.access_token,refreshToken:tokens.refresh_token??null,expiresAt:tokens.expiry_date?new Date(tokens.expiry_date):null,calendarEmail:email,googleUserId,scopes:tokens.scope??null,updatedAt:new Date};const[existing]=await import_db.db.select({id:import_db2.googleCalendarTokens.id}).from(import_db2.googleCalendarTokens).where((0,import_drizzle_orm.eq)(import_db2.googleCalendarTokens.userId,userId)).limit(1);if(existing){await import_db.db.update(import_db2.googleCalendarTokens).set(data).where((0,import_drizzle_orm.eq)(import_db2.googleCalendarTokens.userId,userId))}else{await import_db.db.insert(import_db2.googleCalendarTokens).values({userId,...data})}}__name(storeCalendarToken,\"storeCalendarToken\");async function getAuthedClient(userId){const[token]=await import_db.db.select().from(import_db2.googleCalendarTokens).where((0,import_drizzle_orm.eq)(import_db2.googleCalendarTokens.userId,userId)).limit(1);if(!token)return null;const client=getOAuthClient();client.setCredentials({access_token:token.accessToken,refresh_token:token.refreshToken??void 0,expiry_date:token.expiresAt?token.expiresAt.getTime():void 0});if(!token.expiresAt||token.expiresAt.getTime()-Date.now()<5*60*1e3){try{const{credentials}=await client.refreshAccessToken();await import_db.db.update(import_db2.googleCalendarTokens).set({accessToken:credentials.access_token,expiresAt:credentials.expiry_date?new Date(credentials.expiry_date):null,updatedAt:new Date}).where((0,import_drizzle_orm.eq)(import_db2.googleCalendarTokens.userId,userId));client.setCredentials(credentials)}catch{await import_db.db.delete(import_db2.googleCalendarTokens).where((0,import_drizzle_orm.eq)(import_db2.googleCalendarTokens.userId,userId));return null}}return client}__name(getAuthedClient,\"getAuthedClient\");async function getCalendarStatus(userId){const[token]=await import_db.db.select({calendarEmail:import_db2.googleCalendarTokens.calendarEmail,googleUserId:import_db2.googleCalendarTokens.googleUserId}).from(import_db2.googleCalendarTokens).where((0,import_drizzle_orm.eq)(import_db2.googleCalendarTokens.userId,userId)).limit(1);if(!token)return{connected:false};return{connected:true,email:token.calendarEmail,googleUserId:token.googleUserId}}__name(getCalendarStatus,\"getCalendarStatus\");async function disconnectCalendar(userId){const[token]=await import_db.db.select({accessToken:import_db2.googleCalendarTokens.accessToken}).from(import_db2.googleCalendarTokens).where((0,import_drizzle_orm.eq)(import_db2.googleCalendarTokens.userId,userId)).limit(1);if(token){const client=getOAuthClient();await client.revokeToken(token.accessToken).catch(()=>{});await import_db.db.delete(import_db2.googleCalendarTokens).where((0,import_drizzle_orm.eq)(import_db2.googleCalendarTokens.userId,userId))}}__name(disconnectCalendar,\"disconnectCalendar\");function availEventId(date){return`canhellavail${date.replace(/-/g,\"\")}`}__name(availEventId,\"availEventId\");async function pushAvailabilityChange(userId,date,status){const client=await getAuthedClient(userId);if(!client)return;const calendarApi=import_googleapis.google.calendar({version:\"v3\",auth:client});const eventId=availEventId(date);if(status===null){await calendarApi.events.delete({calendarId:\"primary\",eventId}).catch(()=>{});return}const colorId=status===\"available\"?\"2\":\"11\";const summary=status===\"available\"?\"CanHelp: \\u0395\\u03BB\\u03B5\\u03CD\\u03B8\\u03B5\\u03C1\\u03BF\\u03C2/\\u03B7\":\"CanHelp: \\u0391\\u03C0\\u03B1\\u03C3\\u03C7\\u03BF\\u03BB\\u03B7\\u03BC\\u03AD\\u03BD\\u03BF\\u03C2/\\u03B7\";const eventBody={summary,colorId,start:{date},end:{date},description:`canhelp-availability:${date}`};const existing=await calendarApi.events.get({calendarId:\"primary\",eventId}).catch(()=>null);if(existing?.data?.id){await calendarApi.events.update({calendarId:\"primary\",eventId,requestBody:eventBody}).catch(()=>{})}else{await calendarApi.events.insert({calendarId:\"primary\",requestBody:{...eventBody,id:eventId}}).catch(()=>{})}}__name(pushAvailabilityChange,\"pushAvailabilityChange\");async function importBusyTimes(userId,from,to){const client=await getAuthedClient(userId);if(!client)return 0;const calendarApi=import_googleapis.google.calendar({version:\"v3\",auth:client});const res=await calendarApi.freebusy.query({requestBody:{timeMin:`${from}T00:00:00Z`,timeMax:`${to}T23:59:59Z`,items:[{id:\"primary\"}]}});const busyPeriods=res.data.calendars?.primary?.busy??[];const today=new Date().toISOString().slice(0,10);let count=0;for(const period of busyPeriods){if(!period.start||!period.end)continue;const startDate=period.start.slice(0,10);const endDate=period.end.slice(0,10);const cur=new Date(startDate);const end=new Date(endDate);while(cur<=end){const dateStr=cur.toISOString().slice(0,10);if(dateStr>=today){const[existing]=await import_db.db.select({id:import_db2.specialistAvailability.id}).from(import_db2.specialistAvailability).where((0,import_drizzle_orm.and)((0,import_drizzle_orm.eq)(import_db2.specialistAvailability.specialistId,userId),(0,import_drizzle_orm.eq)(import_db2.specialistAvailability.date,dateStr))).limit(1);if(existing){await import_db.db.update(import_db2.specialistAvailability).set({status:\"busy\",updatedAt:new Date}).where((0,import_drizzle_orm.and)((0,import_drizzle_orm.eq)(import_db2.specialistAvailability.specialistId,userId),(0,import_drizzle_orm.eq)(import_db2.specialistAvailability.date,dateStr)))}else{await import_db.db.insert(import_db2.specialistAvailability).values({specialistId:userId,date:dateStr,status:\"busy\"})}count++}cur.setDate(cur.getDate()+1)}}return count}__name(importBusyTimes,\"importBusyTimes\");async function runFirstImport(userId){const today=new Date().toISOString().slice(0,10);const threeMonths=new Date;threeMonths.setMonth(threeMonths.getMonth()+3);const to=threeMonths.toISOString().slice(0,10);return importBusyTimes(userId,today,to)}__name(runFirstImport,\"runFirstImport\");0&&(module.exports={disconnectCalendar,exchangeCode,getCalendarAuthUrl,getCalendarStatus,getOAuthClient,importBusyTimes,pushAvailabilityChange,runFirstImport,storeCalendarToken});\n})()\n","warnings":[],"map":{"version":3,"mappings":"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","names":["import_db"],"ignoreList":[],"sources":["/opt/canhelp/apps/api/src/lib/google-oauth.ts"],"sourcesContent":[null]}}