# CostaPy # Copyright (C) 2022 Dita Aji Pratama # # This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. # This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. # You should have received a copy of the GNU General Public License along with this program. If not, see https://www.gnu.org/licenses/. import json from bottle import Bottle, route, response, request from config import directory, database import mysql.connector as mariadb import templates.plain.main as template_public import modules.public.home as public_home app = Bottle() # Sample data to simulate a database # also serves as a model reminder data = { "items": [ {"id": 1, "name": "Kopi", "price": 200.00, "qty": 10}, {"id": 2, "name": "Teh", "price": 200.00, "qty": 20}, {"id": 3, "name": "Susu", "price": 300.00, "qty": 30} ] } @app.route('/') def index(): params = { "mako":{ "website" : template_public.main(directory.page["public"], "home") } } return public_home.main().html(params) @app.route('/api/', method=['OPTIONS', 'GET', 'POST', 'PUT', 'DELETE']) def index(crud): response.content_type = 'application/json' result = { "status": "error", "message": f"API endpoint for /api/{crud} is not implemented yet." } db_main = mariadb.connect(**database.db_main) cursor = db_main.cursor(dictionary=True) payload = request.json if request.method == 'OPTIONS': return None elif crud == "create": name = payload["name"] price = payload["price"] qty = payload["qty"] if not name or not price or not qty: result["status"] = "error" result["message"] = "Name, price, and quantity are required." return json.dumps(result, indent = 2).encode() data_id = cursor.execute("INSERT INTO `items` (name, price, qty) VALUES (%s, %s, %s);", (name, price, qty)) db_main.commit() # Get the newly created item with its ID cursor.execute("SELECT * FROM `items` WHERE `id` = LAST_INSERT_ID();") new_item = cursor.fetchone() result["status"] = "success" result["message"] = f'{payload["name"]} is added to the list.' result["data"] = new_item elif crud == "read": cursor.execute("SELECT * FROM `items`;") items = cursor.fetchall() if not items: result["status"] = "error" result["message"] = "No items found." return json.dumps(result, indent = 2).encode() result["status"] = "success" result["message"] = "Items collected." result["data"] = items elif crud == "update": item_id = payload["id"] name = payload["name"] price = payload["price"] qty = payload["qty"] cursor.execute("UPDATE `items` SET `name` = %s, `price` = %s, `qty` = %s WHERE `id` = %s ;" , (name, price, qty, item_id) ) db_main.commit() cursor.execute("SELECT * FROM `items` WHERE `id` = %s;", (item_id,)) item = cursor.fetchone() if not item: result["status"] = "error" result["message"] = f'Item with ID {item_id} not found.' return json.dumps(result, indent = 2).encode() result["status"] = "success" result["message"] = f'Item with ID {item_id} is updated.' result["data"] = { "id" : item["id"], "name" : item["name"], "price": item["price"], "qty" : item["qty"] } elif crud == "delete": item_id = payload["id"] cursor.execute("SELECT * FROM `items` WHERE `id` = %s;", (item_id,)) item = cursor.fetchone() if not item: result["status"] = "error" result["message"] = f'Item with ID {item_id} not found.' return json.dumps(result, indent = 2).encode() cursor.execute("DELETE FROM `items` WHERE `id` = %s;", (item_id,)) result["status"] = "success" result["message"] = f'Item with ID {item_id} is deleted.' result["data"] = { "id" : item["id"], "name" : item["name"], "price": item["price"], "qty" : item["qty"] } return json.dumps(result, indent = 2).encode()