Главные ошибки: permissions теряют CamelCase, даты не форматируются, неизвестная роль добавляет пустой объект, HTTP-статус и структура ответа не проверяются. Поиск ids лучше заменить на Set.
Проверка кода: формирование отчёта о пользователях
Главные ошибки: permissions теряют CamelCase, даты не форматируются, неизвестная роль добавляет пустой объект, HTTP-статус и структура ответа не проверяются. Поиск ids лучше заменить на Set.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
В проекте присутствуют три файла — review.md, main.js и review.js. Текст задания изложен в review.md, а реализация находится в main.js и review.js. Требуется выполнить код‑ревью файла review.js.
// review.md
Задача: собрать отчёт по пользователям компании.
Описание: Необходимо написать функцию, которая принимает массив идентификаторов пользователей и возвращает их данные в виде, соответствующем роли.
Источник данных: запрос к API GET /api/users (JavaScript).
Требования к функции:
-
На вход подаётся массив
userIds(строк). -
Для каждой роли выводятся разные поля:
- admin –
id,name,email,role,createdAt,permissions; - manager –
id,name,role,department,lastLogin; - customer –
id,name,role,loyaltyPoints,lastPurchase.
- admin –
-
Поле
permissions(только у admin) должно содержать лишь допустимые права (editUsers,deleteUsers,viewReports) в CamelCase. -
Поле
lastLogin(только у manager) должно быть отформатировано какYYYY-MM-DD HH:mm:ss. -
Поле
lastPurchase(только у customer) должно быть в видеYYYY-MM-DD. -
Формат данных может изменяться в дальнейшем.
// main.js
import './style.css';
import javascriptLogo from './javascript.svg';
import viteLogo from '/vite.svg';
import { setupCounter } from './counter.js';
document.querySelector('#app').innerHTML = `
<div>
<a href="https://vite.dev" target="_blank">
<img src="${viteLogo}" class="logo" alt="Vite logo" />
</a>
<a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript" target="_blank">
<img src="${javascriptLogo}" class="logo vanilla" alt="JavaScript logo" />
</a>
<h1>Привет, кодосоздатель!</h1>
<div class="card">
<button id="counter" type="button"></button>
</div>
</div>
`;
setupCounter(document.querySelector('#counter'));
// review.js
export async function getRes(ids) {
let users = await fetch('/api/users').then(res => res.json());
const validPermissions = {
editUsers: true,
deleteUsers: true,
viewReports: true,
};
let report = [];
for (let i = 0; i < users.length; i++) {
if (!ids.includes(users[i].id)) continue;
let data = {};
if (users[i].role === 'admin') {
data = {
id: users[i].id,
name: users[i].name,
email: users[i].email,
role: users[i].role,
createdAt: users[i].createdAt,
permissions: [],
};
for (const perm in validPermissions) {
if (validPermissions[perm] && users[i].permissions.includes(perm)) {
data.permissions.push(perm.toLowerCase());
}
}
} else if (users[i].role === 'manager') {
data = {
id: users[i].id,
name: users[i].name,
role: users[i].role,
department: users[i].department,
lastLogin: users[i].lastLogin,
};
} else if (users[i].role === 'customer') {
data = {
id: users[i].id,
name: users[i].name,
role: users[i].role,
loyaltyPoints: users[i].loyaltyPoints,
lastPurchase: users[i].lastPurchase,
};
}
report.push(data);
}
return report;
}
Ответ
Главные ошибки: permissions теряют CamelCase, даты не форматируются, неизвестная роль добавляет пустой объект, HTTP-статус и структура ответа не проверяются. Поиск ids лучше заменить на Set.
Сохраните разрешённые права без toLowerCase: user.permissions.filter(permission => allowed.has(permission)), предварительно проверив массив и при необходимости удалив повторы. Вынесите преобразование каждой роли в отдельный адаптер с явным набором полей; неизвестные роли пропускайте либо отвергайте по контракту. fetch требует проверки response.ok и Array.isArray. Для ids задайте единый строковый формат и используйте Set. Форматирование дат должно иметь согласованный часовой пояс: в UTC валидный Date можно преобразовать через toISOString().slice(0, 19).replace('T', ' '), для покупки — slice(0, 10). Null и неверную дату обработайте отдельно. Нельзя считать роли в отчёте разрешением доступа: авторизацию и ограничение выдачи обязан обеспечивать сервер. main.js функцию getRes пока вообще не вызывает.