ট্র্যাক
/
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 অবজেক্ট, যেখানে কী (key) হিসেবে থাকবে আইটেমের নাম আর মান হিসেবে থাকবে দাম (ইন্টিজার)
        {
           "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, যদি অর্ডার সফলভাবে দেওয়া যায়
        • 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

        • দুটি স্ট্রিং ফিল্ড order_id আর status থাকা একটি JSON অবজেক্ট, যা যথাক্রমে অর্ডার আইডি ও স্ট্যাটাস (pending, in progress, বা completed এর মধ্যে একটি) নির্দেশ করে

          {
              "type": "object",
              "properties": {
                  "order_id": {
                      "type": "string"
                  },
                  "status": {
                      "type": "string"
                  }
              },
              "required": [
                  "order_id",
                  "status"
              ]
          }
          
  4. একটি অর্ডার আপডেট করা। কেবল স্ট্যাটাস এখনও pending থাকলে অনুমোদিত।

    • মেথড - PUT

    • পাথ - /order/{orderId}

    • রিকোয়েস্ট

      • রিকোয়েস্ট পেলোড হবে কেবল একটি ফিল্ড order_items থাকা একটি JSON অবজেক্ট।

        • 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, যদি আপডেট সফল হয়
        • 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")।

সংজ্ঞা

  • সার্ভিসটি যে পোর্টে শোনে তা নির্দিষ্ট করতে 8080 ডিফল্ট মানযুক্ত একটি configurable ভ্যারিয়েবল port ব্যবহার করুন।
  • অর্ডারগুলোর স্ট্যাটাস সংরক্ষণে একটি মডিউল-লেভেল orderStatus ম্যাপ ব্যবহার করুন, যেখানে এলোমেলোভাবে তৈরি করা অর্ডার আইডি স্ট্রিংয়ের বিপরীতে মান হয় "pending", "in progress", বা "completed" এগুলোর যেকোনো একটি।
    • কী (key) - এলোমেলোভাবে তৈরি করা অর্ডার আইডি স্ট্রিং
    • মান - অর্ডারের স্ট্যাটাস ("pending", "in progress", বা "completed")
  • প্রতিটি নতুন অর্ডারের জন্য "pending" মান দিয়ে orderStatus ম্যাপ আপডেট করুন।

উদাহরণ ১

মেনু রিট্রিভ করা।

$ 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টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।