diff --git a/payment-iq/app/api/dashboard/admin/users/route.ts b/payment-iq/app/api/dashboard/admin/users/route.ts index 594c580..b64d0f0 100644 --- a/payment-iq/app/api/dashboard/admin/users/route.ts +++ b/payment-iq/app/api/dashboard/admin/users/route.ts @@ -1,66 +1,127 @@ // app/api/user/route.ts -import { NextResponse } from "next/server"; +import { NextRequest, NextResponse } from "next/server"; + +export const users = [ + { + merchantId: 100987998, + id: "bc6a8a55-13bc-4538-8255-cd0cec3bb4e9", + mame: "Jacob", + username: "lspaddy", + firstName: "Paddy", + lastName: "Man", + email: "patrick@omegasys.eu", + phone: "", + jobTitle: "", + enabled: true, + authorities: [ + "ROLE_IIN", + "ROLE_FIRST_APPROVER", + "ROLE_RULES_ADMIN", + "ROLE_TRANSACTION_VIEWER", + "ROLE_IIN_ADMIN", + "ROLE_USER_PSP_ACCOUNT", + ], + allowedMerchantIds: [100987998], + created: "2025-05-04T15:32:48.432Z", + disabledBy: null, + disabledDate: null, + disabledReason: null, + incidentNotes: false, + lastLogin: "", + lastMandatoryUpdated: "2025-05-04T15:32:48.332Z", + marketingNewsletter: false, + releaseNotes: false, + requiredActions: ["CONFIGURE_TOTP", "UPDATE_PASSWORD"], + twoFactorCondition: "required", + twoFactorCredentials: [], + }, + { + merchantId: 100987998, + mame: "Jacob", + id: "382eed15-1e21-41fa-b1f3-0c1adb3af714", + username: "lsterence", + firstName: "Terence", + lastName: "User", + email: "terence@omegasys.eu", + phone: "", + jobTitle: "", + enabled: true, + authorities: ["ROLE_IIN", "ROLE_FIRST_APPROVER", "ROLE_RULES_ADMIN"], + allowedMerchantIds: [100987998], + created: "2025-05-04T15:32:48.432Z", + disabledBy: null, + disabledDate: null, + disabledReason: null, + incidentNotes: false, + lastLogin: "", + lastMandatoryUpdated: "2025-05-04T15:32:48.332Z", + marketingNewsletter: false, + releaseNotes: false, + requiredActions: ["CONFIGURE_TOTP", "UPDATE_PASSWORD"], + twoFactorCondition: "required", + twoFactorCredentials: [], + }, +]; export async function GET() { - return NextResponse.json([ - { - merchantId: 100987998, - id: "bc6a8a55-13bc-4538-8255-cd0cec3bb4e9", - mame: "Jacob", - username: "lspaddy", - firstName: "Paddy", - lastName: "Man", - email: "patrick@omegasys.eu", - phone: "", - jobTitle: "", - enabled: true, - authorities: [ - "ROLE_IIN", - "ROLE_FIRST_APPROVER", - "ROLE_RULES_ADMIN", - "ROLE_TRANSACTION_VIEWER", - "ROLE_IIN_ADMIN", - "ROLE_USER_PSP_ACCOUNT", - ], - allowedMerchantIds: [100987998], - created: "2025-05-04T15:32:48.432Z", - disabledBy: null, - disabledDate: null, - disabledReason: null, - incidentNotes: false, - lastLogin: "", - lastMandatoryUpdated: "2025-05-04T15:32:48.332Z", - marketingNewsletter: false, - releaseNotes: false, - requiredActions: ["CONFIGURE_TOTP", "UPDATE_PASSWORD"], - twoFactorCondition: "required", - twoFactorCredentials: [], - }, - { - merchantId: 100987998, - mame: "Jacob", - id: "382eed15-1e21-41fa-b1f3-0c1adb3af714", - username: "lsterence", - firstName: "Terence", - lastName: "User", - email: "terence@omegasys.eu", - phone: "", - jobTitle: "", - enabled: true, - authorities: ["ROLE_IIN", "ROLE_FIRST_APPROVER", "ROLE_RULES_ADMIN"], - allowedMerchantIds: [100987998], - created: "2025-05-04T15:32:48.432Z", - disabledBy: null, - disabledDate: null, - disabledReason: null, - incidentNotes: false, - lastLogin: "", - lastMandatoryUpdated: "2025-05-04T15:32:48.332Z", - marketingNewsletter: false, - releaseNotes: false, - requiredActions: ["CONFIGURE_TOTP", "UPDATE_PASSWORD"], - twoFactorCondition: "required", - twoFactorCredentials: [], - }, - ]); + return NextResponse.json(users); } + +export async function POST(request: NextRequest) { + const body = await request.json(); + + // Use the first user as a template + const templateUser = users[0]; + + // Create the new user by spreading the template and then the body (body fields override template) + const newUser = { + ...templateUser, + ...body, + id: + typeof crypto !== "undefined" && crypto.randomUUID + ? crypto.randomUUID() + : Math.random().toString(36).substring(2, 15), + created: new Date().toISOString(), + }; + + users.push(newUser); + + return NextResponse.json(newUser, { status: 201 }); +} + +// To call the POST function from the client side, you can use fetch like this: + +/* +Example usage in a React component or any client-side JS: + +const createUser = async (userData) => { + const res = await fetch('/api/dashboard/admin/users', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(userData), + }); + + if (!res.ok) { + // handle error + throw new Error('Failed to create user'); + } + + const newUser = await res.json(); + return newUser; +}; + +// Usage: +createUser({ + username: "newuser", + firstName: "New", + lastName: "User", + email: "newuser@example.com", + // ...other fields as needed +}).then(user => { + console.log('Created user:', user); +}).catch(err => { + console.error(err); +}); +*/ diff --git a/payment-iq/app/dashboard/admin/users/page.tsx b/payment-iq/app/dashboard/admin/users/page.tsx index c5625e4..a3a3654 100644 --- a/payment-iq/app/dashboard/admin/users/page.tsx +++ b/payment-iq/app/dashboard/admin/users/page.tsx @@ -1,12 +1,15 @@ import Users from "@/app/features/Pages/Admin/Users/users"; export default async function BackOfficeUsersPage() { - const res = await fetch("http://localhost:3000/api/dashboard/admin/users", { + const baseUrl = + process.env.NEXT_PUBLIC_BASE_URL || process.env.VERCEL_URL + ? `https://${process.env.VERCEL_URL}` + : "http://localhost:3000"; + const res = await fetch(`${baseUrl}/api/dashboard/admin/users`, { cache: "no-store", // 👈 disables caching for SSR freshness }); const users = await res.json(); - console.log("[USERS]", users); return (
diff --git a/payment-iq/app/features/UserRoles/EditUser/EditUser.tsx b/payment-iq/app/features/UserRoles/EditUser/EditUser.tsx index 5c779cf..9f384ff 100644 --- a/payment-iq/app/features/UserRoles/EditUser/EditUser.tsx +++ b/payment-iq/app/features/UserRoles/EditUser/EditUser.tsx @@ -1,23 +1,11 @@ import React from "react"; -import "./editUser.scss"; - -// Union type for form field names -export type EditUserField = - | "firstName" - | "lastName" - | "email" - | "role" - | "phone"; - -interface IEditUserForm { - firstName: string; - lastName: string; - email: string; - role: string; - phone: string; -} +import { useRouter } from "next/navigation"; +import { IEditUserForm, EditUserField } from "../User.interfaces"; +import { createRole } from "@/services/roles.services"; +import "./EditUser.scss"; const EditUser = () => { + const router = useRouter(); const [form, setForm] = React.useState({ firstName: "", lastName: "", @@ -53,8 +41,20 @@ const EditUser = () => { }); }; + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + + try { + await createRole(form); + router.refresh(); // <- refreshes the page (SSR re-runs) + } catch (err: any) { + console.log(err.message || "Error creating role"); + // setError(err.message || "Error creating role"); + } + }; + return ( -
+ - Roles{" "} + Roles @@ -113,13 +114,13 @@ export default function UserRoleCard({ {extraRolesCount && } - {isEditing && } - {/* Footer */} - {/* - - {lastLogin} - - */} +
+ {isEditing && } +
); diff --git a/payment-iq/services/roles.services.ts b/payment-iq/services/roles.services.ts new file mode 100644 index 0000000..4f14b61 --- /dev/null +++ b/payment-iq/services/roles.services.ts @@ -0,0 +1,15 @@ +import { IEditUserForm } from "@/app/features/UserRoles/User.interfaces"; + +export async function createRole(data: IEditUserForm) { + const res = await fetch("/api/dashboard/admin/users", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(data), + }); + + if (!res.ok) { + throw new Error("Failed to create role"); + } + + return res.json(); // or return type depending on your backend +}