/
Cooolprogrammers
/
web-nodejs-labs
Обзор
Документация
Войти
/
Cooolprogrammers
/
web-nodejs-labs
Код
Запросы
0
Задачи
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
backend/src/services/lab8/task2Service.js
208 строк
7 KB
darkvoid6@mail.ru
ЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫ
18 дек 2025, 07:59
18 дек 2025, 07:59
f2c4f06
Код
Авторство
О чём код?
// backend/src/services/lab8/task2Service.js import { promises as fs } from 'fs'; import path from 'path'; import { fileURLToPath } from 'url'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); const baseDir = path.join(__dirname, '../../../data/lab8/task2'); const cupFile = path.join(baseDir, 'cup.txt'); const groupsFile = path.join(baseDir, 'groups.json'); const stadiumFile = path.join(baseDir, 'stadium.json'); const calendarByDateFile = path.join(baseDir, 'task31.json'); const calendarByStadiumFile = path.join(baseDir, 'task32.json'); async function ensureDir() { await fs.mkdir(baseDir, { recursive: true }); } function parseMatchLine(line) { // Поддержка двух форматов: // 1) YYYY-MM-DD Ddd HH:MM Team1 n-n Team2 @ Stadium, City // 2) (N) Ddd Mon/Day HH:MM Team1 n-n (h-h) Team2 @ Stadium, City const atIdx = line.indexOf('@'); if (atIdx === -1) return null; const left = line.slice(0, atIdx).trim(); const right = line.slice(atIdx + 1).trim(); // Удаляем возможный префикс с номером матча (N) const leftClean = left.replace(/^\(\d+\)\s*/, '').trim(); // Попытка формата #1 (ISO дата) let date, time, teamsPart; let m1 = leftClean.match(/^(\d{4}-\d{2}-\d{2})\s+\S+\s+(\d{2}:\d{2})\s+(.+)$/); if (m1) { [, date, time, teamsPart] = m1; } else { // Попытка формата #2 (Ddd Mon/Day HH:MM ...) const m2 = leftClean.match(/^([A-Za-z]{3})\s+([A-Za-z]{3})\/(\d{1,2})\s+(\d{2}:\d{2})\s+(.+)$/); if (!m2) return null; const [, _dow, monAbbr, dayNum, _time, _teamsPart] = m2; time = _time; teamsPart = _teamsPart; const monthMap = { Jan: '01', Feb: '02', Mar: '03', Apr: '04', May: '05', Jun: '06', Jul: '07', Aug: '08', Sep: '09', Oct: '10', Nov: '11', Dec: '12', }; const mm = monthMap[monAbbr] || '01'; const dd = String(dayNum).padStart(2, '0'); // Год фиксирован для ЧМ-2022 date = `2022-${mm}-${dd}`; } const scoreMatch = teamsPart.match(/^(.+?)\s+(\d+)\s*-\s*(\d+)\s+(.+)$/); if (!scoreMatch) return null; const [, team1, score1, score2, team2] = scoreMatch; // Stadium, City let stadiumName = right; let city = undefined; const commaIdx = right.lastIndexOf(','); if (commaIdx !== -1) { stadiumName = right.slice(0, commaIdx).trim(); city = right.slice(commaIdx + 1).trim(); } return { date, time, team1: team1.trim(), team2: team2.trim(), score1: Number(score1), score2: Number(score2), stadium: stadiumName, city, }; } async function readCupTxt() { await ensureDir(); const altPath = path.join(__dirname, '../../../src/routes/lab8/task2/cup.txt'); // Предпочтительно читать исходник из src/routes (часто кладут туда), // если отсутствует — читаем из data по ТЗ try { const txt = await fs.readFile(altPath, 'utf-8'); if (txt && txt.trim().length > 0) return txt; } catch {} return await fs.readFile(cupFile, 'utf-8'); } export async function processCupTxt() { await ensureDir(); const txt = await readCupTxt(); const lines = txt.split(/\r?\n/); const groups = {}; const stadiumsMap = new Map(); let currentGroup = null; for (const rawLine of lines) { const line = rawLine.trim(); if (!line) continue; const groupMatch = line.match(/^Group\s+([A-H])\b/i); if (groupMatch) { currentGroup = groupMatch[1].toUpperCase(); if (!groups[currentGroup]) groups[currentGroup] = { group: currentGroup, matches: [] }; continue; } const match = parseMatchLine(line); if (match && currentGroup) { groups[currentGroup].matches.push({ ...match, group: currentGroup }); const key = `${match.stadium}||${match.city || ''}`; const prev = stadiumsMap.get(key) || { name: match.stadium, city: match.city, matchesCount: 0, matches: [] // Добавляем массив для хранения матчей }; prev.matchesCount += 1; prev.matches.push({ // Добавляем информацию о матче team1: match.team1, team2: match.team2, score1: match.score1, score2: match.score2, date: match.date, time: match.time }); stadiumsMap.set(key, prev); } } const groupsArr = Object.values(groups); const stadiumsArr = Array.from(stadiumsMap.values()); await fs.writeFile(groupsFile, JSON.stringify(groupsArr, null, 2), 'utf-8'); await fs.writeFile(stadiumFile, JSON.stringify(stadiumsArr, null, 2), 'utf-8'); return { groups: groupsArr, stadiums: stadiumsArr }; } export async function readGroups() { await ensureDir(); try { const data = await fs.readFile(groupsFile, 'utf-8'); return JSON.parse(data); } catch { const { groups } = await processCupTxt(); return groups; } } export async function readStadiums() { await ensureDir(); try { const data = await fs.readFile(stadiumFile, 'utf-8'); return JSON.parse(data); } catch { const { stadiums } = await processCupTxt(); return stadiums; } } function formatDateLabel(dateStr) { // dateStr: YYYY-MM-DD const d = new Date(`${dateStr}T00:00:00Z`); const days = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']; const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; const day = days[d.getUTCDay()]; const month = months[d.getUTCMonth()]; const dayOfMonth = String(d.getUTCDate()); return `${day} ${month}/${dayOfMonth}`; } function matchLine(m, includeStadium = false) { const base = `${m.team1} ${m.score1}-${m.score2} ${m.team2}`; if (includeStadium) { return `${base}` + (m.stadium ? ` @ ${m.stadium}${m.city ? ', ' + m.city : ''}` : ''); } return base; } export async function buildCalendarByDate() { const groups = await readGroups(); const calendar = {}; for (const g of groups) { for (const m of g.matches) { const label = formatDateLabel(m.date); if (!calendar[label]) calendar[label] = {}; calendar[label][m.time] = matchLine(m, true); } } await fs.writeFile(calendarByDateFile, JSON.stringify(calendar, null, 2), 'utf-8'); return calendar; } export async function buildCalendarByStadium() { const groups = await readGroups(); const byStadium = {}; for (const g of groups) { for (const m of g.matches) { const stadiumKey = `${m.stadium}${m.city ? ', ' + m.city : ''}`; if (!byStadium[stadiumKey]) byStadium[stadiumKey] = {}; const dateLabel = formatDateLabel(m.date); if (!byStadium[stadiumKey][dateLabel]) byStadium[stadiumKey][dateLabel] = {}; byStadium[stadiumKey][dateLabel][m.time] = matchLine(m, false); } } await fs.writeFile(calendarByStadiumFile, JSON.stringify(byStadium, null, 2), 'utf-8'); return byStadium; }