Edit: /tmp/tsx-0/17887-45871266979ef923c1d8eca8aaccf1eca1d5b909 (11528B)
{"code":"__filename=\"/opt/canhelp/apps/api/src/routes/portfolio.ts\";(()=>{\n\"use strict\";var __create=Object.create;var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDescriptor;var __getOwnPropNames=Object.getOwnPropertyNames;var __getProtoOf=Object.getPrototypeOf;var __hasOwnProp=Object.prototype.hasOwnProperty;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 __toESM=(mod,isNodeMode,target)=>(target=mod!=null?__create(__getProtoOf(mod)):{},__copyProps(isNodeMode||!mod||!mod.__esModule?__defProp(target,\"default\",{value:mod,enumerable:true}):target,mod));var __toCommonJS=mod=>__copyProps(__defProp({},\"__esModule\",{value:true}),mod);var portfolio_exports={};__export(portfolio_exports,{default:()=>portfolio_default});module.exports=__toCommonJS(portfolio_exports);var import_hono=require(\"hono\");var import_zod=require(\"zod\");var import_drizzle_orm=require(\"drizzle-orm\");var import_fs=__toESM(require(\"fs\"));var import_path=__toESM(require(\"path\"));var import_db=require(\"../db.js\");var import_db2=require(\"@canhelp/db\");var import_auth=require(\"../middleware/auth.js\");const IMAGE_TYPES=[\"image/jpeg\",\"image/png\",\"image/webp\"];const VIDEO_TYPES=[\"video/mp4\",\"video/webm\",\"video/quicktime\"];const MAX_SIZE=(Number(process.env.MAX_FILE_SIZE_MB)||5)*1024*1024;const UPLOAD_DIR=import_path.default.resolve(process.env.UPLOAD_DIR||\"./uploads\");const MAX_PORTFOLIO_ITEMS=100;const app=new import_hono.Hono;app.get(\"/my\",import_auth.requireAuth,async c=>{const user=c.get(\"user\");const items=await import_db.db.select().from(import_db2.portfolioItems).where((0,import_drizzle_orm.eq)(import_db2.portfolioItems.specialistId,user.id)).orderBy((0,import_drizzle_orm.asc)(import_db2.portfolioItems.order),(0,import_drizzle_orm.asc)(import_db2.portfolioItems.createdAt));return c.json(items)});app.post(\"/\",import_auth.requireAuth,async c=>{const user=c.get(\"user\");let canUploadVideo=false;const[dbUser]=await import_db.db.select({planId:import_db2.users.planId}).from(import_db2.users).where((0,import_drizzle_orm.eq)(import_db2.users.id,user.id));if(dbUser?.planId){const[plan]=await import_db.db.select({canUploadVideo:import_db2.plans.canUploadVideo}).from(import_db2.plans).where((0,import_drizzle_orm.eq)(import_db2.plans.id,dbUser.planId));if(plan){canUploadVideo=!!plan.canUploadVideo}}const[{count}]=await import_db.db.select({count:import_drizzle_orm.sql`cast(count(*) as int)`}).from(import_db2.portfolioItems).where((0,import_drizzle_orm.eq)(import_db2.portfolioItems.specialistId,user.id));if(count>=MAX_PORTFOLIO_ITEMS){return c.json({error:`Maximum ${MAX_PORTFOLIO_ITEMS} portfolio items allowed`,code:\"PORTFOLIO_LIMIT\"},400)}const formData=await c.req.formData();const file=formData.get(\"file\");if(!file)return c.json({error:\"No file provided\"},400);const isVideo=VIDEO_TYPES.includes(file.type);const isImage=IMAGE_TYPES.includes(file.type);if(!isImage&&!isVideo){return c.json({error:\"Only JPEG, PNG, WebP images and MP4/WebM videos are allowed\"},400)}if(isVideo&&!canUploadVideo){return c.json({error:\"Video uploads require a Pro or Ultimate plan\",code:\"PLAN_UPGRADE_REQUIRED\"},403)}if(file.size>MAX_SIZE){return c.json({error:`File too large (max ${MAX_SIZE/1024/1024}MB)`},400)}const title=formData.get(\"title\")?.trim().slice(0,200)||null;const description=formData.get(\"description\")?.trim().slice(0,1e3)||null;const cardId=formData.get(\"cardId\")||null;const ext=file.name.split(\".\").pop()?.toLowerCase()||\"jpg\";const filename=`portfolio_${crypto.randomUUID()}.${ext}`;const dest=import_path.default.join(UPLOAD_DIR,filename);import_fs.default.writeFileSync(dest,Buffer.from(await file.arrayBuffer()));const imageUrl=`${process.env.API_URL||\"http://localhost:4000\"}/api/uploads/${filename}`;const[item]=await import_db.db.insert(import_db2.portfolioItems).values({specialistId:user.id,cardId,imageUrl,title,description,order:count}).returning();return c.json(item,201)});const patchSchema=import_zod.z.object({title:import_zod.z.string().max(200).optional().nullable(),description:import_zod.z.string().max(1e3).optional().nullable(),order:import_zod.z.number().int().min(0).optional()});app.patch(\"/:id\",import_auth.requireAuth,async c=>{const user=c.get(\"user\");const id=c.req.param(\"id\");const[item]=await import_db.db.select().from(import_db2.portfolioItems).where((0,import_drizzle_orm.eq)(import_db2.portfolioItems.id,id));if(!item)return c.json({error:\"Not found\"},404);if(item.specialistId!==user.id&&user.role!==\"admin\"){return c.json({error:\"Forbidden\"},403)}const body=await c.req.json();const parsed=patchSchema.safeParse(body);if(!parsed.success)return c.json({error:\"Invalid data\"},400);const updates={updatedAt:new Date};if(\"title\"in parsed.data)updates.title=parsed.data.title;if(\"description\"in parsed.data)updates.description=parsed.data.description;if(\"order\"in parsed.data)updates.order=parsed.data.order;const[updated]=await import_db.db.update(import_db2.portfolioItems).set(updates).where((0,import_drizzle_orm.eq)(import_db2.portfolioItems.id,id)).returning();return c.json(updated)});app.delete(\"/:id\",import_auth.requireAuth,async c=>{const user=c.get(\"user\");const id=c.req.param(\"id\");const[item]=await import_db.db.select().from(import_db2.portfolioItems).where((0,import_drizzle_orm.eq)(import_db2.portfolioItems.id,id));if(!item)return c.json({error:\"Not found\"},404);if(item.specialistId!==user.id&&user.role!==\"admin\"){return c.json({error:\"Forbidden\"},403)}try{const filename=item.imageUrl.split(\"/\").pop();if(filename){const filePath=import_path.default.join(UPLOAD_DIR,filename);if(import_fs.default.existsSync(filePath))import_fs.default.unlinkSync(filePath)}}catch{}await import_db.db.delete(import_db2.portfolioItems).where((0,import_drizzle_orm.eq)(import_db2.portfolioItems.id,id));return c.json({ok:true})});app.get(\"/user/:userId\",async c=>{const userId=c.req.param(\"userId\");const items=await import_db.db.select({id:import_db2.portfolioItems.id,cardId:import_db2.portfolioItems.cardId,imageUrl:import_db2.portfolioItems.imageUrl,title:import_db2.portfolioItems.title,description:import_db2.portfolioItems.description,order:import_db2.portfolioItems.order,createdAt:import_db2.portfolioItems.createdAt}).from(import_db2.portfolioItems).where((0,import_drizzle_orm.eq)(import_db2.portfolioItems.specialistId,userId)).orderBy((0,import_drizzle_orm.asc)(import_db2.portfolioItems.order),(0,import_drizzle_orm.asc)(import_db2.portfolioItems.createdAt));return c.json(items)});var portfolio_default=app;\n})()\n","warnings":[],"map":{"version":3,"mappings":"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","names":["import_db","path","fs"],"ignoreList":[],"sources":["/opt/canhelp/apps/api/src/routes/portfolio.ts"],"sourcesContent":[null]}}