Fixed the errors coming out in csv.
This commit is contained in:
1 parent
ecce31ce34
commit
075559ffc3
3 files changed
+52
-28
No files matched your search
@@ -3,11 +3,9 @@ import { networkService } from "../main";
|
||||
|
||||
export const useBulkMonitors = () => {
|
||||
const [isLoading, setIsLoading] = useState(false);
|
||||
const [error, setError] = useState(null);
|
||||
|
||||
const createBulkMonitors = async (file, user) => {
|
||||
setIsLoading(true);
|
||||
setError(null);
|
||||
|
||||
const formData = new FormData();
|
||||
formData.append("csvFile", file);
|
||||
@@ -16,14 +14,14 @@ export const useBulkMonitors = () => {
|
||||
|
||||
try {
|
||||
const response = await networkService.createBulkMonitors(formData);
|
||||
return response.data;
|
||||
return [true, response.data, null]; // [success, data, error]
|
||||
} catch (err) {
|
||||
setError(err?.response?.data?.msg ?? err.message);
|
||||
return null;
|
||||
const errorMessage = err?.response?.data?.errors?.[0]?.message || err.message;
|
||||
return [false, null, errorMessage];
|
||||
} finally {
|
||||
setIsLoading(false);
|
||||
}
|
||||
};
|
||||
|
||||
return [createBulkMonitors, isLoading, error];
|
||||
return [createBulkMonitors, isLoading];
|
||||
};
|
||||
@@ -26,20 +26,22 @@ const BulkImport = () => {
|
||||
{ name: t("bulkImport.title"), path: `/uptime/bulk-import` },
|
||||
];
|
||||
|
||||
const [createBulkMonitors, hookLoading, error] = useBulkMonitors();
|
||||
const [createBulkMonitors, hookLoading] = useBulkMonitors();
|
||||
|
||||
const handleSubmit = async () => {
|
||||
if (!selectedFile) {
|
||||
createToast({ body: t("bulkImport.noFileSelected") });
|
||||
return;
|
||||
}
|
||||
const success = await createBulkMonitors(selectedFile, user);
|
||||
|
||||
const [success, data, error] = await createBulkMonitors(selectedFile, user);
|
||||
|
||||
if (success) {
|
||||
// You can use `data` here if needed
|
||||
createToast({ body: t("bulkImport.uploadSuccess") });
|
||||
navigate("/uptime");
|
||||
} else {
|
||||
createToast({ body: error });
|
||||
createToast({ body: error || t("bulkImport.uploadFailed") });
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -256,37 +256,60 @@ class MonitorController {
|
||||
createBulkMonitors = async (req, res, next) => {
|
||||
try {
|
||||
const { parse } = pkg;
|
||||
|
||||
|
||||
if (!req.file) {
|
||||
return res.status(400).json({ msg: "No file uploaded" });
|
||||
return res.status(400).json({
|
||||
errors: [
|
||||
{ message: "No file uploaded" }
|
||||
]
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
const { userId, teamId } = req.body;
|
||||
|
||||
|
||||
if (!userId || !teamId) {
|
||||
return res.status(400).json({ msg: "Missing userId or teamId in form data" });
|
||||
return res.status(400).json({
|
||||
errors: [
|
||||
{ message: "Missing userId or teamId in form data" }
|
||||
]
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
// Get file buffer from memory and convert to string
|
||||
const fileData = req.file.buffer.toString("utf-8");
|
||||
|
||||
console.log("File data:", fileData);
|
||||
|
||||
// Parse the CSV data
|
||||
parse(fileData, {
|
||||
header: true,
|
||||
skipEmptyLines: true,
|
||||
transform: (value, header) => {
|
||||
if (value === "") return undefined;
|
||||
if (value === "") return undefined; // Empty fields become undefined
|
||||
|
||||
// Handle 'port' and 'interval' fields, check if they're valid numbers
|
||||
if (["port", "interval"].includes(header)) {
|
||||
const num = parseInt(value, 10);
|
||||
return isNaN(num) ? undefined : num;
|
||||
if (isNaN(num)) {
|
||||
return res.status(400).json({
|
||||
errors: [
|
||||
{ message: `${header} should be a valid number, got: ${value}` }
|
||||
]
|
||||
}); // Return error immediately with this structure
|
||||
}
|
||||
return num;
|
||||
}
|
||||
|
||||
|
||||
return value;
|
||||
},
|
||||
complete: async ({ data, errors }) => {
|
||||
if (errors.length > 0) {
|
||||
return res.status(400).json({ msg: "Error parsing CSV", errors });
|
||||
return res.status(400).json({
|
||||
errors: [
|
||||
{ message: "Error parsing CSV" }
|
||||
]
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
const enrichedData = data.map((monitor) => ({
|
||||
userId,
|
||||
teamId,
|
||||
@@ -295,20 +318,21 @@ class MonitorController {
|
||||
name: monitor.name || monitor.url,
|
||||
type: monitor.type || "http",
|
||||
}));
|
||||
|
||||
|
||||
try {
|
||||
// Run Joi validation
|
||||
await createMonitorsBodyValidation.validateAsync(enrichedData);
|
||||
} catch (error) {
|
||||
return next(handleValidationError(error, SERVICE_NAME));
|
||||
}
|
||||
|
||||
|
||||
try {
|
||||
const monitors = await this.db.createBulkMonitors(enrichedData);
|
||||
|
||||
|
||||
await Promise.all(
|
||||
monitors.map(async (monitor, index) => {
|
||||
const notifications = enrichedData[index].notifications;
|
||||
|
||||
|
||||
if (notifications?.length) {
|
||||
monitor.notifications = await Promise.all(
|
||||
notifications.map(async (notification) => {
|
||||
@@ -318,11 +342,11 @@ class MonitorController {
|
||||
);
|
||||
await monitor.save();
|
||||
}
|
||||
|
||||
|
||||
this.jobQueue.addJob(monitor._id, monitor);
|
||||
})
|
||||
);
|
||||
|
||||
|
||||
return res.success({
|
||||
msg: this.stringService.bulkMonitorsCreate,
|
||||
data: monitors,
|
||||
@@ -335,7 +359,7 @@ class MonitorController {
|
||||
} catch (error) {
|
||||
return next(handleError(error, SERVICE_NAME, "createBulkMonitors"));
|
||||
}
|
||||
};
|
||||
};
|
||||
/**
|
||||
* Checks if the endpoint can be resolved
|
||||
* @async
|
||||
|
||||
Reference in new issue
Block a user