[add]: Database connection and migrations
This commit is contained in:
+20
-1
@@ -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
|
||||
|
||||
@@ -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"
|
||||
@@ -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"
|
||||
@@ -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
@@ -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
|
||||
@@ -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']
|
||||
@@ -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}>'
|
||||
|
||||
@@ -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}>'
|
||||
@@ -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}>'
|
||||
@@ -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}>'
|
||||
@@ -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}>'
|
||||
Reference in New Issue
Block a user