> *امان از ویرایشهای ویکیپدیا!*
>
> — حامد
حامد که از محتوای ویکیپدیا بسیار ناراحت و خسته شده، قصد دارد تا آن را به شیوهای که خودش دوست دارد پیادهسازی کند. او میخواهد رفتار تمام کاربرانی که پستی را ویرایش میکنند را زیر نظر داشته باشد و همچنین اطلاعات سازنده و آخرین ویرایشکننده را هم سریعاً بهدست بیاورد.
شما باید برای رسیدن به این هدف به او کمک کنید.
# جزئیات پروژه
پروژهی اولیه را از [این لینک](/contest/assignments/35048/download_problem_initial_project/124282/) دانلود کنید.
<details class="grey">
<summary>ساختار فایلها</summary>
```
qpedia
├── app
│ ├── Console
│ ├── Exceptions
│ ├── Http
│ ├── Models
│ │ ├── Edit.php
│ │ ├── Post.php
│ │ └── User.php
│ └── Providers
├── bootstrap
├── config
├── database
│ ├── factories
│ │ └── UserFactory.php
│ ├── migrations
│ │ ├── 2014_10_12_000000_create_users_table.php
│ │ ├── 2014_10_12_100000_create_password_resets_table.php
│ │ ├── 2019_08_19_000000_create_failed_jobs_table.php
│ │ ├── 2019_12_14_000001_create_personal_access_tokens_table.php
│ │ ├── 2021_11_30_135802_create_posts_table.php
│ │ ├── 2021_11_30_135820_create_edits_table.php
│ │ └── 2021_11_30_140323_create_edit_post_table.php
│ └── seeders
├── public
├── resources
├── routes
├── storage
├── tests
├── README.md
├── artisan
├── composer.json
├── composer.lock
├── package.json
├── phpunit.xml
├── server.php
└── webpack.mix.js
```
</details>
<details class="brown">
<summary>راهاندازی پروژه</summary>
**برای اجرای پروژه، باید `php` و `composer` را از قبل نصب کرده باشید.**
+ ابتدا پروژهی اولیه را دانلود و از حالت فشرده خارج کنید.
+ دستور `composer install` را در پوشهی اصلی پروژه برای نصب نیازمندیها اجرا کنید.
+ برای اجرای تستهای نمونه، میتوانید از دستور `php artisan test` استفاده کنید.
</details>
## مایگریشنها
مایگریشنهای مربوط به پروژه از قبل ایجاد شدهاند. در اولین گام باید ساختار جداول پروژه را مطابق توضیحات زیر تکمیل کنید:
مایگریشن `posts`: ستونهای زیر را به مایگریشن جدول `posts` اضافه کنید:
|نام ستون|نوع|تعریف|
|:-------|:--|----:|
|`user_id`|`bigInteger`|کلید خارجی به جدول `users` و ستون `id`|
|`title`|`string`|عنوان|
|`body`|`text`|بدنه|
|`created_by`|`bigInteger`|آیدی کاربر ایجادکنندهی پست|
|`updated_by`|`bigInteger`|آیدی آخرین کاربر بهروزکنندهی پست|
مایگریشن `edits`: ستونهای زیر را به مایگریشن جدول `edits` اضافه کنید:
|نام ستون|نوع|تعریف|
|:-------|:--|----:|
|`user_id`|`bigInteger`|کلید خارجی به جدول `users` و ستون `id`|
|`change`|`string`|ستون تغییریافته مثلا `title`|
|`value`|`string`|مقدار جدید|
سپس باید بین این جداول روابط زیر را برقرار کنید:
+ هر کاربر میتواند چندین پست ایجاد کند و هر پست متعلق به یک کاربر است.
+ هر کاربر میتواند چندین ویرایش بر روی پستها داشته باشد و هر ویرایش را یک کاربر ایجاد کرده است.
+ بین جدول پستها و جدول ویرایشها باید رابطهی چندبهچند وجود داشته باشد. مایگریشن مربوط به جدول میانی این رابطه هم که از قبل وجود دارد نیز باید تکمیل شود.
ساختار نهایی جداول باید بهصورت زیر باشد:
![نمودار ER](https://quera.ir/qbox/view/HoiySPgVH6/er.png)
## مدلها
در آخرین گام شما باید امکانی را به این پروژه اضافه کنید که اگر پستی ایجاد شد، مقادیر `created_by` و `updated_by` این پست با آیدی کاربری که این پست را ایجاد کرده پر شود و اگر پستی آپدیت شد، مقدار `updated_by` آن نیز با آیدی کاربری که این پست را آپدیت کرد پر شود. در این حالت که پست آپدیت شد، باید مقدار تغییریافتهی پست را به دست آورده و آن را به جدول ویرایشها اضافه کنید.
برای درک بهتر سؤال، فرض کنید کاربری با آیدی `1` پستی را با عنوان `تست` و محتوا `تست تست تست` ایجاد کرده. مقادیر `created_by` و `updated_by` این پست باید با مقدار `1` در دیتابیس وجود داشته باشند. حال فرض کنید کاربری با آیدی `2` عنوان این پست را به `test` ویرایش میکند. در این حالت باید مقدار `updated_by` این پست به آیدی `2` تغییر کند و همچنین یک سطر به صورت زیر در جدول ویرایشها اضافه شود:
|user_id|change|value|
|:--|:----|:----|
|2|title|test|
# نکات
+ **تضمین میشود** که هنگام ویرایش پستها کاربر در برنامه لاگین کرده است.
+ شما تنها مجاز به اعمال تغییرات در پوشههای `app/Models` و `database/migrations` هستید.
+ شما باید برای هر تغییر، یک سطر به جدول ویرایشها اضافه کنید؛ یعنی اگر در مثال قبل علاوه بر عنوان پست، محتوای پست هم تغییر میکرد، باید یک سطر دیگر هم به جدول ویرایشها اضافه میشد.
# آنچه باید آپلود کنید
پس از پیادهسازی موارد خواستهشده، پوشههای `app` و `database` را زیپ کرده و آپلود کنید.