diff --git a/app/api/routes/routes.py b/app/api/routes/routes.py index 25680f4..758de63 100644 --- a/app/api/routes/routes.py +++ b/app/api/routes/routes.py @@ -149,7 +149,7 @@ def upload_file(): if file and allowed_file(file.filename): logger.info(f'POST CALLED 5 {file.filename}') - response = FileUploadService.process_file_upload("WEB_MEDIA", file ,member_uid ) + response = FileUploadService.process_file_upload("WEB_MEDIA", file, member_uid) # save_path=UPLOAD_FOLDER + "/" + "F000000000001" # filename = secure_filename(file.filename) @@ -234,6 +234,7 @@ def merms_account_payments(): response = AccountService.process_payments_data(data) return response + @api.route("/panel/account/media-files", methods=["POST"]) def get_websitefiles(): data = request.get_json() @@ -241,6 +242,7 @@ def get_websitefiles(): response = FileUploadService.member_webfiles(data) return response + @api.route("/panel/account/products/url", methods=["POST"]) def myproduct_url(): data = request.get_json() @@ -611,6 +613,20 @@ def get_subscription_billings_office(): return jsonify(result) +@api.route('/office/file-uploads', methods=['GET']) +# @token_required +def get_file_uploads_office(): + # Call the dashboard service + filters = { + 'product_id': request.args.get('product_id'), + 'member_id': request.args.get('member_id'), + 'page': request.args.get('page', 1), + 'limit': request.args.get('limit', 20) + } + result = OfficeDashboardService.get_file_upload_data(filters) + return jsonify(result) + + @api.route('/office/transaction', methods=['GET']) def get_subscription_transaction_office(): # Call the dashboard service diff --git a/app/api/services/office_dashboard.py b/app/api/services/office_dashboard.py index e2a928e..8b0a54d 100644 --- a/app/api/services/office_dashboard.py +++ b/app/api/services/office_dashboard.py @@ -1,13 +1,15 @@ from urllib import request from flask import jsonify + +from app.config import settings from app.utils.logger import logger from app.api.services.base_service import BaseService from sqlalchemy import func, desc from datetime import datetime, timedelta, timezone from app.extensions import db from app.models import MembersProducts, Products, Payments, Members, CustomTemplates, ProductsTemplates, MembersProfile, \ - ProductsDetails + ProductsDetails, MembersWebfiles class OfficeDashboardService(BaseService): @@ -515,6 +517,69 @@ class OfficeDashboardService(BaseService): return response_data + except Exception as e: + logger.error(f"An error occurred while getting dashboard data: {str(e)}", exc_info=True) + return jsonify({"message": "Internal Server Error"}), 500 + + @staticmethod + def get_file_upload_data(filters): + try: + if filters is None: + filters = {} + + # Extract filters + file_group = filters.get('file_group') + member_id = filters.get('member_id') + + # Extract pagination parameters + page = int(filters.get('page', 1)) + limit = int(filters.get('limit', 20)) + + # Ensure page and limit are valid + if page < 1: + page = 1 + if limit < 1 or limit > 100: + limit = 20 + + fileListData, total_count = MembersWebfiles.get_all_webfiles(file_group, file_group, page, limit) + # Convert loans to dictionary format + member_sub_data = [] + if fileListData: + for subs in fileListData: + member_sub_data.append({ + 'id': subs.id, + 'file_uid': subs.uid, + 'member_id': subs.member_id, + 'member_uid': subs.member_uid, + 'file_group': subs.file_group, + 'filename': subs.filename, + 'save_filename': subs.save_filename, + 'file_type': subs.file_type, + 'status': subs.status, + 'file_size': subs.file_size, + 'added': subs.added.isoformat() if subs.added else None, + 'updated': subs.updated.isoformat() if subs.updated else None + }) + + # Calculate total pages + total_pages = (total_count + limit - 1) // limit + + response_data = { + 'file_list': member_sub_data, + 'media_server': settings.MEDIA_SERVER, + 'count': len(member_sub_data), + 'pagination': { + 'total_count': total_count, + 'total_pages': total_pages, + 'current_page': page, + 'limit': limit, + 'has_next': page < total_pages, + 'has_prev': page > 1 + } + } + + return response_data + except Exception as e: logger.error(f"An error occurred while getting dashboard data: {str(e)}", exc_info=True) return jsonify({"message": "Internal Server Error"}), 500 \ No newline at end of file diff --git a/app/models/members_webfiles.py b/app/models/members_webfiles.py index ecbc89f..b984bf7 100644 --- a/app/models/members_webfiles.py +++ b/app/models/members_webfiles.py @@ -76,6 +76,30 @@ class MembersWebfiles(db.Model): return None return member_webfile + @classmethod + def get_all_webfiles(cls, file_group=None, member_id=None, page=1, limit=20): + + query = cls.query + logger.info(f"Get all payments back") + + if member_id: + query = query.filter(cls.member_id == member_id) + + if file_group: + query = query.filter(cls.file_group == file_group) + + # Order by created_at descending (newest first) + query = query.order_by(cls.added.desc()) + + # Get total count before pagination + total_count = query.count() + + # Apply pagination + offset = (page - 1) * limit + query = query.limit(limit).offset(offset) + + return query.all(), total_count + def to_dict(self): """ Convert the Loan object to a dictionary format for JSON serialization.