minor updates
This commit is contained in:
294
api.yml
294
api.yml
@@ -105,63 +105,7 @@ paths:
|
|||||||
description: Old password incorrect
|
description: Old password incorrect
|
||||||
'404':
|
'404':
|
||||||
description: client_id not found
|
description: client_id not found
|
||||||
/Client:
|
/Client/Client:
|
||||||
post:
|
|
||||||
tags:
|
|
||||||
- client
|
|
||||||
summary: Add a new client
|
|
||||||
description: Add a new client to the system
|
|
||||||
operationId: manager.add_client
|
|
||||||
parameters:
|
|
||||||
- name: name
|
|
||||||
in: query
|
|
||||||
description: Client Name
|
|
||||||
required: true
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
- name: birthdate
|
|
||||||
in: query
|
|
||||||
description: Client Birthdate (dd-mm-yyyy)
|
|
||||||
required: true
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
- name: address
|
|
||||||
in: query
|
|
||||||
description: Client Address
|
|
||||||
required: false
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
- name: phone_number
|
|
||||||
in: query
|
|
||||||
description: Client Phone Number
|
|
||||||
required: true
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
- name: email
|
|
||||||
in: query
|
|
||||||
description: Client Email Address
|
|
||||||
required: true
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
- name: password
|
|
||||||
in: query
|
|
||||||
description: Client Password
|
|
||||||
required: true
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
- name: notes
|
|
||||||
in: query
|
|
||||||
description: Notes about client
|
|
||||||
required: false
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
responses:
|
|
||||||
'200':
|
|
||||||
description: "Client created"
|
|
||||||
'400':
|
|
||||||
description: Invalid input
|
|
||||||
'422':
|
|
||||||
description: Validation exception
|
|
||||||
put:
|
put:
|
||||||
tags:
|
tags:
|
||||||
- client
|
- client
|
||||||
@@ -240,27 +184,6 @@ paths:
|
|||||||
description: Invalid Client ID supplied
|
description: Invalid Client ID supplied
|
||||||
'404':
|
'404':
|
||||||
description: Client not found
|
description: Client not found
|
||||||
delete:
|
|
||||||
tags:
|
|
||||||
- client
|
|
||||||
summary: Delete a client by ID
|
|
||||||
description: Delete a client by ID
|
|
||||||
operationId: manager.delete_client
|
|
||||||
parameters:
|
|
||||||
- name: client_id
|
|
||||||
in: query
|
|
||||||
description: ID of client to delete
|
|
||||||
required: true
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
format: int32
|
|
||||||
responses:
|
|
||||||
'200':
|
|
||||||
description: Successful operation
|
|
||||||
'400':
|
|
||||||
description: Invalid Client ID supplied
|
|
||||||
'404':
|
|
||||||
description: Client not found
|
|
||||||
/Account:
|
/Account:
|
||||||
post:
|
post:
|
||||||
tags:
|
tags:
|
||||||
@@ -361,27 +284,6 @@ paths:
|
|||||||
description: Invalid Account ID supplied
|
description: Invalid Account ID supplied
|
||||||
'404':
|
'404':
|
||||||
description: Account not found
|
description: Account not found
|
||||||
delete:
|
|
||||||
tags:
|
|
||||||
- account
|
|
||||||
summary: Delete an account by ID
|
|
||||||
description: Delete an account by ID
|
|
||||||
operationId: manager.delete_account
|
|
||||||
parameters:
|
|
||||||
- name: account_id
|
|
||||||
in: query
|
|
||||||
description: ID of account to delete
|
|
||||||
required: true
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
format: int32
|
|
||||||
responses:
|
|
||||||
'200':
|
|
||||||
description: Successful operation
|
|
||||||
'400':
|
|
||||||
description: Invalid account_id supplied
|
|
||||||
'404':
|
|
||||||
description: Account not found
|
|
||||||
/Transaction:
|
/Transaction:
|
||||||
get:
|
get:
|
||||||
tags:
|
tags:
|
||||||
@@ -473,7 +375,7 @@ paths:
|
|||||||
description: Invalid input
|
description: Invalid input
|
||||||
'404':
|
'404':
|
||||||
description: No transactions found
|
description: No transactions found
|
||||||
/Manager/Interest:
|
/Admin/Interest:
|
||||||
post:
|
post:
|
||||||
tags:
|
tags:
|
||||||
- admin
|
- admin
|
||||||
@@ -522,7 +424,7 @@ paths:
|
|||||||
description: Invalid input
|
description: Invalid input
|
||||||
'422':
|
'422':
|
||||||
description: Validation exception
|
description: Validation exception
|
||||||
/Manager/Clients:
|
/Admin/Clients:
|
||||||
get:
|
get:
|
||||||
tags:
|
tags:
|
||||||
- admin
|
- admin
|
||||||
@@ -540,7 +442,7 @@ paths:
|
|||||||
description: Invalid input
|
description: Invalid input
|
||||||
'404':
|
'404':
|
||||||
description: No clients found
|
description: No clients found
|
||||||
/Manager/Accounts:
|
/Admin/Accounts:
|
||||||
get:
|
get:
|
||||||
tags:
|
tags:
|
||||||
- admin
|
- admin
|
||||||
@@ -558,7 +460,7 @@ paths:
|
|||||||
description: Invalid input
|
description: Invalid input
|
||||||
'404':
|
'404':
|
||||||
description: No accounts found
|
description: No accounts found
|
||||||
/Manager/Transactions:
|
/Admin/Transactions:
|
||||||
get:
|
get:
|
||||||
tags:
|
tags:
|
||||||
- admin
|
- admin
|
||||||
@@ -576,7 +478,7 @@ paths:
|
|||||||
description: Invalid input
|
description: Invalid input
|
||||||
'404':
|
'404':
|
||||||
description: No transactions found
|
description: No transactions found
|
||||||
/Manager/Hash:
|
/System/Hash:
|
||||||
get:
|
get:
|
||||||
tags:
|
tags:
|
||||||
- system
|
- system
|
||||||
@@ -600,8 +502,8 @@ paths:
|
|||||||
'400':
|
'400':
|
||||||
description: Invalid input
|
description: Invalid input
|
||||||
'401':
|
'401':
|
||||||
description: Unauthorized
|
description: Unauthorised
|
||||||
/Manager/Timestamp:
|
/System/Timestamp:
|
||||||
get:
|
get:
|
||||||
tags:
|
tags:
|
||||||
- system
|
- system
|
||||||
@@ -618,7 +520,185 @@ paths:
|
|||||||
'400':
|
'400':
|
||||||
description: Invalid input
|
description: Invalid input
|
||||||
'401':
|
'401':
|
||||||
description: Unauthorized
|
description: Unauthorised
|
||||||
|
/Admin/Balance:
|
||||||
|
get:
|
||||||
|
tags:
|
||||||
|
- admin
|
||||||
|
summary: Test the balance of all accounts
|
||||||
|
description: Tests the balance of all accounts and alerts of any discrepancies
|
||||||
|
operationId: manager.test_account_balances
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: Successful operation
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
'401':
|
||||||
|
description: Unauthorised
|
||||||
|
/System/Initialise:
|
||||||
|
get:
|
||||||
|
tags:
|
||||||
|
- system
|
||||||
|
summary: Initialise the system
|
||||||
|
description: Initialises the system with test data
|
||||||
|
operationId: manager.initialise_database
|
||||||
|
parameters:
|
||||||
|
- name: password
|
||||||
|
in: query
|
||||||
|
description: Password to initialise the system
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: Successful operation
|
||||||
|
'400':
|
||||||
|
description: Database not empty, this function cannot be used
|
||||||
|
/Admin/Promote:
|
||||||
|
put:
|
||||||
|
tags:
|
||||||
|
- admin
|
||||||
|
summary: Promote a client to administrator
|
||||||
|
description: Promote a client to administrator
|
||||||
|
operationId: manager.promote_to_admin
|
||||||
|
parameters:
|
||||||
|
- name: client_id
|
||||||
|
in: query
|
||||||
|
description: ID of client to promote
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: Successful operation
|
||||||
|
'401':
|
||||||
|
description: Unauthorised
|
||||||
|
'404':
|
||||||
|
description: Client not found
|
||||||
|
/Admin/Demote:
|
||||||
|
put:
|
||||||
|
tags:
|
||||||
|
- admin
|
||||||
|
summary: Demote a client from administrator
|
||||||
|
description: Demote a client from administrator
|
||||||
|
operationId: manager.demote_from_admin
|
||||||
|
parameters:
|
||||||
|
- name: client_id
|
||||||
|
in: query
|
||||||
|
description: ID of client to demote
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: Successful operation
|
||||||
|
'401':
|
||||||
|
description: Unauthorised
|
||||||
|
'404':
|
||||||
|
description: Client not found
|
||||||
|
/Admin/Client:
|
||||||
|
post:
|
||||||
|
tags:
|
||||||
|
- admin
|
||||||
|
summary: Add a new client
|
||||||
|
description: Add a new client to the system
|
||||||
|
operationId: manager.add_client
|
||||||
|
parameters:
|
||||||
|
- name: name
|
||||||
|
in: query
|
||||||
|
description: Client Name
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
- name: birthdate
|
||||||
|
in: query
|
||||||
|
description: Client Birthdate (dd-mm-yyyy)
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
- name: address
|
||||||
|
in: query
|
||||||
|
description: Client Address
|
||||||
|
required: false
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
- name: phone_number
|
||||||
|
in: query
|
||||||
|
description: Client Phone Number
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
- name: email
|
||||||
|
in: query
|
||||||
|
description: Client Email Address
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
- name: password
|
||||||
|
in: query
|
||||||
|
description: Client Password
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
- name: notes
|
||||||
|
in: query
|
||||||
|
description: Notes about client
|
||||||
|
required: false
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: "Client created"
|
||||||
|
'400':
|
||||||
|
description: Invalid input
|
||||||
|
'422':
|
||||||
|
description: Validation exception
|
||||||
|
/Delete/Client:
|
||||||
|
delete:
|
||||||
|
tags:
|
||||||
|
- admin
|
||||||
|
summary: Delete a client by ID
|
||||||
|
description: Delete a client by ID
|
||||||
|
operationId: manager.delete_client
|
||||||
|
parameters:
|
||||||
|
- name: client_id
|
||||||
|
in: query
|
||||||
|
description: ID of client to delete
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
format: int32
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: Successful operation
|
||||||
|
'400':
|
||||||
|
description: Invalid Client ID supplied
|
||||||
|
'404':
|
||||||
|
description: Client not found
|
||||||
|
/Delete/Account:
|
||||||
|
delete:
|
||||||
|
tags:
|
||||||
|
- admin
|
||||||
|
summary: Delete an account by ID
|
||||||
|
description: Delete an account by ID
|
||||||
|
operationId: manager.delete_account
|
||||||
|
parameters:
|
||||||
|
- name: account_id
|
||||||
|
in: query
|
||||||
|
description: ID of account to delete
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
format: int32
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: Successful operation
|
||||||
|
'400':
|
||||||
|
description: Invalid account_id supplied
|
||||||
|
'404':
|
||||||
|
description: Account not found
|
||||||
components:
|
components:
|
||||||
schemas:
|
schemas:
|
||||||
Client:
|
Client:
|
||||||
|
|||||||
2
bank.ini
2
bank.ini
@@ -1,5 +1,5 @@
|
|||||||
[database]
|
[database]
|
||||||
name=test_database.db
|
name=bank.db
|
||||||
|
|
||||||
[api_file]
|
[api_file]
|
||||||
name=api.yml
|
name=api.yml
|
||||||
|
|||||||
100
manager.py
100
manager.py
@@ -91,15 +91,6 @@ def get_client(client_id:str): # Returns a specific client in the database
|
|||||||
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
|
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
|
||||||
return jsonify({"error": "Client not found"}), 404
|
return jsonify({"error": "Client not found"}), 404
|
||||||
|
|
||||||
@login_required
|
|
||||||
def add_client(name:str, birthdate:str, address:str, phone_number:str, email:str, password:str, **kwargs): # Adds a new client to the database
|
|
||||||
client_id = generate_uuid_short()
|
|
||||||
notes = kwargs.get("notes", None)
|
|
||||||
new_client = Client(client_id, name, birthdate, timestamp(), address, phone_number, email, hash_password(password), notes, 1, 0, None)
|
|
||||||
session.add(new_client)
|
|
||||||
session.commit()
|
|
||||||
return f"New client has been added: name: {name}, uuid: {client_id} ", 200
|
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
def update_client(client_id:str, **kwargs): # Updates a client in the database
|
def update_client(client_id:str, **kwargs): # Updates a client in the database
|
||||||
current_client_id, is_admin = get_current_client()
|
current_client_id, is_admin = get_current_client()
|
||||||
@@ -331,33 +322,78 @@ def apply_fee(account_id:int, fee:float):
|
|||||||
@admin_required
|
@admin_required
|
||||||
def delete_transaction(transaction_id:int):
|
def delete_transaction(transaction_id:int):
|
||||||
DELETE_TRANSACTION = "DELETE FROM transaction WHERE transaction_id=?"
|
DELETE_TRANSACTION = "DELETE FROM transaction WHERE transaction_id=?"
|
||||||
from api import session, Transaction
|
return
|
||||||
for transaction in session.query(Transaction).all():
|
|
||||||
if transaction.transaction_id == transaction_id:
|
|
||||||
input(f"Are you sure you would like permanenty delete transaction ID: {transaction_id}? WARNING: This action can not be reversed. (Y/N) ")
|
|
||||||
if input == "Y"or input == "y":
|
|
||||||
session.execute(DELETE_TRANSACTION, (transaction_id))
|
|
||||||
print(f"Transaction ID: {transaction_id} has been removed.")
|
|
||||||
else:
|
|
||||||
return f"Transaction ID: {transaction_id} has NOT been removed."
|
|
||||||
return
|
|
||||||
return f"Transaction ID: {transaction_id} is not found."
|
|
||||||
|
|
||||||
@admin_required
|
@admin_required
|
||||||
def test_account_balances():
|
def test_account_balances():
|
||||||
# Get all accounts
|
# Get all transactions from the database
|
||||||
all_accounts = get_all_accounts()
|
all_transactions = session.query(Transaction).all()
|
||||||
|
|
||||||
|
# Initialize a dictionary to store the calculated balance for each account
|
||||||
|
calculated_balances = {}
|
||||||
|
|
||||||
|
# Go through each transaction
|
||||||
|
for transaction in all_transactions:
|
||||||
|
# If the account ID of the transaction is not in the dictionary, add it with a balance of 0
|
||||||
|
if transaction.account_id not in calculated_balances:
|
||||||
|
calculated_balances[transaction.account_id] = 0
|
||||||
|
|
||||||
|
# Update the calculated balance for the account
|
||||||
|
if transaction.transaction_type == 'Deposit':
|
||||||
|
calculated_balances[transaction.account_id] += transaction.amount
|
||||||
|
elif transaction.transaction_type == 'Withdrawal':
|
||||||
|
calculated_balances[transaction.account_id] -= transaction.amount
|
||||||
|
|
||||||
|
# Get all accounts from the database
|
||||||
|
all_accounts = session.query(Account).all()
|
||||||
|
|
||||||
|
# Initialize a list to store the discrepancies
|
||||||
|
discrepancies = []
|
||||||
|
|
||||||
# Go through each account
|
# Go through each account
|
||||||
for account in all_accounts:
|
for account in all_accounts:
|
||||||
# Calculate the balance based on the transactions
|
# If the calculated balance doesn't match the stored balance, add the discrepancy to the list
|
||||||
calculated_balance = 0
|
if calculated_balances.get(account.account_id, 0) != account.balance:
|
||||||
for transaction in account.get_transactions():
|
discrepancies.append({"error": f"Alert: Account {account.account_id} has a balance discrepancy. Stored balance is {account.balance}, but calculated balance is {calculated_balances.get(account.account_id, 0)}."})
|
||||||
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
|
# Return the list of discrepancies
|
||||||
if calculated_balance != account.balance:
|
return jsonify(discrepancies), 200
|
||||||
print(f"Alert: Account {account.account_id} has a balance discrepancy. Stored balance is {account.balance}, but calculated balance is {calculated_balance}.")
|
|
||||||
|
|
||||||
|
@admin_required
|
||||||
|
def add_client(name:str, birthdate:str, address:str, phone_number:str, email:str, password:str, **kwargs): # Adds a new client to the database
|
||||||
|
client_id = generate_uuid_short()
|
||||||
|
notes = kwargs.get("notes", None)
|
||||||
|
new_client = Client(client_id, name, birthdate, timestamp(), address, phone_number, email, hash_password(password), notes, 1, 0, None)
|
||||||
|
session.add(new_client)
|
||||||
|
session.commit()
|
||||||
|
return client_id, 200
|
||||||
|
|
||||||
|
def initialise_database(password:str):
|
||||||
|
existing_clients = session.query(Client).all() # Check if any clients exist in the database
|
||||||
|
if not existing_clients: # If no clients exist, create an administrator client
|
||||||
|
add_client('ADMINISTRATOR', 'ADMINISTRATOR', 'ADMINISTRATOR', 'ADMINISTRATOR', 'ADMINISTRATOR', password) # Add the administrator client
|
||||||
|
session.commit()
|
||||||
|
admin_client = session.query(Client).filter_by(name='ADMINISTRATOR').one() # Retrieve the administrator client
|
||||||
|
admin_client.administrator = 1 # Set the new client as an administrator
|
||||||
|
session.commit()
|
||||||
|
return jsonify(f"Database initialised with administrator account with client_id {admin_client.client_id}"), 200
|
||||||
|
return jsonify("Database not empty, this function cannot be used."), 400
|
||||||
|
|
||||||
|
@admin_required
|
||||||
|
def promote_to_admin(client_id:str):
|
||||||
|
for client in session.query(Client).all():
|
||||||
|
if client.client_id == client_id:
|
||||||
|
client.administrator = 1
|
||||||
|
session.commit()
|
||||||
|
return f"client_id: {client_id} has been promoted to administrator.", 200
|
||||||
|
return f"client_id: {client_id} is not found.", 404
|
||||||
|
|
||||||
|
@admin_required
|
||||||
|
def demote_from_admin(client_id:str):
|
||||||
|
for client in session.query(Client).all():
|
||||||
|
if client.client_id == client_id:
|
||||||
|
client.administrator = 0
|
||||||
|
session.commit()
|
||||||
|
return f"client_id: {client_id} has been demoted from administrator.", 200
|
||||||
|
return f"client_id: {client_id} is not found.", 404
|
||||||
BIN
test_database.db
BIN
test_database.db
Binary file not shown.
Reference in New Issue
Block a user