placemate-server / controllers /companyController.js
Mittalyash's picture
Upload folder using huggingface_hub
1906404 verified
import { readFileSync } from 'fs';
import { resolve, dirname } from 'path';
import { fileURLToPath } from 'url';
import { markQuestionSolved, unmarkQuestionSolved, getUserProgress } from '../services/firebaseService.js';
const __dirname = dirname(fileURLToPath(import.meta.url));
// Load company prep data once at startup
let companyData = {};
try {
const dataPath = resolve(__dirname, '..', 'data', 'companyPrepData.json');
companyData = JSON.parse(readFileSync(dataPath, 'utf8'));
console.log('✅ Company prep data loaded');
} catch (error) {
console.error('⚠️ Failed to load company prep data:', error.message);
}
/**
* GET /api/company/topics
* Returns all topics with company counts and question counts.
*/
export async function getTopics(req, res) {
try {
const topics = Object.keys(companyData).map(topic => {
const tData = companyData[topic];
const companies = Object.keys(tData.companies || {});
const totalQuestions = companies.reduce(
(acc, c) => acc + (tData.companies[c]?.length || 0), 0
);
return {
name: topic,
desc: tData.desc,
icon: tData.icon,
numCompanies: companies.length,
numQuestions: totalQuestions,
};
});
res.json({ topics });
} catch (error) {
console.error('Get topics error:', error);
res.status(500).json({ error: 'Failed to fetch topics.' });
}
}
/**
* GET /api/company/:topic/companies
* Returns all companies under a topic.
*/
export async function getCompanies(req, res) {
try {
const { topic } = req.params;
const topicData = companyData[topic];
if (!topicData) {
return res.status(404).json({ error: `Topic "${topic}" not found.` });
}
const companies = Object.keys(topicData.companies || {}).map(company => ({
name: company,
questionCount: topicData.companies[company]?.length || 0,
}));
res.json({ topic, companies });
} catch (error) {
console.error('Get companies error:', error);
res.status(500).json({ error: 'Failed to fetch companies.' });
}
}
/**
* GET /api/company/:topic/:company
* Returns questions from static JSON, annotated with user's solved status.
*/
export async function getQuestions(req, res) {
try {
const { topic, company } = req.params;
const topicData = companyData[topic];
if (!topicData) {
return res.status(404).json({ error: `Topic "${topic}" not found.` });
}
const questions = topicData.companies?.[company];
if (!questions) {
return res.status(404).json({ error: `Company "${company}" not found under "${topic}".` });
}
// Get user's progress for this topic+company
const { solvedIds } = await getUserProgress(req.user.uid, topic, company);
const solvedSet = new Set(solvedIds);
const annotated = questions.map((q, i) => {
const qId = `${topic}-${company}-${q.name}`;
return {
...q,
id: qId,
index: i,
solved: solvedSet.has(qId),
};
});
res.json({
topic,
company,
questions: annotated,
totalCount: questions.length,
solvedCount: solvedIds.length,
});
} catch (error) {
console.error('Get questions error:', error);
res.status(500).json({ error: 'Failed to fetch questions.' });
}
}
/**
* POST /api/company/solve
* Body: { topic, company, questionId }
*/
export async function solveQuestion(req, res) {
try {
const { topic, company, questionId } = req.body;
if (!topic || !company || !questionId) {
return res.status(400).json({ error: 'topic, company, and questionId are required.' });
}
const result = await markQuestionSolved(req.user.uid, { topic, company, questionId });
res.json({ success: true, ...result });
} catch (error) {
console.error('Solve question error:', error);
res.status(500).json({ error: 'Failed to mark question as solved.' });
}
}
/**
* POST /api/company/unsolve
* Body: { topic, company, questionId }
*/
export async function unsolveQuestion(req, res) {
try {
const { topic, company, questionId } = req.body;
if (!topic || !company || !questionId) {
return res.status(400).json({ error: 'topic, company, and questionId are required.' });
}
const result = await unmarkQuestionSolved(req.user.uid, { topic, company, questionId });
res.json({ success: true, ...result });
} catch (error) {
console.error('Unsolve question error:', error);
res.status(500).json({ error: 'Failed to unmark question.' });
}
}
/**
* GET /api/company/progress/:topic/:company
* Returns solved count and solved question IDs.
*/
export async function getProgress(req, res) {
try {
const { topic, company } = req.params;
const progress = await getUserProgress(req.user.uid, topic, company);
// Get total from static data
const totalCount = companyData[topic]?.companies?.[company]?.length || 0;
res.json({
topic,
company,
...progress,
totalCount,
pendingCount: totalCount - progress.solvedCount,
});
} catch (error) {
console.error('Get progress error:', error);
res.status(500).json({ error: 'Failed to fetch progress.' });
}
}