diff --git a/app/api/user/[user]/route.ts b/app/api/user/[user]/route.ts new file mode 100644 index 0000000..72918f6 --- /dev/null +++ b/app/api/user/[user]/route.ts @@ -0,0 +1,23 @@ +import { NextRequest, NextResponse } from "next/server" +import { getClient } from "../../auth/[...nextauth]/options" +import { ROLE } from "../options" + +// eslint-disable-next-line import/prefer-default-export +export async function PATCH(req: NextRequest, { params }: { params: { user: string } }) { + + const client = await getClient() + if (client instanceof NextResponse) { + return client + } + + const username = params.user + const role = ROLE.get(req.nextUrl.searchParams.get("role") || "") + try { + if (!role) throw new Error("Role is missing") + + await client.connection.aclSetUser(username, role) + return NextResponse.json({ message: "User created" },{status: 200}) + } catch (err: unknown) { + return NextResponse.json({ message: (err as Error).message }, { status: 400 }) + } +} \ No newline at end of file diff --git a/app/api/user/options.ts b/app/api/user/options.ts new file mode 100644 index 0000000..e2135fa --- /dev/null +++ b/app/api/user/options.ts @@ -0,0 +1,13 @@ +export interface CreateUser { + username: string + password: string + role: string +} + +export const ROLE = new Map( + [ + ["Admin", ["on", "~*", "&*", "+@all"]], + ["Read-Write", ["on", "~*", "resetchannels", "-@all", "+graph.query", "+graph.explain", "+graph.list", "+ping", "+graph.profile",]], + ["Read-Only", ["on", "~*", "resetchannels", "-@all", "+graph.ro_query", "+graph.explain", "+graph.list", "+ping"]] + ] +) \ No newline at end of file diff --git a/app/api/user/route.ts b/app/api/user/route.ts index 151161f..265c3e7 100644 --- a/app/api/user/route.ts +++ b/app/api/user/route.ts @@ -1,22 +1,8 @@ import { NextRequest, NextResponse } from "next/server"; import { getClient } from "@/app/api/auth/[...nextauth]/options"; import { User } from "./model" +import { CreateUser, ROLE } from "./options"; -const ROLE = new Map( - [ - ["Admin", ["on", "~*", "&*", "+@all"]], - ["Read-Write", ["on", "~*", "resetchannels", "-@all", "+graph.query", "+graph.explain", "+graph.list", "+ping", "+graph.profile",]], - ["Read-Only", ["on", "~*", "resetchannels", "-@all", "+graph.ro_query", "+graph.explain", "+graph.list", "+ping"]] - ] -) - -interface CreateUser { - username: string - password: string - role: string -} - -// eslint-disable-next-line import/prefer-default-export export async function GET() { const client = await getClient() @@ -50,7 +36,6 @@ export async function GET() { } } -// eslint-disable-next-line import/prefer-default-export export async function POST(req: NextRequest) { const client = await getClient() @@ -89,7 +74,6 @@ export async function POST(req: NextRequest) { } } -// eslint-disable-next-line import/prefer-default-export export async function DELETE(req: NextRequest) { const client = await getClient() diff --git a/app/settings/users/AddUser.tsx b/app/settings/users/AddUser.tsx index e8c4966..36efad3 100644 --- a/app/settings/users/AddUser.tsx +++ b/app/settings/users/AddUser.tsx @@ -44,7 +44,7 @@ export default function AddUser({ setUsers }: { }) if (response.ok) { - Toast("Success", "User added successfully") + Toast("User added successfully", "Success") setUsers(prev => [...prev, { username, role, selected: false }]) } setOpen(false) diff --git a/app/settings/users/Users.tsx b/app/settings/users/Users.tsx index f6108f0..8ad40b9 100644 --- a/app/settings/users/Users.tsx +++ b/app/settings/users/Users.tsx @@ -40,6 +40,30 @@ export default function Users() { run() }, []) + const handelSetRole = async (role: string, username?: string) => { + const updatedUsers = await Promise.all(users.map(async user => { + const updated = username ? user.username === username : user.selected + + if (!updated) return user + + const result = await securedFetch(`api/user/${username}/?role=${role}`, { + method: 'PATCH' + }) + + if (result.ok) { + return { + ...user, + role + } + } + + return user + })) + + setUsers(updatedUsers) + } + + return (
@@ -51,13 +75,7 @@ export default function Users() { options={ROLES} setSelectedValue={(role) => { setChecked(false) - setUsers(prev => prev.map(user => { - if (!user.selected) return user - const u = user - u.role = role - u.selected = false - return u - })) + handelSetRole(role) }} />
@@ -93,7 +111,7 @@ export default function Users() { { setUsers(prev => prev.map(currentUser => { @@ -112,13 +130,7 @@ export default function Users() { type="Role" options={ROLES} selectedValue={role || ""} - setSelectedValue={(r) => setUsers(prev => prev.map((user) => { - if (username !== user.username) return user - return { - ...user, - role: r - } - }))} /> + setSelectedValue={(r) => handelSetRole(r, username)} /> {