From 7051c250ba6e1879e5b19c993bf38e8745740706 Mon Sep 17 00:00:00 2001 From: Bobby Date: Tue, 3 May 2022 20:55:34 -0400 Subject: citizen adding working --- interface/controllers/district.controller.js | 12 +- interface/controllers/mandal.controller.js | 8 +- interface/controllers/state.controller.js | 7 +- interface/controllers/village.controller.js | 10 +- interface/public/adduser.js | 291 +++++++++++++++++++++++++++ interface/routes/api/citizens.js | 171 +++++++++------- interface/routes/api/geography.js | 21 +- interface/routes/api/index.js | 2 +- interface/views/adduser.ejs | 250 ++--------------------- 9 files changed, 452 insertions(+), 320 deletions(-) create mode 100644 interface/public/adduser.js diff --git a/interface/controllers/district.controller.js b/interface/controllers/district.controller.js index 5b21530..468d5fb 100644 --- a/interface/controllers/district.controller.js +++ b/interface/controllers/district.controller.js @@ -10,10 +10,10 @@ exports.allDistricts = () => { exports.allDistrictsByStateId = (state_id) => { const query =`SELECT * FROM district_master WHERE state_id = ${state_id}`; - return db.sequelize.query(query, { type: db.sequelize.QueryTypes.SELECT }); + return db.sequelize.query(query, { type: db.sequelize.QueryTypes.SELECT }).then(districts => { + if (districts) { + return districts; + } + return null; + }); }; - - - - - diff --git a/interface/controllers/mandal.controller.js b/interface/controllers/mandal.controller.js index 43842fe..5e4d287 100644 --- a/interface/controllers/mandal.controller.js +++ b/interface/controllers/mandal.controller.js @@ -11,6 +11,10 @@ exports.allMandals = () => { exports.allMandalsByDistrictId = (district_id) => { const query =`SELECT * FROM mandal_master WHERE district_id = ${district_id}`; - return db.sequelize.query(query, { type: db.sequelize.QueryTypes.SELECT }); - + return db.sequelize.query(query, { type: db.sequelize.QueryTypes.SELECT }).then(mandals => { + if (mandals) { + return mandals; + } + return null; + }); }; diff --git a/interface/controllers/state.controller.js b/interface/controllers/state.controller.js index 1a3a4ed..95bff0d 100644 --- a/interface/controllers/state.controller.js +++ b/interface/controllers/state.controller.js @@ -4,10 +4,5 @@ const state = db.state_master; // function to get all states exports.allStates = () => { const query = "SELECT * FROM state_master"; - return db.sequelize.query(query, { type: db.sequelize.QueryTypes.SELECT }); - + return db.sequelize.query(query, { type: db.sequelize.QueryTypes.SELECT }); }; - - - - diff --git a/interface/controllers/village.controller.js b/interface/controllers/village.controller.js index 0a488d4..95372fa 100644 --- a/interface/controllers/village.controller.js +++ b/interface/controllers/village.controller.js @@ -11,8 +11,10 @@ exports.allVillages = () => { exports.allVillagesByMandalId = (mandal_id) => { const query =`SELECT * FROM village_master WHERE mandal_id = ${mandal_id}`; - return db.sequelize.query(query, { type: db.sequelize.QueryTypes.SELECT }); - + return db.sequelize.query(query, { type: db.sequelize.QueryTypes.SELECT }).then(villages => { + if (villages) { + return villages; + } + return null; + }); }; - - diff --git a/interface/public/adduser.js b/interface/public/adduser.js new file mode 100644 index 0000000..bee96f6 --- /dev/null +++ b/interface/public/adduser.js @@ -0,0 +1,291 @@ +$("#citizenForm").form({ + on: "blur", + inline: true, + fields: { + citizen_id: { + identifier: "citizen_id", + rules: [ + { + type: "empty", + prompt: "Please enter a citizen id", + }, + ], + }, + first_name: { + identifier: "first_name", + rules: [ + { + type: "empty", + prompt: "Please enter a first name", + }, + ], + }, + last_name: { + identifier: "last_name", + rules: [ + { + type: "empty", + prompt: "Please enter a last name", + }, + ], + }, + address: { + identifier: "address", + rules: [ + { + type: "empty", + prompt: "Please enter a address", + }, + ], + }, + mobile_number: { + identifier: "mobile_number", + rules: [ + { + type: "empty", + prompt: "Please enter a mobile number", + }, + { + type: "number", + prompt: "Please enter a valid mobile number", + }, + { + type: "minLength[10]", + prompt: "Please enter a valid mobile number", + }, + ], + }, + dob: { + identifier: "dob", + rules: [ + { + type: "empty", + prompt: "Please enter a date of birth", + }, + ], + }, + state: { + identifier: "state", + rules: [ + { + type: "empty", + prompt: "Please select a state", + }, + ], + }, + district: { + identifier: "district", + rules: [ + { + type: "empty", + prompt: "Please select a district", + }, + ], + }, + mandal: { + identifier: "mandal", + rules: [ + { + type: "empty", + prompt: "Please select a mandal", + }, + ], + }, + village: { + identifier: "village", + rules: [ + { + type: "empty", + prompt: "Please select a village", + }, + ], + }, + }, +}); + +//gereate random data with Upper case letter with seven digit number +function generateCitizenId() { + var text = ""; + var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + var possible2 = "0123456789"; + text += possible.charAt(Math.floor(Math.random() * possible.length)); + for (var i = 0; i < 7; i++) + text += possible2.charAt(Math.floor(Math.random() * possible2.length)); + + //validate user name with database + fetch("/api/citizens/validate", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ citizen_id: text }), + }).then((res) => { + if (res.status == 200) { + document.getElementById("citizen_id").value = text; + } else { + generateCitizenId(); + } + }); +} + +generateCitizenId(); + +//get all states +fetch("/api/geography/states", { + method: "GET", + headers: { "Content-Type": "application/json" }, +}) + .then((res) => res.json()) + .then((data) => { + var state = document.getElementById("state"); + // set the first option to be the default disabled option + var disabledOption = document.createElement("option"); + disabledOption.text = "Select State"; + disabledOption.value = "undefined"; + disabledOption.disabled = true; + disabledOption.selected = true; + $(state).dropdown("set selected", disabledOption.value); + + state.add(disabledOption); + + for (var i = 0; i < data.length; i++) { + var option = document.createElement("option"); + option.value = data[i].state_id; + option.text = data[i].state_name; + state.add(option); + } + }); + +//get all districts +document.getElementById("state").addEventListener("change", function () { + var state_id = document.getElementById("state").value; + fetch("/api/geography/districts/" + state_id, { + method: "GET", + headers: { "Content-Type": "application/json" }, + }) + .then((res) => res.json()) + .then((data) => { + var district = document.getElementById("district"); + district.innerHTML = ""; + var disabledOption = document.createElement("option"); + disabledOption.text = "Select District"; + disabledOption.value = "undefined"; + disabledOption.disabled = true; + disabledOption.selected = true; + $(district).dropdown("set selected", disabledOption.value); + + district.add(disabledOption); + + for (var i = 0; i < data.length; i++) { + var option = document.createElement("option"); + option.value = data[i].district_id; + option.text = data[i].district_name; + district.add(option); + } + }).catch((err) => { + alert(err); + }); +}); + +//get all mandals +document.getElementById("district").addEventListener("change", function () { + var district_id = document.getElementById("district").value; + fetch("/api/geography/mandals/" + district_id, { + method: "GET", + headers: { "Content-Type": "application/json" }, + }) + .then((res) => res.json()) + .then((data) => { + var mandal = document.getElementById("mandal"); + mandal.innerHTML = ""; + var disabledOption = document.createElement("option"); + disabledOption.text = "Select Mandal"; + disabledOption.value = "undefined"; + disabledOption.disabled = true; + disabledOption.selected = true; + $(mandal).dropdown("set selected", disabledOption.value); + mandal.add(disabledOption); + + for (var i = 0; i < data.length; i++) { + var option = document.createElement("option"); + option.value = data[i].mandal_id; + option.text = data[i].mandal_name; + mandal.add(option); + } + }).catch((err) => { + alert(err); + }); +}); + +//get all villages +document.getElementById("mandal").addEventListener("change", function () { + var mandal_id = document.getElementById("mandal").value; + fetch("/api/geography/villages/" + mandal_id, { + method: "GET", + headers: { "Content-Type": "application/json" }, + }) + .then((res) => res.json()) + .then((data) => { + var village = document.getElementById("village"); + village.innerHTML = ""; + var disabledOption = document.createElement("option"); + disabledOption.text = "Select Village"; + disabledOption.value = "undefined"; + disabledOption.disabled = true; + disabledOption.selected = true; + $(village).dropdown("set selected", disabledOption.value); + village.add(disabledOption); + + for (var i = 0; i < data.length; i++) { + var option = document.createElement("option"); + option.value = data[i].village_id; + option.text = data[i].village_name; + village.add(option); + } + }).catch((err) => { + alert(err); + }); +}); + +function addCitizen(event) { + event.preventDefault(); + if ($("#citizenForm form").form("is valid")) { + var formData = { + citizen_id: document.getElementById("citizen_id").value, + first_name: document.getElementById("first_name").value, + middle_name: document.getElementById("middle_name").value, + last_name: document.getElementById("last_name").value, + address: document.getElementById("address").value, + mobile_num: '+91-' + document.getElementById("mobile_number").value, + dob: document.getElementById("dob").value, + gender: document.getElementById("gender").value, + marital_status: document.getElementById("marital_status").value, + disabled: document.getElementById("disabled").value, + disbaled_percentage: document.getElementById("disbaled_percentage").value ?? 0, + caste: document.getElementById("caste").value, + village_id: document.getElementById("village").value, + }; + + fetch("/api/citizens/addnewcitizen", { + method: "POST", + body: JSON.stringify(formData), + headers: { "Content-Type": "application/json" }, + }) + .then((res) => res.json()) + .then((data) => { + if (data.message == "Citizen added successfully") { + window.location.href = "/citizens"; + } else { + console.log(data.message); + alert(data.message); + } + }); + } +} + +document.getElementById("add_citizen").addEventListener("click", addCitizen); +document.getElementById("disabled").addEventListener("change", function () { + if (document.getElementById("disabled").value == "yes") { + document.getElementById("disbaled_percentage").disabled = false; + } else { + document.getElementById("disbaled_percentage").disabled = true; + } +}); diff --git a/interface/routes/api/citizens.js b/interface/routes/api/citizens.js index 40e0c16..fc98928 100644 --- a/interface/routes/api/citizens.js +++ b/interface/routes/api/citizens.js @@ -3,78 +3,113 @@ const router = express.Router(); const citizensController = require("../../controllers/citizens.controller"); -router.post('/edit', (req, res) => { - const { citizen_id, address, mobile_num, dob, marital_status } = req.body; - if (!citizen_id || !address || !mobile_num || !dob || !marital_status) { - res.status(400).json({ message: "Please fill in all fields" }); - } else { - citizensController.editCitizen(citizen_id, address, mobile_num, dob, marital_status) - .then(() => { - res.status(200).json({ message: "Citizen updated successfully" }); - }) - .catch((err) => { - res.status(400).json({ message: err }); - }); - } +router.post("/edit", (req, res) => { + const { citizen_id, address, mobile_num, dob, marital_status } = req.body; + if (!citizen_id || !address || !mobile_num || !dob || !marital_status) { + res.status(400).json({ message: "Please fill in all fields" }); + } else { + citizensController + .editCitizen(citizen_id, address, mobile_num, dob, marital_status) + .then(() => { + res.status(200).json({ message: "Citizen updated successfully" }); + }) + .catch((err) => { + res.status(400).json({ message: err }); + }); + } }); - -router.post('/delete', (req, res) => { - const { citizen_id } = req.body; - if (!citizen_id) { - res.status(400).json({ message: "Please fill in all fields" }); - } else { - citizensController.deleteCitizenbyId(citizen_id) - .then(() => { - res.status(200).json({ message: "Citizen deleted successfully" }); - }) - .catch((err) => { - res.status(400).json({ message: err }); - }); - } -} ); - - -router.post('/validate', (req, res) => { - const { citizen_id } = req.body; - if (!citizen_id) { - res.status(400).json({ message: "Please fill in all fields" }); - } else { - citizensController.checkCitizenId(citizen_id) - .then(( isValid ) => { - res.status(200).json({ isValid: !isValid }); - } - ) - .catch((err) => { - res.status(400).json({ message: err }); - }); - } +router.post("/delete", (req, res) => { + const { citizen_id } = req.body; + if (!citizen_id) { + res.status(400).json({ message: "Please fill in all fields" }); + } else { + citizensController + .deleteCitizenbyId(citizen_id) + .then(() => { + res.status(200).json({ message: "Citizen deleted successfully" }); + }) + .catch((err) => { + res.status(400).json({ message: err }); + }); + } }); - -router.post('/addnewcitizen', (req, res) => { - const { citizen_id, first_name, last_name, address, mobile_num, dob, gender, marital_status, disabled, disbaled_percentage, caste, village_id} = req.body; - - if(!citizen_id && !first_name && !last_name && !address && !mobile_num && !dob && !gender && !marital_status && !disabled && !caste && !village_id){ - - res.status(400).json({ message: "Please fill in all fields" }); - - }else{ - citizensController.addNewCitizen(citizen_id, first_name, last_name, address, mobile_num, dob, gender, marital_status, disabled, disbaled_percentage, caste, village_id).then(() => { - res.status(200).json({ message: "Citizen added successfully" }); - }).catch((err) => { - res.status(400).json({ message: err }); - }); - } - +router.post("/validate", (req, res) => { + const { citizen_id } = req.body; + if (!citizen_id) { + res.status(400).json({ message: "Please fill in all fields" }); + } else { + citizensController + .checkCitizenId(citizen_id) + .then((isValid) => { + res.status(200).json({ isValid: !isValid }); + }) + .catch((err) => { + res.status(400).json({ message: err }); + }); + } }); +router.post("/addnewcitizen", (req, res) => { + let { + citizen_id, + first_name, + middle_name, + last_name, + address, + mobile_num, + dob, + gender, + marital_status, + disabled, + disbaled_percentage, + caste, + village_id, + } = req.body; + + if (!disbaled_percentage) { + disbaled_percentage = 0.0; + } + + if ( + !citizen_id || + !first_name || + !last_name || + !address || + !mobile_num || + !dob || + !gender || + !marital_status || + !disabled || + !caste || + !village_id + ) { + res.status(400).json({ message: "Please fill in all fields" }); + } else { + citizensController + .addNewCitizen( + citizen_id, + first_name, + last_name, + address, + mobile_num, + dob, + gender, + marital_status, + disabled, + disbaled_percentage, + caste, + village_id + ) + .then(() => { + res.status(200).json({ message: "Citizen added successfully" }); + }) + .catch((err) => { + console.log(err); + res.status(400).json({ message: err }); + }); + } +}); - - - - - - - -module.exports = router; \ No newline at end of file +module.exports = router; diff --git a/interface/routes/api/geography.js b/interface/routes/api/geography.js index 4667db8..58e3b84 100644 --- a/interface/routes/api/geography.js +++ b/interface/routes/api/geography.js @@ -9,27 +9,38 @@ const districtController = require("../../controllers/district.controller"); router.get("/states", (req, res) => { stateController.allStates().then(states => { res.send(states); - }); - + }); }); router.get("/districts/:state_id", (req, res) => { const state_id = req.params.state_id; districtController.allDistrictsByStateId(state_id).then(districts => { - res.send(districts); + if (districts) { + res.send(districts); + } else { + res.status(400).json({ message: "No districts found" }); + } }); }); router.get("/mandals/:district_id", (req, res) => { const district_id = req.params.district_id; mandalController.allMandalsByDistrictId(district_id).then(mandals => { - res.send(mandals); + if (mandals) { + res.send(mandals); + } else { + res.status(400).json({ message: "No mandals found" }); + } }); }); router.get("/villages/:mandal_id", (req, res) => { const mandal_id = req.params.mandal_id; villageController.allVillagesByMandalId(mandal_id).then(villages => { - res.send(villages); + if (villages) { + res.send(villages); + } else { + res.status(400).json({ message: "No villages found" }); + } }); }); diff --git a/interface/routes/api/index.js b/interface/routes/api/index.js index f21720b..b8ae7ca 100644 --- a/interface/routes/api/index.js +++ b/interface/routes/api/index.js @@ -64,7 +64,7 @@ router.post("/login", (req, res) => { payload, process.env.JWT_SECRET, { - expiresIn: 3600, + expiresIn: 60 * 60 * 24 * 7, }, (err, token) => { if (err) throw err; diff --git a/interface/views/adduser.ejs b/interface/views/adduser.ejs index 5b21d72..8d1b4d0 100644 --- a/interface/views/adduser.ejs +++ b/interface/views/adduser.ejs @@ -3,17 +3,11 @@ <%- include('partials/head') %> - - <%- include('partials/navbar') %> - - -
-

Add New Citizen

- -
+

Add New Citizen

+
+
+ + +
Date of Birth
+
+ + +
@@ -91,7 +101,7 @@
- First Name - Last Name Address Mobile Number Date of Birth Gender Marital Status - - Village Name @@ -73,20 +75,13 @@ <% for(var i=0; i < citizens.length; i++) { %> - <%= citizens[i].first_name %> - <%= citizens[i].last_name %> <%= citizens[i].address %> <%= citizens[i].mobile_num %> <%= citizens[i].dob %> <%= citizens[i].gender %> <%= citizens[i].marital_status %> - - - <%= citizens[i].village_name %>
diff --git a/interface/views/partials/navbar.ejs b/interface/views/partials/navbar.ejs index 440497a..967cbcb 100644 --- a/interface/views/partials/navbar.ejs +++ b/interface/views/partials/navbar.ejs @@ -1,5 +1,5 @@ <%- include('partials/scripts') %> + -- cgit v1.2.3