Add project entry deletion by user

This commit is contained in:
Ramon Wenger 2019-05-21 14:39:25 +02:00
parent d5364d8d9d
commit 735d2d9afa
3 changed files with 64 additions and 3 deletions

View File

@ -1,7 +1,10 @@
<template>
<div class="project-entry">
<more-options-widget class="project-entry__more" data-cy="project-entry-more">
<li class="popover-links__link"><a @click="editProjectEntry()" data-cy="edit-project-entry">Eintrag bearbeiten</a></li>
<li class="popover-links__link"><a @click="editProjectEntry()" data-cy="edit-project-entry">Eintrag bearbeiten</a>
</li>
<li class="popover-links__link"><a @click="deleteProjectEntry()" data-cy="delete-project-entry">Eintrag löschen</a>
</li>
</more-options-widget>
<h3 class="project-entry__heading">Tätigkeit</h3>
@ -31,6 +34,9 @@
import DocumentBlock from '@/components/content-blocks/DocumentBlock';
import MoreOptionsWidget from '@/components/MoreOptionsWidget';
import DELETE_PROJECT_ENTRY_MUTATION from '@/graphql/gql/mutations/deleteProjectEntry.gql';
import PROJECT_QUERY from '@/graphql/gql/projectQuery.gql';
export default {
components: {
DocumentBlock,
@ -41,6 +47,30 @@
methods: {
editProjectEntry() {
this.$store.dispatch('editProjectEntry', this.id);
},
deleteProjectEntry() {
const projectEntry = this; // otherwise we run into scope errors
this.$apollo.mutate({
mutation: DELETE_PROJECT_ENTRY_MUTATION,
variables: {
input: {
id: this.id
}
},
update(store, {data: {deleteProjectEntry: {success}}}) {
if (success) {
const query = PROJECT_QUERY;
const variables = {
slug: projectEntry.$route.params.slug
};
const data = store.readQuery({query, variables});
if (data) {
data.project.entries.edges.splice(data.project.entries.edges.findIndex(edge => edge.node.id === projectEntry.id), 1);
store.writeQuery({query, variables, data});
}
}
}
})
}
}
}

View File

@ -0,0 +1,12 @@
mutation DeleteProjectEntry($input: DeleteProjectEntryInput!) {
deleteProjectEntry(input: $input) {
success
errors
}
}
#{
# "input": {
# "id": "Um9vbU5vZGU6MjY="
# }
#}

View File

@ -13,6 +13,7 @@ from portfolio.serializers import ProjectSerializer, ProjectEntrySerializer
def check_owner(user, project):
return user.id != project.student.id
class MutateProject(relay.ClientIDMutation):
errors = graphene.List(graphene.String)
project = graphene.Field(ProjectNode)
@ -49,7 +50,6 @@ class AddProject(MutateProject):
@classmethod
def mutate_and_get_payload(cls, root, info, **kwargs):
data = kwargs.get('project')
data['student'] = info.context.user.id
@ -124,10 +124,29 @@ class DeleteProject(relay.ClientIDMutation):
return cls(success=True)
class DeleteProjectEntry(relay.ClientIDMutation):
class Input:
id = graphene.ID(required=True)
success = graphene.Boolean()
errors = graphene.List(graphene.String)
@classmethod
def mutate_and_get_payload(cls, root, info, **kwargs):
id = kwargs.get('id')
project_entry = get_object(ProjectEntry, id)
user = info.context.user
if project_entry.project.student != user:
raise PermissionDenied('Permission denied: Incorrect project')
project_entry.delete()
return cls(success=True)
class PortfolioMutations:
add_project = AddProject.Field()
update_project = UpdateProject.Field()
delete_project = DeleteProject.Field()
add_project_entry = AddProjectEntry.Field()
update_project_entry = UpdateProjectEntry.Field()
delete_project_entry = DeleteProjectEntry.Field()