Skip to content

Commit

Permalink
feat: Add create & edit permission admin mutation & connect frontend …
Browse files Browse the repository at this point in the history
…to API
  • Loading branch information
aXenDeveloper committed Oct 7, 2024
1 parent d363f50 commit db73fcd
Show file tree
Hide file tree
Showing 26 changed files with 689 additions and 68 deletions.
1 change: 1 addition & 0 deletions apps/backend/schema.gql
Original file line number Diff line number Diff line change
Expand Up @@ -244,6 +244,7 @@ type Mutation {
admin__core_plugins__nav__create(code: String!, icon: String, keywords: [String!]!, parent_code: String, plugin_code: String!): ShowAdminNavPluginsObj!
admin__core_plugins__nav__delete(code: String!, parent_code: String, plugin_code: String!): String!
admin__core_plugins__nav__edit(code: String!, icon: String, keywords: [String!]!, parent_code: String, plugin_code: String!, previous_code: String!): ShowAdminNavPluginsObj!
admin__core_plugins__permissions_admin__create_edit(id: String!, old_id: String, parent_id: String, plugin_code: String!): ShowAdminPermissionsAdminPluginsObj!
admin__core_plugins__upload(code: String, file: Upload!): String!
admin__core_security__captcha__edit(secret_key: String!, site_key: String!, type: CaptchaTypeEnum!): ShowAdminCaptchaSecurityObj!
admin__core_staff_administrators__create(group_id: Int, unrestricted: Boolean!, user_id: Int): ShowAdminStaffAdministrators!
Expand Down
34 changes: 33 additions & 1 deletion apps/backend/src/plugins/welcome/config.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,41 @@
{
"code": "testchild",
"icon": "",
"keywords": []
"keywords": [],
"parent_code": "test"
}
]
}
],
"permissions_admin": [
{
"id": "elo",
"children": [
{
"id": "txd",
"children": []
}
]
},
{
"id": "elo1",
"children": []
},
{
"id": "123",
"children": []
},
{
"id": "1234",
"children": []
},
{
"id": "child",
"children": []
},
{
"id": "test13",
"children": []
}
]
}
9 changes: 9 additions & 0 deletions apps/frontend/src/graphql/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -277,6 +277,7 @@ export type Mutation = {
admin__core_plugins__nav__create: ShowAdminNavPluginsObj;
admin__core_plugins__nav__delete: Scalars['String']['output'];
admin__core_plugins__nav__edit: ShowAdminNavPluginsObj;
admin__core_plugins__permissions_admin__create_edit: ShowAdminPermissionsAdminPluginsObj;
admin__core_plugins__upload: Scalars['String']['output'];
admin__core_security__captcha__edit: ShowAdminCaptchaSecurityObj;
admin__core_staff_administrators__create: ShowAdminStaffAdministrators;
Expand Down Expand Up @@ -501,6 +502,14 @@ export type MutationAdmin__Core_Plugins__Nav__EditArgs = {
};


export type MutationAdmin__Core_Plugins__Permissions_Admin__Create_EditArgs = {
id: Scalars['String']['input'];
old_id?: InputMaybe<Scalars['String']['input']>;
parent_id?: InputMaybe<Scalars['String']['input']>;
plugin_code: Scalars['String']['input'];
};


export type MutationAdmin__Core_Plugins__UploadArgs = {
code?: InputMaybe<Scalars['String']['input']>;
file: Scalars['Upload']['input'];
Expand Down
14 changes: 13 additions & 1 deletion apps/frontend/src/plugins/admin/langs/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -305,7 +305,19 @@
}
},
"permissions-admin": {
"title": "Permissions in AdminCP"
"title": "Permissions in AdminCP",
"create_edit": {
"id": {
"label": "ID",
"desc": "Unique ID for this permission.",
"exists": "Permission with this ID already exists."
},
"parent": {
"label": "Parent Permission",
"null": "No parent permission"
},
"create_success": "Permission has been created."
}
}
},
"create": {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { ArgsType, Field } from '@nestjs/graphql';

@ArgsType()
export class CreateEditAdminPermissionsAdminPluginsArgs {
@Field(() => String)
id: string;

@Field(() => String, { nullable: true })
old_id?: string;

@Field(() => String, { nullable: true })
parent_id?: string;

@Field(() => String)
plugin_code: string;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import { AdminAuthGuards, OnlyForDevelopment } from '@/utils';
import { UseGuards } from '@nestjs/common';
import { Args, Mutation, Resolver } from '@nestjs/graphql';

import { ShowAdminPermissionsAdminPluginsObj } from '../show/show.dto';
import { CreateEditAdminPermissionsAdminPluginsArgs } from './create-edit.dto';
import { CreateEditAdminPermissionsAdminPluginsService } from './create-edit.service';

@Resolver()
export class CreateEditAdminPermissionsAdminPluginsResolver {
constructor(
private readonly service: CreateEditAdminPermissionsAdminPluginsService,
) {}

@Mutation(() => ShowAdminPermissionsAdminPluginsObj)
@UseGuards(AdminAuthGuards)
@UseGuards(OnlyForDevelopment)
async admin__core_plugins__permissions_admin__create_edit(
@Args() args: CreateEditAdminPermissionsAdminPluginsArgs,
): Promise<ShowAdminPermissionsAdminPluginsObj> {
return await this.service.createEdit(args);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,172 @@
import {
ABSOLUTE_PATHS_BACKEND,
ConfigPlugin,
CustomError,
InternalServerError,
NotFoundError,
} from '@/index';
import { Injectable } from '@nestjs/common';
import { existsSync } from 'fs';
import { readFile, writeFile } from 'fs/promises';

import { ShowAdminPermissionsAdminPluginsObj } from '../show/show.dto';
import { CreateEditAdminPermissionsAdminPluginsArgs } from './create-edit.dto';

@Injectable()
export class CreateEditAdminPermissionsAdminPluginsService {
async createEdit({
id,
old_id,
plugin_code,
parent_id,
}: CreateEditAdminPermissionsAdminPluginsArgs): Promise<ShowAdminPermissionsAdminPluginsObj> {
const pathConfig = ABSOLUTE_PATHS_BACKEND.plugin({
code: plugin_code,
}).config;
if (!existsSync(pathConfig)) {
throw new NotFoundError('Plugin');
}

const config: ConfigPlugin = JSON.parse(await readFile(pathConfig, 'utf8'));

const parent = config.permissions_admin?.find(
permission => permission.id === parent_id,
);

if (!parent && parent_id) {
throw new NotFoundError('Parent permission for the plugin');
}

// Check if the id already exists
if (old_id !== id) {
const existsPermission = parent
? parent.children.find(child => child.id === id)
: config.permissions_admin?.find(permission => permission.id === id);

if (existsPermission) {
throw new CustomError({
message: 'Permission already exists',
code: 'PERMISSION_ALREADY_EXISTS',
});
}
}

// Edit
if (old_id) {
const oldPermission = parent
? parent.children.find(child => child.id === old_id)
: config.permissions_admin?.find(
permission => permission.id === old_id,
);

if (!oldPermission) {
throw new NotFoundError('Permission with the old id for the plugin');
}

let newConfig: ConfigPlugin;

if (parent) {
newConfig = {
...config,
permissions_admin: config.permissions_admin?.map(permission => {
if (permission.id === parent.id) {
return {
...permission,
children: permission.children.map(child => {
if (child.id === old_id) {
return {
id,
};
}

return child;
}),
};
}

return permission;
}),
};
} else {
newConfig = {
...config,
permissions_admin: config.permissions_admin?.map(permission => {
if (permission.id === old_id) {
return {
id,
children: permission.children,
};
}

return permission;
}),
};
}

await writeFile(pathConfig, JSON.stringify(newConfig, null, 2));

const returnValue = parent
? newConfig.permissions_admin?.find(
permission => permission.id === parent.id,
)
: newConfig.permissions_admin?.find(permission => permission.id === id);

if (!returnValue) {
throw new InternalServerError();
}

return {
id,
children: [],
};
}

let newConfig: ConfigPlugin;
if (parent) {
newConfig = {
...config,
permissions_admin: (config.permissions_admin ?? []).map(permission => {
if (permission.id === parent.id) {
return {
...permission,
children: [
...permission.children,
{
id,
children: [],
},
],
};
}

return permission;
}),
};
} else {
newConfig = {
...config,
permissions_admin: [
...(config.permissions_admin ?? []),
{
id,
children: [],
},
],
};
}

await writeFile(pathConfig, JSON.stringify(newConfig, null, 2));

const returnValue = parent
? newConfig.permissions_admin?.find(
permission => permission.id === parent.id,
)
: newConfig.permissions_admin?.find(permission => permission.id === id);

if (!returnValue) {
throw new InternalServerError();
}

return returnValue;
}
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
import { Module } from '@nestjs/common';

import { CreateEditAdminPermissionsAdminPluginsResolver } from './create-edit/create-edit.resolver';
import { CreateEditAdminPermissionsAdminPluginsService } from './create-edit/create-edit.service';
import { ShowAdminPermissionsAdminPluginsResolver } from './show/show.resolver';
import { ShowAdminPermissionsAdminPluginsService } from './show/show.service';

@Module({
providers: [
ShowAdminPermissionsAdminPluginsResolver,
ShowAdminPermissionsAdminPluginsService,
CreateEditAdminPermissionsAdminPluginsService,
CreateEditAdminPermissionsAdminPluginsResolver,
],
})
export class AdminPermissionsAdminPluginsModule {}
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { Field, ObjectType } from '@nestjs/graphql';

@ObjectType()
export class ShowAdminPermissionsAdminPlugins {
@Field(() => String)
Expand Down
8 changes: 7 additions & 1 deletion packages/backend/src/providers/plugins.type.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@ interface NavPluginInfoJSONType {
keywords: string[];
}

interface PermissionsAdminPluginInfoJSONType {
id: string;
}

export interface NavPluginInfoJSONTypeWithChildren
extends NavPluginInfoJSONType {
children?: NavPluginInfoJSONType[];
Expand All @@ -15,7 +19,9 @@ export interface NavPluginInfoJSONTypeWithChildren
export interface PluginInfoJSONType extends CreateAdminPluginsArgs {
allow_default: boolean;
nav: NavPluginInfoJSONTypeWithChildren[];
permissions_admin?: [];
permissions_admin?: ({
children: PermissionsAdminPluginInfoJSONType[];
} & PermissionsAdminPluginInfoJSONType)[];
version: string;
version_code: number;
}
Expand Down
24 changes: 14 additions & 10 deletions packages/frontend/src/components/drag&drop/sortable-list/item.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ export function SortableTreeItem<T extends TreeItem<T>>({
id,
onCollapse,
children,
isDragEnd = true,
...props
}: {
childCount?: number;
Expand All @@ -25,6 +26,7 @@ export function SortableTreeItem<T extends TreeItem<T>>({
depth: number;
id: number | string;
indentationWidth: number;
isDragEnd?: boolean;
onCollapse?: () => void;
} & Omit<React.HTMLAttributes<HTMLLIElement>, 'id' | 'style'>) {
const {
Expand Down Expand Up @@ -71,16 +73,18 @@ export function SortableTreeItem<T extends TreeItem<T>>({
} as React.CSSProperties
}
>
<Button
ariaLabel=""
className={cn('w-8 cursor-grab')}
size="icon"
variant="ghost"
{...attributes}
{...listeners}
>
<GripVertical />
</Button>
{isDragEnd && (
<Button
ariaLabel=""
className={cn('w-8 cursor-grab')}
size="icon"
variant="ghost"
{...attributes}
{...listeners}
>
<GripVertical />
</Button>
)}
{onCollapse && (
<Button ariaLabel="" onClick={onCollapse} size="icon" variant="ghost">
<ChevronRight
Expand Down
Loading

0 comments on commit db73fcd

Please sign in to comment.