diff --git a/swagger.py b/swagger.py new file mode 100644 index 0000000..f13e96a --- /dev/null +++ b/swagger.py @@ -0,0 +1,224 @@ +from flask import Flask +from flask_swagger_ui import get_swaggerui_blueprint +import json + +# Swagger configuration +SWAGGER_URL = '/docs' +API_URL = '/swagger.json' + +swagger_ui_blueprint = get_swaggerui_blueprint( + SWAGGER_URL, + API_URL, + config={ + 'app_name': "My First Store API" + } +) + +# Swagger JSON specification +swagger_spec = { + "openapi": "3.0.0", + "info": { + "title": "Simple Store API", + "description": "My first API project - A simple store management system", + "version": "1.0.0" + }, + "servers": [ + { + "url": "http://localhost:5000", + "description": "Development server" + } + ], + "paths": { + "/": { + "get": { + "summary": "Home page", + "description": "Welcome message", + "responses": { + "200": { + "description": "Welcome message", + "content": { + "application/json": { + "example": {"message": "Welcome to my first API!"} + } + } + } + } + } + }, + "/products": { + "get": { + "summary": "Get all products", + "description": "Returns a list of all products in the store", + "responses": { + "200": { + "description": "List of products", + "content": { + "application/json": { + "example": { + "products": [ + {"id": 1, "name": "Laptop", "price": 5000, "quantity": 10} + ] + } + } + } + } + } + }, + "post": { + "summary": "Add new product", + "description": "Create a new product in the store", + "requestBody": { + "required": True, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "name": {"type": "string", "example": "Keyboard"}, + "price": {"type": "number", "example": 300}, + "quantity": {"type": "integer", "example": 20} + }, + "required": ["name", "price"] + } + } + } + }, + "responses": { + "201": { + "description": "Product created successfully" + }, + "400": { + "description": "Missing required fields" + } + } + } + }, + "/products/{product_id}": { + "get": { + "summary": "Get single product", + "description": "Get details of a specific product by ID", + "parameters": [ + { + "name": "product_id", + "in": "path", + "required": True, + "schema": {"type": "integer"}, + "example": 1 + } + ], + "responses": { + "200": { + "description": "Product details" + }, + "404": { + "description": "Product not found" + } + } + }, + "put": { + "summary": "Update product", + "description": "Update an existing product", + "parameters": [ + { + "name": "product_id", + "in": "path", + "required": True, + "schema": {"type": "integer"} + } + ], + "requestBody": { + "required": True, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "name": {"type": "string"}, + "price": {"type": "number"}, + "quantity": {"type": "integer"} + } + } + } + } + }, + "responses": { + "200": { + "description": "Product updated" + }, + "404": { + "description": "Product not found" + } + } + }, + "delete": { + "summary": "Delete product", + "description": "Remove a product from the store", + "parameters": [ + { + "name": "product_id", + "in": "path", + "required": True, + "schema": {"type": "integer"} + } + ], + "responses": { + "200": { + "description": "Product deleted" + }, + "404": { + "description": "Product not found" + } + } + } + }, + "/orders": { + "get": { + "summary": "Get all orders", + "description": "Returns a list of all orders", + "responses": { + "200": { + "description": "List of orders" + } + } + }, + "post": { + "summary": "Create order", + "description": "Place a new order for a product", + "requestBody": { + "required": True, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "product_id": {"type": "integer", "example": 1}, + "quantity": {"type": "integer", "example": 2} + }, + "required": ["product_id", "quantity"] + } + } + } + }, + "responses": { + "201": { + "description": "Order created successfully" + }, + "400": { + "description": "Invalid order data or not enough stock" + }, + "404": { + "description": "Product not found" + } + } + } + } + } +} + +def setup_swagger(app): + """Add Swagger UI to Flask app""" + app.register_blueprint(swagger_ui_blueprint, url_prefix=SWAGGER_URL) + + @app.route('/swagger.json') + def swagger_json(): + return swagger_spec