228 lines
6.7 KiB
JavaScript
228 lines
6.7 KiB
JavaScript
const express = require('express');
|
||
const router = express.Router();
|
||
const { verifyToken } = require('../middleware/auth');
|
||
const Company = require('../models/Company');
|
||
|
||
// Инициализация данных при запуске
|
||
const initializeCompanies = async () => {
|
||
try {
|
||
// Уже не нужна инициализация, она производится через authAPI
|
||
} catch (error) {
|
||
console.error('Error initializing companies:', error);
|
||
}
|
||
};
|
||
|
||
initializeCompanies();
|
||
|
||
// GET /my/info - получить мою компанию (требует авторизации) - ДОЛЖНО быть ПЕРЕД /:id
|
||
router.get('/my/info', verifyToken, async (req, res) => {
|
||
try {
|
||
const userId = req.userId;
|
||
const user = await require('../models/User').findById(userId);
|
||
|
||
if (!user || !user.companyId) {
|
||
return res.status(404).json({ error: 'Company not found' });
|
||
}
|
||
|
||
const company = await Company.findById(user.companyId);
|
||
|
||
if (!company) {
|
||
return res.status(404).json({ error: 'Company not found' });
|
||
}
|
||
|
||
res.json({
|
||
...company.toObject(),
|
||
id: company._id
|
||
});
|
||
} catch (error) {
|
||
console.error('Get my company error:', error);
|
||
res.status(500).json({ error: error.message });
|
||
}
|
||
});
|
||
|
||
// GET /my/stats - получить статистику компании - ДОЛЖНО быть ПЕРЕД /:id
|
||
router.get('/my/stats', verifyToken, async (req, res) => {
|
||
try {
|
||
const userId = req.userId;
|
||
const user = await require('../models/User').findById(userId);
|
||
|
||
if (!user || !user.companyId) {
|
||
return res.status(404).json({ error: 'Company not found' });
|
||
}
|
||
|
||
const stats = {
|
||
profileViews: Math.floor(Math.random() * 1000),
|
||
profileViewsChange: Math.floor(Math.random() * 20 - 10),
|
||
sentRequests: Math.floor(Math.random() * 50),
|
||
sentRequestsChange: Math.floor(Math.random() * 10 - 5),
|
||
receivedRequests: Math.floor(Math.random() * 30),
|
||
receivedRequestsChange: Math.floor(Math.random() * 5 - 2),
|
||
newMessages: Math.floor(Math.random() * 10),
|
||
rating: Math.random() * 5
|
||
};
|
||
|
||
res.json(stats);
|
||
} catch (error) {
|
||
console.error('Get company stats error:', error);
|
||
res.status(500).json({ error: error.message });
|
||
}
|
||
});
|
||
|
||
// Experience endpoints ДОЛЖНЫ быть ДО получения компании по ID
|
||
let companyExperience = [];
|
||
|
||
// GET /:id/experience - получить опыт компании
|
||
router.get('/:id/experience', verifyToken, async (req, res) => {
|
||
try {
|
||
const { id } = req.params;
|
||
const experience = companyExperience.filter(e => e.companyId === id);
|
||
res.json(experience);
|
||
} catch (error) {
|
||
res.status(500).json({ error: error.message });
|
||
}
|
||
});
|
||
|
||
// POST /:id/experience - добавить опыт компании
|
||
router.post('/:id/experience', verifyToken, async (req, res) => {
|
||
try {
|
||
const { id } = req.params;
|
||
const { confirmed, customer, subject, volume, contact, comment } = req.body;
|
||
|
||
const expId = Math.random().toString(36).substr(2, 9);
|
||
const newExp = {
|
||
id: expId,
|
||
_id: expId,
|
||
companyId: id,
|
||
confirmed: confirmed || false,
|
||
customer: customer || '',
|
||
subject: subject || '',
|
||
volume: volume || '',
|
||
contact: contact || '',
|
||
comment: comment || '',
|
||
createdAt: new Date(),
|
||
updatedAt: new Date()
|
||
};
|
||
|
||
companyExperience.push(newExp);
|
||
res.status(201).json(newExp);
|
||
} catch (error) {
|
||
res.status(500).json({ error: error.message });
|
||
}
|
||
});
|
||
|
||
// PUT /:id/experience/:expId - обновить опыт
|
||
router.put('/:id/experience/:expId', verifyToken, async (req, res) => {
|
||
try {
|
||
const { id, expId } = req.params;
|
||
const index = companyExperience.findIndex(e => (e.id === expId || e._id === expId) && e.companyId === id);
|
||
|
||
if (index === -1) {
|
||
return res.status(404).json({ error: 'Experience not found' });
|
||
}
|
||
|
||
companyExperience[index] = {
|
||
...companyExperience[index],
|
||
...req.body,
|
||
updatedAt: new Date()
|
||
};
|
||
|
||
res.json(companyExperience[index]);
|
||
} catch (error) {
|
||
res.status(500).json({ error: error.message });
|
||
}
|
||
});
|
||
|
||
// DELETE /:id/experience/:expId - удалить опыт
|
||
router.delete('/:id/experience/:expId', verifyToken, async (req, res) => {
|
||
try {
|
||
const { id, expId } = req.params;
|
||
const index = companyExperience.findIndex(e => (e.id === expId || e._id === expId) && e.companyId === id);
|
||
|
||
if (index === -1) {
|
||
return res.status(404).json({ error: 'Experience not found' });
|
||
}
|
||
|
||
companyExperience.splice(index, 1);
|
||
res.json({ message: 'Experience deleted' });
|
||
} catch (error) {
|
||
res.status(500).json({ error: error.message });
|
||
}
|
||
});
|
||
|
||
// Получить компанию по ID (ДОЛЖНО быть ПОСЛЕ специфичных маршрутов)
|
||
router.get('/:id', async (req, res) => {
|
||
try {
|
||
const company = await Company.findById(req.params.id);
|
||
|
||
if (!company) {
|
||
return res.status(404).json({ error: 'Company not found' });
|
||
}
|
||
|
||
res.json({
|
||
...company.toObject(),
|
||
id: company._id
|
||
});
|
||
} catch (error) {
|
||
console.error('Get company error:', error);
|
||
res.status(500).json({ error: error.message });
|
||
}
|
||
});
|
||
|
||
// Обновить компанию (требует авторизации)
|
||
const updateCompanyHandler = async (req, res) => {
|
||
try {
|
||
const company = await Company.findByIdAndUpdate(
|
||
req.params.id,
|
||
{ ...req.body, updatedAt: new Date() },
|
||
{ new: true }
|
||
);
|
||
|
||
if (!company) {
|
||
return res.status(404).json({ error: 'Company not found' });
|
||
}
|
||
|
||
res.json({
|
||
...company.toObject(),
|
||
id: company._id
|
||
});
|
||
} catch (error) {
|
||
res.status(500).json({ error: error.message });
|
||
}
|
||
};
|
||
|
||
router.put('/:id', verifyToken, updateCompanyHandler);
|
||
router.patch('/:id', verifyToken, updateCompanyHandler);
|
||
|
||
// Поиск с AI анализом
|
||
router.post('/ai-search', async (req, res) => {
|
||
try {
|
||
const { query } = req.body;
|
||
|
||
if (!query) {
|
||
return res.status(400).json({ error: 'Query required' });
|
||
}
|
||
|
||
const q = query.toLowerCase();
|
||
const result = await Company.find({
|
||
$or: [
|
||
{ fullName: { $regex: q, $options: 'i' } },
|
||
{ shortName: { $regex: q, $options: 'i' } },
|
||
{ industry: { $regex: q, $options: 'i' } }
|
||
]
|
||
});
|
||
|
||
res.json({
|
||
companies: result.map(c => ({
|
||
...c.toObject(),
|
||
id: c._id
|
||
})),
|
||
total: result.length,
|
||
aiSuggestion: `Found ${result.length} companies matching "${query}"`
|
||
});
|
||
} catch (error) {
|
||
res.status(500).json({ error: error.message });
|
||
}
|
||
});
|
||
|
||
module.exports = router;
|