مسیرها
/
Ballerina
Ballerina
/
تمرین‌ها
/
کیک یک دروغ است
کیک یک دروغ است

کیک یک دروغ است

متوسط

دستورالعمل‌ها

صورت مسئله

CakeStation، یک قنادی محبوب که انواع کیک می‌پزد، از شما خواسته است یک سیستم مدیریت سفارش آنلاین برایش راه‌اندازی کنید.

جزئیات موارد موجود در منو به این شرح است.

مورد قیمت
Butter Cake 15
Chocolate Cake 20
Tres Leches 25

انتظار می‌رود انجام موارد زیر ممکن باشد.

  • دریافت منو.
  • ثبت سفارش.
  • دریافت وضعیت یک سفارش (یکی از pending، in progress یا completed).
  • به‌روزرسانی یک سفارش. فقط در صورتی مجاز است که وضعیت هنوز pending باشد.
  • حذف یک سفارش. فقط در صورتی مجاز است که وضعیت هنوز pending باشد.

محدودیت‌ها

  1. دریافت منو

    • متد - GET
    • مسیر - /menu
    • پاسخ
      • 200 OK
      • content-type - application/json
      • یک شیء JSON که اسم موارد به‌عنوان کلیدها و قیمت‌ها به‌عنوان مقدارها (عدد صحیح) در آن قرار دارند
        {
           "Butter Cake": 15,
           "Chocolate Cake": 20,
           "Tres Leches": 25
        }
        
  2. ثبت سفارش

    • متد - POST

    • مسیر - /order

    • درخواست

      • محتوای درخواست یک شیء JSON با فیلدهای زیر خواهد بود
        • username - اسم کاربر (string)
        • order_items - آرایه‌ای از شیءهای JSON که موارد سفارش را نشان می‌دهد. هر شیء JSON دقیقاً دو فیلد خواهد داشت: یک فیلد item از نوع رشته که اسم مورد را مشخص می‌کند و یک فیلد quantity از نوع عدد صحیح که تعداد سفارش برای آن مورد خاص را نشان می‌دهد.
        {
            "type": "object",
            "properties": {
                "username": {
                    "type": "string"
                },
                "order_items": {
                    "type": "array",
                    "items": {
                        "type": "object",
                        "properties": {
                            "item": {
                                "type": "string"
                            },
                            "quantity": {
                                "type": "integer"
                            }
                        },
                        "required": [
                            "item",
                            "quantity"
                        ]
                    }
                }
            },
            "required": [
                "username",
                "order_items"
            ]
        }
        
    • پاسخ

      • 400 Bad Request در صورتی که
        • محتوای درخواست با قالب مورد انتظار مطابقت نداشته باشد، یا
        • username خالی باشد، یا
        • آرایه‌ی order_items خالی باشد، یا
        • آرایه‌ی order_items برای یک نوع کیک خاص بیش از یک شیء JSON داشته باشد، یا
        • عضوی از آرایه‌ی order_items فیلد item داشته باشد که نوع کیکی در آن آمده باشد که روی منو نیست، یا
        • عضوی از آرایه‌ی order_items فیلد quantity داشته باشد که مقدارش کمتر از ۱ باشد
      • 201 Created در صورتی که سفارش با موفقیت ثبت شود
        • content-type - application/json
        • یک شیء JSON با دو فیلد
          • یک order_id که شامل رشته‌ی شناسه‌ی سفارش تولیدشده به‌صورت تصادفی است. این باید نمایش رشته‌ای یک مقدار عددی معتبر باشد.
          • یک فیلد total که مقدار کل سفارش (عدد صحیح) را در خود دارد (یعنی مجموع قیمت × تعداد برای هر نوع کیک)
          {
              "type": "object",
              "properties": {
                  "order_id": {
                      "type": "string"
                  },
                  "total": {
                      "type": "integer"
                  }
              },
              "required": [
                  "order_id",
                  "total"
              ]
          }
          
  3. دریافت وضعیت یک سفارش

    • متد - GET
    • مسیر - /order/{orderId}
    • پاسخ
      • 404 Not Found اگر سفارشی با orderId مشخص‌شده وجود نداشته باشد
      • 200 OK
        • content-type - application/json

        • یک شیء JSON با دو فیلد رشته‌ای order_id و status که به‌ترتیب شناسه‌ی سفارش و وضعیت (یکی از pending، in progress یا completed) را نشان می‌دهند

          {
              "type": "object",
              "properties": {
                  "order_id": {
                      "type": "string"
                  },
                  "status": {
                      "type": "string"
                  }
              },
              "required": [
                  "order_id",
                  "status"
              ]
          }
          
  4. به‌روزرسانی یک سفارش. فقط در صورتی مجاز است که وضعیت هنوز pending باشد.

    • متد - PUT

    • مسیر - /order/{orderId}

    • درخواست

      • محتوای درخواست یک شیء JSON با یک فیلد order_items خواهد بود.

        • order_items - آرایه‌ای از شیءهای JSON که موارد سفارش را نشان می‌دهد. هر شیء JSON دقیقاً دو فیلد خواهد داشت: یک فیلد item از نوع رشته که اسم مورد را مشخص می‌کند و یک فیلد quantity از نوع عدد صحیح که تعداد سفارش برای آن مورد خاص را نشان می‌دهد.
        {
            "type": "object",
            "properties": {
                "order_items": {
                    "type": "array",
                    "items": {
                        "type": "object",
                        "properties": {
                            "item": {
                                "type": "string"
                            },
                            "quantity": {
                                "type": "integer"
                            }
                        },
                        "required": [
                            "item",
                            "quantity"
                        ]
                    }
                }
            },
            "required": [
                "order_items"
            ]
        }
        
    • پاسخ

      • 404 Not Found اگر سفارشی با orderId مشخص‌شده وجود نداشته باشد
      • 403 Forbidden اگر وضعیت سفارش pending نباشد (یعنی in progress یا completed)
      • 400 Bad Request اگر آرایه‌ی order_items همان شرایط لازم برای ثبت سفارش (۲) را برآورده نکند
      • 200 OK اگر به‌روزرسانی موفقیت‌آمیز باشد
        • content-type - application/json

        • یک شیء JSON با دو فیلد

          • یک order_id که همان رشته‌ی شناسه‌ی سفارش اصلی را در خود دارد
          • یک فیلد total که مقدار کل سفارش را در خود دارد (یعنی مجموع قیمت × تعداد برای هر نوع کیک)
          {
              "type": "object",
              "properties": {
                  "order_id": {
                      "type": "string"
                  },
                  "total": {
                      "type": "integer"
                  }
              },
              "required": [
                  "order_id",
                  "total"
              ]
          }
          

      توجه: اگر تلاش برای به‌روزرسانی شکست بخورد، نباید هیچ تغییری در سفارش موجود اعمال شود.

  5. حذف یک سفارش. فقط در صورتی مجاز است که وضعیت هنوز pending باشد.

    • متد - DELETE
    • مسیر - /order/{orderId}
    • پاسخ
      • 404 Not Found اگر سفارشی با orderId مشخص‌شده وجود نداشته باشد
      • 403 Forbidden اگر وضعیت سفارش pending نباشد (یعنی in progress یا completed)
      • 200 OK اگر حذف موفقیت‌آمیز باشد
  6. شناسه‌ی سفارش تولیدشده باید یکتا باشد، باید یک رشته باشد و باید نمایش رشته‌ای یک عدد معتبر باشد (مثلاً "1"، "1234").

تعریف

  • از یک متغیر configurable به اسم port با مقدار پیش‌فرض 8080 استفاده کنید تا پورتی که سرویس روی آن گوش می‌دهد مشخص شود.
  • از یک نگاشت orderStatus در سطح ماژول برای نگه‌داشتن وضعیت سفارش‌ها استفاده کنید، که در آن مقدار برای هر رشته‌ی شناسه‌ی سفارش که به‌صورت تصادفی تولید شده، یکی از "pending"، "in progress" یا "completed" است.
    • کلید - رشته‌ی شناسه‌ی سفارش تولیدشده به‌صورت تصادفی
    • مقدار - وضعیت سفارش ("pending"، "in progress" یا "completed")
  • نگاشت orderStatus را برای هر سفارش جدید با مقدار "pending" به‌روزرسانی کنید.

مثال ۱

دریافت منو.

$ curl -v http://localhost:8080/menu

< HTTP/1.1 200 OK
< content-type: application/json
{"Butter Cake":15, "Chocolate Cake":20, "Tres Leches":25}

مثال ۲

تلاش برای ثبت سفارش با یک محتوای معتبر.

$ curl -v http://localhost:8080/order -d '{"username": "mary", "order_items": [{"item": "Tres Leches", "quantity": 1}, {"item": "Chocolate Cake", "quantity": 2}]}' -H 'Content-Type: application/json'

< HTTP/1.1 201 Created
< content-type: application/json
{"order_id":"7", "total":65}

توجه: «order_id» باید یک رشته‌ی یکتا باشد و به‌صورت تصادفی تولید خواهد شد.

مثال ۳

تلاش برای ثبت سفارش با محتوایی که با قالب مورد انتظار مطابقت ندارد.

$ curl -v http://localhost:8080/order -d '{"username": "mary", "order_items": [{"Tres Leches": 1}, {"Chocolate Cake": 2}]}' -H 'Content-Type: application/json'

< HTTP/1.1 400 Bad Request

راهنمایی‌ها

ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
Ballerina Exercism

آماده‌اید کیک یک دروغ است را شروع کنید؟

در Exercism ثبت‌نام کنید تا Ballerina را همراه با 60 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.