DotNetRu / Commune

DotNetRu Meetup Management App
MIT License
13 stars 12 forks source link

Интеграция с TimePad #6

Open kulakovt opened 6 years ago

kulakovt commented 6 years ago

Необходимо найти или разработать компонент, который предоставит возможность взаимодействовать с TimePad. Возможностей интеграции должно хватить для создания полноценных анонсов

Обязательные требования:

kulakovt commented 6 years ago

Официальная документация PHP враппер для API Таймпада

rafaelldi commented 5 years ago

Могу позаниматься интеграцией, посмотрел пока доку timepad. У timepad есть swagger и swagger ui, так что с помощью NSwag можно сгенерировать клиент.

  1. не интерактивное выполнение всех действий - не очень понял, что означает этот пункт;
  2. На этой странице можно сгенерировать API токен и использовать его;
  3. При создании события можно указать описание с html-тегами. У события есть поле access_status, которое в документации указано как string, судя по всему, с помощью него можно управлять видимостью события;
  4. возможность указания Друзей в Анонсе - тоже не очень понял;
  5. Публикация черновика может происходить обновлением видимости события;
  6. Получение списка событий;
  7. Участников можно получить через получение всех заказов.

Я по солюшену не нашёл, где пишутся интеграции, создать под них отдельный проект?

Sergey-Buyanov commented 5 years ago

В предыдущей версии создавался проект в infrastructure layer, использующий domain context сейчас наверное также. @AnatolyKulakov или Егор может уточнить.

ilabutin commented 5 years ago

не интерактивное выполнение всех действий

Означает что вся работа должна быть только через API, без UI Timepad'а

возможность указания Друзей в Анонсе

У каждого митапа есть Друзья (т.е. спонсоры). Вот их и надо уметь указывать. Пример: 52-й митап - см. раздел "Партнеры" - там указана Intermedia. Их список есть у нас в Аудите.

kulakovt commented 5 years ago
  1. это значит, что для выполнения всех действий не должен требоваться пользовательский ввод (например пароля) или иные действия оператора. Интеграция должна настраиваться 1 раз (например получить Token) и всё, дальше работать самостоятельно.
  2. То что надо.
  3. Скорее всего в будущем нужно будет сделать чтобы шаблон анонса лежал в отдельном файле. Например в виде Razor Template. Пока можно его захардкодить. Я позже пришлю настоящий шаблон, но примерно в нём нужно будет заполнять стандартную информацию для нашего митапа. Она вся должна быть доступна из модели.
  4. У каждого анонса есть внизу секция "Партнеры". image Скорее всего для неё тоже должны быть какие-то API.
  5. Прекрасно. В нашем случае нужно эти шаги разделить. Т.е. анонс должен всегда создаваться в виде черновика и только после ручной проверки, оператор будет его публиковать (через API или через web страницу TimePad пока не понятно).
  6. Здесь нужно ещё учитывать историю с обновлением существующего анонса. Т.е. если событие ещё не завершено и его имя совпадает с тем что мы собираемся создать, значит нужно не делать новый анонс а изменить старый.
  7. Этот пункт планировалось сделать для сбора статистики и выгрузки в базу email'ов. Скорее всего это можно оставить на будущее, когда будет интеграция с MailChimp (#8)

Про расположение проекта лучше скажет @egorikas . Но интеграций будет много, поэтому лучше отдельную папку для них завести где-нибудь.

Я годик назад уже делал попытку интеграции. Рабочий прототип (на PowerShell) есть в моём репозитории. Может быть будет чем-то полезен. Несколько неочевидных моментов в API при создании нового события я решил только с помощью саппорта. Кстати, у них был публичный чатик, где сидели сами разработчики и отвечали мгновенно. Очень отзывчивые и добрые люди.

Multitenancy

Все Token'ы, адреса, настройки и шаблоны нужно держать в рамках Сообщества. У разных сообществ будут свои страницы на TimePad и в будущем свои настройки. У нас сейчас нет авторизации и пользователей. Как нам сейчас в это не упираться, а сделать как-то грубо и быстро? Вот это надо обсудить, нужны идеи.

Задача: предоставить набор секретных настроек (Access Token) для нужд интеграции. Настроек может быть много. Интеграций будет много. Настройки зависят от сообщества. Настройки никто не должен уметь читать (ибо тайна), кроме самого сервера. Но хочется их удобно изменять (добавлять новые сообщества). Желательно это делать без перезапуска сервера.

kulakovt commented 5 years ago

Мы уже поднимали вопрос хранения API ключей в обсуждении интеграции с VK (#1) и Телеграмом (#4). Я заведу для этого отдельную задачу. Пока можно принимать зависимостью стандартный Configuration и надеяться что в нём находятся все нужные настройки.

egorikas commented 5 years ago

@rafaelldi как мне кажется есть смысл сделать DotNetRuServer.Integration проект или External APis нам на первое время точно достаточно будет, но все up to you как говорится, если есть какие-то мысли, озвучивай, будем рады

kulakovt commented 5 years ago

Кажется, что нам нужна страница в wiki по каждой интеграции. В которой как минимум будет:

rafaelldi commented 5 years ago

Интеграция с TimePad

Интеграция позволяет создавать private событие из объекта Meetup в сервисе TimePad и в дальнейшем переводить его в состояние public.

Токен

Токен можно получить на этой странице. Необходимые права: Редактировать события (edit_events), Создавать события (add_events), Видеть скрытые события своих организаций (view_private_events), Доступ к непубличным свойствам событий организации (view_private_organizations).

Далее токен необходимо указать в конфигурации:

"Community.Id": {
  "TimePad": {
    "Token": "11111111"
  }
}

Токен принимается в сервисе как IOptionsSnapshot<TimePadConfiguration>, так что необходимо зарегистрировать конфигурацию в DI (сейчас это не сделано). В ишью #93 создаётся ConfigurationProvider для таких целей. Возможно, дополнить TimePadServiceCollectionExtension -> AddTimePadIntegration.

Подключение

Для включения интеграции необходимо зарегестрировать через метод расширения IServiceCollection AddTimePadIntegration().

Взаимодействие

Для тестовой работы был добавлен TimePadController, который имеет метод:

POST api/timepad/create/{meetupId}

Данный метод создаёт событие на TimePad из существуещего meetup из БД.

Шаблоны событий

Шаблоны событий лежат в проекте DotNetRuServer.Integration в папке Templates->Community.Id->TimePad.cshtml

Тонкости и неочевидности интеграции

Связанные ишью

kulakovt commented 4 years ago

@rafaelldi , давай оформим документацию, создадим issue на сценарии, которые не удалось реализовать по разным причинам и закроем эту задачу?

rafaelldi commented 4 years ago

Ок, а что ты понимаешь под "оформим документацию"?

kulakovt commented 4 years ago

Наверное нужно сделать на Wiki отдельную страницу "Интеграция с TimePad" и туда занести как минимум:

rafaelldi commented 4 years ago

Ну получается перенести примерно то, что я выше написал. Я, кстати, не могу создавать страницы на вики. Видимо, мне нужна помощь @egorikas

kulakovt commented 4 years ago

@rafaelldi По-сути, да, перенести. А редактировать уже созданные можешь?

rafaelldi commented 4 years ago

Нет, не могу

kulakovt commented 4 years ago

@rafaelldi Тогда посмотри ещё раз документацию, которую ты оформил в комментарии. И я позже сам перенесу её в wiki.

rafaelldi commented 4 years ago

@AnatolyKulakov Дополнил и создал ещё ишью #111.

kulakovt commented 4 years ago

@rafaelldi , просмотри пожалуйста этот issue и коментарии к твоему pull request и убедись что мы ничего не забыли. Что текущая документация полна, а все необходимые issue заведены.

Оформил wiki: https://github.com/DotNetRu/Server/wiki/TimePad-Integration

Для включения интеграции необходимо...

Так он сейчас не зарегистрирован? Почему?

В данный момент конфигурация TimePadConfiguration никак не регестрируется в DI, без токена из этой конфигурации сервис работать не будет.

Давай всё зарегистрируем и сделаем так чтобы он работало. Если в момент вызова метода "Создания События" Токен не зарегистрирован в конфигурации, то нужно бросить исключение (сейчас должно так и быть, пока не сделаем конфигурацию).

rafaelldi commented 4 years ago

Просмотрел всё, вроде бы ничего не забыли.

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

Можно, наверное, ещё указать, что событие добавляется как private, и необходимо через таймпад его опубликовать (если мы не будем делать это через наш ui).

kulakovt commented 4 years ago

Про private и public есть в самом начале