Проверка кода: формирование отчёта о пользователях

Главные ошибки: 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.
  • Поле 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 пока вообще не вызывает.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее