spurrin-backend/src/controllers/feedbacksController.js
2025-07-15 11:30:19 +05:30

446 lines
13 KiB
JavaScript

const db = require('../config/database');
// Create feedback from app user to hospital
exports.createAppUserFeedback = async (req, res) => {
try {
const {
hospital_code,
rating,
purpose,
information_received,
feedback_text,
improvement,
} = req.body;
const user_id = req.user.id; // From auth middleware
console.log(
'user data---',
hospital_code,
rating,
purpose,
information_received,
feedback_text,
improvement
);
// Validate required fields
if (!hospital_code) {
return res.status(400).json({
error: 'Hospital code is required',
});
}
// Set default values if not provided
const validRating = ['Terrible', 'Bad', 'Okay', 'Good', 'Awesome'];
const validInfoReceived = ['Yes', 'Partially', 'No'];
const finalRating =
rating && validRating.includes(rating) ? rating : null;
const finalInfoReceived =
information_received && validInfoReceived.includes(information_received)
? information_received
: null;
// Check if hospital exists
const hospitalCheck = await db.query(
'SELECT id FROM hospitals WHERE hospital_code = ?',
[hospital_code]
);
if (hospitalCheck.length === 0) {
return res.status(404).json({
error: 'Hospital not found',
});
}
// Insert feedback
const query = `
INSERT INTO feedback (
sender_type,
sender_id,
receiver_type,
receiver_id,
rating,
purpose,
information_received,
feedback_text,
improvement
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
`;
const result = await db.query(query, [
'appuser',
user_id,
'hospital',
hospitalCheck[0].id,
finalRating,
purpose,
finalInfoReceived,
feedback_text || null,
improvement || null,
]);
res.status(201).json({
message: 'Feedback submitted successfully',
feedback_id: result.insertId,
});
} catch (error) {
console.error('Error creating app user feedback:', error);
res.status(500).json({ error: 'Internal server error' });
}
};
// Create feedback from hospital to Spurrin
exports.createHospitalFeedback = async (req, res) => {
try {
const {
rating,
purpose,
information_received,
feedback_text,
improvement
} = req.body;
const hospital_code = req.user.hospital_code; // From auth middleware
// Validate required fields
if (!rating || !purpose || !information_received) {
return res.status(400).json({
error: "Rating, purpose and information received are required"
});
}
// Validate rating enum
const validRating = ['angry', 'sad', 'neutral', 'happy', 'awesome'];
if (!validRating.includes(rating)) {
return res.status(400).json({
error: "Invalid rating value"
});
}
// Validate information_received enum
const validInfoReceived = ['Yes', 'Partially', 'No'];
if (!validInfoReceived.includes(information_received)) {
return res.status(400).json({
error: "Invalid information received value"
});
}
// Get hospital ID
const hospitalCheck = await db.query(
'SELECT id FROM hospitals WHERE hospital_code = ?',
[hospital_code]
);
if (hospitalCheck.length === 0) {
return res.status(404).json({
error: "Hospital not found"
});
}
// Insert feedback
const query = `
INSERT INTO feedback (
sender_type,
sender_id,
receiver_type,
receiver_id,
rating,
purpose,
information_received,
feedback_text,
improvement
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
`;
const result = await db.query(query, [
'hospital',
hospitalCheck[0].id,
'spurrin',
1, // Assuming 1 is the ID for Spurrin
rating,
purpose,
information_received,
feedback_text || null,
improvement || null
]);
res.status(201).json({
message: "Feedback submitted successfully",
feedback_id: result.insertId
});
} catch (error) {
console.error("Error creating hospital feedback:", error);
res.status(500).json({ error: "Internal server error" });
}
};
// Get feedbacks for a hospital (for hospital users)
exports.getHospitalFeedbacks = async (req, res) => {
try {
const hospital_code = req.user.hospital_code; // From auth middleware
// Get hospital ID
const hospitalCheck = await db.query(
'SELECT id FROM hospitals WHERE hospital_code = ?',
[hospital_code]
);
if (hospitalCheck.length === 0) {
return res.status(404).json({
error: "Hospital not found"
});
}
const query = `
SELECT
f.feedback_id,
f.sender_type,
f.sender_id,
f.receiver_type,
f.receiver_id,
f.rating,
f.purpose,
f.information_received,
f.feedback_text,
f.improvement,
f.created_at,
f.is_forwarded,
au.username as user_name,
au.email as user_email
FROM feedback f
LEFT JOIN app_users au ON f.sender_id = au.id AND f.sender_type = 'appuser'
WHERE f.receiver_type = 'hospital' AND f.receiver_id = ?
ORDER BY f.created_at DESC
`;
const feedbacks = await db.query(query, [hospitalCheck[0].id]);
res.status(200).json({
message: "Feedbacks fetched successfully",
data: feedbacks
});
} catch (error) {
console.error("Error fetching hospital feedbacks:", error);
res.status(500).json({ error: "Internal server error" });
}
};
// Get all feedbacks (for Spurrin admin)
exports.getAllFeedbacks = async (req, res) => {
try {
// Check authorization
if(req.user.role !== 'Spurrinadmin' && req.user.role !== 6){
return res.status(403).json({
error: "You are not authorized!"
});
}
const query = `
SELECT
f.feedback_id,
f.sender_type,
f.sender_id,
f.receiver_type,
f.receiver_id,
f.rating,
f.purpose,
f.information_received,
f.feedback_text,
f.created_at,
f.is_forwarded,
au.name as user_name,
au.email as user_email,
h.name_hospital as hospital_name,
h.hospital_code
FROM feedback f
LEFT JOIN app_users au ON f.sender_id = au.id AND f.sender_type = 'appuser'
LEFT JOIN hospitals h ON f.sender_id = h.id AND f.sender_type = 'hospital'
ORDER BY f.created_at DESC
`;
const feedbacks = await db.query(query);
res.status(200).json({
message: "All feedbacks fetched successfully",
data: feedbacks
});
} catch (error) {
console.error("Error fetching all feedbacks:", error);
res.status(500).json({ error: "Internal server error" });
}
};
// Forward app user feedbacks to Spurrin (for hospital users)
exports.forwardAppUserFeedbacks = async (req, res) => {
try {
const { feedback_ids } = req.body;
const hospital_code = req.user.hospital_code;
if (!feedback_ids || !Array.isArray(feedback_ids) || feedback_ids.length === 0) {
return res.status(400).json({ error: "Feedback IDs array is required" });
}
const hospitalCheck = await db.query(
'SELECT id FROM hospitals WHERE hospital_code = ?',
[hospital_code]
);
if (hospitalCheck.length === 0) {
return res.status(404).json({ error: "Hospital not found" });
}
const hospitalId = hospitalCheck[0].id;
const verifyQuery = `
SELECT feedback_id
FROM feedback
WHERE feedback_id IN (?)
AND receiver_type = 'hospital'
AND receiver_id = ?
AND sender_type = 'appuser'
`;
const validFeedbacks = await db.query(verifyQuery, [feedback_ids, hospitalId]);
if (validFeedbacks.length !== feedback_ids.length) {
return res.status(400).json({
error: "One or more feedback IDs are invalid or don't belong to this hospital"
});
}
const forwardPromises = feedback_ids.map(async (feedback_id) => {
const originalFeedback = await db.query(
'SELECT * FROM feedback WHERE feedback_id = ?',
[feedback_id]
);
if (originalFeedback.length === 0) return null;
const feedback = originalFeedback[0];
// Insert new feedback for Spurrin
await db.query(`
INSERT INTO feedback (
sender_type,
sender_id,
receiver_type,
receiver_id,
rating,
purpose,
information_received,
feedback_text,
improvement
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,
[
'hospital',
hospitalId,
'spurrin',
1, // Spurrin ID
feedback.rating,
`Purpose: ${feedback.purpose}`,
feedback.information_received,
feedback.feedback_text,
feedback.improvement || null
]
);
// Mark original feedback as forwarded
await db.query(
'UPDATE feedback SET is_forwarded = 1 WHERE feedback_id = ?',
[feedback_id]
);
});
await Promise.all(forwardPromises);
res.status(200).json({
message: "Feedbacks forwarded to Spurrin successfully",
forwarded_count: feedback_ids.length
});
} catch (error) {
console.error("Error forwarding feedbacks:", error);
res.status(500).json({ error: "Internal server error" });
}
};
// API to get all forwarded feedbacks for Spurrin
exports.getForwardedFeedbacks = async (req, res) => {
try {
// Check authorization
if (req.user.role !== 'Spurrinadmin' && req.user.role !== 6) {
return res.status(403).json({
error: "You are not authorized!"
});
}
const query = `
SELECT
f.sender_type,
f.sender_id,
f.receiver_type,
f.receiver_id,
f.rating,
f.purpose,
f.information_received,
f.feedback_text,
f.created_at,
f.is_forwarded,
f.improvement,
h.name_hospital as sender_hospital,
h.hospital_code
FROM feedback f
LEFT JOIN hospitals h ON f.sender_id = h.id AND f.sender_type = 'hospital'
WHERE f.receiver_type = 'spurrin'
ORDER BY f.created_at DESC
`;
const forwardedFeedbacks = await db.query(query);
res.status(200).json({
message: "Forwarded feedbacks fetched successfully.",
data: forwardedFeedbacks
});
} catch (error) {
console.error("Error fetching forwarded feedbacks:", error);
res.status(500).json({ error: "Internal server error" });
}
};
exports.deleteAppUserFeedback = async (req, res) => {
try {
const feedbackId = req.params.id;
const user = req.user; // From auth middleware
// Validate that the feedback ID is provided
if (!feedbackId) {
return res.status(400).json({
error: 'Feedback ID is required',
});
}
if (
user.role !== 'Spurrinadmin' &&
user.role !== 6 &&
user.role !== 'Superadmin' &&
user.role !== 7
) {
return res.status(403).json({
error: 'You are not authorized!',
});
}
// Delete the feedback
await db.query('DELETE FROM feedback WHERE feedback_id = ?', [feedbackId]);
res.status(200).json({
message: 'Feedback deleted successfully',
});
} catch (error) {
console.error('Error deleting app user feedback:', error);
res.status(500).json({ error: 'Internal server error' });
}
};