Files
CHIEFSOFT\ameye a8f94b9017 file_url
2026-02-14 14:19:51 -05:00

215 lines
8.1 KiB
Python

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