forked from rohit/spurrin-backend
446 lines
13 KiB
JavaScript
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' });
|
|
}
|
|
}; |