diff --git a/app/models/user.py b/app/models/user.py new file mode 100644 index 0000000..ccc61ed --- /dev/null +++ b/app/models/user.py @@ -0,0 +1,57 @@ +from datetime import datetime, timezone +from app.extensions import db +from werkzeug.security import generate_password_hash, check_password_hash + + +class User(db.Model): + __tablename__ = 'users' + + id = db.Column(db.Integer, primary_key=True, autoincrement=True) + username = db.Column(db.String(50), unique=True, nullable=False) + password_hash = db.Column(db.String(255), nullable=False) + name = db.Column(db.String(100), nullable=False) + created_at = db.Column(db.DateTime, default=datetime.now(timezone.utc)) + updated_at = db.Column(db.DateTime, default=datetime.now(timezone.utc), onupdate=datetime.now(timezone.utc)) + + def __repr__(self): + return f'' + + def set_password(self, password): + self.password_hash = generate_password_hash(password) + + def check_password(self, password): + return check_password_hash(self.password_hash, password) + + @classmethod + def create_user(cls, username, password, name): + # Check if user already exists + if cls.query.filter_by(username=username).first(): + raise ValueError("Username already exists") + + user = cls( + username=username, + name=name + ) + user.set_password(password) + + try: + db.session.add(user) + db.session.commit() + except Exception as e: + db.session.rollback() + raise ValueError(f"Error creating user: {str(e)}") + + return user + + @classmethod + def get_user_by_username(cls, username): + return cls.query.filter_by(username=username).first() + + def to_dict(self): + return { + 'id': self.id, + 'username': self.username, + 'name': self.name, + 'created_at': self.created_at.isoformat() if self.created_at else None, + 'updated_at': self.updated_at.isoformat() if self.updated_at else None + } \ No newline at end of file diff --git a/app/swagger/digifi_swagger.json b/app/swagger/digifi_swagger.json index 139fb9c..c973c48 100644 --- a/app/swagger/digifi_swagger.json +++ b/app/swagger/digifi_swagger.json @@ -58,6 +58,9 @@ } ], "paths": { + "/login": { + "$ref": "../swagger/paths/Login.json" + }, "/Authorize": { "$ref": "../swagger/paths/Authorize.json" }, @@ -88,6 +91,12 @@ "AuthorizeRefreshRequest": { "$ref": "../swagger/schemas/AuthorizeRefreshRequest.json" }, + "LoginRequest": { + "$ref": "../swagger/schemas/LoginRequest.json" + }, + "LoginResponse": { + "$ref": "../swagger/schemas/LoginResponse.json" + }, "LoansResponse": { "$ref": "../swagger/schemas/LoansResponse.json" }, diff --git a/jmeter/digifi_first_core_test_plan.jmx b/jmeter/digifi_first_core_test_plan.jmx index 3f44273..c234bb0 100644 --- a/jmeter/digifi_first_core_test_plan.jmx +++ b/jmeter/digifi_first_core_test_plan.jmx @@ -20,7 +20,7 @@ - + customer_id @@ -60,18 +60,18 @@ - + 10 - 5 + 1 true continue - 10 + 1 false - + /loans true GET @@ -102,7 +102,7 @@ - + /loans true GET @@ -128,7 +128,7 @@ - + 200 @@ -138,7 +138,7 @@ 8 - + $.loans false @@ -148,7 +148,7 @@ - + false saveConfig @@ -185,7 +185,7 @@ - + false saveConfig @@ -298,7 +298,7 @@ - + 200 @@ -308,7 +308,7 @@ 8 - + $.transactions false @@ -355,7 +355,7 @@ - + false saveConfig