{"action":"created","comment":{"url":"https://api.github.com/repos/Flexberry/rfcs/pulls/comments/168753526","pull_request_review_id":97136078,"id":168753526,"diff_hunk":"@@ -0,0 +1,131 @@\n+- Дата создания: 2018-02-05\n+- RFC PR:\n+- RFC Issue:\n+- Flexberry Issue:\n+\n+# Универсальный интеграционный адаптер\n+\n+## Краткое описание\n+\n+> Необходимо разработать универсальный адаптер для решения задачи интеграции и синхронизации данных корпоративных приложений.\n+\n+## Обоснование\n+\n+> Часто на прикладных проектах возникает проблема интеграции/синхронизации данных между несколькими приложениями. В каждом случаи разработчики, задействованные на проекте, с помощью различных технологий и архитектуры, создают свои решения, нацеленные на работу с конкретными приложениями. Отсюда возникает проблема, что при возникновении задачи интеграции, зачастую необходимо начинать разработку интеграционного решения с нуля, из-за невозможности переиспользования или отсутствия других решений. В результате разработке данного проектного решения планируется получить универсальный адаптер, который позволит разработчикам обеспечить интеграцию данных между приложениями с использованием общей технологии и архитектуры.\n+\n+## Детальное проектирование\n+\n+> Адаптер должен решать две первичные задачи\n+> * обеспечить интеграцию данных между приложениями\n+> * обеспечить синхронизацию данных между приложениями\n+\n+> Адаптер должен обладать следующими возможностями:\n+> 1. формировать запрос на получение данных из других источников\n+> 2. предоставление данных по запросу\n+> 3. получение данных по подписке, и обработка полученных данных\n+> 4. отправка измененных данных в другой источник\n+> 5. поддерживать работу в операционных системах Linux и Windows\n+> 6. предоставлять возможность реализации различных способов взаимодействия между приложениями (сервисная шина предприятия, прямое подключения БД-приёмника и другие)\n+> 7. предоставлять API для возможности управления из других приложений\n+\n+> Основная идея - рядом с прикладным приложением разворачивается служба-адаптер, которая, при минимальном изменение внутри прикладного проекта-источника, собирает данные об изменениях объектов внутри прикладной системы. По запросу или временному регламенту собранные данные передаются приложению приёмнику.\n+> За основу реализации синхронизации данных предлагается взять уже разработанный ранее проект Synchronizer, который позволяет реализовать сбор изменений объектов приложения-источника за счет указания интерфейса ISyncObserver и преобразование объектов одной системы в другую - интерфейс ISyncMapper.\n+\n+\n+### Описание решения на примере взаимодействия с сервисной шиной предприятия(ESB):\n+\n+#### Описание модулей адаптера\n+\n+**Схема решения**\n+![Схема решения](/Images/SyncAdapter/Sync-Adapter-Tech.png)\n+\n+> Адаптер разделен на следующие модули:\n+> 1. ASP.NET веб-служба SyncAdapter - отвечает за обработку входящих обращений, регистрацию изменений и формирование из них пакетов, формирование и приём сообщений различных типов.\n+> В службу входят:\n+> * API - Web API содержит методы управляющие поведением адаптера.\n+> * Change Package Collector - Упаковщик фактов-изменений SyncEntity в сообщения для шины SyncLogItem. Содержит логику по сборке произошедних изменений в пакет.\n+> * MessageCreator - Формирует для шины наборы сообщений различных типов.\n+> * BusListener - Сохраняет полученные по обратному вызову сообщения от шины в SyncLogItem.\n+> 2. Консольное приложение BusSender - отвечает, за обработку подготовленных для отправки SyncLogItem и отправку сообщений в шину.\n+> 3. Консольное приложение MessageHandler - отвечает, за обработку полученных SyncLogItem.\n+> 4. Sheduler - средство для обращения к Web API для вызова синхронизации по расписанию.\n+> 5. Адаптер имеет отдельную от приложения БД, которая является связующим звеном между различными модулями и содержит таблицы:\n+> * ICS_SyncEntity, ICS_SyncSetting, ICS_SyncSubSetting, ICS_SyncSystem, ICS_SyncType - обеспечивают работу Synchronizer,\n+> * SyncLogItem - таблица для ведения журнала синхронизации \n+> * Log - для ведения лога работы модулей,\n+> * KeyMap - таблица соответствия, для хранения возникающих коллизий ключей.\n+\n+#### Описание работы модулей адаптера\n+**Изменение в прикладном приложении-источнике App**\n+> В приложение-источник App включается сборка в которой создаются наблюдатели (реализация ISyncObserver) за синхронизируемыми объектами. ISyncObserver – паттерн «наблюдатель», обеспечивает реакцию на изменение объекта синхронизации. Внутри наблюдателя может содержится логика по принятию решения о синхронизации объекта (Например, не хотим, чтобы при изменении некоторых отдельных полей объект синхронизировался).\n+\n+> Для работы наблюдателя, приложение должно вести аудит изменения своих объектов. После фиксации аудита изменений вызывается соответствующий Observer изменённого объекта, который записывает факт об изменении объекта - SyncEntity(Date, ObjectPrimaryKey, ObjectStatus, Setting) в специальную таблицу БД ICS_SyncEntity.\n+\n+**ASP.NET веб-служба SyncAdapter**\n+> На сервере приложения разворачивается веб-служба адаптер SyncAdapter. К SyncAdapter подключается Synchronizer и сборки объектов приложения-источника App Object и приложений-приёмников XML Object и создаются соответствующие сборкам объектов наборы мапперов и наблюдателей.\n+\n+> Synchronizer позволяет реализовать наборы преобразований объектов из одной системы в другую – мапперы (Реализация ISyncMapper) ISyncMapper – схож с паттерном «адаптер», обеспечивает преобразование объекта системы App в XML-объект для шины. Для изменения мастеров используются сабмапперы, настройки их использования прописываются отдельно. Детейлам соответствуют отдельные мапперы, где агрегатор выступает в роли мастера. Для преобразования из одного объекта в два используются два разных маппера с одним объектом-источником и разными объектами-приёмниками.","path":"text/0000-Sync-Adapter.md","position":67,"original_position":67,"commit_id":"1be47189895ef4b5e8140b28cd5eea1d034cae4e","original_commit_id":"1be47189895ef4b5e8140b28cd5eea1d034cae4e","user":{"login":"bratchikov","id":837035,"avatar_url":"https://avatars1.githubusercontent.com/u/837035?v=4","gravatar_id":"","url":"https://api.github.com/users/bratchikov","html_url":"https://github.com/bratchikov","followers_url":"https://api.github.com/users/bratchikov/followers","following_url":"https://api.github.com/users/bratchikov/following{/other_user}","gists_url":"https://api.github.com/users/bratchikov/gists{/gist_id}","starred_url":"https://api.github.com/users/bratchikov/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bratchikov/subscriptions","organizations_url":"https://api.github.com/users/bratchikov/orgs","repos_url":"https://api.github.com/users/bratchikov/repos","events_url":"https://api.github.com/users/bratchikov/events{/privacy}","received_events_url":"https://api.github.com/users/bratchikov/received_events","type":"User","site_admin":false},"body":"Вот вырисовывается ещё один независимый компонент, который можно упаковать в отдельный или один из существующих NuGet-пакетов (ORM).","created_at":"2018-02-16T13:18:55Z","updated_at":"2018-02-16T13:39:57Z","html_url":"https://github.com/Flexberry/rfcs/pull/2#discussion_r168753526","pull_request_url":"https://api.github.com/repos/Flexberry/rfcs/pulls/2","author_association":"OWNER","_links":{"self":{"href":"https://api.github.com/repos/Flexberry/rfcs/pulls/comments/168753526"},"html":{"href":"https://github.com/Flexberry/rfcs/pull/2#discussion_r168753526"},"pull_request":{"href":"https://api.github.com/repos/Flexberry/rfcs/pulls/2"}}},"pull_request":{"url":"https://api.github.com/repos/Flexberry/rfcs/pulls/2","id":169552565,"html_url":"https://github.com/Flexberry/rfcs/pull/2","diff_url":"https://github.com/Flexberry/rfcs/pull/2.diff","patch_url":"https://github.com/Flexberry/rfcs/pull/2.patch","issue_url":"https://api.github.com/repos/Flexberry/rfcs/issues/2","number":2,"state":"open","locked":false,"title":"Sync Adapter RFC","user":{"login":"AkovalevPerm","id":33832640,"avatar_url":"https://avatars1.githubusercontent.com/u/33832640?v=4","gravatar_id":"","url":"https://api.github.com/users/AkovalevPerm","html_url":"https://github.com/AkovalevPerm","followers_url":"https://api.github.com/users/AkovalevPerm/followers","following_url":"https://api.github.com/users/AkovalevPerm/following{/other_user}","gists_url":"https://api.github.com/users/AkovalevPerm/gists{/gist_id}","starred_url":"https://api.github.com/users/AkovalevPerm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AkovalevPerm/subscriptions","organizations_url":"https://api.github.com/users/AkovalevPerm/orgs","repos_url":"https://api.github.com/users/AkovalevPerm/repos","events_url":"https://api.github.com/users/AkovalevPerm/events{/privacy}","received_events_url":"https://api.github.com/users/AkovalevPerm/received_events","type":"User","site_admin":false},"body":"[Rendered](https://github.com/AkovalevPerm/rfcs/blob/master/text/0000-Sync-Adapter.md)","created_at":"2018-02-16T05:50:05Z","updated_at":"2018-02-16T13:39:58Z","closed_at":null,"merged_at":null,"merge_commit_sha":"232dddb29cf5d69b8517bbe178b6776eed4a8369","assignee":{"login":"bratchikov","id":837035,"avatar_url":"https://avatars1.githubusercontent.com/u/837035?v=4","gravatar_id":"","url":"https://api.github.com/users/bratchikov","html_url":"https://github.com/bratchikov","followers_url":"https://api.github.com/users/bratchikov/followers","following_url":"https://api.github.com/users/bratchikov/following{/other_user}","gists_url":"https://api.github.com/users/bratchikov/gists{/gist_id}","starred_url":"https://api.github.com/users/bratchikov/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bratchikov/subscriptions","organizations_url":"https://api.github.com/users/bratchikov/orgs","repos_url":"https://api.github.com/users/bratchikov/repos","events_url":"https://api.github.com/users/bratchikov/events{/privacy}","received_events_url":"https://api.github.com/users/bratchikov/received_events","type":"User","site_admin":false},"assignees":[{"login":"bratchikov","id":837035,"avatar_url":"https://avatars1.githubusercontent.com/u/837035?v=4","gravatar_id":"","url":"https://api.github.com/users/bratchikov","html_url":"https://github.com/bratchikov","followers_url":"https://api.github.com/users/bratchikov/followers","following_url":"https://api.github.com/users/bratchikov/following{/other_user}","gists_url":"https://api.github.com/users/bratchikov/gists{/gist_id}","starred_url":"https://api.github.com/users/bratchikov/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bratchikov/subscriptions","organizations_url":"https://api.github.com/users/bratchikov/orgs","repos_url":"https://api.github.com/users/bratchikov/repos","events_url":"https://api.github.com/users/bratchikov/events{/privacy}","received_events_url":"https://api.github.com/users/bratchikov/received_events","type":"User","site_admin":false},{"login":"ehaberev","id":7845484,"avatar_url":"https://avatars2.githubusercontent.com/u/7845484?v=4","gravatar_id":"","url":"https://api.github.com/users/ehaberev","html_url":"https://github.com/ehaberev","followers_url":"https://api.github.com/users/ehaberev/followers","following_url":"https://api.github.com/users/ehaberev/following{/other_user}","gists_url":"https://api.github.com/users/ehaberev/gists{/gist_id}","starred_url":"https://api.github.com/users/ehaberev/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ehaberev/subscriptions","organizations_url":"https://api.github.com/users/ehaberev/orgs","repos_url":"https://api.github.com/users/ehaberev/repos","events_url":"https://api.github.com/users/ehaberev/events{/privacy}","received_events_url":"https://api.github.com/users/ehaberev/received_events","type":"User","site_admin":false}],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/Flexberry/rfcs/pulls/2/commits","review_comments_url":"https://api.github.com/repos/Flexberry/rfcs/pulls/2/comments","review_comment_url":"https://api.github.com/repos/Flexberry/rfcs/pulls/comments{/number}","comments_url":"https://api.github.com/repos/Flexberry/rfcs/issues/2/comments","statuses_url":"https://api.github.com/repos/Flexberry/rfcs/statuses/1be47189895ef4b5e8140b28cd5eea1d034cae4e","head":{"label":"AkovalevPerm:master","ref":"master","sha":"1be47189895ef4b5e8140b28cd5eea1d034cae4e","user":{"login":"AkovalevPerm","id":33832640,"avatar_url":"https://avatars1.githubusercontent.com/u/33832640?v=4","gravatar_id":"","url":"https://api.github.com/users/AkovalevPerm","html_url":"https://github.com/AkovalevPerm","followers_url":"https://api.github.com/users/AkovalevPerm/followers","following_url":"https://api.github.com/users/AkovalevPerm/following{/other_user}","gists_url":"https://api.github.com/users/AkovalevPerm/gists{/gist_id}","starred_url":"https://api.github.com/users/AkovalevPerm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AkovalevPerm/subscriptions","organizations_url":"https://api.github.com/users/AkovalevPerm/orgs","repos_url":"https://api.github.com/users/AkovalevPerm/repos","events_url":"https://api.github.com/users/AkovalevPerm/events{/privacy}","received_events_url":"https://api.github.com/users/AkovalevPerm/received_events","type":"User","site_admin":false},"repo":{"id":120407380,"name":"rfcs","full_name":"AkovalevPerm/rfcs","owner":{"login":"AkovalevPerm","id":33832640,"avatar_url":"https://avatars1.githubusercontent.com/u/33832640?v=4","gravatar_id":"","url":"https://api.github.com/users/AkovalevPerm","html_url":"https://github.com/AkovalevPerm","followers_url":"https://api.github.com/users/AkovalevPerm/followers","following_url":"https://api.github.com/users/AkovalevPerm/following{/other_user}","gists_url":"https://api.github.com/users/AkovalevPerm/gists{/gist_id}","starred_url":"https://api.github.com/users/AkovalevPerm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AkovalevPerm/subscriptions","organizations_url":"https://api.github.com/users/AkovalevPerm/orgs","repos_url":"https://api.github.com/users/AkovalevPerm/repos","events_url":"https://api.github.com/users/AkovalevPerm/events{/privacy}","received_events_url":"https://api.github.com/users/AkovalevPerm/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/AkovalevPerm/rfcs","description":"RFCs for changes to Flexberry","fork":true,"url":"https://api.github.com/repos/AkovalevPerm/rfcs","forks_url":"https://api.github.com/repos/AkovalevPerm/rfcs/forks","keys_url":"https://api.github.com/repos/AkovalevPerm/rfcs/keys{/key_id}","collaborators_url":"https://api.github.com/repos/AkovalevPerm/rfcs/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/AkovalevPerm/rfcs/teams","hooks_url":"https://api.github.com/repos/AkovalevPerm/rfcs/hooks","issue_events_url":"https://api.github.com/repos/AkovalevPerm/rfcs/issues/events{/number}","events_url":"https://api.github.com/repos/AkovalevPerm/rfcs/events","assignees_url":"https://api.github.com/repos/AkovalevPerm/rfcs/assignees{/user}","branches_url":"https://api.github.com/repos/AkovalevPerm/rfcs/branches{/branch}","tags_url":"https://api.github.com/repos/AkovalevPerm/rfcs/tags","blobs_url":"https://api.github.com/repos/AkovalevPerm/rfcs/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/AkovalevPerm/rfcs/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/AkovalevPerm/rfcs/git/refs{/sha}","trees_url":"https://api.github.com/repos/AkovalevPerm/rfcs/git/trees{/sha}","statuses_url":"https://api.github.com/repos/AkovalevPerm/rfcs/statuses/{sha}","languages_url":"https://api.github.com/repos/AkovalevPerm/rfcs/languages","stargazers_url":"https://api.github.com/repos/AkovalevPerm/rfcs/stargazers","contributors_url":"https://api.github.com/repos/AkovalevPerm/rfcs/contributors","subscribers_url":"https://api.github.com/repos/AkovalevPerm/rfcs/subscribers","subscription_url":"https://api.github.com/repos/AkovalevPerm/rfcs/subscription","commits_url":"https://api.github.com/repos/AkovalevPerm/rfcs/commits{/sha}","git_commits_url":"https://api.github.com/repos/AkovalevPerm/rfcs/git/commits{/sha}","comments_url":"https://api.github.com/repos/AkovalevPerm/rfcs/comments{/number}","issue_comment_url":"https://api.github.com/repos/AkovalevPerm/rfcs/issues/comments{/number}","contents_url":"https://api.github.com/repos/AkovalevPerm/rfcs/contents/{+path}","compare_url":"https://api.github.com/repos/AkovalevPerm/rfcs/compare/{base}...{head}","merges_url":"https://api.github.com/repos/AkovalevPerm/rfcs/merges","archive_url":"https://api.github.com/repos/AkovalevPerm/rfcs/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/AkovalevPerm/rfcs/downloads","issues_url":"https://api.github.com/repos/AkovalevPerm/rfcs/issues{/number}","pulls_url":"https://api.github.com/repos/AkovalevPerm/rfcs/pulls{/number}","milestones_url":"https://api.github.com/repos/AkovalevPerm/rfcs/milestones{/number}","notifications_url":"https://api.github.com/repos/AkovalevPerm/rfcs/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/AkovalevPerm/rfcs/labels{/name}","releases_url":"https://api.github.com/repos/AkovalevPerm/rfcs/releases{/id}","deployments_url":"https://api.github.com/repos/AkovalevPerm/rfcs/deployments","created_at":"2018-02-06T05:43:18Z","updated_at":"2018-02-02T09:11:21Z","pushed_at":"2018-02-16T05:36:38Z","git_url":"git://github.com/AkovalevPerm/rfcs.git","ssh_url":"git@github.com:AkovalevPerm/rfcs.git","clone_url":"https://github.com/AkovalevPerm/rfcs.git","svn_url":"https://github.com/AkovalevPerm/rfcs","homepage":null,"size":625,"stargazers_count":0,"watchers_count":0,"language":null,"has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":null,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"Flexberry:master","ref":"master","sha":"8df94bf2637a1344e49b7df67cd59c90279356e4","user":{"login":"Flexberry","id":8894761,"avatar_url":"https://avatars0.githubusercontent.com/u/8894761?v=4","gravatar_id":"","url":"https://api.github.com/users/Flexberry","html_url":"https://github.com/Flexberry","followers_url":"https://api.github.com/users/Flexberry/followers","following_url":"https://api.github.com/users/Flexberry/following{/other_user}","gists_url":"https://api.github.com/users/Flexberry/gists{/gist_id}","starred_url":"https://api.github.com/users/Flexberry/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Flexberry/subscriptions","organizations_url":"https://api.github.com/users/Flexberry/orgs","repos_url":"https://api.github.com/users/Flexberry/repos","events_url":"https://api.github.com/users/Flexberry/events{/privacy}","received_events_url":"https://api.github.com/users/Flexberry/received_events","type":"Organization","site_admin":false},"repo":{"id":118867804,"name":"rfcs","full_name":"Flexberry/rfcs","owner":{"login":"Flexberry","id":8894761,"avatar_url":"https://avatars0.githubusercontent.com/u/8894761?v=4","gravatar_id":"","url":"https://api.github.com/users/Flexberry","html_url":"https://github.com/Flexberry","followers_url":"https://api.github.com/users/Flexberry/followers","following_url":"https://api.github.com/users/Flexberry/following{/other_user}","gists_url":"https://api.github.com/users/Flexberry/gists{/gist_id}","starred_url":"https://api.github.com/users/Flexberry/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Flexberry/subscriptions","organizations_url":"https://api.github.com/users/Flexberry/orgs","repos_url":"https://api.github.com/users/Flexberry/repos","events_url":"https://api.github.com/users/Flexberry/events{/privacy}","received_events_url":"https://api.github.com/users/Flexberry/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Flexberry/rfcs","description":"RFCs for changes to Flexberry","fork":false,"url":"https://api.github.com/repos/Flexberry/rfcs","forks_url":"https://api.github.com/repos/Flexberry/rfcs/forks","keys_url":"https://api.github.com/repos/Flexberry/rfcs/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Flexberry/rfcs/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Flexberry/rfcs/teams","hooks_url":"https://api.github.com/repos/Flexberry/rfcs/hooks","issue_events_url":"https://api.github.com/repos/Flexberry/rfcs/issues/events{/number}","events_url":"https://api.github.com/repos/Flexberry/rfcs/events","assignees_url":"https://api.github.com/repos/Flexberry/rfcs/assignees{/user}","branches_url":"https://api.github.com/repos/Flexberry/rfcs/branches{/branch}","tags_url":"https://api.github.com/repos/Flexberry/rfcs/tags","blobs_url":"https://api.github.com/repos/Flexberry/rfcs/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Flexberry/rfcs/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Flexberry/rfcs/git/refs{/sha}","trees_url":"https://api.github.com/repos/Flexberry/rfcs/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Flexberry/rfcs/statuses/{sha}","languages_url":"https://api.github.com/repos/Flexberry/rfcs/languages","stargazers_url":"https://api.github.com/repos/Flexberry/rfcs/stargazers","contributors_url":"https://api.github.com/repos/Flexberry/rfcs/contributors","subscribers_url":"https://api.github.com/repos/Flexberry/rfcs/subscribers","subscription_url":"https://api.github.com/repos/Flexberry/rfcs/subscription","commits_url":"https://api.github.com/repos/Flexberry/rfcs/commits{/sha}","git_commits_url":"https://api.github.com/repos/Flexberry/rfcs/git/commits{/sha}","comments_url":"https://api.github.com/repos/Flexberry/rfcs/comments{/number}","issue_comment_url":"https://api.github.com/repos/Flexberry/rfcs/issues/comments{/number}","contents_url":"https://api.github.com/repos/Flexberry/rfcs/contents/{+path}","compare_url":"https://api.github.com/repos/Flexberry/rfcs/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Flexberry/rfcs/merges","archive_url":"https://api.github.com/repos/Flexberry/rfcs/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Flexberry/rfcs/downloads","issues_url":"https://api.github.com/repos/Flexberry/rfcs/issues{/number}","pulls_url":"https://api.github.com/repos/Flexberry/rfcs/pulls{/number}","milestones_url":"https://api.github.com/repos/Flexberry/rfcs/milestones{/number}","notifications_url":"https://api.github.com/repos/Flexberry/rfcs/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Flexberry/rfcs/labels{/name}","releases_url":"https://api.github.com/repos/Flexberry/rfcs/releases{/id}","deployments_url":"https://api.github.com/repos/Flexberry/rfcs/deployments","created_at":"2018-01-25T05:40:56Z","updated_at":"2018-02-02T09:11:21Z","pushed_at":"2018-02-16T05:50:05Z","git_url":"git://github.com/Flexberry/rfcs.git","ssh_url":"git@github.com:Flexberry/rfcs.git","clone_url":"https://github.com/Flexberry/rfcs.git","svn_url":"https://github.com/Flexberry/rfcs","homepage":null,"size":17,"stargazers_count":2,"watchers_count":2,"language":null,"has_issues":true,"has_projects":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":2,"mirror_url":null,"archived":false,"open_issues_count":1,"license":null,"forks":2,"open_issues":1,"watchers":2,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/Flexberry/rfcs/pulls/2"},"html":{"href":"https://github.com/Flexberry/rfcs/pull/2"},"issue":{"href":"https://api.github.com/repos/Flexberry/rfcs/issues/2"},"comments":{"href":"https://api.github.com/repos/Flexberry/rfcs/issues/2/comments"},"review_comments":{"href":"https://api.github.com/repos/Flexberry/rfcs/pulls/2/comments"},"review_comment":{"href":"https://api.github.com/repos/Flexberry/rfcs/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/Flexberry/rfcs/pulls/2/commits"},"statuses":{"href":"https://api.github.com/repos/Flexberry/rfcs/statuses/1be47189895ef4b5e8140b28cd5eea1d034cae4e"}},"author_association":"NONE"}}
{"actor":{"display_login":"bratchikov"}}