# v1 থেকে মাইগ্রেশন

import { Badge } from '@astrojs/starlight/components';

এই গাইডটি প্রতিটি লিগ্যাসি `/create*Message` ফিল্ডকে তার Messaging API v2-এর সমতুল্য ফিল্ডে ম্যাপ করে। বিদ্যমান ইন্টিগ্রেশন পোর্ট করার সময় এটি একটি রেফারেন্স হিসাবে ব্যবহার করুন।

<Aside type="note">
লিগ্যাসি v1 মেথডগুলি ডেপ্রিকেটেড কিন্তু সম্পূর্ণ কার্যকর। এর কোনো নির্দিষ্ট শেষ তারিখ নেই, তাই আপনি আপনার নিজের গতিতে মাইগ্রেট করতে পারেন। নতুন ইন্টিগ্রেশনের জন্য, Messaging API v2 ব্যবহার করুন।
</Aside>

## উচ্চ-স্তরের পার্থক্য

| দিক | v1 | v2 |
|---|---|---|
| প্রতি চ্যানেলের জন্য এন্ডপয়েন্ট | প্রতি চ্যানেলের জন্য আলাদা মেথড (`/createMessage`, `/createEmailMessage`, `/createSMSMessage`, `/createKakaoMessage`, …) | একক এন্ডপয়েন্ট — `POST /messaging/v2/notify` |
| অথ | রিকোয়েস্ট বডিতে `auth` ফিল্ড | `Authorization: Token <API_TOKEN>` হেডার |
| টার্গেটিং | মিশ্রিত: একই রিকোয়েস্টে `filter` + `conditions` + `devices` + `users` | স্পষ্ট বিভাজন: `NotifySegment` বনাম `NotifyTransactional` |
| কন্টেন্ট | ফ্ল্যাট `content` + সহোদর প্ল্যাটফর্ম ব্লক | নেস্টেড `payload.content.localized_content.{locale}.{platform}` |
| রেসপন্স | `MessageCode[]` | `message_code` + ঐচ্ছিক `unknown_identifiers` |

## `/createMessage` থেকে

v1 `notifications[*]` এন্ট্রিগুলি স্বতন্ত্র `Notify` রিকোয়েস্টে পরিণত হয় (প্রতিটিতে একটি মেসেজ)। যদি একটি v1 কলে একাধিক এন্ট্রি থাকে, তবে প্রতিটি এন্ট্রির জন্য একটি `Notify` ইস্যু করুন।

**টার্গেটিং সিদ্ধান্ত।** যদি v1 এন্ট্রি `devices` বা `users` (স্পষ্ট তালিকা) ব্যবহার করে, তবে এটিকে `transactional`-এ ম্যাপ করুন। অন্যথায় এটিকে `segment`-এ ম্যাপ করুন।

### রিকোয়েস্ট-স্তরের ফিল্ড

- `application` → `segment.application` বা `transactional.application` (একই অ্যাপ-কোড ফরম্যাট)।
- `applications_group`: v2-তে সমর্থিত নয়। একাধিক প্রতি-অ্যাপ রিকোয়েস্ট ব্যবহার করুন।
- `auth`: `Authorization` হেডারে সরানো হয়েছে, আর বডিতে নেই।

### শিডিউলিং

- `send_date` (`"YYYY-MM-DD HH:mm"` বা `"now"`) → `schedule.at` (RFC 3339 UTC টাইমস্ট্যাম্প)। v1-এর `"now"` পুনরায় তৈরি করতে, `schedule.at` বর্তমান সময়ে সেট করুন। অতীতের যেকোনো টাইমস্ট্যাম্প অবিলম্বে পাঠানো হয়।
- `ignore_user_timezone` → `schedule.follow_user_timezone`। **বিপরীত:** `ignore_user_timezone: true` হয়ে যায় `follow_user_timezone: false`।
- `timezone`: সমর্থিত নয়। v2 সর্বদা `at`-এর জন্য UTC ব্যবহার করে। ক্লায়েন্ট-সাইডে রূপান্তর করুন।

### টার্গেটিং

- `filter` (সেগমেন্টের নাম) → `segment.code`।
- `conditions` (`[[tag, op, value], ...]`) → `segment.expression`। একটি [seglang](/bn/developer/api-reference/segmentation-filters-api/segmentation-language/) এক্সপ্রেশনে আবার লিখুন। seglang-এ, `*` হল লজিক্যাল AND এবং অ্যাপ-নির্দিষ্ট ট্যাগগুলি `Tag("<application-code>", "<tag>", <op>, <value>)` হিসাবে রেফারেন্স করা হয়। উদাহরণ: `[["Country","EQ","BR"],["Language","EQ","pt"]]` এবং `conditions_operator: AND` → `Tag("XXXXX-XXXXX", "Country", EQ, "br") * Tag("XXXXX-XXXXX", "Language", EQ, "pt")`।
- `conditions_operator` (`AND` / `OR`): `segment.expression`-এ অন্তর্ভুক্ত।
- `devices` (hwids বা পুশ টোকেন) → `transactional.hwids.list` বা `transactional.push_tokens.list`। v2 দুটিকে আলাদা করে: hwids যায় `hwids`-এ, র' পুশ টোকেন যায় `push_tokens`-এ।
- `users` → `transactional.users.list`।
- `platforms` (সাংখ্যিক কোড `[1, 3, …]`) → `segment.platforms` বা `transactional.platforms` (স্ট্রিং enum `["IOS", "ANDROID", …]`)। দেখুন [প্ল্যাটফর্ম enum](/bn/developer/api-reference/messaging-api-v2/notify/#platform-enum)।

### কন্টেন্ট

- `content` (স্ট্রিং) → `payload.content.localized_content.default.{platform}.body`। v2-তে, কন্টেন্ট সর্বদা প্রতি-লোকেল এবং প্রতি-প্ল্যাটফর্ম হয়। একটি সাধারণ v1 স্ট্রিং বিশেষ `"default"` কী-এর অধীনে রাখুন (ক্যাচ-অল অনুবাদ, দেখুন [ডিভাইসের জন্য লোকেল নির্বাচন](/bn/developer/api-reference/messaging-api-v2/payload-reference/#locale-selection-for-a-device))।
- `content` (`{locale: text}`) → `payload.content.localized_content.{locale}.{platform}.body`। প্রতিটি টার্গেটেড প্ল্যাটফর্ম ব্লকে বডি ডুপ্লিকেট করুন।
- `preset` → `payload.preset`।
- `data` → `payload.custom_data`।
- `rich_media` → `payload.open_action.rich_media.code`।
- `link` → `payload.open_action.link.url`।
- `minimize_link` (`0` বা `2`) → `payload.open_action.link.shortener` (`NONE` বা `BITLY`)।
- `inbox_image` → `payload.content.localized_content.{locale}.{platform}.inbox.image_url` (প্রতিটি প্ল্যাটফর্ম ব্লকের নিজস্ব `inbox` আছে)।
- `inbox_date` → `payload.content.localized_content.{locale}.{platform}.inbox.expiration_date`।
- `inbox_days`: সমর্থিত নয়। ক্লায়েন্ট-সাইডে একটি অ্যাবসোলিউট `expiration_date`-এ রূপান্তর করুন।

### ডেলিভারি কন্ট্রোল

- `dynamic_content` / `dynamic_content_placeholders` → `segment` বা `transactional`-এ `dynamic_content_placeholders`।
- `campaign` → `segment` বা `transactional`-এ `campaign`।
- `capping_days` → `frequency_capping.days`।
- `capping_count` → `frequency_capping.count`।
- `send_rate` (int) → `send_rate.value` এবং `send_rate.bucket: "1s"`।
- `message_type` (`"marketing"` / `"transactional"`) → `message_type` (`MESSAGE_TYPE_MARKETING` / `MESSAGE_TYPE_TRANSACTIONAL`)।

### v2-তে সমর্থিত নয়

- `transactionId`: সরাসরি কোনো সমতুল্য নেই। আপনার দিকে কোরিলেশন ট্র্যাক করুন।
- `template_bindings`: Liquid টেমপ্লেট বাইন্ডিং v2-তে উপলব্ধ নয়। যদি আপনি এগুলির উপর নির্ভর করেন তবে v1 ব্যবহার চালিয়ে যান।

### প্ল্যাটফর্ম-নির্দিষ্ট ব্লক

v1 প্রতিটি `notifications[*]` এন্ট্রির শীর্ষ স্তরে প্ল্যাটফর্ম-নির্দিষ্ট প্যারামিটার গ্রহণ করে (`ios`, `android`, `safari`, `chrome`, …)। v2-তে সেগুলি লোকেল-এর ভিতরে চলে যায়:

```
// v1
"notifications": [{
  "content": "Hello",
  "ios":     { "title": "Hi",    "sound": "default.caf" },
  "android": { "header": "Hi",   "led": "#ff0000" }
}]

// v2
"payload": {
  "content": {
    "localized_content": {
      "en": {
        "ios":     { "title": "Hi", "body": "Hello", "sound": "default.caf" },
        "android": { "title": "Hi", "body": "Hello", "led_color": "#ff0000" }
      }
    }
  }
}
```

প্ল্যাটফর্ম ব্লকের মধ্যে ফিল্ডের নাম কিছু জায়গায় ভিন্ন। সঠিক v2 নামের জন্য [Payload রেফারেন্স](/bn/developer/api-reference/messaging-api-v2/payload-reference/) দেখুন।

### উদাহরণ: আগে এবং পরে

**v1 `/createMessage`** (একটি সেগমেন্টে পুশ):

```json
{
  "request": {
    "application": "XXXXX-XXXXX",
    "auth":        "YOUR_API_TOKEN",
    "notifications": [{
      "send_date":  "2026-05-01 12:00",
      "content":    "Hello!",
      "platforms":  [1, 3],
      "filter":     "active_users",
      "campaign":   "YYYYY-YYYYY",
      "capping_days":  7,
      "capping_count": 3,
      "message_type":  "marketing"
    }]
  }
}
```

**v2 `/messaging/v2/notify`**:

```json
{
  "segment": {
    "application": "XXXXX-XXXXX",
    "platforms":   ["IOS", "ANDROID"],
    "code":        "active_users",
    "payload": {
      "content": {
        "localized_content": {
          "en": {
            "ios":     { "body": "Hello!" },
            "android": { "body": "Hello!" }
          }
        }
      }
    },
    "schedule":          { "at": "2026-05-01T12:00:00Z" },
    "frequency_capping": { "days": 7, "count": 3 },
    "campaign":          "YYYYY-YYYYY",
    "message_type":      "MESSAGE_TYPE_MARKETING"
  }
}
```

## `/createTargetedMessage` থেকে

`/createTargetedMessage` বেশিরভাগ ক্ষেত্রে `transactional`-এ ম্যাপ করে অথবা `segment`-এ যদি আপনি এটি শুধুমাত্র একটি ক্রস-অ্যাপ `devices_filter` হিসাবে ব্যবহার করেন কোনো স্পষ্ট আইডেন্টিফায়ার ছাড়া।

- `devices_filter` → `segment.expression` (seglang) বা `segment.filter_expression` (স্ট্রাকচার্ড)।
- `content` → `payload.content.localized_content.{locale}.{platform}.body`।
- অন্যান্য সমস্ত ফিল্ড, উপরের `/createMessage`-এর মতো।

## `/createEmailMessage` থেকে

`platforms: ["EMAIL"]` এবং একটি `email_payload` ব্লক সহ `Notify`-তে যান। সম্পূর্ণ রেফারেন্স: [ইমেল পেলোড রেফারেন্স](/bn/developer/api-reference/messaging-api-v2/email-payload-reference/)।

- `subject` → `email_payload.subject` (লোকেল দ্বারা কীড করা ম্যাপ। একক-লোকেল মানগুলিকে `{"en": "..."}`-এ মোড়ান)।
- `content` (HTML) → `email_payload.body`।
- `email_template` → `email_payload.email_template`।
- `from` / `from_name` → `email_payload.from` (`{ "name": "...", "email": "..." }`)।
- `reply_to` / `reply_to_name` → `email_payload.reply_to`।
- `list_unsubscribe` → `email_payload.list_unsubscribe`।
- `attachments` → `email_payload.attachments` (`[{ "name": "...", "content": "<base64>" }]`)।
- টার্গেটিং, শিডিউল, ক্যাম্পেইন, ইত্যাদি, `/createMessage`-এর মতো।

## `/createSMSMessage` থেকে

`platforms: ["SMS"]` সহ `Notify`-তে যান। SMS বডি অ্যাপের কনফিগার করা SMS প্রদানকারীর মাধ্যমে ডেলিভার করা হয়। কন্টেন্টটি যেকোনো ভরা প্ল্যাটফর্ম ব্লকে `payload.content.localized_content.{locale}.{platform}.body`-তে রাখুন।

SMS-নির্দিষ্ট প্রদানকারীর বিকল্পগুলি (প্রেরকের আইডি, ইত্যাদি) রিকোয়েস্ট বডির পরিবর্তে অ্যাপের SMS কনফিগারেশন থেকে আসতে থাকে।

## `/createKakaoMessage` থেকে

`platforms: ["KAKAO"]` সহ `Notify`-তে যান, `payload.content.localized_content.{locale}.kakao` ব্যবহার করে:

- `template_id` → `kakao.template`।
- `content` → `kakao.content`।
- `variables` → `kakao.content_variables` (JSON-স্ট্রিংগিফাইড)।

## `/createWhatsAppMessage` থেকে

`platforms: ["WHATS_APP"]` সহ `Notify`-তে যান, `payload.content.localized_content.{locale}.whatsapp` ব্যবহার করে:

- `content` (ফ্রি-ফর্ম টেক্সট) → `whatsapp.content`। শুধুমাত্র ২৪-ঘণ্টার গ্রাহক পরিষেবা উইন্ডোর মধ্যে Meta দ্বারা ডেলিভার করা হয়।
- `content_id` → `whatsapp.content_id`। একটি পূর্ব-অনুমোদিত Meta টেমপ্লেটের নাম।
- `language` → `whatsapp.language`। Meta-টেমপ্লেট লোকেল (যেমন `"en_US"`)। বাইরের `LocalizedContent` লোকেল কী থেকে স্বাধীন।
- `content_variables` (v1-এ অবজেক্ট) → `whatsapp.content_variables` (JSON-স্ট্রিংগিফাইড অবজেক্ট)। উদাহরণ v1 `{"1": "John"}` হয়ে যায় v2 `"{\"1\":\"John\"}"`।
- `button_url_variables` (অবজেক্ট) → `whatsapp.button_url_variables` (JSON-স্ট্রিংগিফাইড)।
- `header_variables` (অবজেক্ট) → `whatsapp.header_variables` (JSON-স্ট্রিংগিফাইড)।
- `preset` → `payload.preset` (পেলোড স্তরে জেনেরিক প্রিসেট)।
- টার্গেটিং: v1-এ `devices`-এ যাওয়া WhatsApp ফোন নম্বর (যেমন `"whatsapp:+1234567890"`) একটি ব্যবহারকারীর বিরুদ্ধে [`/registerDevice`](/bn/developer/api-reference/device-api#registerdevice) এর মাধ্যমে রেজিস্টার করতে হবে। v2-তে, `transactional.users.list` (অথবা `transactional.hwids.list`-এর মাধ্যমে hwid) দিয়ে ফলস্বরূপ ব্যবহারকারীকে টার্গেট করুন।
- `use_auto_registration`: সমর্থিত নয়। পাঠানোর আগে WhatsApp নম্বর রেজিস্টার করুন।

## `/createLineMessage` থেকে

`platforms: ["LINE"]` সহ `Notify`-তে যান, `payload.content.localized_content.{locale}.line` ব্যবহার করে:

- `content` (প্লেইন টেক্সট) → `line.content`।
- `preset` (LINE প্রিসেট কোড) → `line.template`। v2 ফিল্ড একটি কোড সংরক্ষণ করে যা Pushwoosh কন্ট্রোল প্যানেলে কনফিগার করা একটি LINE টেমপ্লেটকে রেফারেন্স করে।
- ইনলাইন `template` (v1 ইমেজ, ক্যারোসেল, বা ফ্লেক্স মেসেজ স্ট্রাকচার): v2-তে সরাসরি সমর্থিত নয়। রিচ মেসেজটিকে কন্ট্রোল প্যানেলে একটি LINE প্রিসেট হিসাবে প্রি-কনফিগার করুন এবং `line.template`-এর মাধ্যমে এটি রেফারেন্স করুন।
- টার্গেটিং: v1 `devices` তালিকা (SDK / `/registerDevice`-এর মাধ্যমে রেজিস্টার করা LINE ব্যবহারকারী আইডি) v2-তে `transactional.users.list` (অথবা `transactional.hwids.list`-এর মাধ্যমে hwid) হয়ে যায়।

## রেসপন্সের পার্থক্য

v1 `/createMessage` রিটার্ন করে:

```json
{
  "status_code": 200,
  "status_message": "OK",
  "response": { "Messages": ["XXXXX-XXXXX-AAAAA"] }
}
```

v2 `Notify` রিটার্ন করে:

```json
{
  "result": {
    "message_code": "XXXXX-XXXXX-AAAAA",
    "unknown_identifiers": []
  }
}
```

নন-200 রেসপন্সগুলি স্ট্যান্ডার্ড gRPC-Gateway এরর এনভেলপ (`{ "code": ..., "message": ..., "details": [...] }`) অনুসরণ করে, v1-এর `status_code` / `status_message` জোড়ার পরিবর্তে।