# BDNews — JSON থেকে MySQL মাইগ্রেশন গাইড

> **আপডেট নোট:** প্রজেক্টে নতুন ফিচার (📺 YouTube ভিডিও ইন্টিগ্রেশন,
> 💰 AdMob সেটিংস, ব্যাকআপ টুল) যোগ হওয়ার সময় `config/config.php` এবং
> `includes/functions.php` আবার পুরনো JSON-ভিত্তিক ভার্সনে ফিরে গিয়েছিল
> (সম্ভবত পুরনো ব্যাকআপ থেকে ওভাররাইট হয়ে)। এই রাউন্ডে সেটা আবার ঠিক
> করে MySQL এ আনা হয়েছে, এবং নতুন YouTube ফিচারের ডাটাও
> (`youtube_channels`, `youtube_videos`, `youtube_meta` টেবিল) এখন
> MySQL-ভিত্তিক। **ভবিষ্যতে সতর্ক থাকুন:** পুরনো zip/ব্যাকআপ থেকে
> `config.php` বা `functions.php` রিস্টোর করলে আবার JSON-এ ফিরে যাবে —
> নতুন কোড ডিপ্লয় করার সময় সবসময় সর্বশেষ MySQL-ভিত্তিক ভার্সনটাই
> ব্যবহার করুন।

## যা বদলেছে
আপনার প্রজেক্ট আগে সব ডাটা `backend/data/*.json` ফাইলে রাখতো
(`news_YYYY-MM-DD.json`, `sources.json`, `settings.json` ইত্যাদি)।
এখন সব ডাটা MySQL ডাটাবেইজে থাকবে — বিশেষ করে নিউজ আর্টিকেল, যেটা
দিনে দিনে বড় হতে থাকলে ফাইল-স্ক্যান করে API সার্ভ করা স্লো হয়ে যেত।
এখন `news` টেবিলে ইনডেক্স করা কলাম (pub_ts, category, source_id)
দিয়ে সরাসরি SQL কোয়েরি চলে, তাই ডাটা যত বড় হোক পারফরম্যান্স স্থিতিশীল
থাকবে।

`admin/`, `api/`, `cron/` ফোল্ডারের **কোনো ফাইল পরিবর্তন করা হয়নি** —
সব ফাংশনের নাম/প্যারামিটার আগের মতোই আছে, শুধু `backend/includes/functions.php`
এর ভেতরের স্টোরেজ ইঞ্জিন বদলেছে।

## নতুন/পরিবর্তিত ফাইল
- `backend/database/schema.sql` — MySQL টেবিল তৈরির স্ক্রিপ্ট
- `backend/database/migrate_from_json.php` — পুরনো JSON ডাটা একবার ইমপোর্ট করার স্ক্রিপ্ট
- `backend/includes/db.php` — নতুন, PDO কানেকশন হেল্পার
- `backend/includes/functions.php` — রিরাইট করা হয়েছে (MySQL ব্যবহার করে)
- `backend/includes/functions_json_backup.php.bak_reference` — আপনার **আগের** JSON-ভিত্তিক ফাইলটা রেফারেন্সের জন্য রাখা হলো (এটা আর ব্যবহৃত হয় না, চাইলে ডিলিট করে দিতে পারেন)
- `backend/config/config.php` — উপরে DB_HOST/DB_NAME/DB_USER/DB_PASS যোগ হয়েছে

## ধাপে ধাপে যা করবেন

### ১. cPanel এ MySQL ডাটাবেইজ তৈরি করুন
cPanel > **MySQL Databases** এ গিয়ে:
- একটা নতুন Database তৈরি করুন (যেমন `bdnews`) — cPanel এটাকে
  `cpaneluser_bdnews` নামে সেভ করবে
- একটা নতুন User তৈরি করুন, স্ট্রং পাসওয়ার্ড দিন
- সেই User কে Database এর সাথে "Add User to Database" করে **ALL PRIVILEGES** দিন

### ২. schema.sql ইমপোর্ট করুন
cPanel > **phpMyAdmin** এ গিয়ে আপনার ডাটাবেইজ সিলেক্ট করুন > **Import**
ট্যাব > `backend/database/schema.sql` ফাইলটা আপলোড/ইমপোর্ট করুন।
(অথবা SQL ট্যাবে ফাইলের কন্টেন্ট পেস্ট করে Go চাপুন)

### ৩. config.php আপডেট করুন
`backend/config/config.php` ফাইলে এই ৪টা লাইন এডিট করুন:
```php
define('DB_HOST', 'localhost');
define('DB_NAME', 'cpaneluser_bdnews');   // ধাপ ১ থেকে পাওয়া নাম
define('DB_USER', 'cpaneluser_dbuser');   // ধাপ ১ থেকে পাওয়া নাম
define('DB_PASS', 'আপনার_ডাটাবেইজ_পাসওয়ার্ড');
```

### ৪. পুরো প্রজেক্ট আপলোড করুন
পুরো `backend/` ফোল্ডার আপনার শেয়ার্ড হোস্টিং এ (আগে যেখানে ছিল সেখানে)
আপলোড করুন — এটা পুরনো JSON ফাইলভিত্তিক ভার্সনকে প্রতিস্থাপন করবে।

**গুরুত্বপূর্ণ:** যদি আপনার লাইভ সার্ভারে ইতিমধ্যে পুরনো `data/*.json`
ফাইলে real ডাটা থাকে (যেমন কয়েকদিনের নিউজ কালেকশন), সেগুলো এই zip
এ নেই — সেগুলো আপনার লাইভ সার্ভারেই আছে। তাই নতুন কোড আপলোড করার সময়
পুরনো `data/` ফোল্ডারটা **মুছবেন না**, ওভাররাইট না করে পাশে রাখুন,
যাতে পরের ধাপে মাইগ্রেট করতে পারেন।

### ৫. মাইগ্রেশন স্ক্রিপ্ট চালান (একবারই)
ব্রাউজারে খুলুন:
```
https://আপনারডোমেইন.com/backend/database/migrate_from_json.php?key=আপনার_এডমিন_প্যানেল_পাসওয়ার্ড
```
(এডমিন প্যানেলে লগইন করার যেই পাসওয়ার্ড ব্যবহার করেন, সেটাই এখানে `key=` এ দেবেন)

এটা আপনার সার্ভারের বিদ্যমান সব `data/*.json` ফাইল পড়ে MySQL এ কপি
করে দেবে এবং একটা সামারি রিপোর্ট দেখাবে (কতগুলো সোর্স/নিউজ/এলার্ট
মাইগ্রেট হলো)।

### ৬. যাচাই করুন
এডমিন প্যানেল খুলে চেক করুন — সোর্স লিস্ট, আজকের নিউজ, সেটিংস সব
ঠিকমতো দেখাচ্ছে কিনা। অ্যাপের API (`api/news.php` ইত্যাদি) কল করেও
দেখতে পারেন।

### ৭. পরিষ্কার করুন
সব ঠিক থাকলে:
- `backend/database/migrate_from_json.php` ফাইলটা সার্ভার থেকে **ডিলিট করুন**
  (এটা রেখে দিলে যে কেউ এডমিন পাসওয়ার্ড অনুমান করার চেষ্টা করতে পারবে)
- পুরনো `backend/data/*.json` ফাইলগুলো একটা ব্যাকআপ zip করে ডাউনলোড
  করে রাখুন, তারপর সার্ভার থেকে মুছে ফেলুন (নতুন কোড এগুলো আর পড়ে না,
  তাই এগুলো শুধু জায়গা নেবে)

## ডিজাইন নোট
- `youtube_channels`, `youtube_videos` — পুরোপুরি রিলেশনাল টেবিল
  (ইনডেক্সড কলাম সহ)। `youtube_meta` — quota ট্র্যাকিং ও থ্রটল-লাস্ট-রান
  টাইমের জন্য একটাই ছোট রো (আগে `youtube_quota.json` + `youtube_last_run.txt`)।
- `admin/backup.php` (ডাটা ব্যাকআপ টুল) স্পর্শ করা হয়নি — এটা এখনো
  `backend/data/` ফোল্ডার zip করে, কিন্তু এখন যেহেতু আসল ডাটা (নিউজ,
  সোর্স, ভিডিও ইত্যাদি) MySQL এ, তাই এই zip এ শুধু লগ ফাইল থাকবে —
  আসল ব্যাকআপ এখন থেকে cPanel > phpMyAdmin > Export দিয়ে ডাটাবেইজের
  SQL ডাম্প নেওয়া উচিত।
- `news`, `sources`, `scrape_sources`, `alerts`, `alert_watch_sources`,
  `category_labels`, `weather_cities`, `pinned_news` — এগুলো পুরোপুরি
  রিলেশনাল টেবিল, ইনডেক্সড কলাম সহ।
- `settings` আর `weather_cache` ছোট, একক "ব্লব"-জাতীয় ডাটা (কখনো
  লাখো রো হবে না) — তাই এগুলো `settings_store`/`weather_cache_store`
  টেবিলে একটা মাত্র রো তে JSON কলামে রাখা হয়েছে; লজিক অপরিবর্তিত।
- সার্চ (`search_news`) আগের মতোই সাবস্ট্রিং ম্যাচ (SQL `LIKE`)
  ব্যবহার করে, যাতে পুরনো বিহেভিয়ার হুবহু বজায় থাকে। ডাটা কয়েক লাখ
  আর্টিকেল ছাড়িয়ে গেলে ভবিষ্যতে MySQL FULLTEXT ইনডেক্সে আপগ্রেড করা
  যেতে পারে আরও দ্রুত সার্চের জন্য।

## YouTube Live Monitor
For the Live Monitor, run `migration_youtube_live.sql` if you prefer manual migrations. The feature also calls `CREATE TABLE IF NOT EXISTS` automatically on first access.

## Automation Center upgrade
For V3.2 Automation Center / Story Intelligence, import:

`migration_automation_center.sql`

It adds `story_clusters`, `story_cluster_members`, `automation_logs`, and `automation_notifications`. All statements use `CREATE TABLE IF NOT EXISTS` and are safe to run again.
