from datetime import datetime, timezone, timedelta from app.extensions import db from sqlalchemy.sql import func from sqlalchemy.exc import IntegrityError import uuid from app.utils.logger import logger class Signup(db.Model): __tablename__ = 'signup' id = db.Column(db.Integer, primary_key=True, autoincrement=True) uid = db.Column(db.String(150), nullable=False) email = db.Column(db.String(100), nullable=False) firstname = db.Column(db.String(25), nullable=False) lastname = db.Column(db.String(25), 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()) # "account_id": self.account_id, def to_dict(self): return { "id": self.id, "uid": str(self.uid), "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, "firstname": self.firstname, "lastname": self.lastname, } def __repr__(self): return f'' @classmethod def add_signup(cls, firstname, lastname, email): # Save the response signup_data = cls( uid=str(uuid.uuid4()), firstname=firstname, lastname=lastname, email=email, added=datetime.now(timezone.utc), updated=datetime.now(timezone.utc) ) try: db.session.add(signup_data) except IntegrityError as err: raise ValueError(f"Database integrity error: {err}") return signup_data @classmethod def get_all_start_signup(cls, email=None, firstname=None, lastname=None, page=1, limit=20): query = cls.query logger.info(f"Get all customer back") if firstname: query = query.filter(cls.firstname == firstname) if lastname: query = query.filter(cls.lastname == lastname) if email: query = query.filter(cls.email == email) # Order by created_at descending (newest first) query = query.order_by(cls.added.desc()) # Get total count before pagination total_count = query.count() # Apply pagination offset = (page - 1) * limit query = query.limit(limit).offset(offset) return query.all(), total_count