Edit: /tmp/tsx-0/17887-74944eaf007dd1c93550faa4d356333dd045aea0 (15592B)
{"code":"__filename=\"/opt/canhelp/apps/api/src/lib/fomo.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 fomo_exports={};__export(fomo_exports,{getCustomerDashboard:()=>getCustomerDashboard,getSpecialistFomoDashboard:()=>getSpecialistFomoDashboard,getTaskStats:()=>getTaskStats,recordMissedOrders:()=>recordMissedOrders,recordTaskView:()=>recordTaskView});module.exports=__toCommonJS(fomo_exports);var import_drizzle_orm=require(\"drizzle-orm\");var import_db=require(\"../db.js\");var import_db2=require(\"@canhelp/db\");function todayDate(){return new Date().toLocaleDateString(\"sv-SE\",{timeZone:\"Europe/Athens\"})}__name(todayDate,\"todayDate\");async function recordTaskView(taskId,userId){const[viewer]=await import_db.db.select({planId:import_db2.users.planId}).from(import_db2.users).where((0,import_drizzle_orm.eq)(import_db2.users.id,userId));let tier=null;if(viewer?.planId){const[plan]=await import_db.db.select({tier:import_db2.plans.tier}).from(import_db2.plans).where((0,import_drizzle_orm.eq)(import_db2.plans.id,viewer.planId));tier=plan?.tier??null}await import_db.db.insert(import_db2.taskViews).values({taskId,userId,userPlanTier:tier??\"free\"}).onConflictDoNothing();const isPro=tier===\"pro\"||tier===\"ultimate\";await import_db.db.execute(import_drizzle_orm.sql`\n INSERT INTO task_stats (id, task_id, total_views, pro_views, total_offers, updated_at)\n VALUES (gen_random_uuid(), ${taskId}, 1, ${isPro?1:0}, 0, now())\n ON CONFLICT (task_id) DO UPDATE SET\n total_views = (SELECT count(*) FROM task_views WHERE task_id = ${taskId}),\n pro_views = (SELECT count(*) FROM task_views WHERE task_id = ${taskId} AND user_plan_tier IN ('pro', 'ultimate')),\n updated_at = now()\n `);const[stats]=await import_db.db.select({totalViews:import_db2.taskStats.totalViews,proViews:import_db2.taskStats.proViews}).from(import_db2.taskStats).where((0,import_drizzle_orm.eq)(import_db2.taskStats.taskId,taskId));return{totalViews:stats?.totalViews??1,proViews:stats?.proViews??0}}__name(recordTaskView,\"recordTaskView\");async function getTaskStats(taskId){const[stats]=await import_db.db.select().from(import_db2.taskStats).where((0,import_drizzle_orm.eq)(import_db2.taskStats.taskId,taskId));const[offerCount]=await import_db.db.select({count:(0,import_drizzle_orm.count)()}).from(import_db2.offers).where((0,import_drizzle_orm.eq)(import_db2.offers.taskId,taskId));const[task]=await import_db.db.select({createdAt:import_db2.tasks.createdAt}).from(import_db2.tasks).where((0,import_drizzle_orm.eq)(import_db2.tasks.id,taskId));let avgResponseMin=null;if(task){const[result]=await import_db.db.select({avg:import_drizzle_orm.sql`EXTRACT(EPOCH FROM AVG(${import_db2.offers.createdAt} - ${import_drizzle_orm.sql`${task.createdAt}::timestamp`})) / 60`}).from(import_db2.offers).where((0,import_drizzle_orm.eq)(import_db2.offers.taskId,taskId));avgResponseMin=result?.avg?Math.round(result.avg):null}if(stats){await import_db.db.update(import_db2.taskStats).set({totalOffers:offerCount?.count??0,avgResponseMin,updatedAt:new Date}).where((0,import_drizzle_orm.eq)(import_db2.taskStats.taskId,taskId))}return{totalViews:stats?.totalViews??0,proViews:stats?.proViews??0,totalOffers:offerCount?.count??0,avgResponseMin}}__name(getTaskStats,\"getTaskStats\");async function recordMissedOrders(taskId,acceptedSpecialistId){const date=todayDate();const[task]=await import_db.db.select({id:import_db2.tasks.id,budget:import_db2.tasks.budget,category:import_db2.tasks.category,location:import_db2.tasks.location}).from(import_db2.tasks).where((0,import_drizzle_orm.eq)(import_db2.tasks.id,taskId));if(!task)return;const estimatedValue=task.budget??null;const[winnerUser]=await import_db.db.select({planId:import_db2.users.planId}).from(import_db2.users).where((0,import_drizzle_orm.eq)(import_db2.users.id,acceptedSpecialistId));let takenByPro=false;if(winnerUser?.planId){const[plan]=await import_db.db.select({tier:import_db2.plans.tier}).from(import_db2.plans).where((0,import_drizzle_orm.eq)(import_db2.plans.id,winnerUser.planId));takenByPro=plan?.tier===\"pro\"||plan?.tier===\"ultimate\"}const categoryCondition=task.category?import_drizzle_orm.sql`${import_db2.specialistCards.categories} @> ARRAY[${task.category}]::text[]`:import_drizzle_orm.sql`true`;const relevantSpecs=await import_db.db.selectDistinct({specialistId:import_db2.specialistCards.specialistId}).from(import_db2.specialistCards).where((0,import_drizzle_orm.and)((0,import_drizzle_orm.eq)(import_db2.specialistCards.isActive,true),categoryCondition));const relevantIds=relevantSpecs.map(r=>r.specialistId).filter(id=>id!==acceptedSpecialistId);if(relevantIds.length===0)return;const viewedSet=new Set;if(relevantIds.length>0){const views=await import_db.db.select({userId:import_db2.taskViews.userId}).from(import_db2.taskViews).where((0,import_drizzle_orm.eq)(import_db2.taskViews.taskId,taskId));views.forEach(v=>viewedSet.add(v.userId))}const offeredSet=new Set;const existingOffers=await import_db.db.select({specialistId:import_db2.offers.specialistId}).from(import_db2.offers).where((0,import_drizzle_orm.eq)(import_db2.offers.taskId,taskId));existingOffers.forEach(o=>offeredSet.add(o.specialistId));const missedValues=relevantIds.filter(id=>!offeredSet.has(id)).map(specialistId=>({specialistId,taskId,reason:viewedSet.has(specialistId)?\"viewed_no_offer\":\"not_viewed\",estimatedValue,takenByPro,date}));if(missedValues.length>0){await import_db.db.insert(import_db2.missedOrders).values(missedValues).onConflictDoNothing()}for(const m of missedValues){await import_db.db.execute(import_drizzle_orm.sql`\n INSERT INTO daily_specialist_stats (id, specialist_id, date, missed_total, missed_by_pro, missed_revenue, hot_orders_missed)\n VALUES (gen_random_uuid(), ${m.specialistId}, ${date}, 1, ${m.takenByPro?1:0}, ${Number(m.estimatedValue??0)}, 0)\n ON CONFLICT (specialist_id, date) DO UPDATE SET\n missed_total = daily_specialist_stats.missed_total + 1,\n missed_by_pro = daily_specialist_stats.missed_by_pro + ${m.takenByPro?1:0},\n missed_revenue = daily_specialist_stats.missed_revenue + ${Number(m.estimatedValue??0)}\n `)}await import_db.db.execute(import_drizzle_orm.sql`\n INSERT INTO daily_specialist_stats (id, specialist_id, date, received_orders)\n VALUES (gen_random_uuid(), ${acceptedSpecialistId}, ${date}, 1)\n ON CONFLICT (specialist_id, date) DO UPDATE SET\n received_orders = daily_specialist_stats.received_orders + 1\n `)}__name(recordMissedOrders,\"recordMissedOrders\");async function getSpecialistFomoDashboard(specialistId){const date=todayDate();const[todayStats]=await import_db.db.select().from(import_db2.dailySpecialistStats).where((0,import_drizzle_orm.and)((0,import_drizzle_orm.eq)(import_db2.dailySpecialistStats.specialistId,specialistId),(0,import_drizzle_orm.eq)(import_db2.dailySpecialistStats.date,date)));const weekAgo=new Date;weekAgo.setDate(weekAgo.getDate()-7);const weekDate=weekAgo.toLocaleDateString(\"sv-SE\",{timeZone:\"Europe/Athens\"});const[weekAgg]=await import_db.db.select({missedTotal:import_drizzle_orm.sql`COALESCE(SUM(${import_db2.dailySpecialistStats.missedTotal}), 0)`,missedRevenue:import_drizzle_orm.sql`COALESCE(SUM(${import_db2.dailySpecialistStats.missedRevenue}), 0)`,receivedOrders:import_drizzle_orm.sql`COALESCE(SUM(${import_db2.dailySpecialistStats.receivedOrders}), 0)`}).from(import_db2.dailySpecialistStats).where((0,import_drizzle_orm.and)((0,import_drizzle_orm.eq)(import_db2.dailySpecialistStats.specialistId,specialistId),(0,import_drizzle_orm.gte)(import_db2.dailySpecialistStats.date,weekDate)));const recentMissed=await import_db.db.select({taskId:import_db2.missedOrders.taskId,reason:import_db2.missedOrders.reason,estimatedValue:import_db2.missedOrders.estimatedValue,takenByPro:import_db2.missedOrders.takenByPro,date:import_db2.missedOrders.date}).from(import_db2.missedOrders).where((0,import_drizzle_orm.eq)(import_db2.missedOrders.specialistId,specialistId)).orderBy(import_drizzle_orm.sql`${import_db2.missedOrders.createdAt} DESC`).limit(10);const missed=todayStats?.missedTotal??0;const received=todayStats?.receivedOrders??0;const total=missed+received;const coveragePercent=total>0?Math.round(received/total*100):100;return{today:{missedTotal:missed,missedByPro:todayStats?.missedByPro??0,missedRevenue:todayStats?.missedRevenue??\"0\",receivedOrders:received,totalAvailable:total,hotOrdersMissed:todayStats?.hotOrdersMissed??0,coveragePercent},week:{missedTotal:Number(weekAgg?.missedTotal??0),missedRevenue:String(weekAgg?.missedRevenue??\"0\"),receivedOrders:Number(weekAgg?.receivedOrders??0)},recentMissed}}__name(getSpecialistFomoDashboard,\"getSpecialistFomoDashboard\");async function getCustomerDashboard(customerId){const activeTasks=await import_db.db.select({id:import_db2.tasks.id,title:import_db2.tasks.title}).from(import_db2.tasks).where((0,import_drizzle_orm.and)((0,import_drizzle_orm.eq)(import_db2.tasks.customerId,customerId),(0,import_drizzle_orm.eq)(import_db2.tasks.status,\"open\"))).orderBy(import_drizzle_orm.sql`${import_db2.tasks.createdAt} DESC`).limit(20);const result=await Promise.all(activeTasks.map(async t=>{const stats=await getTaskStats(t.id);return{taskId:t.id,title:t.title,...stats}}));return{activeTasks:result}}__name(getCustomerDashboard,\"getCustomerDashboard\");0&&(module.exports={getCustomerDashboard,getSpecialistFomoDashboard,getTaskStats,recordMissedOrders,recordTaskView});\n})()\n","warnings":[],"map":{"version":3,"mappings":"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","names":["import_db"],"ignoreList":[],"sources":["/opt/canhelp/apps/api/src/lib/fomo.ts"],"sourcesContent":[null]}}