Spaces:
Running
Running
| import {expressRepre} from "@vashuthegreat/vexpress"; | |
| import ApiError from "../utils/ApiError.js"; | |
| import asyncHandler from "../utils/asyncHandler.js"; | |
| import ApiResponse from "../utils/ApiResponse.js"; | |
| import Template from "../models/templates.models.js"; | |
| import reder_html from "../helper/ejsEmbeder.helper.js" | |
| import fs from "fs"; | |
| import path from "path"; | |
| import logger from "../logger/create.logger.js"; | |
| export const createTemplate=expressRepre( | |
| { | |
| summary:"upload a template", | |
| FormData:{ | |
| temp_data:"json.pdf", | |
| title:"Data Science", | |
| template:"resume.pdf" | |
| }, | |
| response:"uploaded template" | |
| }, | |
| asyncHandler( | |
| async(req,res)=>{ | |
| const {temp_data,title}=req.body | |
| const files = req.files as any; | |
| const templateFile = files?.template?.[0]; | |
| const tempDataFile = files?.temp_data?.[0]; | |
| if (!templateFile || !title){ | |
| throw new ApiError(400,"Invalid template data. Please provide a template file and title.") | |
| } | |
| // Read the uploaded template file content | |
| const templateContent = fs.readFileSync(templateFile.path, "utf-8"); | |
| // Handle temp_data (can be file or body string) | |
| let parsedTempData; | |
| if (tempDataFile) { | |
| try { | |
| const tempDataContent = fs.readFileSync(tempDataFile.path, "utf-8"); | |
| parsedTempData = JSON.parse(tempDataContent); | |
| } catch (error) { | |
| throw new ApiError(400, "Invalid JSON in temp_data file"); | |
| } | |
| } else if (temp_data) { | |
| if (typeof temp_data === "string") { | |
| try { | |
| parsedTempData = JSON.parse(temp_data); | |
| } catch (error) { | |
| throw new ApiError(400, "Invalid JSON in temp_data body"); | |
| } | |
| } else { | |
| parsedTempData = temp_data; | |
| } | |
| } | |
| if (!parsedTempData) { | |
| throw new ApiError(400, "Please provide temp_data as a file or in the request body."); | |
| } | |
| const templateData=await Template.create({ | |
| template: templateContent, | |
| temp_data: parsedTempData, | |
| title | |
| }) | |
| // Clean up the temporary files | |
| if (templateFile && fs.existsSync(templateFile.path)) { | |
| fs.unlinkSync(templateFile.path); | |
| } | |
| if (tempDataFile && fs.existsSync(tempDataFile.path)) { | |
| fs.unlinkSync(tempDataFile.path); | |
| } | |
| if (templateData){ | |
| res.status(200).json(new ApiResponse(200,templateData,"Template uploaded successfully")) | |
| } | |
| else{ | |
| throw new ApiError(400,"Failed to upload template") | |
| } | |
| } | |
| ) | |
| ) | |
| export const getTemplates=expressRepre( | |
| { | |
| summary: "get templates", | |
| params:{id:'696c7ba53a981f5c038d009b'}, | |
| response: "templates" | |
| }, | |
| asyncHandler( | |
| async(req,res)=>{ | |
| const { id } = req.params as { id: string }; | |
| logger.info(`Fetching template by ID: ${id}`); | |
| if (!id){ | |
| throw new ApiError(400,"Invalid template id") | |
| } | |
| // Try to find in database | |
| const templateData = await Template.findById(id).catch(() => null); | |
| if (templateData){ | |
| res.status(200).json(new ApiResponse(200,templateData,"Template fetched successfully")) | |
| } else { | |
| throw new ApiError(404, "Template not found"); | |
| } | |
| } | |
| ) | |
| ) | |
| export const getAllTemplates = expressRepre( | |
| { | |
| summary: "Get all templates", | |
| response: "templates" | |
| }, | |
| asyncHandler(async (req, res) => { | |
| try { | |
| console.log("getAllTemplates called"); | |
| const templateData = await Template.find().lean(); | |
| console.log(`Found ${templateData.length} templates in DB`); | |
| if (!templateData || templateData.length === 0) { | |
| // Return empty array gracefully instead of throwing error | |
| return res | |
| .status(200) | |
| .json(new ApiResponse(200, [], "Templates fetched successfully (empty)")); | |
| } | |
| const final_response: any[] = [] | |
| templateData.forEach((template: any) => { | |
| try { | |
| const rendered = reder_html(template.template, template.temp_data); | |
| final_response.push({ ...template, to_render: rendered }); | |
| } catch (renderErr) { | |
| logger.error(`Error rendering template ${template.title}:`, renderErr); | |
| // Skip this template if it fails to render | |
| } | |
| }); | |
| // console.log(final_response) | |
| // agar templates mil gaye | |
| return res | |
| .status(200) | |
| .json(new ApiResponse(200, final_response, "Templates fetched successfully")); | |
| } catch (err) { | |
| logger.error("Error fetching templates:", err); | |
| // database ya server error | |
| throw new ApiError(500, "Internal Server Error"); | |
| } | |
| }) | |
| ); | |
| export const getTemplate_by_data=expressRepre( | |
| { | |
| summary: "get filled template with data", | |
| body:{template_id:'696c7ba53a981f5c038d009b',temp_data:`{ | |
| "personal": { | |
| "name": "John Doe", | |
| "title": "Software Engineer", | |
| "phone": "+1 234 567 890", | |
| "email": "john.doe@example.com", | |
| "location": "San Francisco, CA", | |
| "image": { | |
| "enabled": true, | |
| "url": "" | |
| } | |
| }, | |
| "summary": "Experienced software engineer with a strong background in full-stack development and a passion for building scalable applications.", | |
| "education": [ | |
| { | |
| "year": "2016 - 2020", | |
| "institute": "University of California, Berkeley", | |
| "degree": "Bachelor of Science in Computer Science" | |
| } | |
| ], | |
| "skills": [ | |
| "JavaScript", | |
| "Node.js", | |
| "React", | |
| "MongoDB", | |
| "Docker", | |
| "Leadership", | |
| "Communication", | |
| "Problem Solving" | |
| ], | |
| "soft_skills": [ | |
| "Leadership", | |
| "Communication", | |
| "Problem Solving" | |
| ], | |
| "languages": [ | |
| "English", | |
| "Spanish" | |
| ], | |
| "experience": [ | |
| { | |
| "role": "Senior Developer", | |
| "duration": "2021 - Present", | |
| "company": "Tech Solutions Inc.", | |
| "description": "Lead a team of 5 developers in building a high-traffic e-commerce platform. Implemented microservices architecture using Node.js and AWS. Optimized database queries, reducing response time by 30%." | |
| }, | |
| { | |
| "role": "Junior Developer", | |
| "duration": "2020 - 2021", | |
| "company": "Startup Hub", | |
| "description": "Developed and maintained RESTful APIs for a mobile application. Collaborated with UI/UX designers to implement responsive web interfaces. Participated in code reviews and unit testing." | |
| } | |
| ], | |
| "projects": [ | |
| { | |
| "title": "AI Resume Builder", | |
| "description": "A web application that generates multiple resume templates dynamically using AI and user data.", | |
| "tech_stack": ["React", "Node.js", "EJS"] | |
| } | |
| ], | |
| "certifications": [ | |
| "AWS Certified Developer", | |
| "Full Stack Web Development" | |
| ], | |
| "achievements": [ | |
| "Employee of the Month", | |
| "Winner of Hackathon 2023" | |
| ], | |
| "references": [ | |
| { | |
| "name": "Jane Smith", | |
| "company": "Tech Solutions Inc.", | |
| "position": "CTO", | |
| "phone": "+1 987 654 321", | |
| "email": "jane.smith@techsolutions.com" | |
| } | |
| ], | |
| "someImportantUrls": { | |
| "GitHub": "https://github.com/johndoe", | |
| "LinkedIn": "https://linkedin.com/in/johndoe", | |
| "Portfolio": "https://johndoe.com" | |
| } | |
| }`}, | |
| response: "template with filled data" | |
| }, | |
| asyncHandler( | |
| async(req,res)=>{ | |
| const userAvatar = (req.user as any)?.avatar; | |
| const id=req.body.template_id | |
| if (!id){ | |
| throw new ApiError(400,"Invalid template id") | |
| } | |
| // Try to find in database | |
| const templateData = await Template.findById(id).catch(() => null); | |
| const {temp_data}=req.body; | |
| if (!temp_data){ | |
| throw new ApiError(400, "temp data is undefined") | |
| } | |
| // Parse temp_data if it's a string | |
| let parsedTempData; | |
| if (typeof temp_data === "string") { | |
| try { | |
| parsedTempData = JSON.parse(temp_data); | |
| } catch (error) { | |
| throw new ApiError(400, "Invalid JSON in temp_data body"); | |
| } | |
| } else { | |
| parsedTempData = temp_data; | |
| } | |
| if (templateData){ | |
| parsedTempData={...parsedTempData,avatar:userAvatar} | |
| res.status(200).json(new ApiResponse(200,{to_render:reder_html(templateData.template,parsedTempData)},"Template fetched successfully")) | |
| } else { | |
| throw new ApiError(404, "Template not found"); | |
| } | |
| } | |
| ) | |
| ) |