Skip to content

Commit 7417ec1

Browse files
committed
fix: bugs
1 parent acd3f32 commit 7417ec1

File tree

3 files changed

+163
-28
lines changed

3 files changed

+163
-28
lines changed

src/app/api/resource/route.js

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,18 @@ export async function GET(req) {
4848

4949
const url = new URL(req.url);
5050
const requestId = url.searchParams.get("requestId");
51+
const projectRequest = url.searchParams.get("projectRequest");
5152

52-
const resources = await Resource.find({ _id: requestId });
53+
const query = {};
54+
55+
// Add filters dynamically
56+
if (requestId) {
57+
query._id = requestId;
58+
}
59+
if (projectRequest) {
60+
query.projectid = projectRequest;
61+
}
62+
const resources = await Resource.find(query);
5363

5464
return NextResponse.json(resources, { status: 200 });
5565
} catch (error) {

src/app/cloudresources/page.js

Lines changed: 131 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ export default function CloudResources({ params }) {
1919
const [allocation, setAllocation] = useState("");
2020
const [alert, setAlert] = useState("");
2121
const [availableVM, setAvailableVM] = useState([]);
22+
const [warning, setWarning] = useState("");
2223
const [projectName, setProjectName] = useState("");
2324
const [projectDescription, setProjectDescription] = useState("");
2425
const [pathWithNamespace, setPathWithNamespace] = useState("");
@@ -247,10 +248,117 @@ export default function CloudResources({ params }) {
247248
},
248249
];
249250

251+
const [usernameWarning, setUsernameWarning] = useState("");
252+
const [passwordWarning, setPasswordWarning] = useState("");
253+
254+
const disallowedUsernames = [
255+
"administrator",
256+
"admin",
257+
"user",
258+
"user1",
259+
"test",
260+
"user2",
261+
"test1",
262+
"user3",
263+
"admin1",
264+
"1",
265+
"123",
266+
"a",
267+
"actuser",
268+
"adm",
269+
"admin2",
270+
"aspnet",
271+
"backup",
272+
"console",
273+
"david",
274+
"guest",
275+
"john",
276+
"owner",
277+
"root",
278+
"server",
279+
"sql",
280+
"support",
281+
"support_388945a0",
282+
"sys",
283+
"test2",
284+
"test3",
285+
"user4",
286+
"user5",
287+
];
288+
289+
const disallowedPasswords = [
290+
"abc@123",
291+
"P@$$w0rd",
292+
"P@ssw0rd",
293+
"P@ssword123",
294+
"Pa$$word",
295+
"pass@word1",
296+
"Password!",
297+
"Password1",
298+
"Password22",
299+
"iloveyou!",
300+
];
301+
302+
const validateUsername = (username) => {
303+
if (username.length < 1) return "Username must be at least 1 character.";
304+
if (username.length > 64) return "Username cannot exceed 64 characters.";
305+
if (disallowedUsernames.includes(username.toLowerCase()))
306+
return "This username is not allowed.";
307+
if (username.endsWith("."))
308+
return "Windows username cannot end with a dot.";
309+
return "";
310+
};
311+
312+
const validatePassword = (password) => {
313+
const lower = /[a-z]/;
314+
const upper = /[A-Z]/;
315+
const digit = /\d/;
316+
const special = /[\W_]/;
317+
318+
let complexityCount = 0;
319+
if (lower.test(password)) complexityCount++;
320+
if (upper.test(password)) complexityCount++;
321+
if (digit.test(password)) complexityCount++;
322+
if (special.test(password)) complexityCount++;
323+
324+
if (password.length < 6) return "Password must be at least 6 characters.";
325+
if (password.length > 72) return "Password cannot exceed 72 characters.";
326+
if (disallowedPasswords.includes(password))
327+
return "This password is not allowed.";
328+
if (complexityCount < 3) {
329+
return "Password must have at least 3 of: Uppercase, Lowercase, Digit, Special Character";
330+
}
331+
return "";
332+
};
333+
334+
const handleUsernameChange = (e) => {
335+
const username = e.target.value;
336+
setAdminUser(username);
337+
const warning = validateUsername(username);
338+
setUsernameWarning(warning);
339+
};
340+
341+
const handlePasswordChange = (e) => {
342+
const password = e.target.value;
343+
setAdminPassword(password);
344+
const warning = validatePassword(password);
345+
setPasswordWarning(warning);
346+
};
347+
250348
const handleSave = async () => {
251349
setAlert("");
252-
if (!resourceName || !adminUser || !adminPassword || !allocation) {
253-
setAlert("Please fill out the request form");
350+
351+
// Ensure all required fields are filled
352+
if (
353+
!resourceName ||
354+
!adminUser ||
355+
!adminPassword ||
356+
!allocation ||
357+
!vmSize ||
358+
!userID ||
359+
!projectID
360+
) {
361+
setAlert("Please fill out all required fields");
254362
return;
255363
}
256364

@@ -274,13 +382,17 @@ export default function CloudResources({ params }) {
274382
}),
275383
});
276384

385+
const data = await res.json();
386+
console.log(data);
387+
277388
if (!res.ok) {
278-
throw new Error(`Failed to save: ${res.statusText}`);
279-
} else {
280-
router.push("/requestresource");
389+
throw new Error(data.message || `Failed to save: ${res.statusText}`);
281390
}
391+
392+
router.push("/requestresource");
282393
} catch (error) {
283-
console.log("Error while saving resource:", error);
394+
setAlert(error.message || "An error occurred while saving the resource.");
395+
console.error("Error while saving resource:", error);
284396
}
285397
};
286398

@@ -526,7 +638,6 @@ export default function CloudResources({ params }) {
526638
id="vmSize"
527639
name="vmSize"
528640
className="border border-slate-300 rounded w-full px-4 py-2 text-base"
529-
defaultValue="Standard_A1_v2"
530641
onChange={(e) => setVMSize(e.target.value)}
531642
>
532643
<option value="" disabled>
@@ -567,13 +678,17 @@ export default function CloudResources({ params }) {
567678
name="adminUsername"
568679
className="border border-slate-300 rounded w-full px-4 py-2 text-base"
569680
placeholder="Enter username"
570-
defaultValue="Admin"
571-
onChange={(e) => setAdminUser(e.target.value)}
681+
onChange={handleUsernameChange}
572682
/>
683+
{usernameWarning && (
684+
<span className="text-red-500 text-sm mt-2 block">
685+
{usernameWarning}
686+
</span>
687+
)}
573688
</div>
574689

575690
{/* Admin Password */}
576-
<div>
691+
<div className="mt-4">
577692
<label htmlFor="adminPassword" className="font-medium block mb-2">
578693
Admin Password
579694
</label>
@@ -583,8 +698,13 @@ export default function CloudResources({ params }) {
583698
name="adminPassword"
584699
className="border border-slate-300 rounded w-full px-4 py-2 text-base"
585700
placeholder="Enter password"
586-
onChange={(e) => setAdminPassword(e.target.value)}
701+
onChange={handlePasswordChange}
587702
/>
703+
{passwordWarning && (
704+
<span className="text-red-500 text-sm mt-2 block">
705+
{passwordWarning}
706+
</span>
707+
)}
588708
</div>
589709

590710
{/* Network Interface

src/app/requestresource/page.js

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -30,38 +30,42 @@ export default function RequestResource() {
3030
const projectData = await projectRes.json();
3131
console.log("Fetched project:", projectData);
3232

33+
console.log("project length", projectData.length);
3334
if (projectData.length > 0) {
34-
const projectId = projectData[0]._id;
35-
console.log("Project ID:", projectId);
36-
const resourceRes = await fetch(`/api/resource?requestId=${projectId}`);
35+
const projectRequest = projectData[0]._id;
36+
console.log("Project ID:", projectRequest);
37+
38+
const resourceRes = await fetch(
39+
`/api/resource?projectRequest=${projectRequest}`
40+
);
3741
if (!resourceRes.ok)
3842
throw new Error(`Resource fetch failed: ${resourceRes.statusText}`);
3943

4044
const resourceData = await resourceRes.json();
4145
console.log("Fetched resources:", resourceData);
4246

43-
const rows = resourceData.map((element) => ({
44-
id: element._id,
45-
name: element.vmname,
46-
type: element.type,
47-
userid: element.userid,
48-
projectid: element.projectid,
49-
statuspm: "Pending",
50-
statusops: "Pending",
51-
}));
52-
53-
setTableRowsCR(rows);
47+
setTableRowsCR(
48+
resourceData.map((element) => ({
49+
id: element._id,
50+
name: element.vmname,
51+
type: element.type,
52+
userid: element.userid,
53+
projectid: element.projectid,
54+
statuspm: "Pending",
55+
statusops: "Pending",
56+
}))
57+
);
5458
}
5559
} catch (error) {
5660
console.log(error.message);
5761
}
5862
};
5963

6064
useEffect(() => {
61-
if (pathWithNamespace) {
65+
if (data) {
6266
fetchResources();
6367
}
64-
});
68+
}, [data]);
6569

6670
const handleRequest = async () => {
6771
toast.success("Request sent successfully");
@@ -78,6 +82,7 @@ export default function RequestResource() {
7882
if (!res.ok) {
7983
throw new Error(`Error: ${res.status} - ${res.statusText}`);
8084
} else {
85+
await fetchResources(); // Refetch resources after request
8186
router.push("/projectlist");
8287
}
8388
} catch (error) {

0 commit comments

Comments
 (0)