from datetime import datetime, timezone from app.extensions import db from sqlalchemy.sql import func from sqlalchemy.exc import IntegrityError import uuid from app.utils.logger import logger class Members(db.Model): __tablename__ = 'members' id = db.Column(db.Integer, primary_key=True, autoincrement=True) uid = db.Column(db.String(150), nullable=False) username = db.Column(db.String(25), nullable=False) password = db.Column(db.String(100), nullable=True) loc = db.Column(db.String(20), nullable=True) status = db.Column(db.Integer, default=1) added = db.Column(db.DateTime(timezone=False), server_default=func.now()) updated = db.Column(db.DateTime(timezone=False), server_default=func.now(), onupdate=func.now()) email = db.Column(db.String(100), nullable=False) account_name = db.Column(db.String(100), nullable=True) firstname = db.Column(db.String(25), nullable=False) lastname = db.Column(db.String(100), nullable=True) country = db.Column(db.String(3), nullable=True) def to_dict(self): return { "id": self.id, "uid": str(self.uid), "username": self.account_id, "account_id": self.username, "password": self.password, "country": self.country, "loc": self.loc, "status": self.status, "added": self.added.isoformat() if self.added else None, "updated": self.updated.isoformat() if self.updated else None, "email": self.email, "account_name": self.account_name, "firstname": self.firstname, "lastname": self.lastname } def __repr__(self): return f'' @classmethod def get_member_by_username(cls, username): member = cls.query.filter_by(username=str(username)).first() if not member: return None return member @classmethod def get_member_by_uid(cls, uid): member = cls.query.filter_by(uid=str(uid)).first() if not member: logger.info(f"User UID = {uid} found") return None return member @classmethod def add_member(cls, firstname, lastname, email, username,password, country): # Save the response member_data = cls( uid=str(uuid.uuid4()), firstname=firstname, lastname=lastname, username =username, email=email, country=country, password=password, added=datetime.now(timezone.utc), updated=datetime.now(timezone.utc) ) try: db.session.add(member_data) except IntegrityError as err: raise ValueError(f"Database integrity error: {err}") return member_data @classmethod def update_user_password(cls, reset_id, member_uid, member_id, new_passwprd_hash): member = cls.query.filter_by(uid=str(member_uid),id=member_id).first() if not member: raise ValueError(f"Reset with UID {member_uid} does not exist.") # Update reset_p status and the updated_at timestamp member.password = new_passwprd_hash