feat: delete views from views dropdown (#1234)

Closes #1129

Co-authored-by: Charles Bochet <charlesBochet@users.noreply.github.com>
This commit is contained in:
Thaïs
2023-08-16 23:27:03 +02:00
committed by GitHub
parent 8863bb0035
commit a24e1e4dc9
17 changed files with 188 additions and 24 deletions

View File

@ -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 });

View File

@ -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,

View File

@ -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));
}
}

View File

@ -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,
});
}
}

View File

@ -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;

View File

@ -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)