uas-web-22412001/api/handler.py

131 lines
4.7 KiB
Python
Raw Normal View History

2025-07-15 13:23:28 +07:00
# 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/.
2025-07-15 13:27:55 +07:00
import json
from bottle import Bottle, route, response, request
2025-07-15 13:23:28 +07:00
from config import directory, database
2025-07-15 13:27:55 +07:00
import mysql.connector as mariadb
2025-07-15 13:23:28 +07:00
import templates.plain.main as template_public
import modules.public.home as public_home
app = Bottle()
2025-07-15 13:27:55 +07:00
# Sample data to simulate a database
# also serves as a model reminder
data = {
2025-07-15 13:54:40 +07:00
"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}
2025-07-15 13:27:55 +07:00
]
}
2025-07-15 13:23:28 +07:00
@app.route('/')
def index():
params = {
"mako":{
"website" : template_public.main(directory.page["public"], "home")
}
}
return public_home.main().html(params)
@app.route('/api/<crud>', method=['OPTIONS', 'GET', 'POST', 'PUT', 'DELETE'])
2025-07-15 13:27:55 +07:00
def index(crud):
2025-07-15 13:23:28 +07:00
response.content_type = 'application/json'
2025-07-15 13:27:55 +07:00
result = {
"status": "error",
"message": f"API endpoint for /api/{crud} is not implemented yet."
2025-07-15 13:23:28 +07:00
}
db_main = mariadb.connect(**database.db_main)
2025-07-15 13:27:55 +07:00
cursor = db_main.cursor(dictionary=True)
payload = request.json
2025-07-15 14:13:12 +07:00
if request.method == 'OPTIONS':
return None
elif crud == "create":
2025-07-15 13:27:55 +07:00
name = payload["name"]
2025-07-15 13:54:40 +07:00
price = payload["price"]
qty = payload["qty"]
2025-07-15 13:27:55 +07:00
2025-07-15 13:54:40 +07:00
if not name or not price or not qty:
2025-07-15 13:27:55 +07:00
result["status"] = "error"
2025-07-15 13:54:40 +07:00
result["message"] = "Name, price, and quantity are required."
2025-07-15 13:27:55 +07:00
return json.dumps(result, indent = 2).encode()
2025-07-15 13:54:40 +07:00
data_id = cursor.execute("INSERT INTO `items` (name, price, qty) VALUES (%s, %s, %s);", (name, price, qty))
2025-07-15 14:13:12 +07:00
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()
2025-07-15 13:27:55 +07:00
result["status"] = "success"
result["message"] = f'{payload["name"]} is added to the list.'
2025-07-15 14:13:12 +07:00
result["data"] = new_item
2025-07-15 13:27:55 +07:00
2025-07-15 13:23:28 +07:00
elif crud == "read":
2025-07-15 13:54:40 +07:00
cursor.execute("SELECT * FROM `items`;")
items = cursor.fetchall()
2025-07-15 13:27:55 +07:00
2025-07-15 13:54:40 +07:00
if not items:
2025-07-15 13:27:55 +07:00
result["status"] = "error"
2025-07-15 13:54:40 +07:00
result["message"] = "No items found."
2025-07-15 13:27:55 +07:00
return json.dumps(result, indent = 2).encode()
result["status"] = "success"
2025-07-15 13:54:40 +07:00
result["message"] = "Items collected."
result["data"] = items
2025-07-15 13:27:55 +07:00
2025-07-15 13:23:28 +07:00
elif crud == "update":
2025-07-15 13:54:40 +07:00
item_id = payload["id"]
2025-07-15 13:27:55 +07:00
name = payload["name"]
2025-07-15 13:54:40 +07:00
price = payload["price"]
qty = payload["qty"]
2025-07-15 13:27:55 +07:00
2025-07-15 13:54:40 +07:00
cursor.execute("UPDATE `items` SET `name` = %s, `price` = %s, `qty` = %s WHERE `id` = %s ;" , (name, price, qty, item_id) )
2025-07-15 13:27:55 +07:00
db_main.commit()
2025-07-15 13:54:40 +07:00
cursor.execute("SELECT * FROM `items` WHERE `id` = %s;", (item_id,))
item = cursor.fetchone()
2025-07-15 13:27:55 +07:00
2025-07-15 13:54:40 +07:00
if not item:
2025-07-15 13:27:55 +07:00
result["status"] = "error"
2025-07-15 13:54:40 +07:00
result["message"] = f'Item with ID {item_id} not found.'
return json.dumps(result, indent = 2).encode()
2025-07-15 13:27:55 +07:00
result["status"] = "success"
2025-07-15 13:54:40 +07:00
result["message"] = f'Item with ID {item_id} is updated.'
2025-07-15 13:27:55 +07:00
result["data"] = {
2025-07-15 13:54:40 +07:00
"id" : item["id"],
"name" : item["name"],
"price": item["price"],
"qty" : item["qty"]
2025-07-15 13:23:28 +07:00
}
2025-07-15 13:27:55 +07:00
2025-07-15 13:23:28 +07:00
elif crud == "delete":
2025-07-15 13:54:40 +07:00
item_id = payload["id"]
cursor.execute("SELECT * FROM `items` WHERE `id` = %s;", (item_id,))
item = cursor.fetchone()
if not item:
2025-07-15 13:27:55 +07:00
result["status"] = "error"
2025-07-15 13:54:40 +07:00
result["message"] = f'Item with ID {item_id} not found.'
2025-07-15 13:27:55 +07:00
return json.dumps(result, indent = 2).encode()
2025-07-15 13:54:40 +07:00
cursor.execute("DELETE FROM `items` WHERE `id` = %s;", (item_id,))
2025-07-15 13:27:55 +07:00
result["status"] = "success"
2025-07-15 13:54:40 +07:00
result["message"] = f'Item with ID {item_id} is deleted.'
2025-07-15 13:27:55 +07:00
result["data"] = {
2025-07-15 13:54:40 +07:00
"id" : item["id"],
"name" : item["name"],
"price": item["price"],
"qty" : item["qty"]
2025-07-15 13:27:55 +07:00
}
return json.dumps(result, indent = 2).encode()