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, 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 from app.api.helpers.response_helper import ResponseHelper from app.api.schemas.user import UserSchema class FileUploadService(BaseService): UPLOAD_FOLDER = settings.UPLOAD_FOLDER # '/app/uploads' # '/uploads' ALLOWED_EXTENSIONS = {'txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'} @staticmethod def member_webfiles(data): try: validated_data = FileUploadService.validate_data(data, UserSchema()) user_token = validated_data.get('token') member_uid = str(validated_data.get('uid')) # Who is this member_data = Members.get_member_by_uid(member_uid) if not member_data: return jsonify({"message": "User not found"}), 500 member_id = member_data.id result_file_list = MembersWebfiles.get_member_webfiles_by_member_id(member_id) file_list = [] if result_file_list: for t in result_file_list: file_list.append({ 'id': t.id, 'file_uid': t.uid, 'member_id': t.member_id, 'member_uid': t.member_uid, 'file_group': t.file_group, 'filename': t.filename, 'save_filename': t.save_filename, 'file_type': t.file_type, 'status': t.status, 'file_size': t.file_size, 'added': t.added.isoformat() if t.added else None, 'updated': t.updated.isoformat() if t.updated else None }) response_data = { "file_list": file_list, "media_server": settings.MEDIA_SERVER, } return ResponseHelper.success(data=response_data) except Exception as e: logger.error(f"An error occurred getting file list: {str(e)}", exc_info=True) return jsonify({"message": "Internal Server Error"}), 500 # return file_list @staticmethod def process_profile_file_upload(upload_type: str, file, member_uid): timestamp_integer = int(time.time()) ## MAKE SURE WE HAVE BASE FOLDERS if not os.path.isdir(FileUploadService.UPLOAD_FOLDER): os.makedirs(FileUploadService.UPLOAD_FOLDER) profile_path = FileUploadService.UPLOAD_FOLDER + "/PROFILE" if not os.path.isdir(profile_path): os.makedirs(profile_path) file_uid = "" try: # Who is this member_data = Members.get_member_by_uid(member_uid) if not member_data: return jsonify({"message": "User not found"}), 500 member_id = member_data.id final_folder = f"W{member_id:010d}" logger.info(f'POST CALLED 5 {file.filename}') save_path = profile_path + "/" + final_folder if not os.path.isdir(save_path): os.makedirs(save_path) filename = secure_filename(file.filename) # This is to avert duplicate file name issues save_filename = str(timestamp_integer) + "-" + filename final_save_path = os.path.join(save_path, save_filename) logger.info(f'POST CALLED 6 {final_save_path}') file.save(final_save_path) save_result = [] # Confirm file was created before stamping if os.path.isfile(final_save_path): logger.info(f"'{final_save_path}' was found in the folder '{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 = "PROFILE" save_file_props.member_id = member_id save_file_props.file_size = 0 save_file_props.file_type = filename.rsplit('.', 1)[1].lower() save_result, file_uid = MembersWebfiles.create_file_profile(save_file_props) logger.info(f"After Insert Members File Data {save_result} ") with db.session.begin(): Members.set_member_profile_picture(str(member_uid), str(file_uid)) else: logger.info(f"'{final_save_path}' was not found as a file in '{final_save_path}'") file_url = BaseService.get_profile_picture_url(file_uid) response_data = { "picture": file_url, "save_result": save_result, "file_uid": file_uid, } return response_data except Exception as e: logger.error(f"An error occurred while uploading profile file: {str(e)}", exc_info=True) return jsonify({"message": "Internal Server Error"}), 500 @staticmethod def process_file_upload(upload_type: str, file, member_uid): timestamp_integer = int(time.time()) ## MAKE SURE WE HAVE BASE FOLDERS if not os.path.isdir(FileUploadService.UPLOAD_FOLDER): os.makedirs(FileUploadService.UPLOAD_FOLDER) file_uid = "" try: # Who is this member_data = Members.get_member_by_uid(member_uid) if not member_data: return jsonify({"message": "User not found"}), 500 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): os.makedirs(save_path) logger.info(f'POST CALLED 5 {file.filename}') save_path = FileUploadService.UPLOAD_FOLDER + "/WEBSITE/" + final_folder if not os.path.isdir(save_path): os.makedirs(save_path) filename = secure_filename(file.filename) # This is to avert duplicate file name issues save_filename = str(timestamp_integer) + "-" + filename final_save_path = os.path.join(save_path, save_filename) logger.info(f'POST CALLED 6 {final_save_path}') file.save(final_save_path) save_result = [] # Confirm file was created before stamping if os.path.isfile(final_save_path): logger.info(f"'{final_save_path}' was found in the folder '{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_type = filename.rsplit('.', 1)[1].lower() save_result, file_uid = MembersWebfiles.create_file_profile(save_file_props) logger.info(f"After Insert Members File Data {save_result} ") else: logger.info(f"'{final_save_path}' was not found as a file in '{final_save_path}'") response_data = { "save_result": save_result, "file_uid": file_uid, } return response_data 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