diff --git a/appinfo/routes.php b/appinfo/routes.php index f188b0d..ad1e162 100644 --- a/appinfo/routes.php +++ b/appinfo/routes.php @@ -55,7 +55,8 @@ return [ ['name' => 'api#deleteOption', 'url' => '/api/v1/option/{id}', 'verb' => 'DELETE'], ['name' => 'api#getSubmissions', 'url' => '/api/v1/submissions/{hash}', 'verb' => 'GET'], - ['name' => 'api#insertSubmission', 'url' => '/api/v1/submissions/insert', 'verb' => 'POST'], + ['name' => 'api#insertSubmission', 'url' => '/api/v1/submission/insert', 'verb' => 'POST'], + ['name' => 'api#deleteSubmission', 'url' => '/api/v1/submission/{id}', 'verb' => 'DELETE'], ['name' => 'system#get_site_users_and_groups', 'url' => '/get/siteusers', 'verb' => 'POST'], ] diff --git a/lib/Controller/ApiController.php b/lib/Controller/ApiController.php index 16d1fe7..85f3190 100644 --- a/lib/Controller/ApiController.php +++ b/lib/Controller/ApiController.php @@ -714,4 +714,31 @@ class ApiController extends Controller { return new Http\JSONResponse([]); } + + /** + * @NoAdminRequired + */ + public function deleteSubmission(int $id): Http\JSONResponse { + $this->logger->debug('Delete Submission: {id}', [ + 'id' => $id, + ]); + + try { + $submission = $this->submissionMapper->findById($id); + $form = $this->formMapper->findById($submission->getFormId()); + } catch (IMapperException $e) { + $this->logger->debug('Could not find form or submission'); + return new Http\JSONResponse([], Http::STATUS_BAD_REQUEST); + } + + if ($form->getOwnerId() !== $this->userId) { + $this->logger->debug('This form is not owned by the current user'); + return new Http\JSONResponse([], Http::STATUS_FORBIDDEN); + } + + // Delete submission (incl. Answers) + $this->submissionMapper->delete($submission); + + return new Http\JSONResponse($id); + } } diff --git a/lib/Db/SubmissionMapper.php b/lib/Db/SubmissionMapper.php index 729ce42..85ac5f9 100644 --- a/lib/Db/SubmissionMapper.php +++ b/lib/Db/SubmissionMapper.php @@ -64,6 +64,24 @@ class SubmissionMapper extends QBMapper { return $this->findEntities($qb); } + /** + * @param Integer $id + * @return Submission + * @throws \OCP\AppFramework\Db\MultipleObjectsReturnedException if more than one result + * @throws \OCP\AppFramework\Db\DoesNotExistException if not found + */ + public function findById(int $id): Submission { + $qb = $this->db->getQueryBuilder(); + + $qb->select('*') + ->from($this->getTableName()) + ->where( + $qb->expr()->eq('id', $qb->createNamedParameter($id, IQueryBuilder::PARAM_INT)) + ); + + return $this->findEntity($qb); + } + /** * @param int $formId * @throws DoesNotExistException if not found diff --git a/src/components/Results/Submission.vue b/src/components/Results/Submission.vue index 5cc864a..e17c3a5 100644 --- a/src/components/Results/Submission.vue +++ b/src/components/Results/Submission.vue @@ -22,9 +22,16 @@ diff --git a/src/views/Results.vue b/src/views/Results.vue index e661c05..78e47a9 100644 --- a/src/views/Results.vue +++ b/src/views/Results.vue @@ -60,7 +60,8 @@ v-for="submission in submissions" :key="submission.id" :submission="submission" - :questions="questions" /> + :questions="questions" + @delete="deleteSubmission(submission.id)" />