diff --git a/src/controllers/documentsController.js b/src/controllers/documentsController.js index 84eff85..ed0aa2e 100644 --- a/src/controllers/documentsController.js +++ b/src/controllers/documentsController.js @@ -526,34 +526,83 @@ exports.logDocumentView = async (req, res) => { }; // GET /documents/:id/views -exports.getDocumentViewCount = async (req, res) => { - const documentId = parseInt(req.params.id); - - if (!documentId) { - return res.status(400).json({ error: 'Document ID is required' }); - } - +// GET /documents/views +exports.getDocumentsViewDetailsByHospital = async (req, res) => { try { - const query = ` - SELECT - document_id, - user_id AS viewed_by, - user_role, - viewed_at - FROM document_views - WHERE document_id = ? - ORDER BY viewed_at DESC - `; + const userId = req.user.id; + const hospitalCode = req.user.hospital_code; - const [views] = await db.query(query, [documentId]); + if (!userId || !hospitalCode) { + return res.status(400).json({ error: 'User ID and hospital code are required' }); + } + + // Get hospital_id from hospital_users using hospital_code + const hospitalUsers = await db.query( + `SELECT hospital_id FROM hospital_users WHERE hospital_code = ?`, + [hospitalCode] + ); + + if (!hospitalUsers.length) { + return res.status(404).json({ error: 'Hospital not found for user' }); + } + + const hospitalId = hospitalUsers[0].hospital_id; + + // Get all documents for this hospital + const documents = await db.query( + `SELECT id, file_name, file_url, processed_status, uploaded_by, uploaded_at FROM documents WHERE hospital_id = ?`, + [hospitalId] + ); + + if (!documents.length) { + return res.status(200).json({ total: 0, documents: [] }); + } + + const documentIds = documents.map(doc => doc.id); + const placeholders = documentIds.map(() => '?').join(','); + + // Get all views for these documents + const views = await db.query( + `SELECT document_id, user_id AS viewed_by, user_role, viewed_at + FROM document_views + WHERE document_id IN (${placeholders}) + ORDER BY viewed_at DESC`, + documentIds + ); + + // Group views by document_id + const viewsByDocument = {}; + views.forEach(view => { + if (!viewsByDocument[view.document_id]) { + viewsByDocument[view.document_id] = []; + } + viewsByDocument[view.document_id].push({ + viewed_by: view.viewed_by, + user_role: view.user_role, + viewed_at: view.viewed_at, + }); + }); + + // Combine documents with their views, totalViews, and whether current user has viewed + const result = documents.map(doc => { + const docViews = viewsByDocument[doc.id] || []; + const userViewed = docViews.some(v => v.viewed_by === userId); + + return { + ...doc, + totalViews: docViews.length, + views: docViews, + viewed: userViewed, + }; + }); res.status(200).json({ - documentId, - totalViews: views.length, - views, + total: result.length, + documents: result, }); + } catch (error) { - console.error('Error fetching view details:', error.message); - res.status(500).json({ message: 'Error fetching view details' }); + console.error('Error fetching documents with view details:', error.message); + res.status(500).json({ message: 'Internal server error' }); } }; diff --git a/src/routes/documents.js b/src/routes/documents.js index 1d0234f..ef1e9cb 100644 --- a/src/routes/documents.js +++ b/src/routes/documents.js @@ -77,7 +77,7 @@ router.delete( ); router.post('/:id/view', authMiddleware.authenticateToken, documentController.logDocumentView); -router.get('/:id/views',authMiddleware.authenticateToken, documentController.getDocumentViewCount); +router.get('/user/status',authMiddleware.authenticateToken, documentController.getDocumentsViewDetailsByHospital); module.exports = router; \ No newline at end of file