# Предметная область source и подкасты ## TL;DR Вывод Добавить еще одно измерение полезно, когда мы знаем, куда будет двигаться развитие сорцов. Но мы не знаем. Поэтому делаем как проще. Оставляем поле `type` ответственным за то, чтобы отвечать на оба вопроса - как парсить поле `data` - как качать ресурсы - как интерпретировать результат ## Проблема (или нет) Смущает, что мы пытаемся создать клон типа "rss". Сейчас есть поле `type` которое отвечает на вопрос «как мне скачать данные». Оно не говорит о том, как отобразить посты. ``` Source.type = rss | crawler | fulldive ``` На планировании мы пришли к тому, что будет тип сорцов, который будет работать не в тех же сценариях, что и РСС. Например, такие сорцы будут фильтроваться для отдельной выдачи. Технически решение выглядит приводит к такому изменению ``` source.type = rss | podcast | crawler | fulldive source.data = (all the same) | ... | ... ``` К чему это приводит. Мы будем добавлять в if-ы дополнительное условие о том, что надо вызывать один и тот же фетчер для подкастов и РСС. Зачем тогда это разделение на этапе скачивания? Подкаст — это подмножество РСС. Технического отличия нет. Есть только бизнесовое отличие. Разница появляется тогда, когда надо отобразить эпизоды подкастов вместо новостей. Что если таких сценариев еще прибавится? ## Контр-проблема Зачем серверу знать про разницу в фетчинге и отображении? Мы просто храним тип фида и типозависимвые особенности. Маппинг фетчинга и отображения лежит на клиенте. ## Модель данных ### Как сейчас сделано ```javascript Source { type = rss // качать РСС и интерпретировать как текст с картинкой data = { url = "..." } } Source { type = podcast // качать РСС и показывать как эпизоды подкаста data = { url = "..." } } Source { type = crawler // качать с помощью webview и показать как там надо data = { url = "..." } } Source { type = fulldive // пойти в апи авторизованным клиентом, получить ресурсы data = { ... } } ``` ### Вариант РСС-специфики Сработает, если мы уверены, что данные подкаста и общего случая РСС не разойдутся ```javascript Source { type = rss // надо качать РСС data = { interpretation = generic // интерпретировать как посты/новости url = "..." } } Source { type = rss // надо качать РСС data = { interpretation = podcast // интерпретировать как эпизоды с аудио url = "..." } } Source { type = crawler // качать с помощью webview и показать как там надо data = { // дополнительных интерпретаций нет url = "..." } } Source { type = fulldive // пойти в апи авторизованным клиентом, получить ресурсы data = { // дополнительных интерпретаций нет ... } } ```