Архітектура

Огляд системи, модель даних, мультивалютна схема і модель автентифікації.

Огляд системи

Інтерфейс у браузері  -->  Next.js вебзастосунок  -->  Postgres (RLS)
                              |                          ^
                              v                          |
                    Сервіс автентифікації ---------------+
                              ^
                              |
              Машинні клієнти через API Gateway
                              ^
                              |
                Worker (оновлення курсів FX) ------------

Архітектура складається з п'яти компонентів, які працюють з однією базою даних:

  1. web — застосунок на Next.js з вебінтерфейсом і API-маршрутами
  2. auth — сервіс входу за одноразовим кодом, надісланим електронною поштою, і початкового підключення агентів через домен автентифікації
  3. sql-api — AWS Lambda за API Gateway, через яку працюють машинні клієнти
  4. worker — процес, що щодня завантажує валютні курси з ECB, CBR і NBS
  5. Postgres — єдине джерело істини з безпекою на рівні рядків

Модель даних

  • ledger_entries — один рядок на кожен рух коштів за рахунком: дохід, витрату або переказ
  • budget_lines — бюджетні комірки з моделлю append-only; під час читання використовується останній запис
  • budget_comments — примітки до бюджетних комірок, які також зберігаються у форматі append-only
  • workspace_settings — валюта звітності й налаштування на рівні робочого простору
  • account_metadata — метадані окремих рахунків, наприклад класифікація ліквідності
  • exchange_rates — щоденні валютні курси, які використовуються для конвертації під час виконання запиту
  • workspaces / workspace_members — ізоляція між окремими робочими просторами
  • accounts — подання, сформоване на основі записів у журналі операцій

Мультивалютність

Усі суми зберігаються у вихідній валюті. Перерахунок у валюту звітності відбувається під час читання через SQL JOIN з exchange_rates. Попередня конвертація, яка могла б призвести до втрати точності, не використовується.

Автентифікація

Режим автентифікації визначається змінною середовища AUTH_MODE:

  • none — без автентифікації, з одним локальним робочим простором
  • cognito — безпарольний вхід через одноразовий код, надісланий електронною поштою, у AWS Cognito з відкритою реєстрацією

Для машинних клієнтів публічною точкою входу для виявлення сервісу є GET /v1/. Початкове підключення агентів відбувається на домені автентифікації за одноразовим кодом, надісланим електронною поштою: у відповідь клієнт отримує довгоживучий ApiKey, після чого виконує SQL через машинний API за API Gateway.

Кожен користувач отримує ізольований робочий простір. Політики RLS перевіряють належність до нього в кожному запиті, зокрема і для SQL-запитів, що надходять через машинний інтерфейс.