From e2a6b215d5696af56c96557b767196409ec70585 Mon Sep 17 00:00:00 2001 From: seaznCode Date: Mon, 19 Jan 2026 23:31:03 +0100 Subject: [PATCH] feat: add storage status check for user documents in getDetailedUserInfo function --- services/admin/AdminService.js | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/services/admin/AdminService.js b/services/admin/AdminService.js index 7bb55ec..2577a12 100644 --- a/services/admin/AdminService.js +++ b/services/admin/AdminService.js @@ -2,7 +2,7 @@ const AdminRepository = require('../../repositories/admin/AdminRepository'); const UserDocumentRepository = require('../../repositories/documents/UserDocumentRepository'); const UserRepository = require('../../repositories/user/UserRepository'); const { s3 } = require('../../utils/exoscaleUploader'); -const { GetObjectCommand } = require('@aws-sdk/client-s3'); +const { GetObjectCommand, ListObjectsV2Command } = require('@aws-sdk/client-s3'); const { getSignedUrl } = require('@aws-sdk/s3-request-presigner'); const { DeleteObjectCommand } = require('@aws-sdk/client-s3'); const pidusage = require('pidusage'); @@ -197,6 +197,34 @@ class AdminService { }) ); + const hasObjects = async (prefix) => { + try { + const res = await s3.send(new ListObjectsV2Command({ + Bucket: process.env.EXOSCALE_BUCKET, + Prefix: prefix, + MaxKeys: 1 + })); + return !!(res && res.Contents && res.Contents.length); + } catch (e) { + logger.warn('AdminService.getDetailedUserInfo:storage_check_failed', { userId, prefix, error: e && e.message }); + return false; + } + }; + + const userType = (user.user_type || '').toString().toLowerCase(); + const idPrefix = userType === 'company' ? `company-id/${userId}/` : `personal-id/${userId}/`; + const contractBase = `contracts/${userType === 'company' ? 'company' : 'personal'}/${userId}/`; + const [idDocumentsPresent, contractPresent, gdprPresent] = await Promise.all([ + hasObjects(idPrefix), + hasObjects(`${contractBase}contract/`), + hasObjects(`${contractBase}gdpr/`) + ]); + + const storageStatus = { + idDocumentsPresent, + contractPresent: contractPresent || gdprPresent + }; + logger.info('AdminService.getDetailedUserInfo:success', { userId }); return { user, @@ -206,7 +234,8 @@ class AdminService { userStatus, documents, contracts, - idDocuments: idDocumentsWithUrls + idDocuments: idDocumentsWithUrls, + storageStatus }; } catch (error) { logger.error('AdminService.getDetailedUserInfo:error', { userId, error: error.message });