feat: delete views from views dropdown (#1234)
Closes #1129 Co-authored-by: Charles Bochet <charlesBochet@users.noreply.github.com>
This commit is contained in:
@ -140,17 +140,17 @@ export class AbilityFactory {
|
||||
can(AbilityAction.Read, 'View', { workspaceId: workspace.id });
|
||||
can(AbilityAction.Create, 'View', { workspaceId: workspace.id });
|
||||
can(AbilityAction.Update, 'View', { workspaceId: workspace.id });
|
||||
can(AbilityAction.Delete, 'View', { workspaceId: workspace.id });
|
||||
|
||||
// ViewField
|
||||
can(AbilityAction.Read, 'ViewField', { workspaceId: workspace.id });
|
||||
can(AbilityAction.Create, 'ViewField', { workspaceId: workspace.id });
|
||||
can(AbilityAction.Update, 'ViewField', { workspaceId: workspace.id });
|
||||
|
||||
//Favorite
|
||||
can(AbilityAction.Read, 'Favorite', { workspaceId: workspace.id });
|
||||
can(AbilityAction.Create, 'Favorite');
|
||||
can(AbilityAction.Delete, 'Favorite', {
|
||||
workspaceId: workspace.id,
|
||||
});
|
||||
can(AbilityAction.Delete, 'Favorite', { workspaceId: workspace.id });
|
||||
|
||||
// ViewSort
|
||||
can(AbilityAction.Read, 'ViewSort', { workspaceId: workspace.id });
|
||||
|
||||
@ -114,6 +114,7 @@ import {
|
||||
CreateViewAbilityHandler,
|
||||
ReadViewAbilityHandler,
|
||||
UpdateViewAbilityHandler,
|
||||
DeleteViewAbilityHandler,
|
||||
} from './handlers/view.ability-handler';
|
||||
|
||||
@Global()
|
||||
@ -207,6 +208,7 @@ import {
|
||||
ReadViewAbilityHandler,
|
||||
CreateViewAbilityHandler,
|
||||
UpdateViewAbilityHandler,
|
||||
DeleteViewAbilityHandler,
|
||||
// ViewField
|
||||
ReadViewFieldAbilityHandler,
|
||||
CreateViewFieldAbilityHandler,
|
||||
@ -305,6 +307,7 @@ import {
|
||||
ReadViewAbilityHandler,
|
||||
CreateViewAbilityHandler,
|
||||
UpdateViewAbilityHandler,
|
||||
DeleteViewAbilityHandler,
|
||||
// ViewField
|
||||
ReadViewFieldAbilityHandler,
|
||||
CreateViewFieldAbilityHandler,
|
||||
|
||||
@ -77,3 +77,19 @@ export class UpdateViewAbilityHandler implements IAbilityHandler {
|
||||
return ability.can(AbilityAction.Update, subject('View', view));
|
||||
}
|
||||
}
|
||||
|
||||
@Injectable()
|
||||
export class DeleteViewAbilityHandler implements IAbilityHandler {
|
||||
constructor(private readonly prismaService: PrismaService) {}
|
||||
|
||||
async handle(ability: AppAbility, context: ExecutionContext) {
|
||||
const gqlContext = GqlExecutionContext.create(context);
|
||||
const args = gqlContext.getArgs<ViewArgs>();
|
||||
const view = await this.prismaService.client.view.findFirst({
|
||||
where: args.where,
|
||||
});
|
||||
assert(view, '', NotFoundException);
|
||||
|
||||
return ability.can(AbilityAction.Delete, subject('View', view));
|
||||
}
|
||||
}
|
||||
|
||||
@ -7,6 +7,7 @@ import { Prisma, Workspace } from '@prisma/client';
|
||||
import { AppAbility } from 'src/ability/ability.factory';
|
||||
import {
|
||||
CreateViewAbilityHandler,
|
||||
DeleteViewAbilityHandler,
|
||||
ReadViewAbilityHandler,
|
||||
UpdateViewAbilityHandler,
|
||||
} from 'src/ability/handlers/view.ability-handler';
|
||||
@ -25,6 +26,7 @@ import { UpdateOneViewArgs } from 'src/core/@generated/view/update-one-view.args
|
||||
import { AuthWorkspace } from 'src/decorators/auth-workspace.decorator';
|
||||
import { AffectedRows } from 'src/core/@generated/prisma/affected-rows.output';
|
||||
import { CreateManyViewArgs } from 'src/core/@generated/view/create-many-view.args';
|
||||
import { DeleteManyViewArgs } from 'src/core/@generated/view/delete-many-view.args';
|
||||
|
||||
@UseGuards(JwtAuthGuard)
|
||||
@Resolver(() => View)
|
||||
@ -84,4 +86,17 @@ export class ViewResolver {
|
||||
select: prismaSelect.value,
|
||||
} as Prisma.ViewUpdateArgs);
|
||||
}
|
||||
|
||||
@Mutation(() => AffectedRows, {
|
||||
nullable: false,
|
||||
})
|
||||
@UseGuards(AbilityGuard)
|
||||
@CheckAbilities(DeleteViewAbilityHandler)
|
||||
async deleteManyView(
|
||||
@Args() args: DeleteManyViewArgs,
|
||||
): Promise<AffectedRows> {
|
||||
return this.viewService.deleteMany({
|
||||
where: args.where,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@ -0,0 +1,11 @@
|
||||
-- DropForeignKey
|
||||
ALTER TABLE "viewFields" DROP CONSTRAINT "viewFields_viewId_fkey";
|
||||
|
||||
-- DropForeignKey
|
||||
ALTER TABLE "viewSorts" DROP CONSTRAINT "viewSorts_viewId_fkey";
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "viewSorts" ADD CONSTRAINT "viewSorts_viewId_fkey" FOREIGN KEY ("viewId") REFERENCES "views"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "viewFields" ADD CONSTRAINT "viewFields_viewId_fkey" FOREIGN KEY ("viewId") REFERENCES "views"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
@ -606,7 +606,7 @@ model ViewSort {
|
||||
key String
|
||||
name String
|
||||
|
||||
view View @relation(fields: [viewId], references: [id])
|
||||
view View @relation(fields: [viewId], references: [id], onDelete: Cascade)
|
||||
viewId String
|
||||
|
||||
/// @TypeGraphQL.omit(input: true, output: true)
|
||||
@ -629,7 +629,7 @@ model ViewField {
|
||||
objectName String
|
||||
sizeInPx Int
|
||||
|
||||
view View? @relation(fields: [viewId], references: [id])
|
||||
view View? @relation(fields: [viewId], references: [id], onDelete: Cascade)
|
||||
viewId String?
|
||||
|
||||
/// @TypeGraphQL.omit(input: true, output: true)
|
||||
|
||||
Reference in New Issue
Block a user