Resume / backend /src /services /tipsService.js
AFAautomation's picture
Initial commit with LFS enabled
92a138e
Raw
History Blame Contribute Delete
7.44 kB
/**
* Writing Tips Service
* Provides inline expert tips for each resume section.
*/
const TIPS = {
summary: [
{
id: 'sum_1',
tip: 'Start with your job title and years of experience.',
example: '"Results-driven Software Engineer with 5+ years building scalable web apps…"',
tags: ['opening', 'length'],
},
{
id: 'sum_2',
tip: 'Mention 2–3 core competencies aligned with your target role.',
example: '"Specialized in React, Node.js, and cloud-native architecture."',
tags: ['skills', 'alignment'],
},
{
id: 'sum_3',
tip: 'Close with a value statement β€” what you bring to an employer.',
example: '"Passionate about delivering high-quality software on time and under budget."',
tags: ['value', 'closing'],
},
{
id: 'sum_4',
tip: 'Keep it to 40–80 words. Recruiters spend ~7 seconds on initial scan.',
example: null,
tags: ['length', 'ats'],
},
{
id: 'sum_5',
tip: 'Avoid first-person pronouns ("I", "my"). Write in third-person implied.',
example: '"Delivered 15+ client projects" not "I delivered 15+ client projects".',
tags: ['style'],
},
],
experience: [
{
id: 'exp_1',
tip: 'Use the CAR method: Context β†’ Action β†’ Result.',
example: '"Redesigned checkout flow (C) using React + TypeScript (A), reducing cart abandonment by 22% (R)."',
tags: ['structure', 'results'],
},
{
id: 'exp_2',
tip: 'Start every bullet with a strong action verb.',
example: '"Led, Built, Drove, Increased, Reduced, Streamlined, Launched…"',
tags: ['verbs', 'ats'],
},
{
id: 'exp_3',
tip: 'Quantify everything you can: %, $, users, time saved.',
example: '"Cut CI/CD pipeline time from 45 min to 8 min (82% improvement)."',
tags: ['metrics', 'ats'],
},
{
id: 'exp_4',
tip: 'List most recent job first (reverse chronological order).',
example: null,
tags: ['format'],
},
{
id: 'exp_5',
tip: 'Aim for 3–5 bullets per role; 6+ only for senior or long-tenure roles.',
example: null,
tags: ['length'],
},
{
id: 'exp_6',
tip: 'Tailor bullet points to keywords in the job description.',
example: '"Implemented microservices architecture" if the JD mentions microservices.',
tags: ['ats', 'keywords'],
},
],
education: [
{
id: 'edu_1',
tip: 'Include institution name, degree, field of study, and graduation year.',
example: '"B.S. Computer Science, Stanford University, 2021"',
tags: ['completeness'],
},
{
id: 'edu_2',
tip: 'List GPA only if 3.5+ or specifically requested by the employer.',
example: '"GPA: 3.8/4.0 (Magna Cum Laude)"',
tags: ['optional'],
},
{
id: 'edu_3',
tip: 'Recent graduates: place Education before Experience.',
example: null,
tags: ['order', 'new-grad'],
},
{
id: 'edu_4',
tip: 'Include relevant coursework, thesis, or honors if under 3 years of experience.',
example: '"Relevant: Machine Learning, Distributed Systems, Algorithms"',
tags: ['new-grad', 'detail'],
},
],
skills: [
{
id: 'ski_1',
tip: 'Group skills into categories for readability: Languages, Frameworks, Tools, Soft Skills.',
example: '"Languages: Python, Go, TypeScript | Frameworks: React, FastAPI, Django"',
tags: ['organization', 'readability'],
},
{
id: 'ski_2',
tip: 'Mirror keywords from the job description exactly (ATS matches exact strings).',
example: 'Job says "Kubernetes" β†’ use "Kubernetes", not just "containers".',
tags: ['ats', 'keywords'],
},
{
id: 'ski_3',
tip: 'Only list skills you can discuss confidently in an interview.',
example: null,
tags: ['honesty'],
},
{
id: 'ski_4',
tip: 'Omit outdated technologies unless the role requires them.',
example: '"Internet Explorer 6 optimization" is probably not relevant today.',
tags: ['relevance'],
},
],
certifications: [
{
id: 'cert_1',
tip: 'Include full name, issuing organization, and expiry date if applicable.',
example: '"AWS Certified Solutions Architect – Associate | Amazon, 2023 (expires 2026)"',
tags: ['completeness'],
},
{
id: 'cert_2',
tip: 'List industry-recognized certs prominently β€” they\'re major ATS keywords.',
example: 'PMP, AWS, GCP, CPA, CISSP, Scrum Master, etc.',
tags: ['ats', 'priority'],
},
],
projects: [
{
id: 'proj_1',
tip: 'Include project name, tech stack, your role, and a measurable outcome.',
example: '"Built a real-time chat app (React, Socket.io, Redis) used by 2,000+ users."',
tags: ['structure', 'metrics'],
},
{
id: 'proj_2',
tip: 'Link to GitHub or live demo for technical roles.',
example: '"GitHub: github.com/username/project"',
tags: ['links', 'tech'],
},
{
id: 'proj_3',
tip: 'Prioritize projects relevant to the role you are applying for.',
example: null,
tags: ['relevance'],
},
],
contact: [
{
id: 'con_1',
tip: 'Use a professional email (firstname.lastname@domain.com).',
example: '"john.doe@gmail.com" is better than "coolkid99@yahoo.com".',
tags: ['professionalism'],
},
{
id: 'con_2',
tip: 'Add LinkedIn profile URL β€” recruiters will check it.',
example: '"linkedin.com/in/johndoe"',
tags: ['links'],
},
{
id: 'con_3',
tip: 'City + State/Country is sufficient. No need for full street address.',
example: '"San Francisco, CA" or "Remote"',
tags: ['privacy', 'format'],
},
{
id: 'con_4',
tip: 'Ensure your phone number has a professional voicemail set up.',
example: null,
tags: ['professionalism'],
},
],
languages: [
{
id: 'lang_1',
tip: 'Use standard proficiency levels: Native, Fluent, Professional, Conversational, Elementary.',
example: '"Spanish – Fluent | French – Conversational"',
tags: ['format'],
},
],
awards: [
{
id: 'awd_1',
tip: 'Include the award name, issuing body, and year.',
example: '"Dean\'s List, University of Michigan, 2019–2021"',
tags: ['completeness'],
},
{
id: 'awd_2',
tip: 'Briefly explain the significance if the award is not well-known.',
example: '"Top 5% of graduating class (awarded to 12 of 250 students)"',
tags: ['context'],
},
],
};
/**
* Returns all tips for a given section.
* @param {string} section - e.g. 'experience', 'skills', 'summary'
*/
function getTipsForSection(section) {
return TIPS[section.toLowerCase()] || [];
}
/**
* Returns a random tip for a section (useful for inline prompts).
*/
function getRandomTip(section) {
const tips = getTipsForSection(section);
if (!tips.length) return null;
return tips[Math.floor(Math.random() * tips.length)];
}
/**
* Returns all tips across all sections (used to seed the DB).
*/
function getAllTips() {
return Object.entries(TIPS).flatMap(([section, tips]) =>
tips.map((t) => ({ ...t, section }))
);
}
module.exports = { getTipsForSection, getRandomTip, getAllTips };