Edit: /tmp/tsx-0/17887-ef678dc8a0162eb9a7543f4fd594e8a8969a9053 (11005B)
{"code":"__filename=\"/opt/canhelp/apps/api/src/routes/auto-match.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,desc2)=>{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:!(desc2=__getOwnPropDesc(from,key))||desc2.enumerable})}return to};var __toCommonJS=mod=>__copyProps(__defProp({},\"__esModule\",{value:true}),mod);var auto_match_exports={};__export(auto_match_exports,{default:()=>auto_match_default});module.exports=__toCommonJS(auto_match_exports);var import_hono=require(\"hono\");var import_drizzle_orm=require(\"drizzle-orm\");var import_db=require(\"../db.js\");var import_db2=require(\"@canhelp/db\");var import_auth=require(\"../middleware/auth.js\");var import_plan=require(\"../middleware/plan.js\");var import_helper_capability=require(\"../lib/helper-capability.js\");const app=new import_hono.Hono;app.post(\"/:taskId\",import_auth.requireAuth,import_plan.withPlan,async c=>{const user=c.get(\"user\");if(await(0,import_helper_capability.getHelperCapability)(user.id)){return c.json({error:\"Customers only\"},403)}const plan=c.get(\"plan\");if(!plan?.hasAutoMatch){return c.json({error:\"Auto-match requires Ultimate plan\",code:\"PLAN_UPGRADE_REQUIRED\"},403)}const taskId=c.req.param(\"taskId\");const[task]=await import_db.db.select().from(import_db2.tasks).where((0,import_drizzle_orm.eq)(import_db2.tasks.id,taskId));if(!task)return c.json({error:\"Task not found\"},404);if(task.customerId!==user.id)return c.json({error:\"Forbidden\"},403);if(task.status!==\"open\")return c.json({error:\"Task is not open\"},400);const matches=await findBestSpecialists(task);return c.json({taskId:task.id,matches,total:matches.length})});app.get(\"/:taskId\",import_auth.requireAuth,import_plan.withPlan,async c=>{const user=c.get(\"user\");const plan=c.get(\"plan\");if(!plan?.hasAutoMatch){return c.json({error:\"Auto-match requires Ultimate plan\",code:\"PLAN_UPGRADE_REQUIRED\"},403)}const taskId=c.req.param(\"taskId\");const[task]=await import_db.db.select().from(import_db2.tasks).where((0,import_drizzle_orm.eq)(import_db2.tasks.id,taskId));if(!task)return c.json({error:\"Task not found\"},404);if(task.customerId!==user.id)return c.json({error:\"Forbidden\"},403);const matches=await findBestSpecialists(task);return c.json({taskId:task.id,matches,total:matches.length})});var auto_match_default=app;async function findBestSpecialists(task){if(!task.category)return[];const matchingCards=await import_db.db.select({specialistId:import_db2.specialistCards.specialistId,categories:import_db2.specialistCards.categories,locations:import_db2.specialistCards.locations}).from(import_db2.specialistCards).where((0,import_drizzle_orm.and)((0,import_drizzle_orm.eq)(import_db2.specialistCards.isActive,true),import_drizzle_orm.sql`${task.category} = ANY(${import_db2.specialistCards.categories})`));if(!matchingCards.length)return[];const specialistIds=[...new Set(matchingCards.map(c=>c.specialistId))];const specialists=await import_db.db.select({id:import_db2.users.id,name:import_db2.users.name,firstName:import_db2.users.firstName,lastName:import_db2.users.lastName,image:import_db2.users.image,planId:import_db2.users.planId,createdAt:import_db2.users.createdAt,lastSeenAt:import_db2.users.lastSeenAt}).from(import_db2.users).where((0,import_drizzle_orm.and)((0,import_drizzle_orm.inArray)(import_db2.users.id,specialistIds),(0,import_drizzle_orm.eq)(import_db2.users.isActive,true)));if(!specialists.length)return[];const planIds=[...new Set(specialists.map(s=>s.planId).filter(Boolean))];const planRows=planIds.length>0?await import_db.db.select().from(import_db2.plans).where((0,import_drizzle_orm.inArray)(import_db2.plans.id,planIds)):[];const planMap=Object.fromEntries(planRows.map(p=>[p.id,p]));const ratingResults=await Promise.all(specialists.map(async s=>{const[result]=await import_db.db.select({avg:(0,import_drizzle_orm.avg)(import_db2.reviews.rating),total:(0,import_drizzle_orm.count)()}).from(import_db2.reviews).where((0,import_drizzle_orm.eq)(import_db2.reviews.targetId,s.id));return{id:s.id,avg:result?.avg?Number(result.avg):null,total:result?.total??0}}));const ratingMap=Object.fromEntries(ratingResults.map(r=>[r.id,r]));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,task.id));const offeredSet=new Set(existingOffers.map(o=>o.specialistId));const locationMatchMap=new Map;if(task.location){for(const card of matchingCards){if(card.locations?.includes(task.location)){locationMatchMap.set(card.specialistId,true)}}}const scored=specialists.map(s=>{const rating=ratingMap[s.id];const plan=s.planId?planMap[s.planId]:null;const reasons=[];let score=0;if(rating?.avg){score+=Math.min(30,rating.avg*6);if(rating.avg>=4.5)reasons.push(\"high_rating\")}if(rating?.total){score+=Math.min(15,rating.total*1.5);if(rating.total>=10)reasons.push(\"many_reviews\")}const tier=plan?.tier??\"free\";if(tier===\"ultimate\"){score+=20;reasons.push(\"ultimate_specialist\")}else if(tier===\"pro\"){score+=10;reasons.push(\"pro_specialist\")}score+=Math.min(10,plan?.searchBoost??0);if(task.location&&locationMatchMap.get(s.id)){score+=10;reasons.push(\"location_match\")}if(s.lastSeenAt){const hoursSinceActive=(Date.now()-s.lastSeenAt.getTime())/(1e3*60*60);if(hoursSinceActive<1){score+=10;reasons.push(\"recently_active\")}else if(hoursSinceActive<24){score+=5}}const alreadyOffered=offeredSet.has(s.id);if(alreadyOffered){score+=5;reasons.push(\"already_offered\")}const hasVerifiedBadge=!!plan?.hasVerifiedBadge;if(hasVerifiedBadge){score+=5;reasons.push(\"verified\")}return{specialistId:s.id,name:s.name,firstName:s.firstName,lastName:s.lastName,image:s.image,score,reasons,rating:rating?.avg??null,reviewCount:rating?.total??0,planTier:tier,hasVerifiedBadge,alreadyOffered}});scored.sort((a,b)=>b.score-a.score);return scored.slice(0,10)}__name(findBestSpecialists,\"findBestSpecialists\");\n})()\n","warnings":[],"map":{"version":3,"mappings":"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","names":["import_db"],"ignoreList":[],"sources":["/opt/canhelp/apps/api/src/routes/auto-match.ts"],"sourcesContent":[null]}}