### Техническое задание для AI-агента

**Задача:** Разработать парсер (парсер) для RSS-ленты `https://kursiv.media/feed/` на Spring Boot с сохранением результатов в MongoDB.

[cite\_start]**Контекст:** Этот парсер является частью большой AI-платформы для маркетинговой аналитики[cite: 5]. Его цель — собирать новости из указанного источника, нормализовать их и сохранять в базу данных для дальнейшей обработки.

---

## Основные требования

1.  **Получение данных**: Создать сервис, который выполняет HTTP GET-запрос к URL: `https://kursiv.media/feed/`.
2.  **Парсинг RSS**: Разобрать полученный XML-ответ. Для каждой записи (элемента `<item>`) в RSS-ленте необходимо извлечь следующие поля:
    - [cite\_start]`title` (заголовок)[cite: 64].
    - [cite\_start]`link` или `guid` (URL статьи)[cite: 64].
    - [cite\_start]`pubDate` или `isoDate` (дата публикации)[cite: 64].
    - [cite\_start]`description` или `content` (текстовое содержимое)[cite: 65].
3.  **Нормализация данных**:
    - [cite\_start]**Очистка текста**: Текстовое содержимое из `description`/`content` должно быть полностью очищено от HTML-тегов[cite: 65].
    - **Формат даты**: Дата публикации должна быть приведена к формату `ISODate`.
4.  **Создание хэша**: Для каждой новости необходимо сгенерировать уникальный хэш для дедупликации. [cite\_start]Хэш формируется по формуле `sha256(url + "::" + title)`[cite: 54].
5.  **Сохранение в MongoDB**:
    - Подготовленные данные должны сохраняться в коллекцию MongoDB с названием `market_items`.
    - [cite\_start]Операция сохранения должна быть **"upsert"** (обновить, если существует, или вставить, если нет)[cite: 56]. [cite\_start]В качестве ключа для поиска существующей записи используйте поле `hash`[cite: 56].

---

## Модель данных для коллекции `market_items` в MongoDB

Документ в коллекции должен иметь следующую структуру:

```json
{
  "source_name": "Kursiv (Бизнес/экономика)", // Статическое значение для этого парсера
  "url": "https://kursiv.media/article/...", // Из поля <link>
  "title": "Заголовок новости", // Из поля <title>
  "published_at": ISODate("2025-09-14T..."), // Из поля <pubDate>
  "added_at": ISODate("..."), // Текущее время при добавлении
  "raw_text": "Очищенный от HTML текст статьи...", // Из поля <description>
  "hash": "...", // Сгенерированный SHA-256 хэш
  "category": "Бизнес", // Можно задать по умолчанию

  // Этот блок будет заполняться на следующем этапе, но его нужно предусмотреть
  "analytics": {
    "summary": null,
    "sentiment": null,
    "tags": [],
    "entities": {}
  }
}
```

---

## Технологический стек и реализация

- **Фреймворк**: Spring Boot
- **База данных**: Spring Data MongoDB
- **HTTP-клиент**: `RestTemplate` или `WebClient`
- **Парсинг XML/RSS**: Рекомендуется использовать библиотеку, например, **Rome** (`com.rometools:rome`), для удобной работы с RSS-лентами.
- **Логика**: Реализовать класс-сервис (например, `KursivParserService`), который будет содержать всю логику. Для взаимодействия с MongoDB использовать `MongoRepository` или `MongoTemplate`.

## Критерии выполнения

- Создан Spring Boot сервис, который успешно получает и парсит данные с `https://kursiv.media/feed/`.
- При вызове метода этого сервиса, новые записи появляются в коллекции `market_items` в MongoDB.
- При повторном вызове дубликаты новостей не создаются, а существующие записи могут быть обновлены (логика `upsert`).
- Структура сохраненных документов в MongoDB полностью соответствует указанной модели данных.
