const express = require("express"); const router = express.Router(); const pool = require("../config/db"); const upload = require("../middlewares/upload"); const { v4: uuidv4 } = require("uuid"); const generateSlug = (name) => { return name .toLowerCase() .replace(/\s+/g, "-") .replace(/[^a-z0-9-]/g, ""); }; router.post("/add-partner", async (req, res) => { try { const { name, open_time, close_time, address, city, state, pincode, screens, // logo_url, // Assuming logo_url is a URL string, adjust if needed. } = req.body; const slug = generateSlug(name); const uniqueurl = slug; var id = uuidv4(); const [result] = await pool.query( "INSERT INTO tbl_partners (transid,name, logo_url, open_time, close_time, address, city, state, pincode, screens) VALUES (?,?, ?, ?, ?, ?, ?, ?, ?, ?)", [ id, name, uniqueurl, open_time, close_time, address, city, state, pincode, screens, ] ); //hsh var screensnumber = Number(screens); for (let i = 0; i < screensnumber; i++) { const [result1] = await pool.query( "INSERT INTO tbl_screens (transid,partnerid,name) VALUES (UUID(),?, ?)", [id, "Screen " + Number(i + 1)] ); } res.json({ message: "Partner Added Successfully! ", clientid: id, uniqueurl, id, }); } catch (err) { res.status(500).json({ error: err.message }); } }); router.post("/add-screen", async (req, res) => { try { const { partnerid, // logo_url, // Assuming logo_url is a URL string, adjust if needed. } = req.body; console.log(partnerid); const [countRows] = await pool.query( `SELECT COUNT(*) AS cnt FROM tbl_screens WHERE partnerid = ?`, [partnerid] ); const existing = countRows[0].cnt; console.log(existing); // 2️⃣ prepare the new screen name const newScreenName = `Screen ${existing + 1}`; // 3️⃣ insert the new screen const [result] = await pool.query( `INSERT INTO tbl_screens (transid, partnerid, name) VALUES (UUID(), ?, ?)`, [partnerid, newScreenName] ); res.json({ message: "Screen Added Successfully! ", }); } catch (err) { console.log(err); res.status(500).json({ error: err.message }); } }); router.post("/delete-screen", async (req, res) => { try { const { screenid, } = req.body; const [result] = await pool.query( `delete from tbl_screens where transid = ? `, [screenid] ); res.json({ message: "Screen Deleted Successfully! ", }); } catch (err) { console.log(err); res.status(500).json({ error: err.message }); } }); router.post("/upload", upload.single("file"), async (req, res) => { try { const { filename, path } = req.file; const clientid = req.body.clientid; await pool.query( "insert into tbl_files (transid,client_id,file_name,file_path) values (UUID(),?,?,?)", [clientid, filename, path] ); res.json({ message: "File Uploaded Successfully!", filepath: path }); } catch (err) { res.status(500).json({ error: err.message }); } }); router.post("/upload-partner-logo", upload.single("file"), async (req, res) => { try { const { filename, path } = req.file; const partnerid = req.body.partnerid; await pool.query("update tbl_partners set logo_url = ? where transid = ?", [ path, partnerid, ]); res.json({ message: "Partner Logo Uploaded Successfully!", filepath: path, }); } catch (err) { res.status(500).json({ error: err.message }); } }); router.get("/partners", async (req, res) => { try { const [partners] = await pool.query("select * from tbl_partners"); res.json(partners); } catch (err) { res.status(500).json({ error: err.message }); } }); router.post("/update-partner", async (req, res) => { try { const { name, open_time, logo_url, close_time, address, city, state, pincode, screens, transid, yt, scrolltext, } = req.body; const [result] = await pool.query( "update tbl_partners set name =?, logo_url=?, open_time=?, close_time=?, address=?, city=?, state=?, pincode=?, screens=?,yt=?,scrolltext=? where transid = ?", [ name, logo_url, open_time, close_time, address, city, state, pincode, screens, yt, scrolltext, transid, ] ); res.json({ message: "Partner Updated Successfully! ", }); } catch (err) { res.status(500).json({ error: err.message }); } }); router.post("/update-screen-youtube", async (req, res) => { try { const { screenid, sts } = req.body; const [result] = await pool.query( "update tbl_screens set isyoutube=? where transid = ?", [sts, screenid] ); res.json({ message: "Partner Updated Successfully! ", }); } catch (err) { res.status(500).json({ error: err.message }); } }); router.post("/update-screen-type", async (req, res) => { try { const { screenid, sts } = req.body; const [result] = await pool.query( "update tbl_screens set screentype=? where transid = ?", [sts, screenid] ); res.json({ message: "Screen Type Updated Successfully! ", }); } catch (err) { res.status(500).json({ error: err.message }); } }); router.get("/clients", async (req, res) => { try { const [partners] = await pool.query("select * from tbl_clients"); res.json(partners); } catch (err) { res.status(500).json({ error: err.message }); } }); router.post("/add-client", async (req, res) => { try { const { name, emailid, phoneno, address } = req.body; const [result] = await pool.query( "INSERT INTO tbl_clients (transid,name,emailid,phoneno,address) VALUES (UUID(),?, ?,?,?)", [name, emailid, phoneno, address] ); res.json({ message: "Client Added Successfully! ", }); } catch (err) { res.status(500).json({ error: err.message }); } }); router.post("/update-client", async (req, res) => { try { const { transid, name, emailid, phoneno, address } = req.body; const [result] = await pool.query( "update tbl_clients set name=?,emailid=?,phoneno=?,address=? where transid = ?", [name, emailid, phoneno, address, transid] ); res.json({ message: "Client Updated Successfully! ", }); } catch (err) { res.status(500).json({ error: err.message }); } }); router.delete("/delete-client/:clientid", async (req, res) => { try { const { clientid } = req.params; const [response] = await pool.query( "delete from tbl_clients where transid =? ", [clientid] ); const [response1] = await pool.query( "delete from tbl_files where client_id =? ", [clientid] ); const [response2] = await pool.query( "delete from tbl_client_partner_mapping where clientid =? ", [clientid] ); res.json(response); } catch (err) { res.status(500), json({ error: err.message }); } }); router.get("/get-partner/:partnreid", async (req, res) => { try { const { partnreid } = req.params; const [partners] = await pool.query( "select * from tbl_partners where transid=?", [partnreid] ); res.json(partners); } catch (err) { res.status(500).json({ error: err.message }); } }); router.delete("/delete-partner/:partnerid", async (req, res) => { try { const { partnerid } = req.params; const [response] = await pool.query( "delete from tbl_partners where transid =? ", [partnerid] ); const [response1] = await pool.query( "delete from tbl_screens where partnerid =? ", [partnerid] ); const [response2] = await pool.query( "delete from tbl_client_partner_mapping where partnerid =? ", [partnerid] ); res.json(response); } catch (err) { res.status(500), json({ error: err.message }); } }); router.delete( "/delete-client-partner-mapping/:partnerid/:clientid", async (req, res) => { try { const { partnerid, clientid } = req.params; const [response] = await pool.query( "delete from tbl_client_partner_mapping where partnerid =? and clientid =?", [partnerid, clientid] ); res.json(response); } catch (err) { res.status(500), json({ error: err.message }); } } ); router.get("/get-client/:clientid", async (req, res) => { try { const { clientid } = req.params; const [partners] = await pool.query( "select * from tbl_clients where transid=?", [clientid] ); res.json(partners); } catch (err) { res.status(500).json({ error: err.massage }); } }); router.get("/get-screen/:partnerid", async (req, res) => { try { const partnerid = req.params.partnerid; const query = "SELECT * FROM tbl_screens WHERE partnerid = ?"; const [screens] = await pool.query(query, [partnerid]); res.json(screens); } catch (err) { res.status(500).json({ error: err.message }); } }); //Client - Partner Mapping router.get("/client-partner-mappings", async (req, res) => { try { const { clientid, partnerid } = req.query; // Get clientid and partnerid from query parameters if (!clientid || !partnerid) { return res .status(400) .json({ error: "clientid and partnerid are required." }); } const [mappings] = await pool.query( "SELECT * FROM tbl_client_partner_mapping WHERE clientid = ? AND partnerid = ?", [clientid, partnerid] ); res.json(mappings); } catch (err) { res.status(500).json({ error: err.message }); } }); // router.post("/add-client-partner-mapping", async (req, res) => { // try { // const mappings = req.body; // Assuming req.body is an array of mapping objects // console.log(mappings); // if (!Array.isArray(mappings) || mappings.length === 0) { // return res // .status(400) // .json({ error: "Invalid or empty mapping data provided." }); // } // const clientID = mappings[0].clientid; // const partnerID = mappings[0].partnerid; // await pool.query( // "delete from tbl_client_partner_mapping where clientid =? and partnerid = ?", // [clientID, partnerID] // ); // for (const mapping of mappings) { // const { // clientid, // partnerid, // screenid, // fileid, // file_path, // ismonday, // istuesday, // iswednesday, // isthursday, // isfriday, // issaturday, // issunday, // imageduration, // } = mapping; // // Basic validation (you might want to add more robust validation) // if (!clientid || !partnerid || !screenid || !fileid || !file_path) { // return res // .status(400) // .json({ error: "Missing required fields in mapping." }); // } // await pool.query( // "INSERT INTO tbl_client_partner_mapping (clientid, partnerid, screenid, fileid, file_path, ismonday, istuesday, iswednesday, isthursday, isfriday, issaturday, issunday,imageduration) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,?)", // [ // clientid, // partnerid, // screenid, // fileid, // file_path, // ismonday || 0, // Default to 0 if not provided // istuesday || 0, // iswednesday || 0, // isthursday || 0, // isfriday || 0, // issaturday || 0, // issunday || 0, // imageduration || 10, // ] // ); // } // res.json({ message: "Client-Partner mappings added successfully!" }); // } catch (err) { // console.log(err); // res.status(500).json({ error: err }); // } // }); router.post("/add-client-partner-mapping", async (req, res) => { const mappings = req.body; if (!Array.isArray(mappings) || mappings.length === 0) { return res .status(400) .json({ error: "Invalid or empty mapping data provided." }); } const clientID = mappings[0].clientid; const partnerID = mappings[0].partnerid; const conn = await pool.getConnection(); try { await conn.beginTransaction(); // 1) fetch old values by fileid const [oldRows] = await conn.query( `SELECT fileid, imageduration, isinhousead, iscarousel, ismainad FROM tbl_client_partner_mapping WHERE clientid = ? AND partnerid = ?`, [clientID, partnerID] ); const oldMap = oldRows.reduce((m, row) => { m[row.fileid] = row; return m; }, {}); // 2) delete existing mappings await conn.query( "DELETE FROM tbl_client_partner_mapping WHERE clientid = ? AND partnerid = ?", [clientID, partnerID] ); // 3) re-insert, pulling in old flags if the incoming mapping didn’t supply them for (const mapping of mappings) { const { clientid, partnerid, screenid, fileid, file_path, ismonday = 0, istuesday = 0, iswednesday = 0, isthursday = 0, isfriday = 0, issaturday = 0, issunday = 0, imageduration, isinhousead, iscarousel, ismainad, } = mapping; // fall back to old values (or defaults) if not supplied const old = oldMap[fileid] || {}; const duration = imageduration != null ? imageduration : old.imageduration ?? 10; const inhouse = isinhousead != null ? isinhousead : old.isinhousead ?? 0; const carousel = iscarousel != null ? iscarousel : old.iscarousel ?? 0; const mainAd = ismainad != null ? ismainad : old.ismainad ?? 0; // basic field check if (!clientid || !partnerid || !screenid || !fileid || !file_path) { await conn.rollback(); return res .status(400) .json({ error: "Missing required fields in mapping." }); } await conn.query( `INSERT INTO tbl_client_partner_mapping (clientid, partnerid, screenid, fileid, file_path, ismonday, istuesday, iswednesday, isthursday, isfriday, issaturday, issunday, imageduration, isinhousead, iscarousel, ismainad) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [ clientid, partnerid, screenid, fileid, file_path, ismonday, istuesday, iswednesday, isthursday, isfriday, issaturday, issunday, duration, inhouse, carousel, mainAd, ] ); } await conn.commit(); res.json({ message: "Client-Partner mappings updated successfully!" }); } catch (err) { await conn.rollback(); console.error(err); res.status(500).json({ error: err.message || err }); } finally { conn.release(); } }); router.post("/reorder-partner-ads", async (req, res) => { try { const mappings = req.body; // Assuming req.body is an array of mapping objects if (!Array.isArray(mappings) || mappings.length === 0) { return res .status(400) .json({ error: "Invalid or empty mapping data provided." }); } const partnerID = mappings[0].partnerid; await pool.query( "delete from tbl_client_partner_mapping where partnerid = ?", [partnerID] ); for (const mapping of mappings) { const { clientid, partnerid, screenid, fileid, file_path, ismonday, istuesday, iswednesday, isthursday, isfriday, issaturday, issunday, imageduration, isinhousead, iscarousel, ismainad, } = mapping; // console.log(mapping); // Basic validation (you might want to add more robust validation) if (!clientid || !partnerid || !screenid || !fileid || !file_path) { return res .status(400) .json({ error: "Missing required fields in mapping." }); } await pool.query( "INSERT INTO tbl_client_partner_mapping (clientid, partnerid, screenid, fileid, file_path, ismonday, istuesday, iswednesday, isthursday, isfriday, issaturday, issunday,imageduration,isinhousead,iscarousel,ismainad) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,?,?,?,?)", [ clientid, partnerid, screenid, fileid, file_path, ismonday || 0, // Default to 0 if not provided istuesday || 0, iswednesday || 0, isthursday || 0, isfriday || 0, issaturday || 0, issunday || 0, imageduration || 10, isinhousead || 0, iscarousel || 0, ismainad || 0, ] ); } res.json({ message: "Partner Ads Re-ordered successfully!" }); } catch (err) { console.log(err); res.status(500).json({ error: err.message }); } }); router.get("/partner-ads", async (req, res) => { try { const { partnerid } = req.query; // Get clientid and partnerid from query parameters if (!partnerid) { return res.status(400).json({ error: "Partnerid is required." }); } const [mappings] = await pool.query( " SELECT *, (select name from tbl_screens where transid = screenid) as 'screenname',(select name from tbl_clients where transid = clientid) as 'clientname' FROM tbl_client_partner_mapping WHERE partnerid = ?", [partnerid] ); res.json(mappings); } catch (err) { res.status(500).json({ error: err.message }); } }); router.post("/update-settings", async (req, res) => { try { const { transid, value } = req.body; const [result] = await pool.query( "update tbl_settings set value =? where transid = ?", [value, transid] ); res.json({ message: "Settings Updated Successfully! ", }); } catch (err) { res.status(500).json({ error: err.message }); } }); module.exports = router;