From 4d39052c2e847310895a55f286180628c14dea23 Mon Sep 17 00:00:00 2001 From: Fabian <2121190@stud.hs-mannheim.de> Date: Tue, 10 Feb 2026 11:57:32 +0100 Subject: [PATCH] add specification part 2 result --- Szenario/Szenario.yaml | 459 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 459 insertions(+) create mode 100644 Szenario/Szenario.yaml diff --git a/Szenario/Szenario.yaml b/Szenario/Szenario.yaml new file mode 100644 index 0000000..6b3ffce --- /dev/null +++ b/Szenario/Szenario.yaml @@ -0,0 +1,459 @@ +openapi: 3.1.0 +info: + title: Food Express API + description: > + API for managing the FoodExpress restaurants, orders, and customers. + version: 1.0.0 + +servers: + - url: http://localhost:4004/api/v1 + description: Local development servers + - url: https://{stage}.foodexpress.com/api/v1 + description: Stage server + variables: + stage: + description: Stage + enum: + - dev + - test + default: dev + - url: https://foodexpress.com/api/v1 + description: Production server + +tags: + - name: Restaurants + - name: Orders + - name: Customers + +paths: + /restaurants: + get: + tags: [Restaurants] + summary: List restaurants + description: Retrieve a paginated list of restaurants. + security: [] + parameters: + - $ref: "#/components/parameters/Limit" + - $ref: "#/components/parameters/Offset" + - $ref: "#/components/parameters/AcceptLanguage" + responses: + "200": + description: A paginated list of restaurants + content: + application/json: + schema: + type: object + properties: + data: + type: array + items: + $ref: "#/components/schemas/Restaurant" + pagination: + $ref: "#/components/schemas/Pagination" + + /restaurants/{id}/menu: + get: + tags: [Restaurants] + summary: Get restaurant menu + security: [] + parameters: + - $ref: "#/components/parameters/RestaurantId" + - $ref: "#/components/parameters/AcceptLanguage" + responses: + "200": + description: "Menu for the restaurant" + content: + application/json: + schema: + $ref: "#/components/schemas/Menu" + "404": + description: Restaurant not found + + /restaurants/{id}/orders: + get: + tags: [Orders, Restaurants] + summary: List orders for a restaurant + description: Retrieve a paginated list of orders for a specific restaurant. + parameters: + - $ref: "#/components/parameters/RestaurantId" + - $ref: "#/components/parameters/Limit" + - $ref: "#/components/parameters/Offset" + responses: + "200": + description: A paginated list of orders + content: + application/json: + schema: + type: object + properties: + data: + type: array + items: + $ref: "#/components/schemas/Order" + pagination: + $ref: "#/components/schemas/Pagination" + + /orders: + post: + tags: [Orders] + summary: Create a new order + requestBody: + required: true + content: + application/json: + schema: + $ref: "#/components/schemas/CreateOrderRequest" + parameters: + - $ref: "#/components/parameters/IdempotencyKey" + responses: + "201": + description: Order created + content: + application/json: + schema: + $ref: "#/components/schemas/Order" + "400": + description: Invalid request + + /orders/{orderId}: + get: + tags: [Orders] + summary: Get order by ID + parameters: + - $ref: "#/components/parameters/OrderId" + responses: + "200": + description: Order details + content: + application/json: + schema: + $ref: "#/components/schemas/Order" + "404": + description: Order not found + + /orders/{orderId}/status: + patch: + tags: [Orders] + summary: Update order status + description: Update the status of an existing order. + parameters: + - $ref: "#/components/parameters/OrderId" + requestBody: + required: true + content: + application/json: + schema: + $ref: "#/components/schemas/UpdateOrderStatusRequest" + responses: + "200": + description: Order status updated + content: + application/json: + schema: + $ref: "#/components/schemas/Order" + "409": + description: Invalid status transition + + /customers: + post: + tags: [Customers] + summary: Create a customer + requestBody: + required: true + content: + application/json: + schema: + $ref: "#/components/schemas/CreateCustomerRequest" + examples: + Customer: + $ref: "#/components/examples/CustomerRequest" + parameters: + - $ref: "#/components/parameters/IdempotencyKey" + responses: + "201": + description: Customer created + content: + application/json: + schema: + $ref: "#/components/schemas/Customer" + /customers/me: + get: + tags: [Customers] + summary: Get current customer + description: Returns the authenticated customer's profile + responses: + "200": + $ref: "#/components/responses/CustomerDetails" + + /customers/{id}: + get: + tags: [Customers] + summary: Get customer by ID + parameters: + - $ref: "#/components/parameters/CustomerId" + responses: + "200": + $ref: "#/components/responses/CustomerDetails" + "404": + description: Customer not found + + patch: + tags: [Customers] + summary: Update customer details + parameters: + - $ref: "#/components/parameters/CustomerId" + requestBody: + required: true + content: + application/json: + schema: + $ref: "#/components/schemas/UpdateCustomerRequest" + examples: + Customer: + $ref: "#/components/examples/CustomerRequest" + responses: + "200": + description: Customer updated + content: + application/json: + schema: + $ref: "#/components/schemas/Customer" + + delete: + tags: [Customers] + summary: Delete customer + parameters: + - $ref: "#/components/parameters/CustomerId" + responses: + "204": + description: Customer deleted + +components: + parameters: + RestaurantId: + name: id + in: path + required: true + schema: + type: string + example: "09ede9cb-0031-4469-9144-dec6b564f1c0" + + OrderId: + name: orderId + in: path + required: true + schema: + type: string + example: "e17aca0c-c956-4a0d-afec-b117a9926e2c" + + CustomerId: + name: id + in: path + required: true + schema: + type: string + example: "18e1d8a2-e7ca-458f-a997-2cc80754105f" + + Limit: + name: limit + in: query + schema: + type: integer + minimum: 1 + maximum: 100 + default: 20 + examples: [20] + + Offset: + name: offset + in: query + schema: + type: integer + minimum: 0 + default: 0 + examples: [0] + + IdempotencyKey: + in: header + name: Idempotency-Key + required: false + description: Unique key to prevent duplicate orders + schema: + type: string + + AcceptLanguage: + in: header + name: Accept-Language + required: false + description: Preferred language for localized strings. + schema: + type: string + example: "de-DE" + + schemas: + Restaurant: + type: object + properties: + id: + type: string + examples: ["465db18f-6fc0-48e1-804a-156d0df29392"] + name: + type: string + examples: ["Thai Food"] + address: + type: string + examples: ["Hauptstraße 9, 68259 Mannheim"] + + Menu: + type: array + items: + $ref: "#/components/schemas/MenuItem" + + MenuItem: + type: object + properties: + id: + type: string + examples: ["9f062baf-236b-44fe-8d30-88cecb02c26b"] + name: + type: string + examples: ["Cheeseburger"] + price: + type: number + examples: [3.99] + + Order: + type: object + properties: + id: + type: string + examples: ["28c0bc0d-9d17-4b74-9885-84a4cd7c761e"] + restaurantId: + type: string + examples: ["73591883-8aa4-4a2d-a411-abf42220a824"] + customerId: + type: string + examples: ["706f645d-a420-4984-a913-c9a6e0c677f2"] + status: + $ref: "#/components/schemas/OrderStatus" + items: + type: array + items: + $ref: "#/components/schemas/OrderItem" + totalAmount: + type: number + examples: [29.95] + + OrderItem: + type: object + properties: + menuItemId: + type: string + examples: ["359d9b4a-c8a2-4457-a04a-fecddadad64f"] + quantity: + type: integer + minimum: 1 + examples: [1] + + OrderStatus: + type: string + enum: + - CREATED + - CONFIRMED + - PREPARING + - READY + - DELIVERED + - CANCELLED + examples: ["CREATED"] + + CreateOrderRequest: + type: object + required: [restaurantId, customerId, items] + properties: + restaurantId: + type: string + examples: ["435cb941-3483-4e80-acc1-6454f1f948b5"] + customerId: + type: string + examples: ["433569a1-d4d8-4073-ab1a-d26339c747c3"] + items: + type: array + items: + $ref: "#/components/schemas/OrderItem" + + UpdateOrderStatusRequest: + type: object + required: [status] + properties: + status: + $ref: "#/components/schemas/OrderStatus" + + Customer: + type: object + properties: + id: + type: string + examples: ["1a7830a6-8e0f-43b2-a0e0-4479cb0acf7d"] + name: + type: string + examples: ["Max Mustermann"] + email: + type: string + examples: ["max.mustermann@gmail.com"] + + CreateCustomerRequest: + type: object + required: [name, email] + properties: + name: + type: string + email: + type: string + + UpdateCustomerRequest: + type: object + properties: + name: + type: string + email: + type: string + + Pagination: + type: object + properties: + limit: + type: integer + examples: [20] + offset: + type: integer + examples: [0] + total: + type: integer + examples: [35] + + responses: + CustomerDetails: + description: "Customer details" + content: + application/json: + schema: + $ref: "#/components/schemas/Customer" + + examples: + CustomerRequest: + value: + name: "Max Mustermann" + email: "max.mustermann@gmail.com" + + securitySchemes: + BasicAuth: + type: http + scheme: basic + + ApiKeyAuth: + type: apiKey + in: header + name: X-API-Key + +security: + - BasicAuth: []