[add]: Database connection and migrations

This commit is contained in:
VivianDee
2025-03-28 08:38:32 +01:00
parent 3054b7240e
commit 65efe0573a
21 changed files with 431 additions and 19 deletions
+20 -1
View File
@@ -5,6 +5,11 @@ from flask_cors import CORS
from app.config import Config
from app.api.routes import api
from app.errors import register_error_handlers
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
db = SQLAlchemy()
migrate = Migrate()
def create_app():
""" Factory function to create a Flask app instance """
@@ -31,7 +36,21 @@ def create_app():
# Error Handlers
register_error_handlers(app)
import logging
from sqlalchemy import create_engine
# Set up logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
# Log the database URI
logger.info(f"Database URI: {app.config['SQLALCHEMY_DATABASE_URI']}")
# Database and Migrations
db.init_app(app)
migrate.init_app(app, db)
return app
+15
View File
@@ -0,0 +1,15 @@
from app.models import Account
def check_account_settings(account_id, customer_id):
"""
Checks if the account belongs to the customer and if it has existing liens.
"""
account = Account.query.filter_by(id=account_id, customer_id=customer_id).first()
if not account:
return False, "Account not found or doesn't belong to customer"
if account.lien_amount > 0:
return False, "Account has an existing lien"
return True, "Account is valid"
+7
View File
@@ -0,0 +1,7 @@
from app.models import Customer
def check_customer_eligibility(data):
# Verify customer exists
customer = Customer.query.filter_by(id=data['customerId']).first()
if not customer:
return False, "Customer not found"
+10
View File
@@ -0,0 +1,10 @@
from app.models import Loan
def check_active_loans(data):
active_loans = Loan.query.filter_by(
customer_id=data['customerId'],
status='active'
).count()
if active_loans > 0:
return False, "Customer has active loans"
+13 -1
View File
@@ -14,4 +14,16 @@ class Config:
VALID_APP_ID = os.getenv("VALID_APP_ID", "app1")
VALID_API_KEY = os.getenv("VALID_API_KEY", "test-api-key-12345")
BASIC_AUTH_USERNAME = os.environ.get("BASIC_AUTH_USERNAME", "user")
BASIC_AUTH_PASSWORD = os.environ.get("BASIC_AUTH_PASSWORD", "password")
BASIC_AUTH_PASSWORD = os.environ.get("BASIC_AUTH_PASSWORD", "password")
DATABASE_USER = os.environ.get("DATABASE_USER")
DATABASE_PASSWORD = os.environ.get("DATABASE_PASSWORD")
DATABASE_HOST = os.environ.get("DATABASE_HOST")
DATABASE_PORT = os.environ.get("DATABASE_PORT", 10532)
DATABASE_NAME = os.environ.get("DATABASE_NAME")
SQLALCHEMY_DATABASE_URI = (
# f"postgresql+psycopg2://{DATABASE_USER}:{DATABASE_PASSWORD}@{DATABASE_HOST}:{DATABASE_PORT}/{DATABASE_NAME}"
f"postgresql+psycopg2://{DATABASE_USER}:{DATABASE_PASSWORD}@{DATABASE_HOST}:{DATABASE_PORT}/{DATABASE_NAME}?options=-csearch_path%3Dflask_app"
)
SQLALCHEMY_TRACK_MODIFICATIONS = False
+6
View File
@@ -0,0 +1,6 @@
from .customer import Customer
from .account import Account
from .loan import Loan
from .transaction import Transaction
__all__ = ['Customer', 'Account', 'Loan', 'Transaction']
+15
View File
@@ -0,0 +1,15 @@
from datetime import datetime
from app import db
class Account(db.Model):
id = db.Column(db.String(50), primary_key=True)
customer_id = db.Column(db.String(50), db.ForeignKey('customer.id'), nullable=False)
account_type = db.Column(db.String(50))
status = db.Column(db.String(20), default='active')
lien_amount = db.Column(db.Float, default=0.0)
created_at = db.Column(db.DateTime, default=datetime.utcnow)
updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
def __repr__(self):
return f'<Account {self.id}>'
+12
View File
@@ -0,0 +1,12 @@
from datetime import datetime
from app import db
class Customer(db.Model):
id = db.Column(db.String(50), primary_key=True)
msisdn = db.Column(db.String(20), unique=True, nullable=False)
country_code = db.Column(db.String(3), nullable=False)
created_at = db.Column(db.DateTime, default=datetime.utcnow)
updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
def __repr__(self):
return f'<Customer {self.id}>'
+16
View File
@@ -0,0 +1,16 @@
from datetime import datetime
from app import db
class Loan(db.Model):
id = db.Column(db.String(50), primary_key=True)
customer_id = db.Column(db.String(50), db.ForeignKey('customer.id'), nullable=False)
account_id = db.Column(db.String(50), db.ForeignKey('account.id'), nullable=False)
product_id = db.Column(db.String(20), nullable=False)
principal_amount = db.Column(db.Float, nullable=False)
status = db.Column(db.String(20), default='pending')
created_at = db.Column(db.DateTime, default=datetime.utcnow)
updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
def __repr__(self):
return f'<Loan {self.id}>'
+12
View File
@@ -0,0 +1,12 @@
from datetime import datetime
from app import db
class Offer(db.Model):
id = db.Column(db.Integer, primary_key=True)
amount = db.Column(db.Float, nullable=False)
interest_rate = db.Column(db.Float, nullable=False)
created_at = db.Column(db.DateTime, default=datetime.utcnow)
updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
def __repr__(self):
return f'<LoanOffer {self.id}>'
+14
View File
@@ -0,0 +1,14 @@
from datetime import datetime
from app import db
class Transaction(db.Model):
id = db.Column(db.String(50), primary_key=True)
account_id = db.Column(db.String(50), db.ForeignKey('account.id'), nullable=False)
type = db.Column(db.String(50), nullable=False)
amount = db.Column(db.Float, nullable=False)
status = db.Column(db.String(20), default='pending')
created_at = db.Column(db.DateTime, default=datetime.utcnow)
updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
def __repr__(self):
return f'<Transaction {self.id}>'