Розробка

Репозиторій налаштовано для використання у середовищі NodeJS LTS-версій (від 16.3.0 або 18.x.x) разом із npm версій 8+. Основною мовою програмування є TypeScript. Сервіс працює на основі фреймворку NestJS, у якості серверного транспорту використовується express.js. Для тестування використовується Jest. Логування відбувається із застосуванням winston. Для оформлення стилю коду у якості додатковго інструменту використовується ESLint.

Для роботи із валідацією форм використовується пакет formiojs, версія якого має збігатися із версією, що використовується у репозиторії common-web-app.

Особливості конфігурації SonarQube

Для правильної роботи із Sonar у пайплайнах у коренів створено sonar-project.properties, який об’єднує основні налаштування із відповідних файлів у підпакетах, включно із винятками, а також перелічує потрібні шлях до вихідних кодів та тестів.

Оскільки існує значна частина коду, яка раніше була продубльована між порталами, то на момент створення репозиторію Sonar показував досить високий показник дублювання (понад 20%). У якості тимчасової міри більшість службових модулів порталів додано у винятки сканування на дублювання за допомогою директиви sonar.cpd.exclusions.

Також для виправлення проблеми із некоректною оцінкою покриття коду тестами через Sonar, яка була викликана збігом деякіх шляхів до файлів у рамках підпакетів використані додаткові налаштування для Jest у підпакетах, які вказують повні шляхи до файлів відносно монорепозиторію у згенерованих файлах coverage-звітів.

Конфігурація застосунку

Для конфігурації застосунку використовуються константи середовища, які в рамках коду доступні через звернення до process.env.CONSTANT_NAME. Константи формуються на основі змінних середовищ. Також налагоджено механізм, який додає константи, визначені у локальному файлі .env в корені репозиторію (за наявності такого файлу). Цей файл можна використовувати у локальному середовищі під час розробки. Приклад констант можна переглянути у файлі .env.example.

Перегляд ендпоінтів через Swagger

Для доступу до Swagger за замовчанням використовується адреса /swagger-ui. Оскільки передбачається, що поданий сервіс є внутрішнім та не є доступним для зовнішніх користувачів, то використання Swagger не потребує додаткової авторизації.

Алгоритм отримання та роботи із формами

Форми отримуються за ключем із відповідного сервісу form-provider, URL якого можна отримати із константи оточення FORM_PROVIDER_BASE_URL. У рамках запиту до цього сервісу наскрізь передається токен доступу, отриманий поточним сервісом з тіла заголовку X-Access-Token. Токен передається у заголовку з такою ж назвою. Валідація заголовку виконується поза кодом поточного сервісу.

Також для локальної розробки є можливість налаштувати використання локального набору копій форм ("замоканих" форм).

Перелік "замоканих" форм

Для того, щоби увімкнути режим використання "замоканих" форм замість посилання запитів на сервіс отримання форм необхідно налаштувати константу оточення USE_MOCKED_FORM_PROVIDER. Дані локальних форм присутні у файлі src/services/form-provider/mocked-forms-storage.ts у вигляді меппінгу, де ключами є ключі форм, а знченнями - безпосередньо об’єкти схем форм.

Модульні тести також використовують саме схеми форм з цього локального переліку.

Структура файлів проекту

В директорії src присутні такі дочірні директорії:

  • i18n - директорія, що містить файли перекладів рядків.

  • modules - директорія, що містить директорії модулів, в кожній з яких містяться файл модуля, файл контроллера, та, за потреби, додаткові файли із локальними типами або локальними сервісами, що доступні лише всередині відповідного модуля.

  • services - директорія сервсів, яка містить дочірні директорії, всередині кожної з яких присутній файл сервісу та, за потреби, додаткові файли з утилітами, визначеннями локальних типів тощо.

Модульні тести зазвичай розміщені поруч із модулями, що тестуються, та мають у своїй назві додатковий суффікс .test; тобто, для модуля example.ts файл тестів називатиметься example.test.ts.

Логування

Для логування використовується окремий допоміжний сервіс, який визначено як request-scoped та який приймає об’єкт даних про кожен запит при ініціалізації. Цей сервіс вбудовуються в ряд інших сервісів, що призводить до перестворення їх екземплярів при кожному запиті. Це необхідно для того, щоби при логуванні у об’єкти логів наскрізь передавались в тому числі службові заголовки як от X-B3-TraceId, X-B3-SpanId, X-Request-Id тощо.

Логи виводяться у стандартний буфер виводу у форматі однорядкового JSON, звідки вони зчитуються та обробляються відповідно налаштованими сервісами для обробки та збереження логів на кшталт Kibana.

Використання аліасів та файлів index.ts

Для налаштування аліасів використовується поле imports у файлі package.json. Це унеможливлює класичне використання файлів index.ts для реекспорту значень та типів із сусідніх модулів із скороченням шляху до модуля. Натомість для реекспорту використовуються аналогічні файли exports.ts.