شمارش درخواستهای یک کاربر به سامانهی غذای دانشگاه در چین یکی از سختترین کارهایی است که میتواند اتفاق بیافتد. امروزه چینیها بهدنبال ایجاد یک `API` برای شمارش اتوماتیک و نرمافزاری غذاهایی هستند که ملت بهصورت رایگان از سلف دانشگاه خود سفارش میدهند!
برای دانلود پروژهی اولیه روی [این لینک](/problemset/assignments/4367/download_problem_initial_project/129780/) کلیک کنید.
**توجه کنید که شما باید از راهحل این سؤال در سؤالات بعدی نیز استفاده کنید.**
## ایپیآی
در ابتدا به یک `API` نیاز داریم که بتواند بر اساس کد ملی منحصر به هر فرد، تعداد درخواستهای غذای او را بشمرد. این `API` باید در **پورت** `80` و در **مسیر** `/` در دسترس باشد؛ بهشکلی که با ارسال یک ریکوئست به این آدرس به همراه یک هدر `CLIENT-KEY` باید تعداد ریکوئستهای او بهروزرسانی شده و در پاسخ، تعداد کل ریکوئستها توسط همهی کاربران را در کلیدی به نام `"state"` برگراند. بهعنوان مثال:
```bash
$ curl -H "CLIENT-KEY: one" localhost
{'state': {'one': 1}}
$ curl -H "CLIENT-KEY: one" localhost
{'state': {'one': 2}}
$ curl -H "CLIENT-KEY: two" localhost
{'state': {'one': 2, 'two': 1}}
```
## نصب نیازمندیها و اجرا
برای حل این سؤال میتوانید از هر زبان و هر تکنولوژیای که میخواهید استفاده کنید. بهصورتی که در یک پوشه به نام `api` کد برنامه را نوشته و در فایلی به نام `runner.sh` که توسط `sh` اجرا میشود، باید برنامهی خود را اجرا کنید. توجه کنید که حتماً باید `Dockerfile` مربوط به پروژهی خود را برای ما ارسال کنید.
در پروژهی اولیه، ۴ داکرفایل برای `php`، `python`، `golang` و `node` قرار دادیم که میتوانید از آنها مستقیماً استفاده کنید. در صورتی که از یکی از این زبانها برای حل سؤال استفاده میکنید، کافیست که `Dockerfile` مربوط به آن را در پوشهی `api` کپی کنید و طبق توضیحات داده شده، سؤال را حل کنید. برای نصب نیازمندیهای پایتون از `requirements.txt`، برای پیاچپی از `composer.json`، برای گولنگ از `go.mod` و برای نودجیاس از `package.json` استفاده کنید.
در صورتی که زبان مورد استفادهی شما، چیزی به جز این ۴ مورد است، باید خودتان داکرفایلی در پوشهی `api` بهشکلی بنویسید که بتواند نیازمندیهای پروژهی شما را نصب کرده و برنامهی شما را مانند داکرفایلهای موجود اجرا کند.
### تغییر `Dockerfile`
شما آزادید که `Dockerfile` را به هرصورتی که علاقمندید تغییر دهید. در صورتی که با داکر و داکرفایل آشنایی ندارید، هم کافیست که با استفاده از توضیحات داده شده صرفاً با پیادهسازی این `API` سؤال را حل کنید.
## فرد بیهویت
نکتهی مهمی که در این `API` وجود دارد این است که درصورتی که هدر `CLIENT-KEY` وجود نداشت، آخرین وضعیت باید در پاسخ برگردانده شود. درواقع تعداد ریکوئستهایی که فردی بیهویت به `API` میزند شمرده نمیشود.
```bash
$ curl localhost
{'state': {'one': 2, 'two': 1}}
```
## نحوه ارسال پاسخ
شما میتوانید تمامی محتوای موجود در پوشهی `api` را تغییر دهید و هر فایلی که میخواهید اضافه یا کم کنید.
```text
api
├── <mark class="purple" title="نام این فایل اهمیتی ندارد"> api.py </mark> # or main.go somefile.js anyfile.php name.any ...
├── Dockerfile
├── requirements.txt # or go.mod package.json composer.json
└── runner.sh
```
توجه کنید که نام فایل کد شما برای سیستم داوری اهمیتی ندارد و این خود شما هستید که در `runner.sh` از نام آن برای اجرای پروژه استفاده میکنید.
در نهایت این پوشه را _zip_ کرده و ارسال کنید. توجه کنید که پس از _extract_ کردن فایل _zip_ شما، باید پوشهی `api` را ببینیم که درون آن `Dockerfile` وجود دارد.