Назад к задачам
Junior — Senior
5

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

Получайте помощь с лайвкодингом в реальном времени с Sobes Copilot
Условие задачи

В проекте присутствуют три файла — review.md, main.js и review.js. Текст задания изложен в review.md, а реализация находится в main.js и review.js. Требуется выполнить код‑ревью файла review.js.

// review.md

Задача: собрать отчёт по пользователям компании.

Описание: Необходимо написать функцию, которая принимает массив идентификаторов пользователей и возвращает их данные в виде, соответствующем роли.

Источник данных: запрос к API GET /api/users (JavaScript).

Требования к функции:

  • На вход подаётся массив userIds (строк).
  • Для каждой роли выводятся разные поля:
    • adminid, name, email, role, createdAt, permissions;
    • managerid, name, role, department, lastLogin;
    • customerid, 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;
}