feat: migrate backend to high-performance PHP 8.5 with SQLite PDO
This commit is contained in:
@@ -0,0 +1,273 @@
|
||||
<?php
|
||||
// db.php - Database initialization and PDO helper for ShahrNegar
|
||||
|
||||
$dbPath = __DIR__ . '/urban_issues.db';
|
||||
|
||||
function getDB(): PDO {
|
||||
global $dbPath;
|
||||
$pdo = new PDO('sqlite:' . $dbPath);
|
||||
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
||||
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
|
||||
return $pdo;
|
||||
}
|
||||
|
||||
function initDB() {
|
||||
$pdo = getDB();
|
||||
|
||||
// Create Issues Table
|
||||
$pdo->exec("CREATE TABLE IF NOT EXISTS issues (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
tracking_code TEXT UNIQUE NOT NULL,
|
||||
title TEXT NOT NULL,
|
||||
category TEXT NOT NULL,
|
||||
description TEXT NOT NULL,
|
||||
address TEXT NOT NULL,
|
||||
district INTEGER NOT NULL,
|
||||
priority TEXT NOT NULL,
|
||||
status TEXT NOT NULL,
|
||||
lat REAL NOT NULL,
|
||||
lng REAL NOT NULL,
|
||||
image_url TEXT,
|
||||
resolved_image_url TEXT,
|
||||
reporter_name TEXT,
|
||||
reporter_phone TEXT,
|
||||
official_response TEXT,
|
||||
upvotes INTEGER DEFAULT 0,
|
||||
created_at TEXT NOT NULL,
|
||||
resolved_at TEXT
|
||||
)");
|
||||
|
||||
// Create Comments Table
|
||||
$pdo->exec("CREATE TABLE IF NOT EXISTS comments (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
issue_id INTEGER NOT NULL,
|
||||
author_name TEXT NOT NULL,
|
||||
content TEXT NOT NULL,
|
||||
created_at TEXT NOT NULL,
|
||||
FOREIGN KEY (issue_id) REFERENCES issues(id) ON DELETE CASCADE
|
||||
)");
|
||||
|
||||
// Create Timeline Table
|
||||
$pdo->exec("CREATE TABLE IF NOT EXISTS timeline (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
issue_id INTEGER NOT NULL,
|
||||
status TEXT NOT NULL,
|
||||
title TEXT NOT NULL,
|
||||
description TEXT,
|
||||
created_at TEXT NOT NULL,
|
||||
FOREIGN KEY (issue_id) REFERENCES issues(id) ON DELETE CASCADE
|
||||
)");
|
||||
|
||||
// Check count and seed if empty
|
||||
$stmt = $pdo->query("SELECT COUNT(*) FROM issues");
|
||||
$count = (int)$stmt->fetchColumn();
|
||||
|
||||
if ($count === 0) {
|
||||
seedInitialData($pdo);
|
||||
}
|
||||
}
|
||||
|
||||
function seedInitialData(PDO $pdo) {
|
||||
$now = new DateTime();
|
||||
|
||||
$sampleIssues = [
|
||||
[
|
||||
'tracking_code' => 'SHR-78214',
|
||||
'title' => 'فرونشست و چاله عمیق در لاین کندرو',
|
||||
'category' => 'آسفالت و معابر',
|
||||
'description' => 'وجود چاله عمیق با قطر حدود ۱ متر پس از بارندگی اخیر که باعث خسارت به لاستیک خودروها و ترمزهای ناگهانی خطرناک میشود.',
|
||||
'address' => 'بزرگراه شهید همت، نرسیده به خروجی گاندی، لاین کندرو',
|
||||
'district' => 3,
|
||||
'priority' => 'emergency',
|
||||
'status' => 'in_progress',
|
||||
'lat' => 35.7538,
|
||||
'lng' => 51.4172,
|
||||
'image_url' => 'https://images.unsplash.com/photo-1515162816999-a0c47dc192f7?auto=format&fit=crop&w=800&q=80',
|
||||
'resolved_image_url' => null,
|
||||
'reporter_name' => 'علی رضایی',
|
||||
'reporter_phone' => '09121112233',
|
||||
'official_response' => 'اکیپ آسفالتریزی ناحیه ۲ شهرداری منطقه ۳ اعزام گردیده و عملیات زیرسازی و لکهگیری در حال انجام است.',
|
||||
'upvotes' => 42,
|
||||
'days_ago' => 2,
|
||||
'resolved_at' => null,
|
||||
'timeline' => [
|
||||
['pending', 'ثبت گزارش توسط شهروند', 'گزارش در سامانه ۱۳۷ با موفقیت ثبت شد.'],
|
||||
['reviewing', 'تایید کارشناس و ارجاع به معاونت فنی و عمران', 'موضوع به ناحیه ۲ ارجاع داده شد.'],
|
||||
['in_progress', 'اعزام اکیپ عملیاتی لکهگیری', 'تیم فنی با تجهیزات در محل مستقر شد.']
|
||||
],
|
||||
'comments' => [
|
||||
['سارا محمدی', 'دیروز لاستیک ماشین من هم اینجا آسیب دید، ممنون که پیگیری میکنید.'],
|
||||
['حسین کاظمی', 'امیدوارم امشب تا قبل از ترافیک صبحگاهی تموم بشه.']
|
||||
]
|
||||
],
|
||||
[
|
||||
'tracking_code' => 'SHR-65109',
|
||||
'title' => 'خاموشی کامل پایه چراغهای روشنایی بوستان',
|
||||
'category' => 'روشنایی و برق',
|
||||
'description' => 'کل مسیر پیادهروی شرقی بوستان ملت در تاریکی مطلق است که باعث کاهش امنیت خانوادهها و ورزشکاران شبانه شده است.',
|
||||
'address' => 'خیابان ولیعصر، بوستان ملت، ضلع شرقی جنب دریاچه',
|
||||
'district' => 3,
|
||||
'priority' => 'high',
|
||||
'status' => 'resolved',
|
||||
'lat' => 35.7801,
|
||||
'lng' => 51.4116,
|
||||
'image_url' => 'https://images.unsplash.com/photo-1509114397022-ed747cca3f65?auto=format&fit=crop&w=800&q=80',
|
||||
'resolved_image_url' => 'https://images.unsplash.com/photo-1517457373958-b7bdd4587205?auto=format&fit=crop&w=800&q=80',
|
||||
'reporter_name' => 'مریم احمدی',
|
||||
'reporter_phone' => '09123334455',
|
||||
'official_response' => 'کابلکشی زیرزمینی و تعویض پروژکتورهای معیوب توسط اداره زیباسازی و تاسیسات منطقه انجام و روشنایی کامل برقرار گردید.',
|
||||
'upvotes' => 68,
|
||||
'days_ago' => 5,
|
||||
'resolved_at' => (clone $now)->modify('-1 day')->format('Y-m-d H:i'),
|
||||
'timeline' => [
|
||||
['pending', 'ثبت گزارش توسط شهروند', 'گزارش دریافت شد.'],
|
||||
['reviewing', 'بررسی میدانی اداره تاسیسات', 'نقص کابل اصلی تایید شد.'],
|
||||
['in_progress', 'تعمیرات و تعویض کابل', 'تیم تاسیسات در حال اجرای خط جدید.'],
|
||||
['resolved', 'تکمیل و رفع نقص روشنایی', 'چراغها روشن و مدار به طور کامل تست شد.']
|
||||
],
|
||||
'comments' => [
|
||||
['امیر رستمی', 'خیلی سریع درستش کردن، واقعا تشکر از عوامل شهرداری.'],
|
||||
['نگار توکلی', 'دیشب رفتم پارک، همه چراغها درست شده بود.']
|
||||
]
|
||||
],
|
||||
[
|
||||
'tracking_code' => 'SHR-91203',
|
||||
'title' => 'انباشت پسماند و سرریز مخزن زباله شهری',
|
||||
'category' => 'نظافت و پسماند',
|
||||
'description' => 'مخزن مکانیزه زباله شکسته شده و زبالهها در پیادهرو پخش شده که باعث بوی نامطبوع و تجمع حشرات شده است.',
|
||||
'address' => 'خیابان آزادی، تقاطع خیابان استاد معین، پلاک ۴۲',
|
||||
'district' => 9,
|
||||
'priority' => 'medium',
|
||||
'status' => 'pending',
|
||||
'lat' => 35.6997,
|
||||
'lng' => 51.3486,
|
||||
'image_url' => 'https://images.unsplash.com/photo-1532996122724-e3c354a0b15b?auto=format&fit=crop&w=800&q=80',
|
||||
'resolved_image_url' => null,
|
||||
'reporter_name' => 'سعید کریمی',
|
||||
'reporter_phone' => '09355556677',
|
||||
'official_response' => 'گزارش در نوبت بررسی ناظر پسماند منطقه قرار گرفته است.',
|
||||
'upvotes' => 19,
|
||||
'days_ago' => 1,
|
||||
'resolved_at' => null,
|
||||
'timeline' => [
|
||||
['pending', 'ثبت گزارش در سامانه', 'منتظر بازرسی و تخصیص سطل جدید مکانیزه.']
|
||||
],
|
||||
'comments' => [
|
||||
['مهدی بهرامی', 'لطفا سطلهای پدالدار بگذارید که درش بسته بمونه.']
|
||||
]
|
||||
],
|
||||
[
|
||||
'tracking_code' => 'SHR-44390',
|
||||
'title' => 'آسیب دیدگی و شکستن شاخههای درخت کهنسال بر اثر طوفان',
|
||||
'category' => 'فضای سبز و بوستانها',
|
||||
'description' => 'شاخههای سنگین درخت چنار شکسته و روی سیمهای برق و پیادهرو معلق مانده است، احتمال سقوط روی عابرین وجود دارد.',
|
||||
'address' => 'خیابان شریعتی، بالاتر از پل رومی، نبش کوچه یاس',
|
||||
'district' => 1,
|
||||
'priority' => 'emergency',
|
||||
'status' => 'in_progress',
|
||||
'lat' => 35.7985,
|
||||
'lng' => 51.4332,
|
||||
'image_url' => 'https://images.unsplash.com/photo-1542601906990-b4d3fb778b09?auto=format&fit=crop&w=800&q=80',
|
||||
'resolved_image_url' => null,
|
||||
'reporter_name' => 'پویا سرمدی',
|
||||
'reporter_phone' => '09124445566',
|
||||
'official_response' => 'اکیپ سازمان بوستانها و آتشنشانی با جرثقیل در حال هرس ایمن و رفع خطر هستند.',
|
||||
'upvotes' => 54,
|
||||
'days_ago' => 1,
|
||||
'resolved_at' => null,
|
||||
'timeline' => [
|
||||
['pending', 'ثبت فوری گزارش خطر', 'هشدار سقوط شاخه دریافت شد.'],
|
||||
['reviewing', 'هماهنگی با سازمان آتشنشانی و فضای سبز', 'اعلام وضعیت اضطراری.'],
|
||||
['in_progress', 'عملیات رفع خطر و هرس', 'حصارکشی پیادهرو و استقرار بالابر.']
|
||||
],
|
||||
'comments' => [
|
||||
['رویا صبوری', 'خدا رو شکر سریع اومدن نوار خطر کشیدن.']
|
||||
]
|
||||
],
|
||||
[
|
||||
'tracking_code' => 'SHR-33219',
|
||||
'title' => 'سد معبر طولانی مصالح ساختمانی و تخریب پیادهرو',
|
||||
'category' => 'ساختمانسازی و سد معبر',
|
||||
'description' => 'یک پروژه ساختمانی بیش از سه هفته است که تمام پیادهرو و بخشی از خیابان را با نخاله و داربست بدون راه عبور ایمن مسدود کرده است.',
|
||||
'address' => 'سعادتآباد، میدان کاج، خیابان مروارید، پلاک ۱۸',
|
||||
'district' => 2,
|
||||
'priority' => 'high',
|
||||
'status' => 'reviewing',
|
||||
'lat' => 35.7794,
|
||||
'lng' => 51.3758,
|
||||
'image_url' => 'https://images.unsplash.com/photo-1541888946425-d0fbb18086f6?auto=format&fit=crop&w=800&q=80',
|
||||
'resolved_image_url' => null,
|
||||
'reporter_name' => 'فرشید نادری',
|
||||
'reporter_phone' => '09127778899',
|
||||
'official_response' => 'اخطاریه ماده ۱۰۰ و رفع سد معبر برای مالک صادر شد. مهلت رفع ۴۸ ساعت میباشد.',
|
||||
'upvotes' => 37,
|
||||
'days_ago' => 3,
|
||||
'resolved_at' => null,
|
||||
'timeline' => [
|
||||
['pending', 'ثبت گزارش تخلف ساختمانی', 'ثبت شد.'],
|
||||
['reviewing', 'بازدید مامور اجرای احکام شهرداری', 'صدور اخطاریه رسمی رفع انسداد معبر.']
|
||||
],
|
||||
'comments' => [
|
||||
['کامران شمس', 'مادر من با ویلچر مجبور شد بره توی خیابان که خیلی خطرناک بود!']
|
||||
]
|
||||
],
|
||||
[
|
||||
'tracking_code' => 'SHR-55821',
|
||||
'title' => 'خرابی و چشمکزن ماندن چراغ راهنمایی تقاطع پرتردد',
|
||||
'category' => 'ترافیک و حملونقل',
|
||||
'description' => 'چراغ راهنمایی تقاطع به مدت دو روز چشمکزن زرد مانده که باعث گره کور ترافیکی و تصادفات مکرر شده است.',
|
||||
'address' => 'میدان فاطمی (جهاد)، تقاطع خیابان جویبار و شهید گمنام',
|
||||
'district' => 6,
|
||||
'priority' => 'high',
|
||||
'status' => 'resolved',
|
||||
'lat' => 35.7208,
|
||||
'lng' => 51.4082,
|
||||
'image_url' => 'https://images.unsplash.com/photo-1517649763962-0c623266ddc0?auto=format&fit=crop&w=800&q=80',
|
||||
'resolved_image_url' => 'https://images.unsplash.com/photo-1508873696983-2df5703bc275?auto=format&fit=crop&w=800&q=80',
|
||||
'reporter_name' => 'ندا زمانی',
|
||||
'reporter_phone' => '09191113355',
|
||||
'official_response' => 'برد الکترونیکی کنترلر چراغ توسط شرکت کنترل ترافیک تهران تعویض و زمانبندی هوشمند مجدداً فعال گردید.',
|
||||
'upvotes' => 85,
|
||||
'days_ago' => 4,
|
||||
'resolved_at' => (clone $now)->modify('-2 days')->format('Y-m-d H:i'),
|
||||
'timeline' => [
|
||||
['pending', 'ثبت گزارش خرابی علائم ترافیکی', 'گزارش دریافت گردید.'],
|
||||
['reviewing', 'ارجاع به شرکت کنترل ترافیک', 'تایید خرابی سختافزاری کنترلر.'],
|
||||
['in_progress', 'تعویض برد فرمان و سنسورها', 'عملیات فنی در محل انجام شد.'],
|
||||
['resolved', 'راهاندازی و اتصال به مرکز کنترل', 'چراغ طبق برنامه زمانبندی هوشمند شروع به کار کرد.']
|
||||
],
|
||||
'comments' => [
|
||||
['سامان یوسفی', 'دست مریزاد، امروز صبح ترافیک خیلی روانتر بود.']
|
||||
]
|
||||
]
|
||||
];
|
||||
|
||||
$insertIssue = $pdo->prepare("INSERT INTO issues (
|
||||
tracking_code, title, category, description, address, district, priority, status,
|
||||
lat, lng, image_url, resolved_image_url, reporter_name, reporter_phone,
|
||||
official_response, upvotes, created_at, resolved_at
|
||||
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
|
||||
|
||||
$insertTimeline = $pdo->prepare("INSERT INTO timeline (issue_id, status, title, description, created_at) VALUES (?, ?, ?, ?, ?)");
|
||||
$insertComment = $pdo->prepare("INSERT INTO comments (issue_id, author_name, content, created_at) VALUES (?, ?, ?, ?)");
|
||||
|
||||
foreach ($sampleIssues as $item) {
|
||||
$createdTime = (clone $now)->modify("-{$item['days_ago']} days")->format('Y-m-d H:i');
|
||||
$insertIssue->execute([
|
||||
$item['tracking_code'], $item['title'], $item['category'], $item['description'],
|
||||
$item['address'], $item['district'], $item['priority'], $item['status'],
|
||||
$item['lat'], $item['lng'], $item['image_url'], $item['resolved_image_url'],
|
||||
$item['reporter_name'], $item['reporter_phone'], $item['official_response'],
|
||||
$item['upvotes'], $createdTime, $item['resolved_at']
|
||||
]);
|
||||
$issueId = $pdo->lastInsertId();
|
||||
|
||||
foreach ($item['timeline'] as $tl) {
|
||||
$insertTimeline->execute([$issueId, $tl[0], $tl[1], $tl[2], $createdTime]);
|
||||
}
|
||||
|
||||
foreach ($item['comments'] as $cm) {
|
||||
$insertComment->execute([$issueId, $cm[0], $cm[1], $createdTime]);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user