### توضیحات کلی:
داستان از این قرار می باشد که یک پروژه لاراول موجود است. این پروژه یک وبلاگ است، یعنی مدیران می توانند در آن پست قرار دهند و کاربران پست ها را مشاهده کنند و برای آن ها کامنت بگذارند.
حال قرار است شما یک امکان به آن اضافه کنید، این که کاربران بتوانند پست ها را لایک هم بکنند. پروژه به صورت کامل در اختیار شما قرار خواهد گرفت، تغییراتی در آن ایجاد کنید که بتوان در آن پست لایک کرد، و برای هر پست مشاهده کرد که چند لایک دارد. در هیچ مرحله ای لازم نیست با محیط گرافیکی پروژه درگیر شوید و یک خط کد HTML بزنید. همه فرايند از طریق URL و خروجی شما هم JSON خواهد بود.
در پروژه هر پست یک آدرس دارد که به صورت زیر میشود پست را با آن نمایش داد:
` /blog/post-address`
برای لایک پروژه باید URL زیر را ایجاد کنید:
` /add_like/post-address`
و برای مشاهده تعداد لایک های پروژه:
`/get_post_likes/post-address`
کاربر برای لایک کردن و مشاهده تعداد لایک ها باید لاگین کرده باشد، پس اگر کاربر مهمان قصد انجام لایک یا مشاهده تعداد لایک ها را داشته باشد باید با خطا مواجه شود.
همانطور که پیش تر گفته شد، هر درخواست باید با یک خروجی JSON همراه باشد، که شامل فیلدهای زیر است:
* result
* message
* count
* redirect
فیلد `result` یا برابر ok خواهد بود یا not_ok که اولی به معنای این است که عملیات بدون خطا انجام شد، و دومی به این معنا که خطایی وجود دارد. حالاتی که خطایی وجود ندارد و خروجی باید ok باشد در ادامه توضیحات داخل پرانتز گفته شده است.
در فیلد `message` توضیحات بیشتری برای عملیات داده شود. این رشته باید برابر یکی از رشته های زیر باشد:
* `Liked` در صورتی که پست بدون مشکل لایک شد. (حالت بدون خطا)
* `LikeExists` در صورتی که کاربر قبلا پست را لایک کرده است و لایک تکراری است.
* `NotLoggedIn` در صورتی که کاربر وارد سایت نشده است.
اگر کاربر در حال مشاهده تعداد لایک های یک پست است و مشکلی وجود ندارد، در فیلد `count` تعداد لایک ها نمایش داده خواهد شد (حالت بدون خطا) ، در غیر این صورت این فیلد می تواند وجود نداشته باشد یا مقداری دلخواه داشته باشد.
فیلد `redirect` نشان دهنده URL ای خواهد بود که کاربر به آن جا فرستاده خواهد شد و مقادیر آن به صورت زیر است.
* صفحه لاگین، اگر کاربر لاگین نکرده است و درخواستی ارسال کرده است.
* صفحه نمایش پست مربوطه در بلاگ، در صورتی که کاربر وارد شده. (مستقل از اینکه درخواست با مشکلی مواجه شده یا نه)
توجه کنید شما آدرس دامنه سایت را نمی دانید، همچنین ممکن است URI ها در سمت سرور دچار تغییراتی بشوند، پس برای مقدار دهی `redirect` باید از نام route ها استفاده کنید که می توانید آن ها را در پروژه بیابید. برای مثال نام route لاگین، `login` است.
### لینک دانلود پروژه:
http://bayanbox.ir/info/1317224463893997395/challenge
### برای اجرای پروژه:
ابتدا پروژه را Extract کنید،
بعد از Extract کردن، دستورات زیر را در دایرکتوری پروژه اجرا کنید:
* composer update
* rm database/database.sqlite (!)
* touch database/database.sqlite (!)
* php artisan migrate --seed (!)
* php artisan serve
دستوراتی که با (!) مشخص شده اند، دیتابیس را حذف می کنند و دوباره می سازند. شاید در ابتدا نیازی به انجام این کار نباشد ولی برای تست کردن مکرر برنامه تان، احتمالا بخواهید این کار را انجام دهید. (می توانید هم migration ها را rollback کنید)
علامتهای (!) در دستورات نوشته شده بخشی از دستورات نیستند و نباید آن ها را وارد کنید! صرفا برای مشخص شدن در متن صورت سوال هستند.
### برای ارسال پروژه:
* پوشه vendor را از پروژه خود حذف کنید. در غیر این صورت نمی توانید آپلود کنید.
* همه فایل های پروژه را در یک فایل zip قرار دهید (یعنی باید در فایل zip شما فایل های پروژه قرار داشته باشند نه یک پوشه که فایل ها در آن قرار دارند)
* فایل فشرده شده را آپلود کنید.
### نکات قابل توجه:
* برای انجام تغییرات و اضافه کردن امکان لایک، دیگر قسمت های پروژه نباید از کار بیافتد.
* در صورتی که محتوای فایل composer.json را تغییر دهید تست پروژه شما به درستی انجام نخواهد شد و پاسخ تان غلط تلقی خواهد شد.
* در صورتی که کاربر درخواست لایک یا درخواست مشاهده تعداد لایک ها را برای پستی ارسال کرد که وجود نداشت، باید ارور 404 داده شود. (یعنی status code صفحه response باید ۴۰۴ باشد)
* اگر یک کاربر پستی را ۲ بار لایک کند، تعداد لایک ها نباید ۲ بار زیاد شود. هر کاربر فقط یک بار می تواند لایک کند.
* طبیعتا نیازمند انجام تغییرات در دیتابیس خواهید بود، برای این کار می توانید یک migration جدید ایجاد کنید و تغییراتتان را اعمال کنید. migration های شما روی سرور هم اعمال خواهد شد.
ارسال پاسخ برای این سؤال
در حال حاضر شما دسترسی ندارید.