# معماری پروفایل و گفت‌وگوی شهر

آخرین بازبینی: ۶ شهریور ۱۴۰۵

## تجربه کاربر

1. کاربر یک استان را روی نقشه انتخاب می‌کند؛ سایر استان‌ها محو و پنل اطلاعات پس از گذار کوتاه باز می‌شود.
2. با انتخاب شهر دانشگاهی، تب «راهنمای شهر + نظر بچه‌ها» فعال می‌شود.
3. پروفایل شهر تعداد مراکز آموزشی، تجربه‌های محلی و پرسش‌های کاربران را نمایش می‌دهد.
4. کاربر می‌تواند با نام نمایشی یک «پرسش» یا «تجربه» عمومی ثبت کند.
5. پیام برای همه کاربران همان پروفایل شهر قابل خواندن است.

## API

### دریافت پیام‌ها

`GET /api/city-community?province=فارس&city=شیراز`

پاسخ شامل حداکثر ۱۰۰ پیام اخیر و شمارش پیام‌ها، تجربه‌ها و پرسش‌ها است.

### انتشار پیام

`POST /api/city-community`

```json
{
  "province": "فارس",
  "city": "شیراز",
  "kind": "question",
  "author": "نام نمایشی",
  "content": "متن پرسش یا تجربه"
}
```

## ذخیره‌سازی

- در محیط تولید دارای `DATABASE_URL`: جدول PostgreSQL با نام `city_community_posts` به‌صورت خودکار ایجاد می‌شود.
- در توسعه بدون پایگاه‌داده: پیام‌ها در حافظه فرایند نگهداری می‌شوند و با راه‌اندازی مجدد پاک می‌شوند.
- شاخص ترکیبی استان، شهر و زمان برای خواندن سریع گفت‌وگوهای هر شهر ساخته شده است. نام ستون `county` در پایگاه‌داده فعلاً برای سازگاری نسخه قبلی حفظ شده، اما مقدار آن شهر دانشگاهی است.

## کنترل‌های فعلی

- استان و شهر با فهرست ۵۸۲ شهر استخراج‌شده از داده دانشگاه‌ها تطبیق داده می‌شوند؛ شهرهای غیرمرکز شهرستان هم قابل ثبت تجربه‌اند.
- نام نمایشی ۲ تا ۲۸ نویسه و متن پیام ۸ تا ۷۰۰ نویسه است.
- بدنه درخواست محدود به ۸ کیلوبایت است.
- برای هر نشانی شبکه حداکثر ۸ ارسال در ۱۰ دقیقه مجاز است.
- خروجی‌ها در رابط با `textContent` نمایش داده می‌شوند تا متن کاربر به HTML اجرایی تبدیل نشود.
- درخواست نوشتن فقط از مبدأهای مجاز پذیرفته می‌شود.
- فیلد تله برای ربات‌های ساده وجود دارد.

## الزامات پیش از مقیاس عمومی

نسخه فعلی انتشار چندکاربره را پشتیبانی می‌کند، اما پیش از بازشدن عمومی محصول باید این موارد تکمیل شوند:

- ورود کاربر و اتصال پیام به شناسه حساب، به‌جای اتکا به نام نمایشی؛
- گزارش پیام، صف بررسی و پنل مدیریت محتوا؛
- سیاست حریم خصوصی و قواعد جامعه؛
- وضعیت‌های بررسی‌شده، پنهان و حذف‌شده در پایگاه‌داده؛
- اعلان پاسخ، رشته پاسخ‌ها و دنبال‌کردن شهر؛
- تحلیل سوءاستفاده و محدودسازی پیشرفته‌تر از نرخ ارسال.
