215 lines
8.1 KiB
Python
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
|