Назад к задачамПолучайте помощь с лайвкодингом в реальном времени с Sobes Copilot
Junior — Senior
5
Проверка кода: формирование отчёта о пользователях
Условие задачи
В проекте присутствуют три файла — 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;
}