views per user
This commit is contained in:
parent
7531702923
commit
fb257a22c3
@ -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' });
|
||||
}
|
||||
};
|
||||
|
||||
@ -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;
|
||||
Loading…
Reference in New Issue
Block a user