الكعكة كذبة

الكعكة كذبة

متوسط

التعليمات

نص المسألة

طلب منك CakeStation، وهو مخبز شهير يخبز أنواعًا مختلفة من الكعك، إعداد نظام لإدارة الطلبات عبر الإنترنت.

تفاصيل العناصر الموجودة في القائمة كما يلي.

العنصر السعر
Butter Cake 15
Chocolate Cake 20
Tres Leches 25

يُتوقع أن يكون ما يلي ممكنًا.

  • استرجاع القائمة.
  • تقديم طلبية.
  • استرجاع حالة الطلبية (واحدة من pending أو in progress أو completed).
  • تحديث طلبية. لا يُسمح بذلك إلا إذا كانت الحالة لا تزال pending.
  • حذف طلبية. لا يُسمح بذلك إلا إذا كانت الحالة لا تزال pending.

القيود

  1. استرجاع القائمة

    • الطريقة - GET
    • المسار - /menu
    • الاستجابة
      • 200 OK
      • نوع المحتوى - 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 بقيمة أقل من 1
      • 201 Created إذا تم تقديم الطلبية بنجاح
        • نوع المحتوى - 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
        • نوع المحتوى - 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 المتطلبات نفسها المطلوبة لتقديم الطلبية (2)
      • 200 OK إذا نجح التحديث
        • نوع المحتوى - 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" لكل طلبية جديدة.

المثال 1

استرجاع القائمة.

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

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

المثال 2

محاولة تقديم الطلبية بحُمولة صالحة.

$ 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" سلسلة نصية فريدة مُولَّدة عشوائيًا.

المثال 3

محاولة تقديم الطلبية بحُمولة لا تطابق الصيغة المتوقعة.

$ 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 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.