diff --git a/README.md b/README.md index db5a50b4..fe023b24 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# Тестовое задание для отбора на Летнюю ИТ-школу КРОК по разработке +## Тестовое задание для отбора на Летнюю ИТ-школу КРОК по разработке -## Условие задания +### Условие задания Один развивающийся и перспективный маркетплейс активно растет в настоящее время. Текущая команда разработки вовсю занята тем, что развивает ядро системы. Помимо этого, перед CTO маркетплейса стоит задача — разработать подсистему аналитики, которая на основе накопленных данных формировала бы разнообразные отчеты и статистику. Вы — компания подрядчик, с которой маркетплейс заключил рамочный договор на выполнение работ по разработке этой подсистемы. В рамках первого этапа вы условились провести работы по прототипированию и определению целевого технологического стека и общих подходов к разработке. @@ -8,30 +8,98 @@ На одном из совещаний с Заказчиком вы определили задачу, на которой будете выполнять работы по прототипированию. В качестве такой задачи была выбрана разработка отчета о наиболее популярных категориях товаров, продаваемых во время подготовки новогодних подарков покупателями. Аналитики со стороны маркетплейса предоставили небольшой срез массива данных (файл format.json) о совершенных покупках пользователей за 4-й квартал 2023 года, на примере которого вы смогли бы ознакомиться с форматом входных данных. Каждая запись данного среза содержит следующую информацию: + - Дата и время оформления заказа; - Корзина. В пояснительной записке к массиву данных была уточняющая информация относительно формате данных, представленных в корзине. Так, например, корзина - это массив однотипных сведений о купленных товаров, определяемых следующим набором данных: + - Идентификатор товара; - Наименование товара; - Категория. В свою очередь сведения о категории представлены в следующем виде: + - Идентификатор категории; - Наименование категории. Необходимо разработать отчет, определяющий категории товаров, наиболее популярные перед Новым годом. Если популярных категорий товаров больше, чем одна, отчет должен показывать их все. Предновогодним периодом будем считать срок с 1 по 31 декабря. -Требования к реализации: +### Требования к реализации: + 1. Реализация должна содержать, как минимум, одну процедуру (функцию/метод), отвечающую за формирование отчета, и должна быть описана в readme.md в соответствии с чек-листом; 2. В качестве входных данных программа использует json-файл (input.json), соответствующий структуре, описанной в условиях задания; 3. Процедура (функция/метод) формирования отчета должна возвращать строку в формате json следующего формата: - - {«categories»: [«Бытовая техника»]} - - {«categories»: [«Бытовая техника», «Косметика»]} + +{«categories»: [«Бытовая техника»]} +{«categories»: [«Бытовая техника», «Косметика»]} + 4. Найденная в соответствии с условием задачи категория должна выводиться в изначальном наименовании, приведенном в файле с входными данными. Если таких категорий несколько, то на вывод они все подаются в алфавитном порядке. -## Автор решения +### Автор решения +Платонов Даниил \ +почта: platonov.danik@bk.ru \ +tg: p_danik + +### Описание реализации + +Проект `PopularCategories` представляет собой программу для анализа данных о покупках пользователей в маркетплейсе. Основная цель программы - определить наиболее популярные категории товаров, продаваемых перед Новым годом. + +#### Структура проекта + +- **Главный класс: `PopularCategories`** + - Основной класс программы, содержащий точку входа `main` и методы для чтения данных из JSON-файла, подсчета количества категорий, нахождения самых популярных категорий и генерации отчета. + +- **Классы моделей: `OrderData`, `ItemData`, `CategoryData`** + - Классы, представляющие структуру данных о заказах, товарах и категориях в маркетплейсе. Они используются для десериализации JSON-данных в Java-объекты. + +#### Основные методы + +- `readDataFromJson(String fileName, Type type)` + - Метод для чтения данных из JSON-файла и их десериализации в указанный тип объекта. + +- `countCategories(List orders)` + - Метод для подсчета количества каждой категории товаров в списке заказов, сделанных в декабре. + +- `findPopularCategories(Map categoryCounts)` + - Метод для определения наиболее популярных категорий на основе количества каждой категории. + +- `generateReport(List popularCategories)` + - Метод для генерации JSON-отчета на основе списка популярных категорий. + +#### Используемые библиотеки + +- **Gson** + - Используется для десериализации JSON-данных в Java-объекты и сериализации Java-объектов в JSON-формат. + +- **SLF4J (Simple Logging Facade for Java)** + - Используется для логирования информации о выполнении программы. + + +### Инструкция по сборке и запуску решения + +### Инструкция по сборке и запуску решения + +1. **Сборка проекта** + - Сборка проекта выполняется с помощью Apache Maven. Для очистки исходных и скомпилированных файлов, а также компиляции исходного кода, используйте следующие команды: + + ```bash + mvn clean compile + ``` + - После успешной компиляции исходного кода вы можете продолжить сборку проекта и упаковку его в jar-файл с зависимостями. + +2. **Упаковка проекта в jar-файл** + - Для упаковки проекта в jar-файл вместе с зависимостями, используйте следующую команду: + + ```bash + mvn package assembly:single + ``` + - Эта команда соберет проект, упакует его в jar-файл и включит в него все необходимые зависимости. -## Описание реализации +3. **Запуск приложения** + - После успешной сборки проекта перейдите в каталог `target`. Для запуска приложения используйте следующую команду: -## Инструкция по сборке и запуску решения + ```bash + java -jar MarketAnalytic-1.0-SNAPSHOT-jar-with-dependencies.jar + ``` + - Эта команда запустит приложение, и оно начнет анализировать данные и генерировать отчет. diff --git a/application.log b/application.log new file mode 100644 index 00000000..df4f8b36 --- /dev/null +++ b/application.log @@ -0,0 +1,66 @@ +2024-04-29 03:47:00.753 [main] INFO org.example.PopularCategories - Starting... +2024-04-29 03:47:00.809 [main] INFO org.example.PopularCategories - Counting categories... +2024-04-29 03:47:00.812 [main] INFO org.example.PopularCategories - Finding popular categories... +2024-04-29 03:47:00.817 [main] INFO org.example.PopularCategories - Generating report... +2024-04-29 03:47:12.218 [main] INFO org.example.PopularCategories - Counting categories... +2024-04-29 03:47:12.244 [main] INFO org.example.PopularCategories - Finding popular categories... +2024-04-29 03:47:12.250 [main] INFO org.example.PopularCategories - Generating report... +2024-04-29 03:47:39.694 [main] INFO org.example.PopularCategories - Counting categories... +2024-04-29 03:47:39.714 [main] INFO org.example.PopularCategories - Finding popular categories... +2024-04-29 03:47:39.721 [main] INFO org.example.PopularCategories - Generating report... +2024-04-29 05:02:05.715 [main] INFO org.example.PopularCategories - Starting... +2024-04-29 05:02:05.752 [main] INFO org.example.PopularCategories - Counting categories... +2024-04-29 05:02:05.755 [main] INFO org.example.PopularCategories - Finding popular categories... +2024-04-29 05:02:05.759 [main] INFO org.example.PopularCategories - Generating report... +2024-04-29 06:53:57.024 [main] INFO org.example.PopularCategories - Counting categories... +2024-04-29 06:53:57.053 [main] INFO org.example.PopularCategories - Finding popular categories... +2024-04-29 06:53:57.064 [main] INFO org.example.PopularCategories - Generating report... +2024-04-29 06:55:08.704 [main] INFO org.example.PopularCategories - Counting categories... +2024-04-29 06:55:08.734 [main] INFO org.example.PopularCategories - Finding popular categories... +2024-04-29 06:55:08.744 [main] INFO org.example.PopularCategories - Generating report... +2024-04-29 06:55:19.750 [main] INFO org.example.PopularCategories - Starting... +2024-04-29 06:55:19.810 [main] INFO org.example.PopularCategories - Counting categories... +2024-04-29 06:55:50.206 [main] INFO org.example.PopularCategories - Starting... +2024-04-29 06:55:50.256 [main] INFO org.example.PopularCategories - Counting categories... +2024-04-29 06:55:50.259 [main] INFO org.example.PopularCategories - Finding popular categories... +2024-04-29 06:55:50.265 [main] INFO org.example.PopularCategories - Generating report... +2024-04-29 06:55:50.271 [main] INFO org.example.PopularCategories - {"categories":["бытовая техника"]} +2024-04-29 06:56:18.454 [main] INFO org.example.PopularCategories - Starting... +2024-04-29 06:56:18.496 [main] INFO org.example.PopularCategories - Counting categories... +2024-04-29 06:56:18.499 [main] INFO org.example.PopularCategories - Finding popular categories... +2024-04-29 06:56:18.504 [main] INFO org.example.PopularCategories - Generating report... +2024-04-29 06:57:23.567 [main] INFO org.example.PopularCategories - Starting... +2024-04-29 06:57:23.621 [main] INFO org.example.PopularCategories - Counting categories... +2024-04-29 06:58:08.561 [main] INFO org.example.PopularCategories - Starting... +2024-04-29 06:58:08.617 [main] INFO org.example.PopularCategories - Counting categories... +2024-04-29 06:59:30.540 [main] INFO org.example.PopularCategories - Starting... +2024-04-29 06:59:30.595 [main] INFO org.example.PopularCategories - Counting categories... +2024-04-29 06:59:30.598 [main] INFO org.example.PopularCategories - Finding popular categories... +2024-04-29 06:59:30.605 [main] INFO org.example.PopularCategories - Generating report... +2024-04-29 06:59:30.611 [main] INFO org.example.PopularCategories - {"categories":["бытовая техника"]} +2024-04-29 07:00:05.158 [main] INFO org.example.PopularCategories - Starting... +2024-04-29 07:00:05.214 [main] INFO org.example.PopularCategories - Counting categories... +2024-04-29 07:00:05.217 [main] INFO org.example.PopularCategories - Finding popular categories... +2024-04-29 07:00:05.223 [main] INFO org.example.PopularCategories - Generating report... +2024-04-29 07:00:05.229 [main] INFO org.example.PopularCategories - {"categories":["бытовая техника"]} +2024-04-29 07:00:25.770 [main] INFO org.example.PopularCategories - Starting... +2024-04-29 07:00:25.822 [main] INFO org.example.PopularCategories - Counting categories... +2024-04-29 07:00:25.825 [main] INFO org.example.PopularCategories - Finding popular categories... +2024-04-29 07:00:25.831 [main] INFO org.example.PopularCategories - Generating report... +2024-04-29 07:00:25.836 [main] INFO org.example.PopularCategories - {"categories":["бытовая техника"]} +2024-04-29 07:01:12.539 [main] INFO org.example.PopularCategories - Starting... +2024-04-29 07:01:12.596 [main] INFO org.example.PopularCategories - Counting categories... +2024-04-29 07:02:45.747 [main] INFO org.example.PopularCategories - Starting... +2024-04-29 07:02:45.803 [main] INFO org.example.PopularCategories - Counting categories... +2024-04-29 07:02:45.806 [main] INFO org.example.PopularCategories - Finding popular categories... +2024-04-29 07:02:45.813 [main] INFO org.example.PopularCategories - Generating report... +2024-04-29 07:02:45.818 [main] INFO org.example.PopularCategories - {"categories":["бытовая техника"]} +2024-04-29 07:02:54.619 [main] INFO org.example.PopularCategories - Counting categories... +2024-04-29 07:02:54.641 [main] INFO org.example.PopularCategories - Finding popular categories... +2024-04-29 07:02:54.649 [main] INFO org.example.PopularCategories - Generating report... +2024-04-29 07:03:00.897 [main] INFO org.example.PopularCategories - Counting categories... +2024-04-29 07:03:00.916 [main] INFO org.example.PopularCategories - Finding popular categories... +2024-04-29 07:03:00.924 [main] INFO org.example.PopularCategories - Generating report... +2024-04-29 07:04:40.028 [main] INFO org.example.PopularCategories - Counting categories... +2024-04-29 07:04:40.056 [main] INFO org.example.PopularCategories - Finding popular categories... +2024-04-29 07:04:40.064 [main] INFO org.example.PopularCategories - Generating report... diff --git a/pom.xml b/pom.xml new file mode 100644 index 00000000..dd6df4d3 --- /dev/null +++ b/pom.xml @@ -0,0 +1,63 @@ + + + 4.0.0 + + org.example + MarketAnalytic + 1.0-SNAPSHOT + + + + + maven-assembly-plugin + + + + org.example.PopularCategories + + + + jar-with-dependencies + + + + + + + + + com.google.code.gson + gson + 2.9.0 + + + + org.junit.jupiter + junit-jupiter-api + 5.10.1 + test + + + + org.slf4j + slf4j-api + 2.0.12 + + + + ch.qos.logback + logback-classic + 1.4.14 + + + + + + 19 + 19 + UTF-8 + + + \ No newline at end of file diff --git a/src/main/java/org/example/CategoryData.java b/src/main/java/org/example/CategoryData.java new file mode 100644 index 00000000..1e4a79a6 --- /dev/null +++ b/src/main/java/org/example/CategoryData.java @@ -0,0 +1,14 @@ +package org.example; + +public class CategoryData { + + private String name; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/src/main/java/org/example/ItemData.java b/src/main/java/org/example/ItemData.java new file mode 100644 index 00000000..b448e539 --- /dev/null +++ b/src/main/java/org/example/ItemData.java @@ -0,0 +1,33 @@ +package org.example; + +public class ItemData { + + private String id; + private String name; + private CategoryData category; + + public String getId() { + return id; + } + + public String getName() { + return name; + } + + public CategoryData getCategory() { + return category; + } + + public void setId(String id) { + this.id = id; + } + + public void setName(String name) { + this.name = name; + } + + public void setCategory(CategoryData category) { + this.category = category; + } +} + diff --git a/src/main/java/org/example/OrderData.java b/src/main/java/org/example/OrderData.java new file mode 100644 index 00000000..141fc4fc --- /dev/null +++ b/src/main/java/org/example/OrderData.java @@ -0,0 +1,25 @@ +package org.example; + +import java.util.List; + +public class OrderData { + + private String ordered_at; + private List items; + + public String getOrderedAt() { + return ordered_at; + } + + public void setOrderedAt(String ordered_at) { + this.ordered_at = ordered_at; + } + + public List getItems() { + return items; + } + + public void setItems(List items) { + this.items = items; + } +} diff --git a/src/main/java/org/example/PopularCategories.java b/src/main/java/org/example/PopularCategories.java new file mode 100644 index 00000000..a49f7195 --- /dev/null +++ b/src/main/java/org/example/PopularCategories.java @@ -0,0 +1,130 @@ +package org.example; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.lang.reflect.Type; +import java.nio.charset.StandardCharsets; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.google.gson.Gson; +import com.google.gson.JsonSyntaxException; +import com.google.gson.reflect.TypeToken; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class PopularCategories { + + private static final Logger logger = LoggerFactory.getLogger(PopularCategories.class); + private static final int DECEMBER = 12; + private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS"); + + public static void main(String[] args) { + try { + String fileName = "format.json"; + logger.info("Starting..."); + List orders = readDataFromJson(fileName, new TypeToken>() { + }.getType()); + Map categoryCounts = countCategories(orders); + List popularCategories = findPopularCategories(categoryCounts); + String report = generateReport(popularCategories); + logger.info(report); + } catch (IOException e) { + logger.error("Error executing main method", e); + } + } + + /** + * Считывает данные из JSON-файла и десериализует их в указанный тип. + * + * @param fileName Имя JSON-файла. + * @param type Тип данных для десериализации. + * @param Тип данных. + * @return Десериализованные данные. + * @throws IOException Если произошла ошибка ввода-вывода при чтении файла или разборе JSON. + */ + public static T readDataFromJson(String fileName, Type type) throws IOException { + logger.debug("Reading JSON file: {}", fileName); + Gson gson = new Gson(); + ClassLoader classLoader = PopularCategories.class.getClassLoader(); + try (InputStream inputStream = classLoader.getResourceAsStream(fileName); + BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8))) { + return gson.fromJson(reader, type); + } catch (IOException | JsonSyntaxException e) { + logger.error("Error reading or parsing JSON file: {}", fileName, e); + throw e; + } + } + + /** + * Подсчитывает количество каждой категории в списке заказов, сделанных в декабре. + * + * @param orders Список заказов. + * @return Map, содержащая имена категорий и их количество. + */ + public static Map countCategories(List orders) { + logger.info("Counting categories..."); + Map categoryCounts = new HashMap<>(); + for (OrderData order : orders) { + if (order != null && isDataOfOrder(order)) { + for (ItemData item : order.getItems()) { + if (item != null && item.getCategory() != null && item.getCategory().getName() != null) { + String categoryName = item.getCategory().getName().toLowerCase(); + categoryCounts.put(categoryName, categoryCounts.getOrDefault(categoryName, 0) + 1); + } else { + logger.warn("Null or incomplete data found while counting categories in order: {}", order); + } + } + } + } + return categoryCounts; + } + + /** + * Проверяет, был ли заказ сделан в декабре. + * + * @param order Заказ для проверки. + * @return true, если заказ был сделан в декабре, в противном случае - false. + */ + private static boolean isDataOfOrder(OrderData order) { + LocalDate orderedDate = LocalDate.parse(order.getOrderedAt(), DATE_FORMATTER); + return orderedDate.getMonthValue() == DECEMBER; + } + + /** + * Находит самые популярные категории на основе заданных количеств категорий. + * + * @param categoryCounts Map, содержащая имена категорий и их количество. + * @return List наиболее популярных категорий. + */ + public static List findPopularCategories(Map categoryCounts) { + logger.info("Finding popular categories..."); + int maxCount = categoryCounts.values().stream().max(Integer::compareTo).orElse(0); + return categoryCounts.entrySet().stream() + .filter(entry -> entry.getValue() == maxCount) + .map(Map.Entry::getKey) + .sorted() + .toList(); + } + + /** + * Генерирует JSON-отчет на основе списка популярных категорий. + * + * @param popularCategories Список популярных категорий. + * @return String JSON-отчета. + */ + public static String generateReport(List popularCategories) { + logger.info("Generating report..."); + Gson gson = new Gson(); + return gson.toJson(Map.of("categories", popularCategories)); + } +} + + + + diff --git a/src/main/resources/META-INF/MANIFEST.MF b/src/main/resources/META-INF/MANIFEST.MF new file mode 100644 index 00000000..9fd0ef9f --- /dev/null +++ b/src/main/resources/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Main-Class: org.example.PopularCategories + diff --git a/src/main/resources/format.json b/src/main/resources/format.json new file mode 100644 index 00000000..d164b632 --- /dev/null +++ b/src/main/resources/format.json @@ -0,0 +1,60 @@ +[ + { + "ordered_at": "2023-12-14T11:10:29.408", + "items": [ + { + "id": "b250ed3c-25d7-462b-9aae-4cae6db4e1e5", + "name": "Игровая приставка Sony Play Station 5", + "category": { + "id": "e3386407-3918-422a-b128-ad23a2ddf9c3", + "name": "Бытовая техника" + } + }, + { + "id": "bd4395cc-6602-4206-bc7a-01a8c5b1eef9", + "name": "Набор уходовых средств Obagi", + "category": { + "id": "0bf9cb4d-30db-4440-a9dc-37edb0e78684", + "name": "Средства для ухода за собой" + } + }, + { + "id": "3975d9a4-1adc-4eab-baf1-55b59e78136d", + "name": "Богатый папа, бедный папа", + "category": { + "id": "8b9bb003-6d90-43c4-9158-cfeca24b20f8", + "name": "Книги" + } + } + ] + }, + { + "ordered_at": "2023-12-21T18:31:21.349", + "items": [ + { + "id": "e188a4ce-d1c9-45b9-b757-4e9bcfc7281a", + "name": "Телевизор LG C3", + "category": { + "id": "e3386407-3918-422a-b128-ad23a2ddf9c3", + "name": "Бытовая техника" + } + }, + { + "id": "a57548eb-9a1d-4d2c-8397-9d0c2c60fce6", + "name": "Лонгслив SUPREME x CROC", + "category": { + "id": "593d36d5-1d8b-4237-beb4-e1c8e361c335", + "name": "Одежда" + } + }, + { + "id": "b8822fc1-b442-430c-9120-a3a1cedcb573", + "name": "Набор зимней резины Pirelli", + "category": { + "id": "3d400f36-2766-40dc-95dd-f82cf3eef6f3", + "name": "Автозапчасти" + } + } + ] + } +] \ No newline at end of file diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml new file mode 100644 index 00000000..0943a134 --- /dev/null +++ b/src/main/resources/logback.xml @@ -0,0 +1,16 @@ + + + + + + + + + application.log + true + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + diff --git a/src/test/java/PopularCategoriesTest.java b/src/test/java/PopularCategoriesTest.java new file mode 100644 index 00000000..c3c6a033 --- /dev/null +++ b/src/test/java/PopularCategoriesTest.java @@ -0,0 +1,57 @@ +import com.google.gson.reflect.TypeToken; +import org.example.OrderData; +import org.example.PopularCategories; +import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +class PopularCategoriesTest { + + private static final Logger logger = LoggerFactory.getLogger(PopularCategoriesTest.class); + + @Test + void testCountCategories() { + logger.debug("Running testCountCategories..."); + Map expected = new HashMap<>(); + expected.put("одежда", 2); + expected.put("бытовая техника", 1); + try { + List orders = PopularCategories.readDataFromJson("testFormat.json", new TypeToken>() { + }.getType()); + Map actual = PopularCategories.countCategories(orders); + assertEquals(expected, actual); + } catch (IOException e) { + logger.error("Error executing testCountCategories", e); + } + } + + @Test + void testFindPopularCategories() { + logger.debug("Running testFindPopularCategories..."); + Map categories = Map.of( + "Category1", 7, + "Category2", 7, + "Category3", 2, + "Category4", 4 + ); + List expected = List.of("Category1", "Category2"); + List actual = PopularCategories.findPopularCategories(categories); + assertEquals(expected, actual); + } + + @Test + void testReport() { + logger.debug("Running testReport..."); + List popularCategories = List.of("Category1"); + String expected = "{\"categories\":[\"Category1\"]}"; + String actual = PopularCategories.generateReport(popularCategories); + assertEquals(expected, actual); + } +} diff --git a/src/test/resources/testFormat.json b/src/test/resources/testFormat.json new file mode 100644 index 00000000..7f8e54ed --- /dev/null +++ b/src/test/resources/testFormat.json @@ -0,0 +1,60 @@ +[ + { + "ordered_at": "2023-10-14T11:10:29.408", + "items": [ + { + "id": "b250ed3c-25d7-462b-9aae-4cae6db4e1e5", + "name": "Игровая приставка Sony Play Station 5", + "category": { + "id": "e3386407-3918-422a-b128-ad23a2ddf9c3", + "name": "Бытовая техника" + } + }, + { + "id": "bd4395cc-6602-4206-bc7a-01a8c5b1eef9", + "name": "Набор уходовых средств Obagi", + "category": { + "id": "0bf9cb4d-30db-4440-a9dc-37edb0e78684", + "name": "Средства для ухода за собой" + } + }, + { + "id": "3975d9a4-1adc-4eab-baf1-55b59e78136d", + "name": "Богатый папа, бедный папа", + "category": { + "id": "8b9bb003-6d90-43c4-9158-cfeca24b20f8", + "name": "Книги" + } + } + ] + }, + { + "ordered_at": "2023-12-21T18:31:21.349", + "items": [ + { + "id": "e188a4ce-d1c9-45b9-b757-4e9bcfc7281a", + "name": "Телевизор LG C3", + "category": { + "id": "e3386407-3918-422a-b128-ad23a2ddf9c3", + "name": "Бытовая техника" + } + }, + { + "id": "a57548eb-9a1d-4d2c-8397-9d0c2c60fce6", + "name": "Лонгслив SUPREME x CROC", + "category": { + "id": "593d36d5-1d8b-4237-beb4-e1c8e361c335", + "name": "Одежда" + } + }, + { + "id": "a57548eb-9a1d-4d2c-8397-9d0c2c60fce6", + "name": "Лонгслив SUPREME", + "category": { + "id": "593d36d5-1d8b-4237-beb4-e1c8e361c335", + "name": "Одежда" + } + } + ] + } +] \ No newline at end of file