100 lines
3.0 KiB
JavaScript
100 lines
3.0 KiB
JavaScript
const express = require('express')
|
|
const router = express.Router()
|
|
const { verifyToken } = require('../middleware/auth')
|
|
const mockCompaniesData = require('../mocks/companies.json')
|
|
const mockCompanies = mockCompaniesData.mockCompanies
|
|
|
|
// Маппинг отраслей для фильтрации
|
|
const industryMapping = {
|
|
'it': 'IT',
|
|
'finance': 'Финансы',
|
|
'manufacturing': 'Производство',
|
|
'construction': 'Строительство',
|
|
'retail': 'Торговля',
|
|
'wholesale': 'Торговля',
|
|
'logistics': 'Логистика',
|
|
'healthcare': 'Медицина'
|
|
};
|
|
|
|
// GET /search/companies - Поиск компаний
|
|
router.get('/companies', verifyToken, (req, res) => {
|
|
try {
|
|
const {
|
|
query = '',
|
|
industries = '',
|
|
companySizes = '',
|
|
geographies = '',
|
|
minRating = 0,
|
|
hasReviews,
|
|
hasAccepts
|
|
} = req.query;
|
|
|
|
let result = [...mockCompanies];
|
|
|
|
// Фильтр по текстовому запросу
|
|
if (query.trim()) {
|
|
const q = query.toLowerCase();
|
|
result = result.filter(c =>
|
|
c.fullName.toLowerCase().includes(q) ||
|
|
c.shortName.toLowerCase().includes(q) ||
|
|
c.slogan.toLowerCase().includes(q) ||
|
|
c.industry.toLowerCase().includes(q)
|
|
);
|
|
}
|
|
|
|
// Фильтр по отраслям
|
|
if (industries) {
|
|
const selectedIndustries = industries.split(',');
|
|
result = result.filter(c => {
|
|
const mappedIndustries = selectedIndustries.map(i => industryMapping[i] || i);
|
|
return mappedIndustries.some(ind =>
|
|
c.industry.toLowerCase().includes(ind.toLowerCase())
|
|
);
|
|
});
|
|
}
|
|
|
|
// Фильтр по размеру компании
|
|
if (companySizes) {
|
|
const sizes = companySizes.split(',');
|
|
result = result.filter(c => {
|
|
if (!c.companySize) return false;
|
|
return sizes.some(size => {
|
|
if (size === '1-10') return c.companySize === '1-10';
|
|
if (size === '11-50') return c.companySize === '10-50';
|
|
if (size === '51-250') return c.companySize.includes('50') || c.companySize.includes('100') || c.companySize.includes('250');
|
|
if (size === '251-500') return c.companySize.includes('250') || c.companySize.includes('500');
|
|
if (size === '500+') return c.companySize === '500+';
|
|
return false;
|
|
});
|
|
});
|
|
}
|
|
|
|
// Фильтр по рейтингу
|
|
const rating = parseFloat(minRating);
|
|
if (rating > 0) {
|
|
result = result.filter(c => c.rating >= rating);
|
|
}
|
|
|
|
// Фильтр по наличию отзывов
|
|
if (hasReviews === 'true') {
|
|
result = result.filter(c => c.verified === true);
|
|
}
|
|
|
|
// Фильтр по акцептам документов
|
|
if (hasAccepts === 'true') {
|
|
result = result.filter(c => c.verified === true);
|
|
}
|
|
|
|
res.json({
|
|
companies: result,
|
|
total: result.length
|
|
});
|
|
} catch (error) {
|
|
console.error('Search error:', error);
|
|
res.status(500).json({ error: 'Internal server error' });
|
|
}
|
|
});
|
|
|
|
module.exports = router
|
|
|