diff --git a/app/api/users.py b/app/api/users.py new file mode 100644 index 0000000000000000000000000000000000000000..0af19c3648413ab1a34d57ba63e2672c1cc787e3 --- /dev/null +++ b/app/api/users.py @@ -0,0 +1,689 @@ +import csv +import io +import json +from flask import Blueprint, request, jsonify, Response, redirect, url_for + +from ..functions import validate_json_fields +from ..token import get_current_user, token_required +from ..database import db +from ..models import User, Item, Transaction +from ..config import * + +USER_DOES_NOT_EXISTS_MESSAGE = 'Nem létezik ilyen felhasználó!' + +# Endpoint handeler blueprint létrehozása +users = Blueprint('users', __name__, url_prefix='/users') # prefix: /api/v1/users + +calc_credit = lambda role: ADMIN_CREDIT if role == Roles.Admin.value else USER_CREDIT + +# ------------- REST API-sítás ------------------------ + +# /api/users +# Felhasználók lekérdezése +@users.route('/', methods=['GET']) +@token_required(required_role=Roles.Admin.value) +def get_users(): + """ + Felhasználók lekérdezése + --- + tags: + - Felhasználók + description: Az admin felhasználó lekérdezheti az összes felhasználó adatait. + responses: + 200: + description: Sikeres lekérdezés. + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + type: array + items: + type: object + properties: + uuid: + type: string + example: '123e4567-e89b-12d3-a456-426614174000' + name: + type: string + example: 'User1' + balance: + type: integer + example: 1000 + role: + type: string + example: 'admin' + 400: + description: Hibás kérés, például nem létező felhasználó. + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: false + message: + type: string + example: "Nem létezik ilyen felhasználó!" + security: + - jwtCookieAuth: [] + """ + if request.method == 'GET': + users = User.query.all() + user_list = [user.to_dict() for user in users] + return jsonify({"success": True, "data": user_list}), 200 + +# /api/users +# Felhasználó létrehozása +@users.route('/', methods=['POST']) +@token_required(required_role=Roles.Admin.value) +def create_user(): + """ + Felhasználó létrehozása + --- + tags: + - Felhasználók + description: Az admin felhasználó új felhasználót hozhat létre. + parameters: + - name: user + in: body + required: true + description: A felhasználó adatai. + schema: + type: object + properties: + uuid: + type: string + example: '123e4567-e89b-12d3-a456-426614174000' + name: + type: string + example: 'User1' + balance: + type: integer + example: 1000 + role: + type: string + example: 'admin' + responses: + 200: + description: Sikeres felhasználó létrehozás. + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + message: + type: string + example: "Felhasználó sikeresen létrehozva." + 400: + description: Hibás kérés, például már létező UUID. + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: false + message: + type: string + example: "Már létezik ilyen UUID." + security: + - jwtCookieAuth: [] + """ + if request.method == 'POST': + data = request.json + + is_valid, msg = validate_json_fields(data, ['uuid', 'name', 'balance', 'role']) + if not is_valid: + return jsonify({"success": False, 'message': msg}), 400 + + user_uuid = str(data.get('uuid')) + user_name = str(data.get('name')) + user_balance = int(str(data.get('balance'))) + user_role = str(data.get('role')) + + # Lekérdezzük az adatbázisbólk, hogy van e ilyen nevű felhasználó + selected_user = User.query.get(user_uuid) + # Ha van ilyen felhasználó, akkor errort dobunk visza + if selected_user: + return jsonify({"success": False, "message": f"Már létezik ilyen UUID: {user_uuid}."}), 400 + + # Felhasználó létrehozása a táblában + new_user = User( + uuid=user_uuid, + name=user_name, + balance=user_balance, + role=user_role + ) + + # Adatbázisba írás + db.session.add(new_user) + db.session.commit() + + return jsonify({"success": True, "message": f"{user_name} felhasználó sikeresen létrehozva."}), 200 + + +# /api/users/{uuid} +# GET # Felhasználói adatok lekérdezése uuid-val azonosítva +@users.route('/<string:uuid>', methods=['GET']) +@token_required(required_role=Roles.Admin.value) +def get_user_by_uuid(uuid): + """ + Felhasználó adatainak lekérdezése UUID alapján + --- + tags: + - Felhasználók + description: Az admin felhasználó lekérdezheti egy adott felhasználó adatait UUID alapján. + parameters: + - name: uuid + in: path + required: true + description: A felhasználó UUID-ja. + schema: + type: string + responses: + 200: + description: Sikeres lekérdezés. + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + type: object + properties: + uuid: + type: string + example: '123e4567-e89b-12d3-a456-426614174000' + name: + type: string + example: 'User1' + balance: + type: integer + example: 1000 + role: + type: string + example: 'admin' + 400: + description: Hibás kérés, például nem létező felhasználó. + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: false + message: + type: string + example: "Nem létezik ilyen felhasználó!" + security: + - jwtCookieAuth: [] + """ + if request.method == 'GET': + selected_user = User.query.get(uuid) + # Ha nincs ilyen felhasználó, akkor errort dobunk visza + if not selected_user: + return jsonify({"success": False, "message": USER_DOES_NOT_EXISTS_MESSAGE}), 400 + return jsonify({"success": True, "data": selected_user.to_dict()}), 200 + +# DELETE # Felhasználó törlése +@users.route('/<string:uuid>', methods=['DELETE']) +@token_required(required_role=Roles.Admin.value) +def delete_user(uuid): + """ + Felhasználó törlése UUID alapján + --- + tags: + - Felhasználók + description: Az admin felhasználó törölhet egy adott felhasználót UUID alapján. + parameters: + - name: uuid + in: path + required: true + description: A felhasználó UUID-ja. + schema: + type: string + responses: + 200: + description: Sikeres törlés. + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + message: + type: string + example: "Felhasználó sikeresen törölve." + 400: + description: Hibás kérés, például nem létező felhasználó. + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: false + message: + type: string + example: "Nem létezik ilyen felhasználó!" + security: + - jwtCookieAuth: [] + """ + if request.method == 'DELETE': + selected_user = User.query.get(uuid) + # Ha nincs ilyen felhasználó, akkor errort dobunk visza + if not selected_user: + return jsonify({"success": False, "message": USER_DOES_NOT_EXISTS_MESSAGE}), 400 + + # Ellenőrzés, hogy van e kapcsolódó tranzakció + if selected_user.sent_transactions or selected_user.received_transactions: + return jsonify({"success": False, "message": f"{selected_user.name} felhasználót nem lehet addig eltávolítani, ameddig kapcsolódnak hozzá tranzakciók!"}), 200 + + # Felhasználó eltávolítása a táblából + db.session.delete(selected_user) + + # Adatbázisba mentés + db.session.commit() + + return jsonify({"success": True, "message": f"{selected_user.name} felhasználó sikeresen törölve."}), 200 + + +# /api/users/{uuid}/balance +# GET # Felhasználó egyenlegének lekérdezése +@users.route('/<string:uuid>/balance', methods=['GET']) +@token_required(required_role=Roles.Admin.value) +def get_user_balance(uuid): + """ + Felhasználó egyenlegének lekérdezése UUID alapján + --- + tags: + - Felhasználók + description: Az admin felhasználó lekérdezheti egy adott felhasználó egyenlegét UUID alapján. + parameters: + - name: uuid + in: path + required: true + description: A felhasználó UUID-ja. + schema: + type: string + responses: + 200: + description: Sikeres lekérdezés. + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + balance: + type: integer + example: 1000 + 400: + description: Hibás kérés, például nem létező felhasználó. + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: false + message: + type: string + example: "Nem létezik ilyen felhasználó!" + security: + - jwtCookieAuth: [] + """ + if request.method == 'GET': + selected_user = User.query.get(uuid) + # Ha nincs ilyen felhasználó, akkor errort dobunk visza + if not selected_user: + return jsonify({"success": False, "message": USER_DOES_NOT_EXISTS_MESSAGE}), 400 + + return jsonify({"success": True, "balance": selected_user.balance}), 200 + +# PATCH # Felhasználó egyenlegének változtatása (Feltöltés) +@users.route('/<string:uuid>/balance', methods=['PATCH']) +@token_required(required_role=Roles.Admin.value) +def update_user_balance(uuid): + """ + Felhasználó egyenlegének módosítása UUID alapján + --- + tags: + - Felhasználók + description: Az admin felhasználó módosíthatja egy adott felhasználó egyenlegét UUID alapján. + parameters: + - name: uuid + in: path + required: true + description: A felhasználó UUID-ja. + schema: + type: string + - name: amount + in: body + required: true + description: Az új egyenleg összege. + schema: + type: object + properties: + amount: + type: integer + example: 100 + responses: + 200: + description: Sikeres módosítás. + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + message: + type: string + example: "Felhasználó egyenlege sikeresen módosítva." + 400: + description: Hibás kérés, például nem létező felhasználó vagy érvénytelen összeg. + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: false + message: + type: string + example: "Nem létezik ilyen felhasználó!" + security: + - jwtCookieAuth: [] + """ + if request.method == 'PATCH': + data = request.json + + is_valid, msg = validate_json_fields(data, ['amount']) + if not is_valid: + return jsonify({"success": False, 'message': msg}), 400 + + # Összeg kiolvasása + amount = int(str(data.get('amount'))) + + # Ellenőrzés, hogy túl nagy összeget töltött e fel valaki + if amount < -TRANSACTION_AMOUNT_LIMIT or amount > TRANSACTION_AMOUNT_LIMIT: + return jsonify({"success": False, "message": f"Túl nagy vagy túl kis számot adtál meg.\nMaximum {TRANSACTION_AMOUNT_LIMIT} JMF-ot lehet feltölteni!"}), 400 + + # Meghatározzuk a bejelentkezett admin felhasználót + admin_user = get_current_user() + # Lekérdezzük az adatbázisbólk, hogy van e ilyen nevű felhasználó + selected_user = User.query.get(uuid) + # Ha nincs ilyen felhasználó, akkor errort dobunk visza + if (not selected_user) or (not admin_user): + return jsonify({"success": False, "message": USER_DOES_NOT_EXISTS_MESSAGE}), 400 + + # Elégtelen jogosultság esetén hibát dobunk + if admin_user.role < Roles.Admin.value: + return jsonify({"success": False, "message": f"{admin_user.name} felhasználónak nincs jogosultsága ilyen művelethez!"}), 400 + + # Tranzakció felvétele a táblába + topup_transaction = Transaction( + by_user_uuid = admin_user.uuid, + to_user_uuid = uuid, + item_id = TOPUP_ITEM_ID, + amount = amount, + quantity = 1 + ) + + # Transakció létrehozása + db.session.add(topup_transaction) + # A kiválasztott felhasználó egyenlegének növelése/csökkentése + selected_user.balance += amount + # Adatbázisba mentés + db.session.commit() + + return jsonify({"success": True, "message": f"{amount} JMF sikeresen feltöltve {selected_user.name}-nek!"}), 200 + +# /api/users/{uuid}/transactions +# GET # Felhasználó által elszenvedett tranzakciók listája +@users.route('/<string:uuid>/transactions', methods=['GET']) +# @token_required(required_role=Roles.admin.value) +def get_user_transactions(uuid): + """ + Felhasználó tranzakcióinak lekérdezése UUID alapján + --- + tags: + - Felhasználók + description: Az admin felhasználó lekérdezheti egy adott felhasználó tranzakcióit UUID alapján. + parameters: + - name: uuid + in: path + required: true + description: A felhasználó UUID-ja. + schema: + type: string + responses: + 200: + description: Sikeres lekérdezés. + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + transactions: + type: array + items: + type: object + properties: + id: + type: integer + example: 1 + by_user_uuid: + type: string + example: '123e4567-e89b-12d3-a456-426614174000' + to_user_uuid: + type: string + example: '123e4567-e89b-12d3-a456-426614174001' + item_id: + type: integer + example: 1 + amount: + type: integer + example: 1000 + quantity: + type: integer + example: 1 + 400: + description: Hibás kérés, például nem létező felhasználó. + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: false + message: + type: string + example: "Nem létezik ilyen felhasználó!" + security: + - jwtCookieAuth: [] + """ + if request.method == 'GET': + selected_user = User.query.get(uuid) + # Ha nincs ilyen felhasználó, akkor errort dobunk visza + if not selected_user: + return jsonify({"success": False, "message": USER_DOES_NOT_EXISTS_MESSAGE}), 400 + + transactions = Transaction.query.filter((Transaction.by_user_uuid == uuid) | (Transaction.to_user_uuid == uuid)).all() + + transaction_list = [transaction.to_dict() for transaction in transactions] + + return jsonify({"success": True, "transactions": transaction_list}), 200 + +# /api/users/{uuid}/role +# GET # Visszaadja a uuid-vel azonosított felhasználó rangját +@users.route('/<string:uuid>/role', methods=['GET']) +@token_required(required_role=Roles.Admin.value) +def get_user_role(uuid): + """ + Felhasználó rangjának lekérdezése UUID alapján + --- + tags: + - Felhasználók + description: Az admin felhasználó lekérdezheti egy adott felhasználó rangját UUID alapján. + parameters: + - name: uuid + in: path + required: true + description: A felhasználó UUID-ja. + schema: + type: string + responses: + 200: + description: Sikeres lekérdezés. + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + role: + type: string + example: 'admin' + 400: + description: Hibás kérés, például nem létező felhasználó. + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: false + message: + type: string + example: "Nem létezik ilyen felhasználó!" + security: + - jwtCookieAuth: [] + """ + if request.method == 'GET': + selected_user = User.query.get(uuid) + # Ha nincs ilyen felhasználó, akkor errort dobunk visza + if not selected_user: + return jsonify({"success": False, "message": USER_DOES_NOT_EXISTS_MESSAGE}), 400 + + return jsonify({"success": True, "role": selected_user.role, "role_name": f"{Roles(selected_user.role)}" }), 200 + +# /api/users/{uuid}/role +# PATCH # Megváltoztatja a felhasználó rangját +@users.route('/<string:uuid>/role', methods=['PATCH']) +# @token_required(required_role=Roles.admin.value) +def update_user_role(uuid): + """ + Felhasználó rangjának módosítása UUID alapján + --- + tags: + - Felhasználók + description: Az admin felhasználó módosíthatja egy adott felhasználó rangját UUID alapján. + parameters: + - name: uuid + in: path + required: true + description: A felhasználó UUID-ja. + schema: + type: string + - name: role + in: body + required: true + description: Az új rang. + schema: + type: object + properties: + role: + type: string + example: 'admin' + responses: + 200: + description: Sikeres módosítás. + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + message: + type: string + example: "Felhasználó rangja sikeresen módosítva." + 400: + description: Hibás kérés, például nem létező felhasználó vagy érvénytelen rang. + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: false + message: + type: string + example: "Nem létezik ilyen felhasználó!" + security: + - jwtCookieAuth: [] + """ + if request.method == 'PATCH': + data = request.json + + is_valid, msg = validate_json_fields(data, ['role'], ['role']) + if not is_valid: + return jsonify({"success": False, 'message': msg}), 400 + + # Rang kiolvasása + role = int(str(data.get('role'))) + + # Lekérdezzük az adatbázisbólk, hogy van e ilyen nevű felhasználó + selected_user = User.query.get(uuid) + # Ha nincs ilyen felhasználó, akkor errort dobunk visza + if not selected_user: + return jsonify({"success": False, "message": USER_DOES_NOT_EXISTS_MESSAGE}), 400 + + # Elégtelen jogosultság esetén hibát dobunk + if role > Roles.Admin.value: + return jsonify({"success": False, "message": f"Nem lehet egy sima felhasználónak 'admin'-nál magasabb jogosultsága!"}), 400 + + # Felhasználó rangjának módosítása + selected_user.role = role + selected_user.credit = calc_credit(role) + + # Adatbázisba mentés + db.session.commit() + + return jsonify({"success": True, "message": f"{selected_user.name} felhasználó mostantól {Roles(selected_user.role)}."}), 200 + + +# ----------------------------------------------------- \ No newline at end of file diff --git a/app/app.py b/app/app.py index 01492269477f0391dca44b3e5dc850f2e5e04be6..086d9f1d926480168085b8cae62bdb4f0c8b1b34 100644 --- a/app/app.py +++ b/app/app.py @@ -95,6 +95,10 @@ app.register_blueprint(user_requests, url_prefix='/') # felhasználói művelete app.register_blueprint(item_requests, url_prefix='/') # tétel műveletek endpointjai app.register_blueprint(icon_requests, url_prefix='/') # ikon műveletek endpointjai +# === REST API endpointok === +from .api.users import users +app.register_blueprint(users, url_prefix= API_PREFIX + users.url_prefix) # oldalak endpoinjainak hozzáakpcsolása az apphoz + # === Adatbázis inizializálása === with app.app_context(): # Kontextus beállítása diff --git a/app/authsch.py b/app/authsch.py index a1d36e27f72b2bae3d1fe65b762449dc0a1863ab..f42a20078243e095cf0ded7880df4cf6dd232575 100644 --- a/app/authsch.py +++ b/app/authsch.py @@ -60,7 +60,7 @@ def login(): test_user = User( uuid=TEST_USER_UUID, name='Teszt Elek', - role=Roles.admin.value, + role=Roles.Admin.value, ) db.session.add(test_user) # Felhasználó hozzáadása az adatbázishoz db.session.commit() # Adatbázisba comittolás (Mentés) @@ -163,15 +163,15 @@ def callback(): if not user: # login_user(user, remember=True) - noAdminYet = User.query.filter_by(role=Roles.admin.value).count() == 0 - roleValue = Roles.admin.value if noAdminYet else Roles.user.value, + noAdminYet = User.query.filter_by(role=Roles.Admin.value).count() == 0 + roleValue = Roles.Admin.value if noAdminYet else Roles.User.value, # Új felhasználó felvétele az adatbázisba user = User( name=session['user']['name'], uuid=session['user']['uuid'], # Az első felhasználó aki regisztrál admin lesz role=roleValue, - credit= ADMIN_CREDIT if roleValue == Roles.admin.value else USER_CREDIT + credit= ADMIN_CREDIT if roleValue == Roles.Admin.value else USER_CREDIT ) db.session.add(user) # Felhasználó hozzáadása az adatbázishoz db.session.commit() # Adatbázisba comittolás (Mentés) diff --git a/app/config.py b/app/config.py index 03b71d1a1b9f481f267ea303d5f0f0ef7397d279..fca56faecb54e5be89c5b190032fb04421a61031 100644 --- a/app/config.py +++ b/app/config.py @@ -7,13 +7,19 @@ load_dotenv(dotenv_path="../.env") # Rangok class Roles(Enum): - user = 0 - bartender = 1 - admin = 2 - bot = 3 + User = 0 + Bartender = 1 + Admin = 2 + Bot = 3 + + def __str__(self): + return self.name + def __int__(self): + return self.value # Alap konstansok +API_PREFIX = '/api/v1' DEBUG_MODE = os.getenv('DEBUG_MODE', 'False') BYPASS_AUTH_SCH = os.getenv('BYPASS_AUTH_SCH', 'False') RELEASE_VERSION = os.getenv('RELEASE_VERSION', 'NOT_FOUND') @@ -31,7 +37,7 @@ NON_DISPLAY_BELLOW_ID = 0 # Becskassza dummy Felhasználó BOT_USER_UUID = 'B3C5K4SS24-B0T-M452T3R' BOT_USER_NAME = 'BecskasszaBot' -BOT_USER_ROLE = Roles.bot.value +BOT_USER_ROLE = Roles.Bot.value # Pénz Feltöltés ikon és a tranzakció hozzárendeléshez tartozó termék TOPUP_ITEM_ID = 0 diff --git a/app/icon_requests.py b/app/icon_requests.py index f3aa3a4c6f142eb6a07e3317348e487c06e77e58..f09339db06955a2bf57bb9015c7fbb94c9de903a 100644 --- a/app/icon_requests.py +++ b/app/icon_requests.py @@ -26,7 +26,7 @@ def allowed_file(filename): # Ikon feltöltés POST kéréssel @icon_requests.route('/upload_icon', methods=['POST']) -@token_required(required_role=Roles.admin.value) +@token_required(required_role=Roles.Admin.value) def upload_icon(): """ Ikon feltöltése @@ -115,7 +115,7 @@ def upload_icon(): # Sok Ikon feltöltés POST kéréssel @icon_requests.route('/upload_icon_files', methods=['POST']) -@token_required(required_role=Roles.admin.value) +@token_required(required_role=Roles.Admin.value) def upload_icon_files(): """ Több ikon feltöltése @@ -217,7 +217,7 @@ def upload_icon_files(): # Ikon módosítás POST kéréssel @icon_requests.route('/modify_icon', methods=['PUT']) -@token_required(required_role=Roles.admin.value) +@token_required(required_role=Roles.Admin.value) def modify_icon(): """ Ikon módosítása @@ -323,7 +323,7 @@ def modify_icon(): # Ikon törlése POST kéréssel @icon_requests.route('/delete_icon', methods=['DELETE']) -@token_required(required_role=Roles.admin.value) +@token_required(required_role=Roles.Admin.value) def delete_icon(): """ Ikon törlése @@ -408,7 +408,7 @@ def delete_icon(): @icon_requests.route('/icons_export', methods=['GET']) -@token_required(required_role=Roles.admin.value) +@token_required(required_role=Roles.Admin.value) def icons_export(): """ Ikonok exportálása diff --git a/app/item_requests.py b/app/item_requests.py index 2dc642b64d47d0bd3c58a85ea7f458b2bb713a6a..b1dbcbd31c5f7598119953fffbad1f77dfd04e37 100644 --- a/app/item_requests.py +++ b/app/item_requests.py @@ -22,7 +22,7 @@ item_requests = Blueprint('itemRequests', __name__) # Termék hozzáadás POST kéréssel @item_requests.route('/add_item', methods=['POST']) -@token_required(required_role=Roles.admin.value) +@token_required(required_role=Roles.Admin.value) def add_item(): """ Termék hozzáadása @@ -101,7 +101,7 @@ def add_item(): # Termék módosítása POST kéréssel @item_requests.route('/modify_item', methods=['PUT']) -@token_required(required_role=Roles.admin.value) +@token_required(required_role=Roles.Admin.value) def modify_item(): """ Termék módosítása @@ -182,7 +182,7 @@ def modify_item(): # Termék archiválása POST kéréssel @item_requests.route('/archive_item', methods=['PUT']) -@token_required(required_role=Roles.admin.value) +@token_required(required_role=Roles.Admin.value) def archive_item(): """ Termék archiválása @@ -237,7 +237,7 @@ def archive_item(): # Termék dearchiválása POST kéréssel @item_requests.route('/dearchive_item', methods=['PUT']) -@token_required(required_role=Roles.admin.value) +@token_required(required_role=Roles.Admin.value) def dearchive_item(): """ Termék dearchiválása @@ -382,7 +382,7 @@ def make_transaction(): # Termék visszavonása POST kéréssel @item_requests.route('/undo_transaction', methods=['DELETE']) -@token_required(required_role=Roles.admin.value) +@token_required(required_role=Roles.Admin.value) def undo_transaction(): """ Tranzakció visszavonása @@ -470,7 +470,7 @@ def undo_transaction(): # Termék készletének feltöltése/módosítása POST kéréssel @item_requests.route('/stockup', methods=['PUT']) -@token_required(required_role=Roles.admin.value) +@token_required(required_role=Roles.Admin.value) def stockup(): """ Termék készletének módosítása @@ -533,7 +533,7 @@ def stockup(): # Pultos megrendelés endpoint POST kéréssel @item_requests.route('/make_order', methods=['POST']) -@token_required(required_role=Roles.bartender.value) +@token_required(required_role=Roles.Bartender.value) def make_order(): """ Megrendelés készítése @@ -612,7 +612,7 @@ def make_order(): if (not selected_user) or (not bartender_user): return jsonify({"success": False, "message": "Nem létezik ilyen felhasználó"}), 400 # Elégtelen jogosultság esetén hibát dobunk - if bartender_user.role < Roles.bartender.value: + if bartender_user.role < Roles.Bartender.value: return jsonify({"success": False, "message": f"{bartender_user.name} felhasználónak nincs jogosultsága ilyen művelethez!"}), 400 @@ -646,7 +646,7 @@ def make_order(): @item_requests.route('/items_export', methods=['GET']) -@token_required(required_role=Roles.admin.value) +@token_required(required_role=Roles.Admin.value) def items_export(): """ Termékek exportálása CSV-be diff --git a/app/models.py b/app/models.py index 0b52b84cf665fa60aa1298a9ff4208fe7fbb05ea..4cefce3a86cd5f885c1491cfe5d88f878b31fcf8 100644 --- a/app/models.py +++ b/app/models.py @@ -62,7 +62,7 @@ class User(db.Model, UserMixin): name = db.Column(db.String(150), nullable=False) # AuthSCH-ról kapott felhasználó teljes neve balance = db.Column(db.Integer, default=0) # Felhassználó egyenlege credit = db.Column(db.Integer, default=USER_CREDIT) # Felhasználó krdeit kerete - role = db.Column(db.Integer, default=Roles.user.value) # Felhasználó rangja (0: Userm, 1: Pultos, 2: Admin) + role = db.Column(db.Integer, default=Roles.User.value) # Felhasználó rangja (0: Userm, 1: Pultos, 2: Admin) # Kapcsolt mezők sent_transactions = db.relationship('Transaction', foreign_keys='Transaction.by_user_uuid', back_populates="by_user") received_transactions = db.relationship('Transaction', foreign_keys='Transaction.to_user_uuid', back_populates="to_user") diff --git a/app/routes.py b/app/routes.py index ab3459dac56b29bce2d7901f5ae8f3a9b67bae52..03c1f1045e94738011d3380f77d8261ceec2e7dd 100644 --- a/app/routes.py +++ b/app/routes.py @@ -91,7 +91,7 @@ def history(uuid): return redirect(url_for('routes.error', message='A keresett felhasználó nem található.')) # Ha egy sima felhasználó más költéseit akarná megnézni, akkor ne tudja - if not current_user.role >= Roles.admin.value and selected_user != current_user: + if not current_user.role >= Roles.Admin.value and selected_user != current_user: return redirect(url_for('routes.history')) @@ -112,7 +112,7 @@ def history(uuid): # Kilistázza a felhasználókat [ADMIN ONLY] @routing.route('/admin') -@token_required(required_role=Roles.admin.value) +@token_required(required_role=Roles.Admin.value) def admin(): """ Adminisztrációs oldal, ahol a felhasználók és tranzakciók kezelhetőek @@ -179,7 +179,7 @@ def admin(): # Kilistázza a felhasználókat [ADMIN ONLY] @routing.route('/users', methods=['GET']) -@token_required(required_role=Roles.admin.value) +@token_required(required_role=Roles.Admin.value) def users(): """ Felhasználók listázása @@ -225,7 +225,7 @@ def users(): # Kilistázza a tételeket, ahol lehet azokat módosítani, hozzáadni, törölni [ADMIN ONLY] @routing.route('/items', methods=['GET']) -@token_required(required_role=Roles.admin.value) +@token_required(required_role=Roles.Admin.value) def items(): """ Tételek kezelése @@ -273,7 +273,7 @@ def items(): # Kilistázza az ikonokat [ADMIN ONLY] @routing.route('/icons', methods=['GET']) -@token_required(required_role=Roles.admin.value) +@token_required(required_role=Roles.Admin.value) def icon(): """ Ikonok listázása @@ -318,7 +318,7 @@ def icon(): # Pult: Pultos kioszthat tételeket [BARTENDER ÉS ADMIN ONLY] @routing.route('/bar', methods=['GET']) -@token_required(required_role=Roles.bartender.value) +@token_required(required_role=Roles.Bartender.value) def bar(): """ Pultkezelés @@ -364,7 +364,7 @@ def bar(): # Az összes tranzakciót kilistázza [ADMIN ONLY] @routing.route('/transactions', methods=['GET']) -@token_required(required_role=Roles.admin.value) +@token_required(required_role=Roles.Admin.value) def transactions(): """ Tranzakciók listázása @@ -452,7 +452,7 @@ def transactions(): @routing.route('/transactions_export', methods=['GET']) -@token_required(required_role=Roles.admin.value) +@token_required(required_role=Roles.Admin.value) def transactions_export(): """ Tranzakciók exportálása CSV fájlban diff --git a/app/token.py b/app/token.py index e2ae1340c01c3a3a8a60d609394314e8c6c07b5d..eac90e26eb3458e498601a226c92bbd9bc6251c1 100644 --- a/app/token.py +++ b/app/token.py @@ -10,7 +10,7 @@ from jwt import ExpiredSignatureError from app.config import BYPASS_AUTH_SCH, DEBUG_MODE, Roles from app.models import User -def token_required(required_role=Roles.user.value): +def token_required(required_role=Roles.User.value): def decorator(func): @wraps(func) def wrapper(*args, **kwargs): diff --git a/app/user_requests.py b/app/user_requests.py index 6307ab491ccd8684a952281cc60acd628ad65e7f..2eae1cf361afa76efefc89491f3fdfbf467f0344 100644 --- a/app/user_requests.py +++ b/app/user_requests.py @@ -14,7 +14,7 @@ USER_DOES_NOT_EXISTS_MESSAGE = 'Nem létezik ilyen felhasználó!' # Endpoint handeler blueprint létrehozása user_requests = Blueprint('userRequests', __name__) -calc_credit = lambda role: ADMIN_CREDIT if role == Roles.admin.value else USER_CREDIT +calc_credit = lambda role: ADMIN_CREDIT if role == Roles.Admin.value else USER_CREDIT # ------------- REST API-sítás ------------------------ @@ -34,7 +34,7 @@ def topup_to_user(selected_user_uuid, amount): return jsonify({"success": False, "message": USER_DOES_NOT_EXISTS_MESSAGE}), 400 # Elégtelen jogosultság esetén hibát dobunk - if admin_user.role != Roles.admin.value: + if admin_user.role != Roles.Admin.value: return jsonify({"success": False, "message": f"{admin_user.name} felhasználónak nincs jogosultsága ilyen művelethez!"}), 400 # Tranzakció felvétele a táblába @@ -55,7 +55,7 @@ def topup_to_user(selected_user_uuid, amount): # Felhasználó egyenleg feltöltésére irányuló POST kérés @user_requests.route('/topup', methods=['PUT', 'OPTIONS']) -@token_required(required_role=Roles.admin.value) +@token_required(required_role=Roles.Admin.value) def topup(): """ Felhasználó egyenleg feltöltése @@ -131,7 +131,7 @@ def topup(): # Felhasználónak ADMIN jog adás POST kéréssel @user_requests.route('/grant_admin', methods=['PUT']) -@token_required(required_role=Roles.admin.value) +@token_required(required_role=Roles.Admin.value) def grant_admin(): """ Admin jog adása egy felhasználónak @@ -195,7 +195,7 @@ def grant_admin(): if not selected_user: return jsonify({"success": False, "message": USER_DOES_NOT_EXISTS_MESSAGE}), 400 - selected_user.role = Roles.admin.value + selected_user.role = Roles.Admin.value selected_user.credit = calc_credit(selected_user.role) # Adatbázisba mentés db.session.commit() @@ -204,7 +204,7 @@ def grant_admin(): # Felhasználótól ADMIN jog megvonás POST kéréssel @user_requests.route('/revoke_admin', methods=['PUT']) -@token_required(required_role=Roles.admin.value) +@token_required(required_role=Roles.Admin.value) def revoke_admin(): """ Admin jog megvonása egy felhasználótól @@ -270,7 +270,7 @@ def revoke_admin(): if not selected_user: return jsonify({"success": False, "message": USER_DOES_NOT_EXISTS_MESSAGE}), 400 - selected_user.role = Roles.user.value + selected_user.role = Roles.User.value selected_user.credit = calc_credit(selected_user.role) # Adatbázisba mentés db.session.commit() @@ -279,7 +279,7 @@ def revoke_admin(): # Felhasználónak PULTOS jog adás POST kéréssel @user_requests.route('/grant_bartender', methods=['PUT']) -@token_required(required_role=Roles.admin.value) +@token_required(required_role=Roles.Admin.value) def grant_bartender(): """ Pultos jog adása egy felhasználónak. @@ -339,7 +339,7 @@ def grant_bartender(): if not selected_user: return jsonify({"success": False, "message": USER_DOES_NOT_EXISTS_MESSAGE}), 400 - selected_user.role = Roles.bartender.value + selected_user.role = Roles.Bartender.value # Adatbázisba mentés db.session.commit() return jsonify({"success": True, "message": f"{selected_user.name} felhasználó mostantól Pultos!"}), 200 @@ -347,7 +347,7 @@ def grant_bartender(): # Felhasnzálótól PULTOS jog megvonás POST kéréssel @user_requests.route('/revoke_bartender', methods=['PUT']) -@token_required(required_role=Roles.admin.value) +@token_required(required_role=Roles.Admin.value) def revoke_bartender(): """ Pultos jog megvonása egy felhasználótól. @@ -408,7 +408,7 @@ def revoke_bartender(): if not selected_user: return jsonify({"success": False, "message": USER_DOES_NOT_EXISTS_MESSAGE}), 400 - selected_user.role = Roles.user.value + selected_user.role = Roles.User.value # Adatbázisba mentés db.session.commit() return jsonify({"success": True, "message": f"{selected_user.name} felhasználó mostantól nem Pultos!"}), 200 @@ -416,7 +416,7 @@ def revoke_bartender(): # Felhasználó törlése az adatbázisból @user_requests.route('/remove_user', methods=['DELETE']) -@token_required(required_role=Roles.admin.value) +@token_required(required_role=Roles.Admin.value) def remove_user(): """ Felhasználó törlése @@ -493,7 +493,7 @@ def remove_user(): @user_requests.route('/users_export', methods=['GET']) -@token_required(required_role=Roles.admin.value) +@token_required(required_role=Roles.Admin.value) def users_export(): """ Felhasználók exportálása @@ -553,7 +553,7 @@ def users_export(): return response @user_requests.route('/users_import', methods=['POST']) -@token_required(required_role=Roles.admin.value) +@token_required(required_role=Roles.Admin.value) def users_import(): """ Felhasználók importálása JSON fájlból @@ -629,7 +629,7 @@ def users_import(): uuid=user_data['uuid'], name=user_data['name'], balance=0, - role=user_data['role'] if 'role' in user_data else Roles.user.value + role=user_data['role'] if 'role' in user_data else Roles.User.value ) db.session.add(user) db.session.commit() # Adatok mentése az adatbázisba