При запуску проекту планувальник автоматично починає сканувати кожну сторінку цільового сайту предмет оновлення. Для цього попередньо з бази даних будуть вибрані останні зміні для кожної сторінки. Якщо в базі немає даних про сторінку з певним
sourceId, вона додається в список для оновлення. Якщо ж сторінка вже
була присутня в базі даних то порівнюється текст і в разі наявності відмінностей
заноситься до списку, який в рамках однієї транзакції заноситься в базу. Парсинг
відбувається POST запитом та за планувальником.Back-end сервіс лише віддає запарсені версії документів. Розраховується, що саме відображення відмінностей між версіями буде виконуватися на клієнтській стороні з використанням JavaScript бібліотек. Вибір SQLite зумовлений відсутністю окремого процесу бази даних, що зменшує накладні витрати і час відгуку.
Таблиця [documents]:
[sourceId] integer - первинний ключ, посилання типу
http://brovary-rada.gov.ua/documents/{sourceId}.html
[name] text - назва рішення міської ради
[deleted] datetime - дата виявлення видалення
Таблиця [versions]:
[id] integer - первинний ключ
[sourceId] integer - зовнішній ключ до таблиці [documents]
[text] text - текст рішення міської ради
[updated] datetime - дата виявлення останньої зміни
Налаштування автоматичного оновлення відбувається шляхом POST запиту до
контролера SheluderController. В тілі запиту необхідно
помістити значення, яке буде конвертовано в TimeSpan
([дні].[години]:[хвилини]:[секунди]):
POST /api/sheluder/update HTTP/1.1
Content-Type: application/json
"1.10:00:21"
За замовчуванням парсинг буде відбуватися кожні 3 години.
UpdateController.POST /api/update/all HTTP/1.1В ідеалі бажано дозволити дану функцію лише для авторизованих користувачів (OAuth, тощо). Доступ до збережених документів відбувається шляхом GET запиту до контролера
DocumentController.Доступ до списку з конкретних документів здійснюється GET запитом до
api/documents. Список можливих параметрів для масштабування: amount (int) - кількість документівpage (int) - сторінка (кількість пропущених елементів = amount * page)deleted (boolean) - документи, що помічені, як видаленіinclVers (boolean) - чи необхідно повернути версії документуДоступ до конкретного документу, враховуючи повну історію змін здійснюється GET запитом до
api/documents/{sourceId}
Клієнтська частина побудована з використанням Angular2. При вибірці документу
будуть підвантажені його версії. Для відображення явних розрізнень у версіях
використовується бібліотека google-diff-match-patch.
Запуск був успішно виконаний на Linux-контейнері. За основу Dockerfile було взято
1.1.2-jessie.
Порядок команд для відновлення проекту: 1. dotnet restore Devchallenge_semifinal.sln - відновлення NuGet-пакетів.
2. dotnet publish Devchallenge_semifinal.sln - компіляція проекту (вихідні файли використвуватимуться в контейнері)
3. docker-compose build - створення та налаштування контейнера (node.js, npm install)
3. docker-compose up AngleSharp, google-diff-match-patch, Quartz.NET