diff --git a/app/api/services/login.py b/app/api/services/login.py index 4673e27..12af1b5 100644 --- a/app/api/services/login.py +++ b/app/api/services/login.py @@ -41,6 +41,12 @@ class LoginService(BaseService): member = Members.get_member_by_username(username) # pass22 = generate_password_hash(password) # logger.info("Password generated = > {}".format(pass22) ) + if not member: + invalid_data = { + "error_message": "invalid username or password", + "message_key": "invalid_username_or_password", + } + return ResponseHelper.success(data=invalid_data) pass_check = check_password_hash(member.password, password) logger.info("Password check: {}".format(pass_check)) diff --git a/app/api/services/register.py b/app/api/services/register.py index ca83c66..ec44fec 100644 --- a/app/api/services/register.py +++ b/app/api/services/register.py @@ -2,16 +2,19 @@ from flask import session, jsonify from app.models.loan import Loan from app.utils.logger import logger from app.api.services.base_service import BaseService -from app.api.schemas.eligibility_check import EligibilityCheckSchema +# from app.api.schemas.eligibility_check import EligibilityCheckSchema from marshmallow import ValidationError -from app.api.enums import TransactionType -from app.api.integrations import SimbrellaIntegration +# from app.api.enums import TransactionType +# from app.api.integrations import SimbrellaIntegration from app.extensions import db -from app.models import Offer, RACCheck, Members -from app.api.services.offer_analysis import OfferAnalysis +from app.models import Offer, MembersPending, Members +# from app.api.services.offer_analysis import OfferAnalysis from app.api.helpers.response_helper import ResponseHelper from werkzeug.security import generate_password_hash, check_password_hash from app.api.schemas.register import RegisterSchema +from flask_mail import Mail, Message + + import datetime import jwt @@ -36,11 +39,19 @@ class RegisterService(BaseService): with db.session.begin(): validated_data = RegisterService.validate_data(data, RegisterSchema()) - # username = validated_data.get('username') - # password = validated_data.get('password') - - # Simulate processing + firstname = validated_data.get('firstname') + lastname = validated_data.get('lastname') + email = validated_data.get('email') + + regData = MembersPending.add_members_pending( firstname, lastname, email) + # { + # "email": "ameye@chiefsoft.com", + # "firstname": "Olusesan", + # "lastname": "Ameye", + # "isChecked": true + # } + response_data = { "member_id": 0, "uid": 0, @@ -90,7 +101,36 @@ class RegisterService(BaseService): return True +def send_register_mail(signup_email, email_uid,last_row_id,firstname): + signup_data = {} + signup_data["id"] = last_row_id + signup_data["uid"] = email_uid + #'d8651e10-3279-4858-87da-b52936faa6f0' + jwt_part = jwt.encode( + {"user": signup_data, 'exp' : datetime.datetime.utcnow() + datetime.timedelta(minutes=3330)}, + app.config["SECRET_KEY"], + algorithm="HS256" + ) + link_url= str(panel_url) + '/csignup/' + jwt_part + print(link_url) + #firstname ='Name001' + msg = Message( + 'verify your MERMS Account', + sender ='message@chiefsoft.com', + recipients = [signup_email,'ameye+merscopy@chiefsoft.com'] + ) + msg.body = f""" + Hello {firstname}, + You received this message for account verification + + Follow the link:{link_url} + + For any Support + Reach Out + """ + + mail.send(msg) # { diff --git a/app/models/__init__.py b/app/models/__init__.py index e68f2ca..083f0a0 100644 --- a/app/models/__init__.py +++ b/app/models/__init__.py @@ -15,8 +15,10 @@ from .members import Members from .products import Products from .members_products import MembersProducts from .members_actions import MembersActions +from .members_pending import MembersPending + __all__ = ['Members','Customer', 'Account', 'Products', - 'MembersProducts', 'MembersActions', 'Loan', 'Transaction', 'Repayment', + 'MembersProducts', 'MembersActions', 'MembersPending', 'Loan', 'Transaction', 'Repayment', 'LoanCharge', 'Offer', 'Charge', 'RACCheck', 'LoanRepaymentSchedule', 'TransactionOffer', 'RepaymentsData', 'Salary'] \ No newline at end of file diff --git a/app/models/members.py b/app/models/members.py index 4b8f80d..f41bf8c 100644 --- a/app/models/members.py +++ b/app/models/members.py @@ -47,7 +47,8 @@ class Members(db.Model): member = cls.query.filter_by(username=str(username)).first() if not member: - raise ValueError(f"Username = {username} not found") + raise None + #ValueError(f"Username = {username} not found") return member @classmethod diff --git a/app/models/members_pending.py b/app/models/members_pending.py index a4b014f..69787ea 100644 --- a/app/models/members_pending.py +++ b/app/models/members_pending.py @@ -1,44 +1,56 @@ from datetime import datetime, timezone from app.extensions import db from sqlalchemy.sql import func - +from sqlalchemy.exc import IntegrityError class MembersPending(db.Model): __tablename__ = 'members_pending' 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) + firstname = db.Column(db.String(35), nullable=False) + lastname = db.Column(db.String(35), nullable=True) + email = db.Column(db.String(35), nullable=False) + status = db.Column(db.Integer, default=0) 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) + + def to_dict(self): return { "id": self.id, "uid": self.uid, - "username": self.account_id, - "account_id": self.username, - "password": self.password, - "loc": self.loc, + "firstname": self.firstname, + "lastname": self.lastname, + "email": self.email, "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 + "updated": self.updated.isoformat() if self.updated else None } def __repr__(self): return f'' + @classmethod + def add_members_pending(cls, firstname, lastname, email): + + # Save the response + pending_data = cls( + firstname=firstname, + lastname=lastname, + email=email, + added=datetime.now(timezone.utc), + updated=datetime.now(timezone.utc) + ) + + try: + db.session.add(pending_data) + except IntegrityError as err: + raise ValueError(f"Database integrity error: {err}") + return pending_data + + @classmethod def get_member_by_username(cls, username): """ @@ -48,4 +60,31 @@ class MembersPending(db.Model): if not member: raise ValueError(f"Username = {username} not found") - return member \ No newline at end of file + return member + + # { + # "email": "ameye@chiefsoft.com", + # "firstname": "Olusesan", + # "lastname": "Ameye", + # "isChecked": true + # } + + ''' + merms_panel=# \d members_pending + Table "public.members_pending" + Column | Type | Collation | Nullable | Default +-----------+-----------------------------+-----------+----------+--------------------------------------------- + id | integer | | not null | nextval('members_pending_id_seq'::regclass) + uid | uuid | | | uuid_generate_v4() + firstname | character varying(35) | | not null | + lastname | character varying(35) | | not null | + email | character varying(35) | | not null | + status | integer | | | 0 + added | timestamp without time zone | | | now() + updated | timestamp without time zone | | | now() +Indexes: + "members_pending_id_key" UNIQUE CONSTRAINT, btree (id) + + +merms_panel=# + ''' \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 7289956..fdcfee1 100644 --- a/requirements.txt +++ b/requirements.txt @@ -39,3 +39,6 @@ werkzeug python-dateutil +Flask-Mail + +pycountry