DigitalDB / src /controllers /mediaController.js
Mr-Thop's picture
Add About us
21fd8ea
Raw
History Blame Contribute Delete
6.91 kB
const pool = require('../config/database');
// Get all media
const getAllMedia = async (req, res) => {
try {
const query = `
SELECT
m.*,
p.local_name as plant_name,
l.village_name
FROM entry_media m
LEFT JOIN survey_entries se ON m.entry_id = se.entry_id
LEFT JOIN plants p ON se.plant_id = p.plant_id
LEFT JOIN locations l ON se.location_id = l.location_id
ORDER BY m.media_id DESC
`;
const [rows] = await pool.execute(query);
res.json({
success: true,
data: rows,
count: rows.length
});
} catch (error) {
console.error('Error fetching media:', error);
res.status(500).json({
success: false,
error: 'Failed to fetch media'
});
}
};
// Get media by type
const getMediaByType = async (req, res) => {
try {
const { type } = req.params;
const validTypes = ['Photo', 'Audio', 'Logo', 'Home']; // Added Home type
if (!validTypes.includes(type)) {
return res.status(400).json({
success: false,
error: 'Invalid media type. Valid types: Photo, Audio, Logo, Home'
});
}
let query;
if (type === 'Logo' || type === 'Home') {
// For Logo and Home, we might not have entry_id linked to plants
query = `
SELECT m.*
FROM entry_media m
WHERE m.media_type = ?
ORDER BY m.media_id DESC
`;
} else {
query = `
SELECT
m.*,
p.local_name as plant_name,
l.village_name
FROM entry_media m
LEFT JOIN survey_entries se ON m.entry_id = se.entry_id
LEFT JOIN plants p ON se.plant_id = p.plant_id
LEFT JOIN locations l ON se.location_id = l.location_id
WHERE m.media_type = ?
ORDER BY m.media_id DESC
`;
}
const [rows] = await pool.execute(query, [type]);
res.json({
success: true,
data: rows,
count: rows.length,
type: type
});
} catch (error) {
console.error('Error fetching media by type:', error);
res.status(500).json({
success: false,
error: 'Failed to fetch media by type'
});
}
};
// Get media by entry ID
const getMediaByEntry = async (req, res) => {
try {
const { entryId } = req.params;
const query = `
SELECT
m.*,
p.local_name as plant_name,
l.village_name
FROM entry_media m
LEFT JOIN survey_entries se ON m.entry_id = se.entry_id
LEFT JOIN plants p ON se.plant_id = p.plant_id
LEFT JOIN locations l ON se.location_id = l.location_id
WHERE m.entry_id = ?
ORDER BY m.media_type, m.media_id
`;
const [rows] = await pool.execute(query, [entryId]);
// Group by media type
const groupedMedia = {
Photo: [],
Audio: []
};
rows.forEach(media => {
if (groupedMedia[media.media_type]) {
groupedMedia[media.media_type].push(media);
}
});
res.json({
success: true,
data: groupedMedia,
total: rows.length,
entry_id: entryId
});
} catch (error) {
console.error('Error fetching media by entry:', error);
res.status(500).json({
success: false,
error: 'Failed to fetch media by entry'
});
}
};
// Get logo media
const getLogoMedia = async (req, res) => {
try {
const query = `
SELECT * FROM entry_media
WHERE media_type = 'Logo'
ORDER BY media_id DESC
LIMIT 1
`;
const [rows] = await pool.execute(query);
res.json({
success: true,
data: rows[0] || null
});
} catch (error) {
console.error('Error fetching logo:', error);
res.status(500).json({
success: false,
error: 'Failed to fetch logo'
});
}
};
// Get homepage media (use first few photos as carousel)
const getHomepageMedia = async (req, res) => {
try {
const query = `
SELECT
m.*,
p.local_name as plant_name,
l.village_name
FROM entry_media m
LEFT JOIN survey_entries se ON m.entry_id = se.entry_id
LEFT JOIN plants p ON se.plant_id = p.plant_id
LEFT JOIN locations l ON se.location_id = l.location_id
WHERE m.media_type = 'Photo'
ORDER BY m.media_id DESC
LIMIT 5
`;
const [rows] = await pool.execute(query);
res.json({
success: true,
data: rows,
count: rows.length
});
} catch (error) {
console.error('Error fetching homepage media:', error);
res.status(500).json({
success: false,
error: 'Failed to fetch homepage media'
});
}
};
// Create media entry
const createMedia = async (req, res) => {
try {
const { entry_id, media_type, file_url } = req.body;
const validTypes = ['Photo', 'Audio']; // Updated to match schema
if (!validTypes.includes(media_type)) {
return res.status(400).json({
success: false,
error: 'Invalid media type. Valid types: Photo, Audio'
});
}
if (!file_url) {
return res.status(400).json({
success: false,
error: 'File URL is required'
});
}
const query = `
INSERT INTO entry_media (entry_id, media_type, file_url)
VALUES (?, ?, ?)
`;
const [result] = await pool.execute(query, [entry_id, media_type, file_url]);
// Fetch the created media
const [newMedia] = await pool.execute(
'SELECT * FROM entry_media WHERE media_id = ?',
[result.insertId]
);
res.status(201).json({
success: true,
data: newMedia[0],
message: 'Media created successfully'
});
} catch (error) {
console.error('Error creating media:', error);
res.status(500).json({
success: false,
error: 'Failed to create media'
});
}
};
// Delete media
const deleteMedia = async (req, res) => {
try {
const { id } = req.params;
const query = 'DELETE FROM entry_media WHERE media_id = ?';
const [result] = await pool.execute(query, [id]);
if (result.affectedRows === 0) {
return res.status(404).json({
success: false,
error: 'Media not found'
});
}
res.json({
success: true,
message: 'Media deleted successfully'
});
} catch (error) {
console.error('Error deleting media:', error);
res.status(500).json({
success: false,
error: 'Failed to delete media'
});
}
};
module.exports = {
getAllMedia,
getMediaByType,
getMediaByEntry,
getLogoMedia,
getHomepageMedia,
createMedia,
deleteMedia
};