vocab-backend/deck_endpoints.py

163 lines
5.0 KiB
Python

# deck_endpoints.py
from flask import Blueprint, request, jsonify
import sqlite3
import os
deck_bp = Blueprint('deck_bp', __name__)
DATABASE = 'mydatabase.db'
def get_db_connection():
conn = sqlite3.connect(DATABASE)
conn.row_factory = sqlite3.Row
return conn
# Erstellen der Tabellen, falls sie nicht existieren
def init_db():
conn = get_db_connection()
cursor = conn.cursor()
# Tabelle Deck erstellen
cursor.execute('''
CREATE TABLE IF NOT EXISTS Deck (
id INTEGER PRIMARY KEY AUTOINCREMENT,
deckname TEXT UNIQUE NOT NULL
)
''')
# Tabelle Image erstellen
cursor.execute('''
CREATE TABLE IF NOT EXISTS Image (
id INTEGER PRIMARY KEY AUTOINCREMENT,
deckid INTEGER,
bildname TEXT,
iconindex INTEGER,
x1 REAL,
x2 REAL,
y1 REAL,
y2 REAL,
FOREIGN KEY(deckid) REFERENCES Deck(id)
)
''')
conn.commit()
conn.close()
@deck_bp.route('/api/decks', methods=['POST'])
def create_deck():
data = request.get_json()
if not data or 'deckname' not in data:
return jsonify({'error': 'No deckname provided'}), 400
deckname = data['deckname']
conn = get_db_connection()
cursor = conn.cursor()
try:
cursor.execute('INSERT INTO Deck (deckname) VALUES (?)', (deckname,))
conn.commit()
deck_id = cursor.lastrowid
conn.close()
return jsonify({'status': 'success', 'deck_id': deck_id}), 201
except sqlite3.IntegrityError:
conn.close()
return jsonify({'error': 'Deckname already exists'}), 400
@deck_bp.route('/api/decks', methods=['GET'])
def get_decks():
conn = get_db_connection()
cursor = conn.cursor()
decks = cursor.execute('SELECT * FROM Deck').fetchall()
deck_list = []
for deck in decks:
deck_id = deck['id']
deck_name = deck['deckname']
# Alle Images für dieses Deck abrufen
images = cursor.execute('''
SELECT
bildname AS name,
iconindex,
x1,
x2,
y1,
y2
FROM Image
WHERE deckid = ?
''', (deck_id,)).fetchall()
images_list = [dict(image) for image in images]
# Deck mit Namen und zugehörigen Images hinzufügen
deck_dict = {
'name': deck_name,
'images': images_list
}
deck_list.append(deck_dict)
conn.close()
return jsonify(deck_list)
@deck_bp.route('/api/decks/<deckname>', methods=['DELETE'])
def delete_deck(deckname):
conn = get_db_connection()
cursor = conn.cursor()
# Zuerst die Images löschen, die zu diesem Deck gehören
cursor.execute('SELECT id FROM Deck WHERE deckname = ?', (deckname,))
deck = cursor.fetchone()
if deck:
deck_id = deck['id']
cursor.execute('DELETE FROM Image WHERE deckid = ?', (deck_id,))
# Dann das Deck löschen
cursor.execute('DELETE FROM Deck WHERE id = ?', (deck_id,))
conn.commit()
conn.close()
return jsonify({'status': 'success'}), 200
else:
conn.close()
return jsonify({'error': 'Deck not found'}), 404
@deck_bp.route('/image', methods=['PUT'])
def update_image():
data = request.get_json()
if not data:
return jsonify({'error': 'No data provided'}), 400
required_fields = ['deckid', 'bildname', 'iconindex', 'x1', 'x2', 'y1', 'y2']
if not all(field in data for field in required_fields):
return jsonify({'error': 'Missing fields in data'}), 400
deckid = data['deckid']
bildname = data['bildname']
iconindex = data['iconindex']
x1 = data['x1']
x2 = data['x2']
y1 = data['y1']
y2 = data['y2']
conn = get_db_connection()
cursor = conn.cursor()
cursor.execute('''
INSERT INTO Image (deckid, bildname, iconindex, x1, x2, y1, y2)
VALUES (?, ?, ?, ?, ?, ?, ?)
''', (deckid, bildname, iconindex, x1, x2, y1, y2))
conn.commit()
image_id = cursor.lastrowid
conn.close()
return jsonify({'status': 'success', 'image_id': image_id}), 201
@deck_bp.route('/image/<bildname>', methods=['GET'])
def get_images_by_bildname(bildname):
conn = get_db_connection()
images = conn.execute('SELECT * FROM Image WHERE bildname = ?', (bildname,)).fetchall()
conn.close()
image_list = [dict(image) for image in images]
return jsonify(image_list)
@deck_bp.route('/image/<bildname>/<int:iconindex>', methods=['GET'])
def get_image_by_bildname_and_index(bildname, iconindex):
conn = get_db_connection()
image = conn.execute('SELECT * FROM Image WHERE bildname = ? AND iconindex = ?', (bildname, iconindex)).fetchone()
conn.close()
if image is None:
return jsonify({'error': 'Image not found'}), 404
else:
return jsonify(dict(image)), 200
# Sicherstellen, dass die Datenbank existiert
if not os.path.exists(DATABASE):
init_db()