views per user

This commit is contained in:
Ubuntu 2025-07-24 12:37:07 +05:30
parent 7531702923
commit fb257a22c3
2 changed files with 73 additions and 24 deletions

View File

@ -526,34 +526,83 @@ exports.logDocumentView = async (req, res) => {
}; };
// GET /documents/:id/views // GET /documents/:id/views
exports.getDocumentViewCount = async (req, res) => { // GET /documents/views
const documentId = parseInt(req.params.id); exports.getDocumentsViewDetailsByHospital = async (req, res) => {
if (!documentId) {
return res.status(400).json({ error: 'Document ID is required' });
}
try { try {
const query = ` const userId = req.user.id;
SELECT const hospitalCode = req.user.hospital_code;
document_id,
user_id AS viewed_by,
user_role,
viewed_at
FROM document_views
WHERE document_id = ?
ORDER BY viewed_at DESC
`;
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({ res.status(200).json({
documentId, total: result.length,
totalViews: views.length, documents: result,
views,
}); });
} catch (error) { } catch (error) {
console.error('Error fetching view details:', error.message); console.error('Error fetching documents with view details:', error.message);
res.status(500).json({ message: 'Error fetching view details' }); res.status(500).json({ message: 'Internal server error' });
} }
}; };

View File

@ -77,7 +77,7 @@ router.delete(
); );
router.post('/:id/view', authMiddleware.authenticateToken, documentController.logDocumentView); 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; module.exports = router;