Edit: /tmp/tsx-0/17887-6e58a0db1b66692a3e7c9e6fe60cc2549e58640f (15002B)
{"code":"__filename=\"/opt/canhelp/apps/api/src/routes/support.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 support_exports={};__export(support_exports,{default:()=>support_default});module.exports=__toCommonJS(support_exports);var import_hono=require(\"hono\");var import_zod_validator=require(\"@hono/zod-validator\");var import_zod=require(\"zod\");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_translate=require(\"../translate.js\");var import_telegram=require(\"../lib/telegram.js\");var import_notif=require(\"../lib/notif.js\");var import_turnstile=require(\"../lib/turnstile.js\");const app=new import_hono.Hono;function escapeHtml(input){return input.replaceAll(\"&\",\"&\").replaceAll(\"<\",\"<\").replaceAll(\">\",\">\")}__name(escapeHtml,\"escapeHtml\");app.post(\"/public\",(0,import_zod_validator.zValidator)(\"json\",import_zod.z.object({name:import_zod.z.string().min(2).max(100),email:import_zod.z.string().email().max(200),subject:import_zod.z.string().min(3).max(200),body:import_zod.z.string().min(10).max(5e3),captchaToken:import_zod.z.string().min(1)})),async c=>{const{name,email,subject,body,captchaToken}=c.req.valid(\"json\");const ip=c.req.header(\"CF-Connecting-IP\")||c.req.header(\"X-Forwarded-For\")?.split(\",\")[0]?.trim();const ok=await(0,import_turnstile.verifyTurnstile)(captchaToken,ip);if(!ok){return c.json({error:\"CAPTCHA verification failed\",code:\"CAPTCHA_FAILED\"},400)}const adminText=[\"\\u{1F198}
Public support message\",`From: ${escapeHtml(name)} <${escapeHtml(email)}>`,`Subject: ${escapeHtml(subject)}`,\"\",escapeHtml(body.length>500?`${body.slice(0,500)}...`:body)].join(\"\\n\");await(0,import_telegram.notifyAdmin)(adminText);return c.json({ok:true})});app.post(\"/\",import_auth.requireAuth,(0,import_zod_validator.zValidator)(\"json\",import_zod.z.object({type:import_zod.z.enum([\"bug\",\"suggestion\",\"other\",\"delete_account\"]),subject:import_zod.z.string().min(3).max(200),body:import_zod.z.string().min(10).max(5e3)})),async c=>{const user=c.get(\"user\");const{type,subject,body}=c.req.valid(\"json\");const[ticket]=await import_db.db.insert(import_db2.supportTickets).values({userId:user.id,type,subject,body}).returning();const userLocale=user.locale??\"el\";Promise.all([\"el\",\"en\",\"ru\",\"uk\"].filter(l=>l!==userLocale).map(async l=>{const[ts,tb]=await Promise.all([(0,import_translate.translateString)(subject,userLocale,l),(0,import_translate.translateString)(body,userLocale,l)]);return[l,ts,tb]})).then(async results=>{const bodyTranslations={[userLocale]:subject+\"\\n\\n\"+body};for(const[l,ts,tb]of results){if(ts||tb)bodyTranslations[l]=(ts??subject)+\"\\n\\n\"+(tb??body)}await import_db.db.update(import_db2.supportTickets).set({bodyTranslations}).where((0,import_drizzle_orm.eq)(import_db2.supportTickets.id,ticket.id)).catch(()=>{})}).catch(()=>{});const shortBody=body.length>300?`${body.slice(0,300)}...`:body;const adminText=[\"\\u{1F198}
New support ticket\",`#${escapeHtml(ticket.id)}`,`Type:
${escapeHtml(type)}`,`From: ${escapeHtml(user.name||user.email||user.id)}`,`Subject: ${escapeHtml(subject)}`,\"\",escapeHtml(shortBody)].join(\"\\n\");(0,import_telegram.notifyAdmin)(adminText).catch(err=>{console.error(\"[support] telegram notify error:\",err)});return c.json(ticket,201)});app.get(\"/my\",import_auth.requireAuth,async c=>{const user=c.get(\"user\");const page=Math.max(1,Number(c.req.query(\"page\")||1));const limit=Math.min(Number(c.req.query(\"limit\")||20),50);const offset=(page-1)*limit;const rows=await import_db.db.select().from(import_db2.supportTickets).where((0,import_drizzle_orm.eq)(import_db2.supportTickets.userId,user.id)).orderBy((0,import_drizzle_orm.desc)(import_db2.supportTickets.createdAt)).limit(limit).offset(offset);const[{total}]=await import_db.db.select({total:(0,import_drizzle_orm.count)()}).from(import_db2.supportTickets).where((0,import_drizzle_orm.eq)(import_db2.supportTickets.userId,user.id));return c.json({data:rows,total,page,limit})});app.get(\"/\",import_auth.requireAdmin,async c=>{const page=Math.max(1,Number(c.req.query(\"page\")||1));const limit=Math.min(Number(c.req.query(\"limit\")||30),100);const offset=(page-1)*limit;const status=c.req.query(\"status\");const type=c.req.query(\"type\");const q=c.req.query(\"q\");const conditions=[];if(status)conditions.push((0,import_drizzle_orm.eq)(import_db2.supportTickets.status,status));if(type)conditions.push((0,import_drizzle_orm.eq)(import_db2.supportTickets.type,type));if(q)conditions.push((0,import_drizzle_orm.or)((0,import_drizzle_orm.ilike)(import_db2.supportTickets.subject,`%${q}%`),(0,import_drizzle_orm.ilike)(import_db2.supportTickets.body,`%${q}%`)));const where=conditions.length>0?(0,import_drizzle_orm.and)(...conditions):void 0;const rows=await import_db.db.select({id:import_db2.supportTickets.id,type:import_db2.supportTickets.type,subject:import_db2.supportTickets.subject,body:import_db2.supportTickets.body,status:import_db2.supportTickets.status,adminReply:import_db2.supportTickets.adminReply,repliedAt:import_db2.supportTickets.repliedAt,createdAt:import_db2.supportTickets.createdAt,updatedAt:import_db2.supportTickets.updatedAt,userId:import_db2.supportTickets.userId,userName:import_db2.users.name,userEmail:import_db2.users.email}).from(import_db2.supportTickets).leftJoin(import_db2.users,(0,import_drizzle_orm.eq)(import_db2.supportTickets.userId,import_db2.users.id)).where(where).orderBy((0,import_drizzle_orm.desc)(import_db2.supportTickets.createdAt)).limit(limit).offset(offset);const[{total}]=await import_db.db.select({total:(0,import_drizzle_orm.count)()}).from(import_db2.supportTickets).where(where);return c.json({data:rows,total,page,limit})});app.patch(\"/:id/reply\",import_auth.requireAdmin,(0,import_zod_validator.zValidator)(\"json\",import_zod.z.object({adminReply:import_zod.z.string().min(1).max(5e3),status:import_zod.z.enum([\"open\",\"in_progress\",\"resolved\",\"closed\"]).optional()})),async c=>{const admin=c.get(\"user\");const{adminReply,status}=c.req.valid(\"json\");const[updated]=await import_db.db.update(import_db2.supportTickets).set({adminReply,status:status??\"resolved\",adminId:admin.id,repliedAt:new Date,updatedAt:new Date}).where((0,import_drizzle_orm.eq)(import_db2.supportTickets.id,c.req.param(\"id\"))).returning();if(!updated)return c.json({error:\"Not found\"},404);const[ticketUser]=await import_db.db.select({locale:import_db2.users.locale}).from(import_db2.users).where((0,import_drizzle_orm.eq)(import_db2.users.id,updated.userId));const adminLocale=admin.locale??\"el\";const userLocale=ticketUser?.locale??\"el\";Promise.all([\"el\",\"en\",\"ru\",\"uk\"].filter(l=>l!==adminLocale).map(async l=>{const translated=await(0,import_translate.translateString)(adminReply,adminLocale,l);return[l,translated]})).then(async results=>{const adminReplyTranslations={[adminLocale]:adminReply};for(const[l,t]of results){if(t)adminReplyTranslations[l]=t}await import_db.db.update(import_db2.supportTickets).set({adminReplyTranslations}).where((0,import_drizzle_orm.eq)(import_db2.supportTickets.id,updated.id)).catch(()=>{})}).catch(()=>{});(0,import_notif.notifySupportTicketReply)(updated.userId,updated.subject,updated.id).catch(err=>{console.error(\"[support] reply notify error:\",err)});return c.json(updated)});app.patch(\"/:id/status\",import_auth.requireAdmin,(0,import_zod_validator.zValidator)(\"json\",import_zod.z.object({status:import_zod.z.enum([\"open\",\"in_progress\",\"resolved\",\"closed\"])})),async c=>{const{status}=c.req.valid(\"json\");const[updated]=await import_db.db.update(import_db2.supportTickets).set({status,updatedAt:new Date}).where((0,import_drizzle_orm.eq)(import_db2.supportTickets.id,c.req.param(\"id\"))).returning();if(!updated)return c.json({error:\"Not found\"},404);return c.json(updated)});var support_default=app;\n})()\n","warnings":[],"map":{"version":3,"mappings":"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","names":["import_db"],"ignoreList":[],"sources":["/opt/canhelp/apps/api/src/routes/support.ts"],"sourcesContent":[null]}}