سلام دوست عزیز😃👋
به مسابقه «بلهکمپ ۷ - مرحله دوم (Back-End)» خوش آمدی!
نکات مفید برای شرکت در مسابقه:
chatGPT
و... در مسابقات کوئرا ممنوع است و بعد از شناسایی از لیست شرکتکنندگان مسابقه حذف میشوید.موفق باشید و بهتون خوش بگذره 😉✌
توجه کنید که سؤال «سامانه بلاگ بَله آباد» را باید با دقیقاً یکی از زبانهای Python ،PHP ،Golang یا Node.js حل کنید. در صورتی که تمایل دارید سؤال را با Node.js حل کنید، میتوانید از طریق این بخش اقدام به حل کنید. خروجی نهایی در در زبانهای مختلف تفاوتی ندارد و میتوانید زبان مورد نظر را با توجه به دانش خود انتخاب کنید.
سلیب پس از ترجمه نقشه متوجه شد که گنج جایی در آبادی « بله آباد » است که در پشت کوههای جزیره پنهان شده است. او سریعاً حرکت کرد و هنگامی که به پشت کوههای « بله آباد » رسید، متوجه شده که مردمان این آبادی، سامانهای شبیه سیستم بلاگ medium ندارند. برای سلیب این موقعیت خوبیبود تا به جای جستوجوی شبانه روزی به دنبال گنج، از این طریق ثروتی کسب کند و بیخیال گنج بشود. پس سریعا درخواست پیادهسازی این سامانه را با مشخصاتی که در ادامه توضیح میدهیم را از شما دارد :).
پروژهی اولیه را از این لینک دانلود کنید.
در این سؤال، ما با دو بخش کلی در ارتباط هستیم، بخش کاربران و بخش بلاگها. در ادامه به بیان جزئیات هر بخش میپردازیم.
برای این بخش نیاز است تا تعدادی REST API شامل endpoint های زیر باید پیادهسازی شود:
آدرس | عنوان |
---|---|
GET / |
بررسی up بودن سرویس |
POST /auth/signup/ |
ثبتنام |
POST /auth/login/ |
ورود به حساب کاربری |
POST /auth/logout/ |
خروج از حساب کاربری |
در این API هر کاربر باید یک توکن داشته باشد. این توکن برای هر کاربر ثابت است.
در همهی endpoint ها، پاسخ باید بهصورت JSON باشد.
اکیداً توصیه میگردد برای پیادهسازی بخش کاربر از JWT استفاده کنید.
اطلاعات ورودی بهصورت application/x-www-form-urlencoded
به endpoint ها ارسال میشوند.
پاسخ این endpoint باید بهصورت زیر باشد:
200
{"message":Welcome to Medium API}
سه پارامتر username
و password
و email
به این endpoint ارسال میشوند. در صورتی که حداقل یکی از پارامترهای username
و password
ارسال نشده باشد یا برابر با رشتهی خالی باشد، پاسخ باید بهصورت زیر باشد:
هر دو پارامتر username
و password
خالی:
400
پارامتر username
خالی:
400
پارامتر password
خالی:
400
اگر کاربری با نام کاربری واردشده از قبل موجود باشد، پاسخ باید بهصورت زیر باشد:
400
در غیر اینصورت، کاربر باید ساخته شود، یک توکن یکتا برایش تولید شود و پاسخ بهصورت زیر باشد:
201
دو پارامتر username
و password
باید به این endpoint ارسال شوند. در صورتی که حداقل یکی از این پارامترها ارسال نشده باشد یا برابر با رشتهی خالی باشد، پاسخ باید بهصورت زیر باشد:
401
{"error": "Invalid credentials"}
اگر نام کاربری یا رمز عبور نادرست باشد، پاسخ باید بهصورت زیر باشد:
401
{"error": "Invalid credentials"}
در غیر اینصورت، پاسخ باید بهصورت زیر باشد:
200
تنها پارامتر refresh
باید به این endpoint ارسال شود. در صورتی که این پارامتر ارسال نشده باشد یا برابر با رشتهی خالی باشد یا حتی مقدار درستی نداشته باشد، پاسخ باید بهصورت زیر باشد:
400
{}
در غیر اینصورت، پاسخ باید بهصورت زیر باشد:
205
{}
برای این بخش نیاز است تا تعدادی REST API شامل endpoint های زیر باید پیادهسازی شود:
آدرس | عنوان |
---|---|
GET /blogs/ |
دریافت تمامی بلاگهای ثبت شده |
POST /blogs/create/ |
ایجاد بلاگ جدید |
PUT /blogs/<int:pk>/ |
آپدیت بلاگ |
DELETE /blogs/<int:pk>/ |
حذف بلاگ |
GET /blogs/<int:pk>/detail/ |
مشاهده بلاگ |
POST /blogs/<int:pk>/like/ |
لایک کردن بلاگ |
POST /blogs/analytics/ |
اوضاع کلی حساب نویسنده |
در همهی endpoint ها، پاسخ باید بهصورت JSON باشد.
اطلاعات ورودی بهصورت application/x-www-form-urlencoded
به endpoint ها ارسال میشوند.
این endpoint نیازمند authentication نیست.
نیازی به ارسال هیچ پارامتری به این endpoint نیست. و در همه حالات باید جواب برابر با مقدار زیر باشد.
200
بلاگهای بازگشت داده شده باید به ترتیب زمان ثبت بلاگ باشند.
این endpoint نیازمند authentication است. در ریکوئست ارسالی مقدار هدر Authorization
باید برابر با توکن کاربر باشد (توکن همواره همراه با Bearer
ارسال میشود.).
پارامتر title
و content
باید به این endpoint ارسال شود. در صورتی که یکی از این پارامترها ارسال نشده باشد یا برابر با رشتهی خالی باشد، پاسخ باید بهصورت زیر باشد:
400
در غیر اینصورت، بلاگ باید ثبت شود و پاسخ بهصورت زیر باشد:
201
این endpoint نیازمند authentication است. در ریکوئست ارسالی مقدار هدر Authorization
باید برابر با توکن کاربر باشد (توکن همواره همراه با Bearer
ارسال میشود.).
پارامتر title
و content
باید به این endpoint ارسال شود. در صورتی که یکی از این پارامترها ارسال نشده باشد یا برابر با رشتهی خالی باشد، پاسخ باید بهصورت زیر باشد:
400
در صورتی که pk
موجود در URL در دیتابیس وجود نداشته باشد، پاسخ باید به صورت زیر باشد:
404
{}
در صورتی که یوزر در حال ارسال ریکوئست برابر با نویسنده بلاگ نباشد، پاسخ باید به صورت زیر باشد:
403
{}
در غیر اینصورت، بلاگ باید آپدیت شود و پاسخ بهصورت زیر باشد:
200
این endpoint نیازمند authentication است. در ریکوئست ارسالی مقدار هدر Authorization
باید برابر با توکن کاربر باشد (توکن همواره همراه با Bearer
ارسال میشود.).
پارامتری به این endpoint ارسال نمیشود. در صورتی که pk
موجود در URL در دیتابیس وجود نداشته باشد، پاسخ باید به صورت زیر باشد:
404
{}
در صورتی که یوزر در حال ارسال ریکوئست برابر با نویسنده بلاگ نباشد، پاسخ باید به صورت زیر باشد:
403
{}
در غیر اینصورت، بلاگ باید حذف شود و پاسخ بهصورت زیر باشد:
204
{}
این endpoint نیازمند authentication نیست.
نیازی به ارسال هیچ پارامتری به این endpoint نیست. و در همه حالات باید جواب برابر با مقادیر زیر باشد:
در صورتی که pk
موجود در URL در دیتابیس وجود نداشته باشد، پاسخ باید به صورت زیر باشد:
404
{}
در غیر اینصورت، بلاگ باید ثبت شود و پاسخ بهصورت زیر باشد:
200
توجه داشته باشید که در صورتی که بلاگ مورد نظر وجود داشت و کاربر بدون مشکل میتوانست آن را مشاهده کند، باید به میزان view
بلاگ یک واحد اضافه کنید و سپس بلاگ را برگردانید. یعنی بازدید فعلی کاربر در میزان بازدیدهای بلاگ باز گردانده شده باید محاسبه شده باشد.
نکته ریت لیمیت: در اینجا نیاز به پیادهسازی ساز و کاری برای پیادهسازی ریت لیمیت داریم. میخواهیم تا هر device_id
و ip
بتواند تنها 10 بار هر بلاگ را ببیند تا میزان ویوهای هر بلاگ شهودی واقعی از میزان دیده شدن بلاگ بدهد. تا 10 ریکوئست برای گرفتن یک بلاگ از یک device_id
و ip
را بدون مشکل باز گردانید و میزان ویو بلاگ را هم اضافه کنید. به محض عبور از 10 نیاز است تا پاسخ برابر زیر باشد و به میزان ویو بلاگ هیچ عددی اضافه نشود.
429
{}
این endpoint نیازمند authentication است. در ریکوئست ارسالی مقدار هدر Authorization
باید برابر با توکن کاربر باشد (توکن همواره همراه با Bearer
ارسال میشود.).
پارامتری به این endpoint ارسال نمیشود. در صورتی که pk
موجود در URL در دیتابیس وجود نداشته باشد، پاسخ باید به صورت زیر باشد:
404
{}
در صورتی که توکن Authorization
وجود نداشت و در اصل یوزر لاگین نبود، پاسخ باید به صورت زیر باشد:
401
{}
در غیر اینصورت، باید یک عدد به لایکهای بلاگ اضافه شود و پاسخ بهصورت زیر باشد:
200
این endpoint نیازمند authentication است. در ریکوئست ارسالی مقدار هدر Authorization
باید برابر با توکن کاربر باشد (توکن همواره همراه با Bearer
ارسال میشود.).
در صورتی که توکن Authorization
وجود نداشت و در اصل یوزر لاگین نبود، پاسخ باید به صورت زیر باشد:
401
{}
در غیر اینصورت، باید مجموع تمام view
و like
های تمام بلاگهای نویسنده را محسابه کند و پاسخ بهصورت زیر باشد:
200
نحوه پیادهسازی کاملا بر عهده خودتان است اما برای دریافت نمره کامل مسئله نیاز است تا تمامی دیتاهای مسئله را persist
کنید. برای این کار در سیستم داوری ما دیتابیس پستگرسی با مشخصات زیر بالاست:
postgres
🔗هاست: medium_postgres
پورت: 5432
یوزرنیم: quera
پسورد: quera
دیتابیس: quera
برای حل این سؤال در پوشه medium
کد برنامه را نوشته و در فایلی به نام entry.sh
که توسط sh
اجرا میشود، باید برنامهی خود را اجرا کنید. توجه کنید که ما در سیستم داوری اسکریپت entry.sh
شما را اجرا میکنیم و پس از آن به آدرس localhost
ریکوئست میزنیم.
برای نصب نیازمندیهای نودجیاس از package.json
استفاده کنید.
docker-compose.yml
و داکرفایل دلخواه نیستید.80
آدرس localhost
قابل دسترسی باشد.entry.sh
خود APIتان را روی 0.0.0.0:80
اجرا کنید.package.json
را در دایرکتوری medium
بسازید و تمامی نیازمندیهای پروژهتان را درون آن بنویسید.شما میتوانید تمامی محتوای موجود در پوشهی medium
را تغییر دهید و هر فایلی که میخواهید اضافه یا کم کنید.
توجه کنید که نام فایل کد شما برای سیستم داوری اهمیتی ندارد و این خود شما هستید که در entry.sh
از نام آن برای اجرای پروژه استفاده میکنید.
در نهایت این پوشه را ZIP کرده و ارسال کنید. توجه کنید که پس از extract کردن فایل ZIP شما، باید پوشهی medium
را ببینیم که درون آن فایلهای پروژه وجود دارد.