From 41db324c7f732b2418f5077cee1378faf832199c Mon Sep 17 00:00:00 2001 From: Lucas Mathews Date: Tue, 21 May 2024 22:18:06 +0200 Subject: [PATCH] added draft database generator and test account balance function --- manager.py | 121 +++++++++++++++++++++++++++---------- requirements.txt | 3 +- test_database.db | Bin 0 -> 102400 bytes test_database_generator.py | 91 ++++++++++++++++++++++++++++ 4 files changed, 181 insertions(+), 34 deletions(-) create mode 100644 test_database.db create mode 100644 test_database_generator.py diff --git a/manager.py b/manager.py index 4f16143..75a90a0 100644 --- a/manager.py +++ b/manager.py @@ -4,13 +4,11 @@ from class_client import Client from class_account import Account from class_transaction import Transaction -from flask import Flask, jsonify, session as flask_session, request # Imports the Flask modules +from flask import jsonify, session as flask_session # Imports the Flask modules import hashlib # hashlib for password hashing import datetime # datetime for timestamps import uuid # uuid for unique identifiers from functools import wraps # functools for decorators / user login - - from database import * # Importing the database connection ############## @@ -70,16 +68,24 @@ def admin_required(f): if client.client_id == flask_session['client_id']: if client.administrator == 1: return f(*args, **kwargs) - return jsonify({"error": "Not authorized"}), 403 + return jsonify({"error": "Not authorised"}), 403 return decorated_function +def get_current_client(): + client = flask_session['client_id'] + is_admin = session.query(Client).filter_by(client_id=client).one_or_none().administrator + return client, is_admin + + ############## ### Client ### ############## @login_required def get_client(client_id:str): # Returns a specific client in the database - client = session.query(Client).filter_by(client_id=client_id).one_or_none() + current_client_id, is_admin = get_current_client() + if not is_admin and client_id != current_client_id: + return jsonify({"error": "You can only view your own client information."}), 403 for client in session.query(Client).all(): if client.client_id == client_id: return jsonify({"name": client.name, "birthdate": client.birthdate, "opening_timestamp": client.opening_timestamp, "address": client.address, "phone_number": client.phone_number, "email": client.email}), 200 @@ -94,20 +100,11 @@ def add_client(name:str, birthdate:str, address:str, phone_number:str, email:str session.commit() return f"New client has been added: name: {name}, uuid: {client_id} ", 200 -@login_required -def delete_client(client_id:str): # Deletes a client from the database - for client in session.query(Client).all(): - if client.client_id == client_id: - if client.accounts == None: - session.delete(client) - session.commit() - return f"client_id: {client_id} has been removed.", 200 - else: - return f"client_id: {client_id} has active accounts and can not be removed.", 400 - return f"client_id: {client_id} is not found.", 404 - @login_required def update_client(client_id:str, **kwargs): # Updates a client in the database + current_client_id, is_admin = get_current_client() + if not is_admin and client_id != current_client_id: + return jsonify({"error": "You can only update your own client information."}), 403 for client in session.query(Client).all(): if client.client_id == client_id: name = kwargs.get("name", None) @@ -134,6 +131,9 @@ def update_client(client_id:str, **kwargs): # Updates a client in the database @login_required def change_password(client_id:str, password:str, new_password:str): # Changes the password of a client + current_client_id, is_admin = get_current_client() + if not is_admin and client_id != current_client_id: + return jsonify({"error": "You can only update your own password."}), 403 old_hash = hash_password(password) new_hash = hash_password(new_password) for client in session.query(Client).all(): @@ -151,6 +151,10 @@ def change_password(client_id:str, password:str, new_password:str): # Changes th @login_required def get_account(account_id:str): # Returns a specific account in the database + current_client_id, is_admin = get_current_client() + account_owner = session.query(Account).filter_by(account_id=account_id).one_or_none().client_id + if not is_admin and account_owner != current_client_id: + return jsonify({"error": "You can only view your own account information."}), 403 account = session.query(Account).filter_by(account_id=account_id).one_or_none() for account in session.query(Account).all(): if account.account_id == account_id: @@ -159,6 +163,9 @@ def get_account(account_id:str): # Returns a specific account in the database @login_required def add_account(client_id:str, description:str, account_type:str, **kwargs): # Adds a new account to the database + current_client_id, is_admin = get_current_client() + if not is_admin and client_id != current_client_id: + return jsonify({"error": "You can only add accounts your own client account."}), 403 account_id = generate_uuid_short() notes = kwargs.get("notes", None) client_found = None @@ -176,20 +183,12 @@ def add_account(client_id:str, description:str, account_type:str, **kwargs): # A session.commit() return f"New account has been added: description: {description}, uuid: {account_id} ", 200 -@login_required -def delete_account(account_id:str): # Deletes an account from the database - for account in session.query(Account).all(): - if account.account_id == account_id: - if account.balance == 0: - session.delete(account) - session.commit() - return f"account_id: {account_id} has been removed.", 200 - else: - return f"account_id: {account_id} has a balance and can not be removed.", 400 - return f"account_id: {account_id} is not found.", 404 - @login_required def update_account(account_id:str, **kwargs): # Updates an account in the database + current_client_id, is_admin = get_current_client() + account_owner = session.query(Account).filter_by(account_id=account_id).one_or_none().client_id + if not is_admin and account_owner != current_client_id: + return jsonify({"error": "You can only view your own account information."}), 403 for account in session.query(Account).all(): if account.account_id == account_id: description = kwargs.get("description", None) @@ -217,14 +216,21 @@ def update_account(account_id:str, **kwargs): # Updates an account in the databa @login_required def get_transaction(transaction_id:int): # Returns a specific transaction in the database + current_client_id, is_admin = get_current_client() transaction = session.query(Transaction).filter_by(transaction_id=transaction_id).one_or_none() - for transaction in session.query(Transaction).all(): - if transaction.transaction_id == transaction_id: - return jsonify({"transaction_type": transaction.transaction_type, "amount": transaction.amount, "timestamp": transaction.timestamp, "description": transaction.description, "account_id": transaction.account_id, "recipient_account_id": transaction.recipient_account_id}), 200 - return jsonify({"error": "Transaction not found"}), 404 + if not transaction: + return jsonify({"error": "Transaction not found"}), 404 + account = session.query(Account).filter_by(account_id=transaction.account_id).one_or_none() + recipient_account = session.query(Account).filter_by(account_id=transaction.recipient_account_id).one_or_none() + if not is_admin and (account.client_id != current_client_id and recipient_account.client_id != current_client_id): + return jsonify({"error": "You can only view your own transaction information."}), 403 + return jsonify({"transaction_type": transaction.transaction_type, "amount": transaction.amount, "timestamp": transaction.timestamp, "description": transaction.description, "account_id": transaction.account_id, "recipient_account_id": transaction.recipient_account_id}), 200 @login_required def add_transaction(amount:int, account_id, recipient_account_id, **kwargs): # Adds a new transaction to the database + current_client_id, is_admin = get_current_client() + if not is_admin and account_id != current_client_id: + return jsonify({"error": "You can only add transactions to your own account."}), 403 transaction_id = generate_uuid() for account in session.query(Account).all(): if account.account_id == account_id: @@ -248,6 +254,12 @@ def add_transaction(amount:int, account_id, recipient_account_id, **kwargs): # A @login_required def transaction_history(account_id:int): # Returns all transactions for a specific account + current_client_id, is_admin = get_current_client() + account = session.query(Account).filter_by(account_id=account_id).one_or_none() + if not account: + return jsonify({"error": "Account not found."}), 404 + if not is_admin and account.client_id != current_client_id: + return jsonify({"error": "You can only view your own transaction history."}), 403 result = session.query(Transaction).filter(Transaction.account_id == account_id) return jsonify([{"transaction_id": transaction.transaction_id, "transaction_type": transaction.transaction_type, "amount": transaction.amount, "timestamp": transaction.timestamp, "description": transaction.description, "account_number": transaction.account_id, "recipient_account_number": transaction.recipient_account_id} for transaction in result]), 200 @@ -255,6 +267,33 @@ def transaction_history(account_id:int): # Returns all transactions for a specif ### Administrator ### ##################### +@admin_required +def delete_client(client_id:str): # Deletes a client from the database + if client_id == flask_session['client_id']: + return "You can not delete yourself.", 400 + + for client in session.query(Client).all(): + if client.client_id == client_id: + if client.accounts == None: + session.delete(client) + session.commit() + return f"client_id: {client_id} has been removed.", 200 + else: + return f"client_id: {client_id} has active accounts and can not be removed.", 400 + return f"client_id: {client_id} is not found.", 404 + +@admin_required +def delete_account(account_id:str): # Deletes an account from the database + for account in session.query(Account).all(): + if account.account_id == account_id: + if account.balance == 0: + session.delete(account) + session.commit() + return f"account_id: {account_id} has been removed.", 200 + else: + return f"account_id: {account_id} has a balance and can not be removed.", 400 + return f"account_id: {account_id} is not found.", 404 + @admin_required def get_all_clients(): # Returns all clients in the database clients = session.query(Client).all() @@ -304,5 +343,21 @@ def delete_transaction(transaction_id:int): return return f"Transaction ID: {transaction_id} is not found." +@admin_required +def test_account_balances(): + # Get all accounts + all_accounts = get_all_accounts() + # Go through each account + for account in all_accounts: + # Calculate the balance based on the transactions + calculated_balance = 0 + for transaction in account.get_transactions(): + if transaction.transaction_type == 'Deposit': + calculated_balance += transaction.amount + elif transaction.transaction_type == 'Withdrawal': + calculated_balance -= transaction.amount + # Check if the calculated balance matches the stored balance + if calculated_balance != account.balance: + print(f"Alert: Account {account.account_id} has a balance discrepancy. Stored balance is {account.balance}, but calculated balance is {calculated_balance}.") diff --git a/requirements.txt b/requirements.txt index 8113c4a..415e17a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,4 +2,5 @@ flask connexion[swagger-ui]==2.14.2 requests sqlalchemy -flask-session \ No newline at end of file +flask-session +faker \ No newline at end of file diff --git a/test_database.db b/test_database.db new file mode 100644 index 0000000000000000000000000000000000000000..73917f30b19404f3df3083af86ec490933c32983 GIT binary patch literal 102400 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