Представьте, ваш проект завязан на внешние API соцсетей, через которую осуществляется постинг контента.
class API::Facebook
def post_photo(img)
api('feed/photos', { image_url: img.publish_url, caption: img.caption })
end
def post_video(video)
api('feed/videos', { url: video.publish_url, caption: video.caption, cover: video.cover })
end
private
def api(path, params)
...
rescue e
context = Context.new(path, params)
rescue_api_error(e, context)
end
def rescue_api_error(e, context)
...
end
end
class API::Vkontakte
end
Запросы в API соцсетей не всегда заканчиваются успешно по ряду причин, вот некоторые из них:
- У пользователя забрали права на публикацию в группу соцсети
- Переданы не валиные данные, например, длинный текст или изображение недопустимо большого разрешения/размера
- Соцсеть сочла контент не приемлемым, например, ссылка в тексте поста заблокирована
- Сервер отвечает специфической ошибкой из документации
- Сервер отвечает не документированной ошибкой
- Сервер отвечает в невалидном формате: ожидаем JSON, а ответ приходит HTML
- Сервер не соблюдает конвенции HTTP, к примеру, возвращает 500 ответ, но при этом публикация в соцсети проходит.
- Сервер недоступен, либо соединение прерывается по таймауту
- В вашем датацентре отключился интернет
Обработка ошибок происходит в методе resque_error
. Опишите, идейно (можно на псевдокоде), как вы реализуете метод
обработки ошибок и что должно происходить в каждом варианте. Как бы вы тестировали такой код
обработки ошибок. Если идей несколько - распишите их плюсы и минусы.
При переходе на новую версию АПИ, старые шаблоны ответов могут стать неактуальными, например, добавляются более детальные
виды ошибок, замещающие предыдущие. Код методаresque_error
со временем теряет актуальность. В реальности не всегда получается прочитать всю документацию по новой версии API и актуализировать код.
Более того, из первого задания известно, что документация не всегда соответствует действительности.
Распишите идеи и подходы, которые позволят содержать код в "актуальном" состоянии, их плюсы и минусы (если несколько).