معماری

نمای کلی سامانه، مدل داده، طراحی چندارزی و الگوی احراز هویت.

نمای کلی سیستم

رابط کاربر در مرورگر  -->  وب‌اپ Next.js  -->  Postgres (RLS)
                            |                 ^
                            v                 |
                    سرویس احراز هویت ---------+
                            ^
                            |
              کلاینت‌های ماشینی از طریق API Gateway
                            ^
                            |
                Worker (گردآورنده‌های نرخ ارز) ---

پنج جزء، یک پایگاه داده:

  1. web — برنامهٔ Next.js با داشبوردهای رابط کاربری و مسیرهای API
  2. auth — ورود با کد یک‌بارمصرف ایمیلی و راه‌اندازی اولیهٔ عامل روی دامنهٔ احراز هویت
  3. sql-api — AWS Lambda پشت API Gateway برای کلاینت‌های ماشینی
  4. worker — واکشی روزانهٔ نرخ ارز از ECB، CBR و NBS
  5. Postgres — پایگاه دادهٔ واحد و مرجع نهایی داده‌ها با RLS

مدل داده

  • ledger_entries — یک ردیف برای هر گردش حساب، مثل درآمد، هزینه یا انتقال
  • budget_lines — سلول‌های بودجه به‌صورت فقط‌الحاقی که در تعارض، آخرین نوشتن ملاک است
  • budget_comments — یادداشت‌های فقط‌الحاقی متصل به سلول‌های بودجه
  • workspace_settings — ارز گزارش‌گیری و تنظیمات سطح فضای کاری
  • account_metadata — فرادادهٔ هر حساب، مانند طبقه‌بندی نقدشوندگی
  • exchange_rates — نرخ‌های روزانهٔ ارز که برای تبدیل در زمان خواندن به‌کار می‌روند
  • workspaces / workspace_members — جداسازی چندمستاجری
  • accounts — نمایی که از ledger_entries مشتق می‌شود

چندارزی

همهٔ مبلغ‌ها با ارز اصلی خودشان ذخیره می‌شوند. تبدیل به ارز گزارش‌گیری هنگام خواندن و از طریق اتصال‌های SQL با exchange_rates انجام می‌شود. هیچ پیش‌تبدیلِ اتلافی در کار نیست.

احراز هویت

رفتار احراز هویت با متغیر محیطی AUTH_MODE در دو حالت تنظیم می‌شود:

  • none — بدون احراز هویت، فقط یک فضای کاری محلی
  • cognito — ورود بدون گذرواژه با کد یک‌بارمصرف ایمیلی از طریق AWS Cognito، با ثبت‌نام آزاد

برای کلاینت‌های ماشینی، نقطهٔ شروع عمومی GET /v1/ است. راه‌اندازی عامل از کد یک‌بارمصرف ایمیلی روی دامنهٔ احراز هویت استفاده می‌کند، یک ApiKey بلندمدت برمی‌گرداند و بعد SQL را از طریق API ماشینیِ پشت API Gateway اجرا می‌کند.

هر کاربر یک فضای کاری ایزوله دارد. سیاست‌های RLS در همهٔ پرس‌وجوها، از جمله درخواست‌های SQL ماشینی، عضویت را بررسی می‌کنند.