Διαδρομές
/
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 τύπου string που δηλώνει το όνομα του είδους και ένα πεδίο 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 που περιέχει το τυχαία παραγόμενο αναγνωριστικό παραγγελίας (string). Αυτό θα πρέπει να είναι η αναπαράσταση ενός έγκυρου αριθμού ως συμβολοσειρά.
          • ένα πεδίο total που περιέχει τη συνολική τιμή (ακέραιος) της παραγγελίας (δηλαδή, το άθροισμα τιμής x ποσότητας για κάθε είδος κέικ)
          {
              "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 με δύο πεδία τύπου string, τα 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 τύπου string που δηλώνει το όνομα του είδους και ένα πεδίο 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 που περιέχει το ίδιο αναγνωριστικό παραγγελίας (string) με την αρχική παραγγελία
          • ένα πεδίο total που περιέχει τη συνολική τιμή της παραγγελίας (δηλαδή το άθροισμα τιμής x ποσότητας για κάθε είδος κέικ)
          {
              "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. Το αναγνωριστικό παραγγελίας που παράγεται θα πρέπει να είναι μοναδικό, να είναι string και να είναι η αναπαράσταση ενός έγκυρου αριθμού ως συμβολοσειρά (π.χ. "1", "1234").

Ορισμός

  • Χρησιμοποίησε μια configurable μεταβλητή port με προεπιλεγμένη τιμή 8080 για να ορίσεις τη θύρα στην οποία ακούει η υπηρεσία.
  • Χρησιμοποίησε έναν χάρτη orderStatus σε επίπεδο module για να τηρείς την κατάσταση των παραγγελιών, όπου η τιμή είναι "pending", "in progress" ή "completed" για το τυχαία παραγόμενο αναγνωριστικό παραγγελίας (string).
    • κλειδί - το τυχαία παραγόμενο αναγνωριστικό παραγγελίας (string)
    • τιμή - η κατάσταση της παραγγελίας ("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" θα πρέπει να είναι / θα είναι ένα τυχαία παραγόμενο μοναδικό string.

Παράδειγμα 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 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.