first commit
This commit is contained in:
359
routes/peopleInfoRoutes.js
Normal file
359
routes/peopleInfoRoutes.js
Normal file
@@ -0,0 +1,359 @@
|
||||
const express = require("express");
|
||||
const router = express.Router();
|
||||
const PeopleInfo = require("../models/peopleInfo");
|
||||
|
||||
router.get("/people_info", async (req, res) => {
|
||||
try {
|
||||
const { searchfield, value } = req.query;
|
||||
|
||||
if (!searchfield || !value) {
|
||||
return res.status(400).json({
|
||||
message: "searchfield and value parameters are required",
|
||||
});
|
||||
}
|
||||
|
||||
let matchQuery = {};
|
||||
|
||||
if (searchfield === "mobile") {
|
||||
let normalizedSearch = value.replace(/\D/g, "");
|
||||
|
||||
const withLeadingZero = normalizedSearch.startsWith("0")
|
||||
? normalizedSearch
|
||||
: `0${normalizedSearch}`;
|
||||
const withoutLeadingZero = normalizedSearch.startsWith("0")
|
||||
? normalizedSearch.substring(1)
|
||||
: normalizedSearch;
|
||||
|
||||
const numericValue = parseInt(withoutLeadingZero, 10);
|
||||
|
||||
matchQuery = {
|
||||
$or: [
|
||||
{ mobile: withLeadingZero },
|
||||
{ mobile: withoutLeadingZero },
|
||||
{ mobile: numericValue },
|
||||
],
|
||||
};
|
||||
} else if (searchfield === "name") {
|
||||
matchQuery = {
|
||||
$or: [
|
||||
{ name: { $regex: value, $options: "i" } },
|
||||
{ family: { $regex: value, $options: "i" } },
|
||||
{
|
||||
$expr: {
|
||||
$regexMatch: {
|
||||
input: { $concat: ["$name", " ", "$family"] },
|
||||
regex: value,
|
||||
options: "i",
|
||||
},
|
||||
},
|
||||
},
|
||||
],
|
||||
};
|
||||
} else if (searchfield === "nationalcode") {
|
||||
matchQuery = { nationalcode: value };
|
||||
} else {
|
||||
return res.status(400).json({
|
||||
message:
|
||||
"Invalid searchfield. Must be 'mobile', 'name', or 'nationalcode'",
|
||||
});
|
||||
}
|
||||
|
||||
const pipeline = [
|
||||
{ $match: matchQuery },
|
||||
|
||||
{ $limit: 10000 },
|
||||
|
||||
{
|
||||
$group: {
|
||||
_id: "$nationalcode",
|
||||
items: {
|
||||
$push: {
|
||||
name: "$name",
|
||||
family: "$family",
|
||||
mobile: "$mobile",
|
||||
mellicard: "$mellicard",
|
||||
mellatcard: "$mellatcard",
|
||||
father: "$father",
|
||||
birthdate: "$birthdate",
|
||||
info1: "$info1",
|
||||
info2: "$info2",
|
||||
info3: "$info3",
|
||||
info4: "$info4",
|
||||
hasMellatcard: {
|
||||
$cond: [{ $ne: ["$mellatcard", null] }, true, false],
|
||||
},
|
||||
hasMellicard: {
|
||||
$cond: [{ $ne: ["$mellicard", null] }, true, false],
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
{
|
||||
$project: {
|
||||
nationalcode: "$_id",
|
||||
items: 1,
|
||||
|
||||
firstWithMellatcard: {
|
||||
$arrayElemAt: [
|
||||
{
|
||||
$filter: {
|
||||
input: "$items",
|
||||
as: "item",
|
||||
cond: { $eq: ["$$item.hasMellatcard", true] },
|
||||
},
|
||||
},
|
||||
0,
|
||||
],
|
||||
},
|
||||
|
||||
firstWithMellicard: {
|
||||
$arrayElemAt: [
|
||||
{
|
||||
$filter: {
|
||||
input: "$items",
|
||||
as: "item",
|
||||
cond: { $eq: ["$$item.hasMellicard", true] },
|
||||
},
|
||||
},
|
||||
0,
|
||||
],
|
||||
},
|
||||
|
||||
hasAnyMellatcard: {
|
||||
$gt: [
|
||||
{
|
||||
$size: {
|
||||
$filter: {
|
||||
input: "$items",
|
||||
as: "item",
|
||||
cond: { $eq: ["$$item.hasMellatcard", true] },
|
||||
},
|
||||
},
|
||||
},
|
||||
0,
|
||||
],
|
||||
},
|
||||
|
||||
hasAnyMellicard: {
|
||||
$gt: [
|
||||
{
|
||||
$size: {
|
||||
$filter: {
|
||||
input: "$items",
|
||||
as: "item",
|
||||
cond: { $eq: ["$$item.hasMellicard", true] },
|
||||
},
|
||||
},
|
||||
},
|
||||
0,
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
{
|
||||
$project: {
|
||||
nationalcode: 1,
|
||||
name: {
|
||||
$cond: [
|
||||
{ $ne: ["$firstWithMellatcard", null] },
|
||||
"$firstWithMellatcard.name",
|
||||
{
|
||||
$cond: [
|
||||
{ $ne: ["$firstWithMellicard", null] },
|
||||
"$firstWithMellicard.name",
|
||||
{ $arrayElemAt: ["$items.name", 0] },
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
family: {
|
||||
$cond: [
|
||||
{ $ne: ["$firstWithMellatcard", null] },
|
||||
"$firstWithMellatcard.family",
|
||||
{
|
||||
$cond: [
|
||||
{ $ne: ["$firstWithMellicard", null] },
|
||||
"$firstWithMellicard.family",
|
||||
{ $arrayElemAt: ["$items.family", 0] },
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
father: {
|
||||
$cond: [
|
||||
{ $ne: ["$firstWithMellatcard", null] },
|
||||
"$firstWithMellatcard.father",
|
||||
{
|
||||
$cond: [
|
||||
{ $ne: ["$firstWithMellicard", null] },
|
||||
"$firstWithMellicard.father",
|
||||
null,
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
birthdate: {
|
||||
$cond: [
|
||||
{ $ne: ["$firstWithMellatcard", null] },
|
||||
"$firstWithMellatcard.birthdate",
|
||||
{
|
||||
$cond: [
|
||||
{ $ne: ["$firstWithMellicard", null] },
|
||||
"$firstWithMellicard.birthdate",
|
||||
null,
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
mobile: {
|
||||
$filter: {
|
||||
input: "$items.mobile",
|
||||
as: "mob",
|
||||
cond: { $ne: ["$$mob", null] },
|
||||
},
|
||||
},
|
||||
allCards: {
|
||||
$reduce: {
|
||||
input: "$items",
|
||||
initialValue: [],
|
||||
in: {
|
||||
$concatArrays: [
|
||||
"$$value",
|
||||
{
|
||||
$filter: {
|
||||
input: ["$$this.mellatcard", "$$this.mellicard"],
|
||||
as: "card",
|
||||
cond: { $ne: ["$$card", null] },
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
info: {
|
||||
$reduce: {
|
||||
input: "$items",
|
||||
initialValue: [],
|
||||
in: {
|
||||
$concatArrays: [
|
||||
"$$value",
|
||||
{
|
||||
$filter: {
|
||||
input: [
|
||||
"$$this.info1",
|
||||
"$$this.info2",
|
||||
"$$this.info3",
|
||||
"$$this.info4",
|
||||
],
|
||||
as: "inf",
|
||||
cond: { $ne: ["$$inf", null] },
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
{
|
||||
$project: {
|
||||
nationalcode: 1,
|
||||
name: 1,
|
||||
family: 1,
|
||||
father: 1,
|
||||
birthdate: 1,
|
||||
mobile: 1,
|
||||
card: "$allCards",
|
||||
info: 1,
|
||||
},
|
||||
},
|
||||
];
|
||||
|
||||
const results = await PeopleInfo.aggregate(pipeline).allowDiskUse(true);
|
||||
|
||||
const processedResults = results.map((result) => {
|
||||
const mobileSet = new Set();
|
||||
result.mobile.forEach((mob) => {
|
||||
if (mob == null) return;
|
||||
const mobStr = String(mob);
|
||||
const normalized = mobStr.startsWith("0")
|
||||
? mobStr.substring(1)
|
||||
: mobStr;
|
||||
mobileSet.add(`0${normalized}`);
|
||||
});
|
||||
result.mobile = Array.from(mobileSet);
|
||||
|
||||
if (result.card) {
|
||||
const cardSet = new Set();
|
||||
result.card.forEach((card) => {
|
||||
if (card && typeof card === "string") {
|
||||
cardSet.add(card.trim());
|
||||
}
|
||||
});
|
||||
result.card = Array.from(cardSet);
|
||||
}
|
||||
|
||||
if (result.birthdate && result.birthdate instanceof Date) {
|
||||
result.birthdate = result.birthdate.toISOString().split("T")[0];
|
||||
}
|
||||
|
||||
result.info = result.info.map((inf) => {
|
||||
return typeof inf === "string" ? inf.replace(/\t/g, "") : inf;
|
||||
});
|
||||
|
||||
return result;
|
||||
});
|
||||
|
||||
res.status(200).json({
|
||||
data: processedResults,
|
||||
count: processedResults.length,
|
||||
});
|
||||
} catch (error) {
|
||||
console.error("Error fetching people info:", error);
|
||||
res
|
||||
.status(500)
|
||||
.json({ message: "Internal Server Error", error: error.message });
|
||||
}
|
||||
});
|
||||
|
||||
router.post("/people_info", async (req, res) => {
|
||||
try {
|
||||
const {
|
||||
first_name,
|
||||
last_name,
|
||||
mobile,
|
||||
postal,
|
||||
province,
|
||||
city,
|
||||
nationalcode,
|
||||
} = req.body;
|
||||
|
||||
const newPeopleInfo = new PeopleInfo({
|
||||
first_name,
|
||||
last_name,
|
||||
mobile,
|
||||
postal,
|
||||
province,
|
||||
city,
|
||||
nationalcode,
|
||||
});
|
||||
|
||||
await newPeopleInfo.save();
|
||||
|
||||
res.status(201).json({
|
||||
message: "People info created successfully",
|
||||
data: newPeopleInfo,
|
||||
});
|
||||
} catch (error) {
|
||||
console.error("Error creating people info:", error);
|
||||
res
|
||||
.status(500)
|
||||
.json({ message: "Internal Server Error", error: error.message });
|
||||
}
|
||||
});
|
||||
|
||||
module.exports = router;
|
||||
Reference in New Issue
Block a user