diff --git a/app/api/services/file_upload.py b/app/api/services/file_upload.py index 0abda7c..6b38a51 100644 --- a/app/api/services/file_upload.py +++ b/app/api/services/file_upload.py @@ -3,11 +3,12 @@ from flask import jsonify from app.api.enums import KafkaMessage from app.api.services import MyProductsService from app.config import settings -from app.models import Members +from app.models import Members, MembersWebfiles from app.utils.logger import logger from app.api.services.base_service import BaseService from sqlalchemy import func, desc from app.extensions import db +from app.api.types.data_types import MemberFileData import os from werkzeug.utils import secure_filename import time @@ -31,9 +32,10 @@ class FileUploadService(BaseService): # Who is this member_data = Members.get_member_by_uid(member_uid) if not member_data: - return [] + return jsonify({"message": "User not found"}), 500 - final_folder = f"W{member_data.id:010d}" + member_id=member_data.id + final_folder = f"W{member_id:010d}" save_path = FileUploadService.UPLOAD_FOLDER + "/WEBSITE" if not os.path.isdir(save_path): @@ -52,6 +54,16 @@ class FileUploadService(BaseService): logger.info(f'POST CALLED 6 {final_save_path}') file.save(final_save_path) + save_file_props = MemberFileData() + save_file_props.member_uid = member_uid + save_file_props.filename = filename + save_file_props.save_filename = save_filename + save_file_props.file_group="WEBSITE" + save_file_props.member_id = member_id + save_file_props.file_size = 0 + save_file_props.file_size = filename.rsplit('.', 1)[1].lower() + + save_result = MembersWebfiles.create_file_profile(save_file_props) response_data = { "file_uid": file_uid, @@ -62,3 +74,7 @@ class FileUploadService(BaseService): except Exception as e: logger.error(f"An error occurred while uploading file: {str(e)}", exc_info=True) return jsonify({"message": "Internal Server Error"}), 500 + + def allowed_file(filename): + return '.' in filename and \ + filename.rsplit('.', 1)[1].lower() in FileUploadService.ALLOWED_EXTENSIONS \ No newline at end of file diff --git a/app/api/types/data_types.py b/app/api/types/data_types.py new file mode 100644 index 0000000..188c39f --- /dev/null +++ b/app/api/types/data_types.py @@ -0,0 +1,8 @@ +class MemberFileData: + member_id: int + member_uid: str + file_group: str + filename: str + save_filename: str + file_type: str + file_size: str diff --git a/app/models/__init__.py b/app/models/__init__.py index a5c793f..7c1b3a6 100644 --- a/app/models/__init__.py +++ b/app/models/__init__.py @@ -21,6 +21,7 @@ from .office_users import OfficeUsers from .custom_templates import CustomTemplates from .products_colorstyle import ProductsColorStyle from .country import Country +from .members_webfiles import MembersWebfiles __all__ = ['Members', 'Account', 'Products', 'MembersProducts', 'MembersActions', 'MembersPending', 'ProductsDetails', diff --git a/app/models/members_webfiles.py b/app/models/members_webfiles.py new file mode 100644 index 0000000..f542a6b --- /dev/null +++ b/app/models/members_webfiles.py @@ -0,0 +1,81 @@ +from datetime import datetime, timezone, timedelta +from itertools import product +from app.extensions import db +from sqlalchemy.exc import IntegrityError +from sqlalchemy.orm import relationship +from dateutil.relativedelta import relativedelta +from datetime import timedelta +import logging +from sqlalchemy import and_, or_, not_ +from sqlalchemy.sql import func + +from app.api.types.data_types import MemberFileData +import uuid +logger = logging.getLogger(__name__) + +class MembersWebfiles(db.Model): + __tablename__ = 'members_webfiles' + + id = db.Column( + db.Integer, + primary_key=True, + autoincrement=True, + ) + + uid = db.Column(db.String(150), nullable=False) + member_id = db.Column(db.Integer, nullable=False) + member_uid = db.Column(db.String(100), nullable=False) + file_group = db.Column(db.String(25), nullable=False) + filename = db.Column(db.String(100), nullable=False) + save_filename = db.Column(db.String(100), nullable=False) + file_type = db.Column(db.String(50), nullable=False) + status = db.Column(db.Integer, nullable=True, default=1) + file_size = db.Column(db.Integer, nullable=True, default=0) + added = db.Column(db.DateTime(timezone=True), server_default=func.now()) + updated = db.Column(db.DateTime(timezone=True), server_default=func.now(), onupdate=func.now()) + + @classmethod + def create_file_profile(cls, file_data: MemberFileData): + logger.info(f" Data for File Data {file_data} ") + file_save_data = cls( + uid=str(uuid.uuid4()), + member_id=file_data.member_id, + member_uid=file_data.member_uid, + file_group=file_data.file_group, + filename=file_data.filename, + save_filename=file_data.save_filename, + file_type=file_data.file_type, + file_size=file_data.file_size, + added=datetime.now(timezone.utc), + updated=datetime.now(timezone.utc) + ) + try: + logger.info(f" About to Insert Members File Data {file_data.member_id} ") + db.session.add(file_save_data) + db.session.flush() + except IntegrityError as err: + logger.error(f" Error inserting file_save_data data {err} -- ") + raise ValueError(f"Database integrity error: {err}") + return file_save_data + + def to_dict(self): + """ + Convert the Loan object to a dictionary format for JSON serialization. + """ + return { + 'id': self.id, + 'uid': self.uid, + 'member_id': self.member_id, + 'member_uid': self.member_uid, + 'file_group': self.file_group, + 'filename': self.filename, + 'save_filename': self.save_filename, + 'file_type': self.file_type, + 'status': self.status, + 'file_size': self.file_size, + 'added': self.added, + 'updated': self.updated + } + + def __repr__(self): + return f''