# POST /v2/mail/address/store

# Mail: Create Address

این اندپوینت برای ایجاد یک حساب ایمیل جدید استفاده می‌شود.   
این متد یک فرآیند دو مرحله‌ای دارد: ابتدا درخواست ساخت اکانت را به سرویس‌دهنده خارجی (External API) ارسال می‌کند و در صورت موفقیت، اطلاعات آن را در دیتابیس محلی ذخیره کرده و به اپراتور درخواست‌دهنده تخصیص می‌دهد.

<div class="api-docs" id="bkmrk-"></div>## Request Overview

<div class="api-docs" id="bkmrk-url%3A-%2Fv2%2Fmail%2Faddres"><div class="endpoint-info"><div>**URL:** `/v2/mail/address/store`</div><div>**Method:** <span class="method-post">POST</span></div><div>**Controller:** MailController@mailAddressStore</div><div>**Middleware Stack:** authWithJwt</div></div></div>## Access Control

<div class="api-docs" id="bkmrk-%D8%AF%D8%B3%D8%AA%D8%B1%D8%B3%DB%8C-%D9%85%D8%B9%D8%AA%D8%A8%D8%B1-jwt-%28%D8%A7%D9%84">- دسترسی معتبر JWT (الزامی برای شناسایی اپراتور سازنده).

</div>## Body Parameters

<div class="api-docs" id="bkmrk-field-type-descripti"><table class="schema-table" dir="rtl"><thead><tr><th>Field</th><th>Type</th><th>Description</th></tr></thead><tbody><tr><td>service\_id</td><td>string/int</td><td>**(الزامی)** شناسه سرویس در سیستم خارجی (Third-party) که برای فراخوانی API آن استفاده می‌شود.</td></tr><tr><td>server</td><td>integer</td><td>**(الزامی)** شناسه رکورد سرور در دیتابیس داخلی (`mail\_servers.id`) برای اتصال ایمیل به سرور.</td></tr><tr><td>address</td><td>string</td><td>**(اختیاری)** نام کاربری ایمیل (بدون @domain).   
اگر ارسال نشود، سیستم به طور خودکار بر اساس نام لاتین اپراتور (`f.lastname`) آن را تولید می‌کند.</td></tr></tbody></table>

</div>## Logic Details

فرآیند متد `mailAddressStore` به شرح زیر است:

<div class="api-docs" id="bkmrk-%D8%AA%D8%B9%DB%8C%DB%8C%D9%86-%D9%86%D8%A7%D9%85-%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%DB%8C-%28ad">1. **تعیین نام کاربری (Address Generation):**
    - اگر پارامتر `address` ارسال شده باشد، همان استفاده می‌شود.
    - اگر ارسال نشده باشد، سیستم حرف اول `first_name_en` و کل `last_name_en` اپراتور را با نقطه ترکیب کرده و کوچک (lowercase) می‌کند. (مثال: `a.rezayi`).
2. **فراخوانی سرویس خارجی:**
    - یک درخواست `POST` به آدرس `baseUrl/{service_id}/accounts` ارسال می‌شود.
    - پارامتر ارسالی: `{ "name": mailAddress }`.
    - هدر: توکن Bearer داخلی سیستم (`$this-&gt;token`).
3. **بررسی پاسخ و ذخیره‌سازی:**
    - اگر پاسخ سرویس خارجی موفق (`status == 'success'`) باشد:   
        یک رکورد در جدول `mail_address` درج می‌شود شامل: 
        - `server`: شناسه سرور داخلی.
        - `address`: نام کاربری ایمیل.
        - `title`: نام کامل فارسی اپراتور.
        - `users`: آرایه JSON حاوی شناسه اپراتور سازنده (به عنوان مالک).
        - `avatar` و `service_id`.
    - اگر پاسخ ناموفق باشد، پیام خطای سرویس خارجی بازگردانده می‌شود.

</div>## Response Structure

### پاسخ موفق (Created)

حساب کاربری هم در سرویس خارجی و هم در دیتابیس داخلی ایجاد شده است.

<div class="api-docs" id="bkmrk-status-code%3A-200-ok-">- **Status Code:** `200 OK`
- **Body:**```json
    {
      "status": true,
      "time": 1670155000,
      "data": "a.username" // The created mail address
    }
    ```

</div>### پاسخ ناموفق (API Reject)

سرویس خارجی درخواست ساخت اکانت را رد کرده است (مثلاً نام کاربری تکراری است).

<div class="api-docs" id="bkmrk-status-code%3A-200-ok--1">- **Status Code:** `200 OK`
- **Body:**```json
    {
      "status": false,
      "time": 1670155005,
      "message": "User already exists or invalid name." // Error from external API
    }
    ```

</div>### پاسخ خطا (Exception)

<div class="api-docs" id="bkmrk-status-code%3A-400-bad">- **Status Code:** `400 Bad Request`
- **Body:**```json
    {
      "status": false,
      "error": "Http request failed...",
      "trace": [...]
    }
    ```

</div>## Flowchart

<div class="api-docs" id="bkmrk-start-%28post-%2Fmail%2Fad"><div class="flowchart"><div class="flow-item">Start (POST /mail/address/store)</div><div class="flow-arrow">↓</div><div class="flow-item-decision">Has `address` Input?</div><div class="flow-arrow-label-left">No</div><div class="flow-arrow-label-right">Yes</div><div style="display: flex; justify-content: center; gap: 40px; margin: 10px 0;"><div class="flow-item-process" style="width: 180px;">Generate: lower(f.lastname)</div><div class="flow-item-process" style="width: 180px;">Use Input Address</div></div><div class="flow-arrow">↓</div><div class="flow-item-process" style="background-color: #ffe0b2;">**External API Call**  
POST /accounts  
(Payload: name)</div><div class="flow-arrow">↓</div><div class="flow-item-decision">API Result Success?</div><div class="flow-arrow">↓ (Yes)</div><div class="flow-item-process" style="background-color: #c8e6c9;">**DB Insert (mail\_address)**  
Set `users` = [operator_id]  
Set `title`, `avatar` from operator</div><div class="flow-arrow">↓</div><div class="flow-item-success">Return Status True + Address</div><div style="position: relative; top: -140px; left: 180px; width: 200px;"><div class="flow-arrow-error" style="transform: rotate(0deg);">→ (No)</div><div class="flow-item-error" style="margin-top: 5px;">Return Status False + API Message</div></div><div class="flow-error-path" style="margin-top: 20px;"><div class="flow-arrow-error">→ On Exception</div><div class="flow-item-error">Return 400 Bad Request</div></div></div></div>