سلیب پس از ترجمهی نقشه متوجه شد که گنج جایی در آبادی «بلهآباد» است که در پشت کوههای جزیره پنهان شدهاست. او سریعاً حرکت کرد و هنگامیکه به پشت کوههای «بلهآباد» رسید، متوجه شد که مردمان این آبادی، سامانهای شبیه سیستم بلاگ 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/ |
لایک کردن بلاگ |
GET /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
کنید، امتیاز بیشتری از مسئله دریافت میکنید.
شما تنها مجاز به استفاده از ایمیجهای موجود در این لینک در داکر فایل و داکر کامپوز خود هستید.
برای حل این سؤال میتوانید از هر زبان و هر تکنولوژیای که میخواهید استفاده کنید. بهصورتیکه در یک پوشه به نام medium
کد برنامه را بنویسید. توجه کنید که حتماً باید Dockerfile
مربوط به پروژهی خود را برای ما ارسال کنید.
docker-compose.yml
تحویلی شما را که در خارج از فولدر medium
قرار دارد، با دستور docker-compose up --build
اجرا میکند.docker-compose.yml
دلخواه هستید.docker-compose.yml
حتما باید برابر با medium
باشد.80
آدرس localhost
قابل دسترسی باشد.0.0.0.0:80
اجرا کنید.3
باشد.شما میتوانید تمامی محتوای موجود در پوشهی medium
را تغییر دهید و هر فایلی که میخواهید اضافه یا کم کنید.
توجه کنید که نام فایل کد شما برای سیستم داوری اهمیتی ندارد و این خود شما هستید که در داکر فایل و داکر کامپوزتان از نام آن برای اجرای پروژه استفاده میکنید.
در نهایت پوشه medium
را به همراه docker-compose.yml
ZIP کرده و ارسال کنید. توجه کنید که پس از extract کردن فایل ZIP شما، باید فایل docker-compose.yml
پوشهی medium
را ببینیم که درون آن Dockerfile
وجود دارد.