Телеграм бот. Нотатки. Стаді плани. Архітектура. Вебсокети. Част. 3

Вступ

Продовження розробки телеграм бота з попередніх частин. Там ми мінімально налаштовували середовище, а зараз детальніше про саму ідею.

Ідея

Цей телеграм-бот створений для агрегації, структурування та аналізу даних. Він дозволяє користувачам створювати та організовувати нотатки у вигляді тематичних "релмів" і отримувати аналітику щодо їхнього користування. Крім того, користувачі можуть створювати навчальні плани, розподіляючи час і теми для вивчення, і отримувати звіти про свій прогрес.

Архітектура

  • Notes CRUD

Через Telegram користувач може створювати, видаляти та переглядати створені нотатки. Щоб відредагувати якусь, він вибирає нотатку і йому генерується унікальна лінка на сторінку, де він може переглянути нотатку повністю та за потреби її відредагувати.

  • Web / WebSocket

При відкритті цієї сторінки, встановлюється WebSocket з’єднанням сервером, щоб будь-які зміни тексту були надіслані та збережені у Redis.

Після закриття WebSocket сесії, всі зміни по нотатці будуть збережені в основну базу до сутності.

Для чого Redis? Для відмовостійкості, розподіленості та для зменшення навантаження на основну БД — PostgreSQL (у випадку достатньої активності з боку юзерів, на початку звісно в цьому немає великої потреби. Це так, чисто щоб спробувати якісь дизайн-рішення)

  • PostgreSQL

Телеграм-користувачі, нотатки, інша інформація.

Трохи коду

Яким чином при відкритті вебсокет сесії ми розуміємо що це за юзер та нотатка?

  • MVC Controller

@GetMapping("/note/{uniqueNoteId}/edit")
public ModelAndView editNote(@PathVariable String uniqueNoteId, ModelAndView modelAndView) {
    Note note = noteRepository.getNoteByUniqueLinkId(uniqueNoteId).orElseThrow();
    modelAndView.addObject("note", note);
    modelAndView.setViewName("editNote");
    return modelAndView;
}

За допомогою Thymeleaf, ми повертаємо шаблон з нашим об’єктом Note.
Коли юзер дістає нотатку по ID, генерується URL посилання виду:

http://example.com/note/sdgf4yhrt/edit
  • editNote.html

let userId = /*[[${note.userId}]]*/ 'defaultId';
sock = new SockJS('/init?userId=' + encodeURIComponent(userId));

Я встановлюю WebSocket сесію по відповідному ендпоінту передаючи userId з отриманого об’єкта Note.

  • Зміни тексту нотатки

При будь-яких змінах, надсилаються дані про нотатку. Де ми це все обробляємо і зберігаємо у Redis.

document.getElementById('noteTextArea').addEventListener('input', function(event) {
    const message = {
        qualifier: 'UpdateNote',
        noteId: /*[[${note.id}]]*/ 'defaultNoteId',
        userIdentifier: /*[[${note.userId}]]*/ 'defaultUserId',
        correlationId: generateUUID(),
        noteText: event.target.value,
    };
    sendMessage(message);
});

Що далі?

Далі, розробка по визначеній роадмапі та покращення функціоналу і процесу CI/CD. У наступній частині я б хотів розкрити — встановлення Kubernetes і якісь мінімальні речі з оркестрацією наших контейнерів.

Поділись своїми ідеями в новій публікації.
Ми чекаємо саме на твій довгочит!
Oleksandr Klymenko
Oleksandr Klymenko@overpathz

Java Software Engineer

2.9KПрочитань
1Автори
53Читачі
На Друкарні з 19 квітня

Більше від автора

  • Java. Повний огляд мережевих моделей. Socket API, forking, non-blocking sockets, event-driven API

    Хоча сокет - це один файловий дескриптор, він є двонаправленим каналом комунікації, який використовується для одночасного відправлення і отримання даних. Операційна система та мережеві протоколи забезпечують управління потоками даних, що дозволяє коректно розрізняти дані

    Теми цього довгочиту:

    Java
  • Java. WebSocket. Spring WebSocket

    Сервер в свою чергу повертає відповідь із 101 статус кодом — що так, давай змінимо протокол між тобою і мною. Тепер будемо використовувати вебсокети. Потім, після з’єднання, я розсилаю всім клієнтам інфомацію про нового користуча (і собі також, не робив додаткових перевірок).

    Теми цього довгочиту:

    Java
  • Телеграм бот. PostgreSQL, docker-compose, .env, DockerHub. Част. 2

    В попередній частині я купив сервер, створив телеграм бота та успішно задеплоїв його на віддаленій машині. Але, кому потрібен бот, який не вміє працювати з даними? Тому, поділюсь як я розширив бота та конфігурацію, додавши PostgreSQL.

    Теми цього довгочиту:

    Java

Вам також сподобається

Коментарі (0)

Підтримайте автора першим.
Напишіть коментар!

Вам також сподобається