{
  "title": "User Service",
  "slug": "team/backend/services/user-service",
  "url": "/docs/team/backend/services/user-service",
  "frontmatter": {},
  "sections": [
    {
      "level": 1,
      "heading": "User Service",
      "content": "**User Service Blueprint**\n\n> **مستند رسمی معماری، مرزهای مسئولیت و تعاملات سرویس مدیریت پروفایل کاربر**\n\n---"
    },
    {
      "level": 2,
      "heading": "فهرست محتوا",
      "content": "1. [هدف و دامنه سرویس](#۱-هدف-و-دامنه-سرویس)\n2. [موارد خارج از مسئولیت](#۲-موارد-خارج-از-مسئولیت)\n3. [مدل شناسه کاربر](#۳-مدل-شناسه-کاربر)\n4. [Public ID](#۴-public-id)\n5. [Username System](#۵-username-system)\n6. [Username Generator](#۶-username-generator)\n7. [Username Registry](#۷-username-registry)\n8. [Default Avatar System](#۸-default-avatar-system)\n9. [مدل داده پروفایل](#۹-مدل-داده-پروفایل)\n10. [Display Name](#۱۰-display-name)\n11. [Preferences](#۱۱-preferences)\n12. [User Status](#۱۲-user-status)\n13. [Onboarding Boundary](#۱۳-onboarding-boundary)\n14. [Event Flow](#۱۴-event-flow)\n15. [رویدادهای خروجی](#۱۵-رویدادهای-خروجی)\n16. [تغییر Username](#۱۶-تغییر-username)\n17. [Audit Log](#۱۷-audit-log)\n18. [Profile Change Policy](#۱۸-profile-change-policy)\n19. [Database Ownership](#۱۹-database-ownership)\n20. [قراردادهای API](#۲۰-قراردادهای-api)\n21. [Security Rules](#۲۱-security-rules)\n22. [معماری ران‌تایم و دیاگرام](#۲۲-معماری-رانتایم-و-دیاگرام)\n23. [آینده توسعه](#۲۳-آینده-توسعه)\n\n---"
    },
    {
      "level": 2,
      "heading": "۱. هدف و دامنه سرویس",
      "content": "**Service Objective**\n\nUser Service مسئول مدیریت اطلاعات مرتبط با **تجربه کاربری و پروفایل** در پلتفرم NONS است.\n\nاین سرویس منبع حقیقت (Source of Truth) برای موارد زیر است:\n\n| حوزه | توضیح |\n|------|-------|\n| **پروفایل کاربر** | اطلاعات نمایشی هویت کاربر در پلتفرم |\n| **شناسه عمومی (Public ID)** | شناسه قابل انتشار برای کاربر |\n| **Username** | شناسه انسانی برای تعاملات اجتماعی |\n| **Avatar** | تصویر نمایشی پیشفرض و شخصی |\n| **تنظیمات شخصی** | ترجیحات ارز، زبان و تم |\n| **اطلاعات نمایشی** | Display Name و داده‌های عمومی پروفایل |\n\n**قانون کلی معماری:**\n\n```\nAuth Service  → «این شخص کیست؟»\nUser Service  → «این شخص چگونه نمایش داده شود؟»\nIAM Service   → «این شخص چه کاری اجازه دارد انجام دهد؟»\nBilling       → «این شخص چه سطح خدماتی دارد؟»\n```\n\n---"
    },
    {
      "level": 2,
      "heading": "۲. موارد خارج از مسئولیت",
      "content": "**Non-Responsibilities**\n\nUser Service مالک موارد زیر نیست و نباید آن‌ها را ذخیره کند:"
    },
    {
      "level": 3,
      "heading": "Authentication",
      "content": "**مالک:** Auth Service / Ory Kratos\n\nشامل: ایمیل (به عنوان identifier)، رمز عبور، Magic Code، Google Login، Session، Identity Verification"
    },
    {
      "level": 3,
      "heading": "Authorization",
      "content": "**مالک:** IAM Service\n\nشامل: Role، Permission، Access Policy"
    },
    {
      "level": 3,
      "heading": "Subscription",
      "content": "**مالک:** Billing Service\n\nشامل: Plan، Payment، Subscription Status"
    },
    {
      "level": 3,
      "heading": "Onboarding Flow",
      "content": "**مالک:** IAM Service\n\nUser Service فقط **اطلاعات نمایشی مورد نیاز UI** را از IAM دریافت یا Sync می‌کند.\n\n---"
    },
    {
      "level": 2,
      "heading": "۳. مدل شناسه کاربر",
      "content": "**Identity Model**\n\nبرای جلوگیری از وابستگی مستقیم به سیستم احراز هویت، سه سطح شناسه تعریف شده است:\n\n| شناسه | مالک | تغییرپذیری | کاربرد |\n|-------|------|------------|--------|\n| **Internal UUID** | User Service | خیر (Immutable) | ارتباطات داخلی و دیتابیس |\n| **Public ID** | User Service | خیر (Immutable) | نمایش عمومی، لینک، چت |\n| **Username** | User Service | بله (Mutable) | تعامل انسانی |\n\n> **نکته:** UUID داخلی هرگز در API عمومی نمایش داده نمی‌شود. Public ID تنها شناسه عمومی کاربر است.\n\n---"
    },
    {
      "level": 2,
      "heading": "۴. Public ID",
      "content": "**Public Identifier**"
    },
    {
      "level": 3,
      "heading": "هدف",
      "content": "شناسه عمومی قابل انتشار برای کاربر — جایگزین ایمن UUID داخلی در فضای عمومی.\n\n```\nid483920183\n```\n\nاستفاده:\n\n```\nnons.app/u/id483920183\nchat/user/id483920183\n```"
    },
    {
      "level": 3,
      "heading": "خصوصیات",
      "content": "- **Unique** — در سطح پلتفرم یکتا است\n- **Immutable** — پس از ایجاد قابل تغییر نیست\n- **بدون ارتباط مستقیم** با UUID دیتابیس"
    },
    {
      "level": 3,
      "heading": "تولید",
      "content": "Public ID هنگام ایجاد پروفایل، پس از دریافت رویداد `nons.auth.user.registered` از Auth Service تولید می‌شود:\n\n```mermaid\nsequenceDiagram\n    participant Auth as Auth Service\n    participant NATS as NATS JetStream\n    participant User as User Service\n\n    Auth->>NATS: publish nons.auth.user.registered\n    NATS->>User: consume event\n    User->>User: Generate Public ID\n    User->>User: Create Profile\n```\n\n---"
    },
    {
      "level": 2,
      "heading": "۵. Username System",
      "content": "**Username System**\n\nUsername یک **شناسه انسانی** برای تعاملات اجتماعی در پلتفرم است.\n\n```\nnight_fox\npixel_star\nblue_wave\n```"
    },
    {
      "level": 3,
      "heading": "کاربرد",
      "content": "- چت و پیام‌رسانی\n- پروفایل عمومی\n- جستجوی کاربر\n- نمایش عمومی"
    },
    {
      "level": 3,
      "heading": "قوانین",
      "content": "| قانون | توضیح |\n|-------|-------|\n| **Unique** | در سطح پلتفرم یکتا است |\n| **مستقل از ایمیل** | هیچ ارتباطی به ایمیل کاربر ندارد |\n| **قابل تغییر** | کاربر می‌تواند آن را تغییر دهد |\n| **فاقد اطلاعات حساس** | نباید شامل ایمیل، UUID یا اطلاعات شخصی باشد |\n\n---"
    },
    {
      "level": 2,
      "heading": "۶. Username Generator",
      "content": "**Username Generator**\n\nبرای کاربر جدید، سیستم به صورت خودکار Username ایجاد می‌کند.\n\n**منبع تولید:** Pool Service (مواد اولیه تولید — `adjectives` / `nouns`) — ر.ک. [Pool Service Blueprint](./pool-service/blueprint.md)\n\n> **تصمیم معماری (D2):** Username Registry دیگر منبع تولید Username نیست. تولید (Generator) از داده‌های موجود در Pool Service توسط همین سرویس (Consumer) انجام می‌شود؛ Registry صرفاً مالک یکتایی، رزرو، انتقال مالکیت و Audit است.\n\n**الگو:**\n\n```\nadjective + noun + number\n```\n\n**نمونه خروجی:**\n\n```\nsilent_fox_381\nbright_star_921\ndark_wolf_047\n```\n\nفرآیند تولید:\n1. انتخاب تصادفی صفت از لیست مصوب\n2. انتخاب تصادفی اسم از لیست مصوب\n3. افزودن عدد تصادفی (۳ رقمی)\n4. بررسی یکتایی در `username_registry`\n5. در صورت تکرار، بازتولید\n\n---"
    },
    {
      "level": 2,
      "heading": "۷. Username Registry",
      "content": "**Username Registry**\n\n> **تصمیم معماری (D2):** Registry **منبع تولید نیست**؛ تنها مالک یکتایی، رزرو (Reservation)، آزادسازی (Release)، انتقال مالکیت و Audit است. مواد اولیه تولید از Pool Service تأمین می‌شود.\n\nجدول مدیریت یکتایی و وضعیت Usernameها."
    },
    {
      "level": 3,
      "heading": "جدول: `username_registry`",
      "content": "| Field | Type | توضیح |\n|-------|------|-------|\n| `id` | UUID | کلید اصلی |\n| `username` | VARCHAR | مقدار نام کاربری |\n| `status` | ENUM | `AVAILABLE` / `RESERVED` / `USED` |\n| `source` | ENUM | `SYSTEM` (سیستمی) / `USER` (انتخاب کاربر) |\n| `created_at` | TIMESTAMPTZ | زمان ایجاد |"
    },
    {
      "level": 3,
      "heading": "هدف",
      "content": "- **جلوگیری از تکرار** — هر Username فقط یک بار در پلتفرم استفاده می‌شود\n- **رزرو نام‌های سیستمی** — نام‌های خاص از دسترس عموم خارج می‌شوند\n- **مدیریت blacklist** — نام‌های نامناسب با وضعیت `RESERVED` مسدود می‌شوند\n\n---"
    },
    {
      "level": 2,
      "heading": "۸. Default Avatar System",
      "content": "**Default Avatar System**\n\nکاربر جدید پیش از انتخاب Avatar شخصی، یک تصویر پیشفرض دریافت می‌کند.\n\n```\navatar_default_01\navatar_default_02\n```"
    },
    {
      "level": 3,
      "heading": "جدول: `avatar_registry`",
      "content": "| Field | Type | توضیح |\n|-------|------|-------|\n| `id` | UUID | کلید اصلی |\n| `asset_url` | TEXT | آدرس تصویر در Storage |\n| `type` | ENUM | `DEFAULT` / `CUSTOM` |\n| `status` | ENUM | `ACTIVE` / `INACTIVE` |\n\n---"
    },
    {
      "level": 2,
      "heading": "۹. مدل داده پروفایل",
      "content": "**User Profile Data Model**"
    },
    {
      "level": 3,
      "heading": "جدول: `users`",
      "content": "```json\n{\n  \"id\": \"uuid\",\n  \"public_id\": \"id483920183\",\n  \"username\": \"silent_fox_381\",\n  \"display_name\": null,\n  \"avatar_id\": \"default_01\",\n  \"preferences\": {\n    \"currency\": \"USD\",\n    \"theme\": \"system\",\n    \"language\": \"fa\"\n  },\n  \"status\": \"ACTIVE\",\n  \"created_at\": \"timestamp\",\n  \"updated_at\": \"timestamp\"\n}\n```"
    },
    {
      "level": 3,
      "heading": "توضیح فیلدها",
      "content": "| Field | Type | توضیح |\n|-------|------|-------|\n| `id` | UUID | کلید اصلی داخلی — هرگز عمومی نمی‌شود |\n| `public_id` | VARCHAR | شناسه عمومی — تنها شناسه قابل نمایش |\n| `username` | VARCHAR | شناسه انسانی — یکتا و قابل تغییر |\n| `display_name` | VARCHAR | نام نمایشی اختیاری |\n| `avatar_id` | VARCHAR | ارجاع به `avatar_registry` |\n| `preferences` | JSONB | تنظیمات شخصی کاربر |\n| `status` | ENUM | وضعیت حساب کاربری |\n| `created_at` | TIMESTAMPTZ | زمان ایجاد |\n| `updated_at` | TIMESTAMPTZ | آخرین بروزرسانی |\n\n---"
    },
    {
      "level": 2,
      "heading": "۱۰. Display Name",
      "content": "**Display Name**\n\nDisplay Name با Username متفاوت است و برای نمایش نام واقعی یا انتخابی کاربر استفاده می‌شود.\n\n| فیلد | نمونه |\n|------|-------|\n| **Username** | `night_fox` |\n| **Display Name** | `Ali Mohammadi` |"
    },
    {
      "level": 3,
      "heading": "خصوصیات",
      "content": "- **خصوصی‌تر** از Username — ممکن است در همه جا نمایش داده نشود\n- **قابل تغییر** — کاربر هر زمان می‌تواند آن را ویرایش کند\n- **اختیاری** — در صورت عدم تنظیم، Username جایگزین می‌شود\n- **برای نمایش داخل پروفایل** و تعاملات مستقیم\n\n---"
    },
    {
      "level": 2,
      "heading": "۱۱. Preferences",
      "content": "**User Preferences**\n\nUser Service مالک تنظیمات شخصی کاربر است:\n\n```json\n{\n  \"currency\": \"USD\",\n  \"theme\": \"dark\",\n  \"language\": \"fa\"\n}\n```\n\n| Preference | مقادیر مجاز | پیشفرض |\n|------------|------------|--------|\n| `currency` | `IRR`, `USD`, `TRY` | `IRR` |\n| `theme` | `light`, `dark`, `system` | `system` |\n| `language` | `fa`, `en`, `tr` | `fa` |\n\n---"
    },
    {
      "level": 2,
      "heading": "۱۲. User Status",
      "content": "**User Status**\n\nوضعیت حساب کاربری (نه وضعیت دسترسی):\n\n| Status | توضیح |\n|--------|-------|\n| `ACTIVE` | حساب فعال و عادی |\n| `PENDING` | در انتظار تکمیل پروفایل |\n| `SUSPENDED` | حساب معلق (توسط ادمین) |\n| `DELETED` | حساب حذف‌شده (Soft Delete) |\n\n> **تصمیم معماری (D7):** این `status` صرفاً **بازتاب‌دهنده** وضعیتی است که توسط **IAM / Onboarding** تعیین می‌شود؛ User Service مالک چرخه انتقال (`PENDING → ACTIVE`) نیست و آن را مدیریت نمی‌کند. هنگام ایجاد پروفایل، مقدار اولیه مستقیماً `ACTIVE` در نظر گرفته می‌شود.\n\n> **مهم:** وضعیت **دسترسی** (ban, suspend برای دلایل امنیتی) توسط **IAM Service** مدیریت می‌شود. این `status` صرفاً وضعیت خود حساب پروفایل است.\n\n---"
    },
    {
      "level": 2,
      "heading": "۱۳. Onboarding Boundary",
      "content": "**Onboarding Boundary**\n\nOnboarding در User Service **مدیریت نمی‌شود**.\n\n**مالک:** IAM Service (یا سرویس Onboarding)\n\n> **تصمیم معماری (D6):** State Machine مربوط به Onboarding در سرویس Onboarding/IAM است و User Service صرفاً یک **Projection** (نمایش) از آن را نگهداری می‌کند. حذف State Machine از User Service صحیح است.\n\nUser Service فقط وضعیت Onboarding را از IAM **دریافت یا Sync می‌کند**:\n\n```\nonboarding_status:\n  NEW\n  PROFILE_REQUIRED\n  COMPLETED\n```\n\nاین مقدار از IAM خوانده می‌شود و User Service هیچ تصمیمی درباره مراحل Onboarding نمی‌گیرد.\n\n---"
    },
    {
      "level": 2,
      "heading": "۱۴. Event Flow",
      "content": "**Event Flow — ایجاد کاربر**\n\n```mermaid\nsequenceDiagram\n    autonumber\n    participant Auth as Auth Service\n    participant NATS as NATS JetStream\n    participant User as User Service\n    participant DB as User DB (PostgreSQL)\n\n    Auth->>NATS: nons.auth.user.registered { user_id }\n    NATS->>User: consume event\n    User->>User: 1. Generate Public ID\n    User->>User: 2. Generate Username (via Registry)\n    User->>User: 3. Assign Default Avatar\n    User->>DB: 4. Insert User Profile\n    User->>NATS: publish nons.user.profile.created\n```\n\n**مراحل پردازش User Service پس از دریافت رویداد:**\n\n1. دریافت رویداد `nons.auth.user.registered`\n2. ساخت Public ID یکتا\n3. ساخت Username از طریق Username Generator\n4. اختصاص Default Avatar\n5. ایجاد Profile در دیتابیس\n6. انتشار رویداد `nons.user.profile.created`\n\n---"
    },
    {
      "level": 2,
      "heading": "۱۵. رویدادهای خروجی",
      "content": "**Outgoing Events**\n\nتمام رویدادها مطابق استاندارد `ADR-EVENT-001` در دامنه `user` تعریف می‌شوند."
    },
    {
      "level": 3,
      "heading": "`nons.user.profile.created`",
      "content": "**زمان:** ایجاد پروفایل کاربر پس از ثبت‌نام\n\n```json\n{\n  \"user_id\": \"uuid\",\n  \"public_id\": \"id483920183\",\n  \"username\": \"silent_fox_381\",\n  \"created_at\": \"timestamp\"\n}\n```\n\n**Consumers:** IAM Service، Notification Service\n\n---"
    },
    {
      "level": 3,
      "heading": "`nons.user.profile.changed`",
      "content": "**زمان:** تغییر هر یک از فیلدهای اطلاعات پروفایل\n\n```json\n{\n  \"user_id\": \"uuid\",\n  \"changed_fields\": [\"display_name\", \"avatar_id\"]\n}\n```\n\n**Consumers:** Notification Service، Search Service\n\n---"
    },
    {
      "level": 3,
      "heading": "`nons.user.username.changed`",
      "content": "**زمان:** تغییر Username کاربر (توسط خود کاربر یا ادمین)\n\n```json\n{\n  \"public_id\": \"id483920183\",\n  \"old_username\": \"silent_fox_381\",\n  \"new_username\": \"bright_wolf_204\",\n  \"changed_at\": \"timestamp\"\n}\n```\n\n**Consumers:** Search Service، Notification Service، Activity Service، Audit Service\n\n> **تصمیم معماری (D10):** تغییر Username از طریق این رویداد اختصاصی منتشر می‌شود. رویداد `nons.user.profile.changed` دیگر فیلد `username` را در `changed_fields` منتشر نمی‌کند (جلوگیری از انتشار دوگانه یک تغییر — ر.ک. قانون ۵).\n\n---"
    },
    {
      "level": 3,
      "heading": "رویدادهای مصرف‌شده توسط User Service",
      "content": "| رویداد | Publisher | عکس‌العمل |\n|--------|-----------|----------|\n| `nons.auth.user.registered` | Auth Service | ایجاد پروفایل کاربر |\n\n---"
    },
    {
      "level": 2,
      "heading": "۱۶. تغییر Username",
      "content": "**Username Change Flow**\n\n```mermaid\nflowchart TD\n    A[درخواست تغییر Username] --> B[Validation ورودی]\n    B --> C{بررسی username_registry}\n    C -- موجود است / رزرو --> D[رد درخواست]\n    C -- آزاد است --> E[بروزرسانی users]\n    E --> F[بروزرسانی username_registry]\n    F --> G[ثبت در profile_audit_log]\n    G --> H[تایید تغییر]\n```"
    },
    {
      "level": 3,
      "heading": "قوانین",
      "content": "| قانون | توضیح |\n|-------|-------|\n| **Unique Check** | یکتایی در `username_registry` بررسی شود |\n| **Blacklist Check** | Username رزرو شده یا ممنوع (از Pool Service) قبول نشود |\n| **Policy Check** | محدودیت‌های تغییر (تعداد مجاز در سال، Cooldown، حداقل عمر حساب) توسط **IAM Policy Engine** اعمال می‌شود — ر.ک. [IAM Service](./iam-service.md) (تصمیم D8) |\n| **Audit Required** | هر تغییر در `profile_audit_log` ثبت شود |\n| **Old Username** | پس از تغییر، وضعیت قبلی به `AVAILABLE` برگردد |\n\n---"
    },
    {
      "level": 2,
      "heading": "۱۷. Audit Log",
      "content": "**Audit Log**\n\nبرای تغییرات مهم پروفایل، یک ردپای کامل نگهداری می‌شود."
    },
    {
      "level": 3,
      "heading": "جدول: `profile_audit_log`",
      "content": "| Field | Type | توضیح |\n|-------|------|-------|\n| `id` | UUID | کلید اصلی |\n| `user_id` | UUID | FK به `users.id` |\n| `action` | VARCHAR | نوع عملیات |\n| `old_value` | JSONB | مقدار قبل از تغییر |\n| `new_value` | JSONB | مقدار بعد از تغییر |\n| `actor` | VARCHAR | کاربر یا سرویس انجام‌دهنده |\n| `created_at` | TIMESTAMPTZ | زمان ثبت |"
    },
    {
      "level": 3,
      "heading": "موارد ثبت‌شده",
      "content": "- تغییر Username\n- تغییر Avatar\n- بروزرسانی پروفایل (display_name)\n- تغییر وضعیت Status\n\n---"
    },
    {
      "level": 2,
      "heading": "۱۸. Profile Change Policy",
      "content": "**Profile Change Policy**\n\n| نوع تغییر | روش | Audit |\n|-----------|-----|-------|\n| **تغییرات شخصی** (display_name, avatar, preferences) | مستقیم ثبت می‌شوند | دارد |\n| **تغییر Username** | از طریق Registry Check + تایید پالیسی IAM | دارد |\n\n> **تصمیم معماری (D8):** محدودیت تغییر Username (مثلاً `max_changes_per_year`، `cooldown_days`، `minimum_account_age`) توسط **IAM Policy Engine** تعریف و اعمال می‌شود. User Service صرفاً نتیجه بررسی پالیسی IAM را اجرا می‌کند و خودش محدودیتی را هاردکد نمی‌کند.\n\n> **تصمیم معماری (D9):** همین سیاست (cooldown، rate_limit، quota) برای تغییر Avatar نیز توسط IAM اعمال می‌شود.\n\n> **آینده:** امکان اضافه شدن Approval Flow برای تغییرات حساس در فازهای بعدی وجود دارد.\n\n---"
    },
    {
      "level": 2,
      "heading": "۱۹. Database Ownership",
      "content": "**Database Ownership**\n\nUser Service یک **دیتابیس مستقل PostgreSQL** دارد و مالک آن است."
    },
    {
      "level": 3,
      "heading": "جداول متعلق به User Service",
      "content": "| جدول | توضیح |\n|------|-------|\n| `users` | پروفایل اصلی کاربر |\n| `username_registry` | مدیریت یکتایی Username‌ها |\n| `avatar_registry` | لیست Avatar‌های پیشفرض و سفارشی |\n| `profile_audit_log` | تاریخچه تغییرات |"
    },
    {
      "level": 3,
      "heading": "جداول ممنوع",
      "content": "User Service **نباید** موارد زیر را ذخیره کند:\n\n- `password` / Credentials\n- `email` (به عنوان identifier)\n- Role / Permission\n- Billing / Subscription data\n- Session / Token\n\n---"
    },
    {
      "level": 2,
      "heading": "۲۰. قراردادهای API",
      "content": "**API Contracts**\n\nتمامی مسیرها با پیشوند `/v1/users` ارائه می‌شوند."
    },
    {
      "level": 3,
      "heading": "Profile Endpoints",
      "content": "| Method | Path | توضیح |\n|--------|------|-------|\n| `GET` | `/v1/users/{publicId}` | دریافت پروفایل عمومی کاربر با Public ID |\n| `GET` | `/v1/users/me` | دریافت پروفایل کاربر جاری (احراز هویت‌شده) |\n| `PATCH` | `/v1/users/me/profile` | بروزرسانی اطلاعات پروفایل |\n| `PATCH` | `/v1/users/me/preferences` | بروزرسانی تنظیمات شخصی |\n| `PATCH` | `/v1/users/me/username` | تغییر Username |\n| `PATCH` | `/v1/users/me/avatar` | تغییر Avatar |"
    },
    {
      "level": 3,
      "heading": "فرمت پاسخ‌ها",
      "content": "مطابق با استاندارد پلتفرم (ر.ک. `standard/api-response-format`):\n\n```json\n// GET /v1/users/{publicId} → 200\n{\n  \"data\": {\n    \"public_id\": \"id483920183\",\n    \"username\": \"silent_fox_381\",\n    \"display_name\": \"Ali Mohammadi\",\n    \"avatar_url\": \"https://cdn.nons.app/avatars/default_01.png\"\n  }\n}\n```\n\n```json\n// PATCH /v1/users/me/profile → 200\n{\n  \"data\": {\n    \"public_id\": \"id483920183\",\n    \"display_name\": \"Ali Mohammadi\",\n    \"updated_at\": \"2026-06-22T00:00:00Z\"\n  }\n}\n```\n\n```json\n// خطای Username تکراری → 409\n{\n  \"error\": {\n    \"code\": \"USERNAME_ALREADY_TAKEN\",\n    \"message\": \"The requested username is not available\",\n    \"details\": []\n  }\n}\n```\n\n---"
    },
    {
      "level": 2,
      "heading": "۲۱. Security Rules",
      "content": "**Security Rules**\n\n| قانون | توضیح |\n|-------|-------|\n| **UUID محرمانه** | UUID داخلی هرگز در API عمومی نمایش داده نمی‌شود |\n| **فقط Public ID** | Public ID تنها شناسه قابل انتشار کاربر است |\n| **عدم ذخیره Email** | Email ذخیره نمی‌شود مگر با تصمیم معماری جدید |\n| **Username Validation** | اعتبارسنجی Username برای جلوگیری از XSS و Injection اجباری است |\n| **Audit Mandatory** | همه تغییرات حساس باید در Audit Log ثبت شوند |\n\n---"
    },
    {
      "level": 2,
      "heading": "۲۲. معماری ران‌تایم و دیاگرام",
      "content": "**Runtime Architecture**\n\n```mermaid\ngraph TD\n    Client[كلاينت] -->|GET /v1/users/:id| GW[Traefik Gateway]\n    GW -->|ForwardAuth /v1/auth/validate| AuthSvc[Auth Service]\n    AuthSvc -->|200 + X-User-Id header| GW\n    GW -->|Route /v1/users/...| UserSvc[User Service]\n    UserSvc -->|Read / Write| UserDB[(User DB PostgreSQL)]\n\n    AuthSvc -->|nons.auth.user.registered| NATS[NATS JetStream]\n    NATS -->|consume| UserSvc\n\n    UserSvc -->|nons.user.profile.created| NATS\n    UserSvc -->|nons.user.profile.changed| NATS\n\n    NATS -->|consume| IAM[IAM Service]\n    NATS -->|consume| Notif[Notification Service]\n```"
    },
    {
      "level": 3,
      "heading": "ماتریس وابستگی",
      "content": "| سرویس | نوع ارتباط | جهت |\n|-------|-----------|------|\n| **Auth Service** | رویداد `nons.auth.user.registered` | ورودی |\n| **IAM Service** | مصرف رویداد `nons.user.profile.created` | خروجی |\n| **Notification Service** | مصرف رویدادهای `nons.user.*` | خروجی |\n| **Traefik Gateway** | Forward به `/v1/users/...` | ورودی |\n\n---"
    },
    {
      "level": 2,
      "heading": "۲۳. آینده توسعه",
      "content": "**Future Extensions**\n\nاین سرویس با حفظ مدل اصلی User قابلیت توسعه برای موارد زیر را دارد:\n\n| قابلیت | توضیح |\n|--------|-------|\n| **Social Profile** | پروفایل عمومی با bio، لینک‌های اجتماعی |\n| **Chat Identity** | شناسه یکتای کاربر در سیستم پیام‌رسانی |\n| **Marketplace Profile** | پروفایل فروشنده (در هماهنگی با Marketplace Service) |\n| **Public Pages** | صفحه عمومی کاربر در پلتفرم |\n| **Reputation System** | امتیاز و اعتبار کاربر |\n\n> **قانون:** هیچ قابلیت جدیدی که تغییر در مدل اصلی `users` ایجاد می‌کند، بدون ADR مجزا اضافه نخواهد شد."
    }
  ]
}