Skip to content

Commit

Permalink
refactor: map query payloads using MapRequestPayload
Browse files Browse the repository at this point in the history
  • Loading branch information
joelbeckmann committed Jan 27, 2025
1 parent 81554bc commit a635fb4
Show file tree
Hide file tree
Showing 5 changed files with 30 additions and 27 deletions.
2 changes: 1 addition & 1 deletion assets/dropzone.js
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ function handleCSVFile(file, responseText) {
cancelBtn.addEventListener("click", function () {
let input = document.createElement("input");
input.setAttribute("type", "hidden");
input.setAttribute("name", "dataset-import-remove");
input.setAttribute("name", "datasetImportRemove");
input.setAttribute("value", "true");
form.append(input);
console.log(form);
Expand Down
2 changes: 1 addition & 1 deletion src/Controller/CodebookController.php
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ public function performUpdate(Dataset $dataset, Request $request): JsonResponse
{
$this->logger->debug("Enter CodebookController::performUpdateAction with [UUID: {$dataset->getId()}]");
if ($request->isMethod('POST')) {
$postedData = json_decode($request->getContent(), true, 512, JSON_THROW_ON_ERROR);
$postedData = $request->getPayload()->all();
$this->saveCodebookVariables($postedData);
}
$jsonCodebook = $this->codebookCollectionToJsonArray($dataset->getCodebook());
Expand Down
28 changes: 9 additions & 19 deletions src/Controller/FileManagementController.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
namespace App\Controller;

use App\Entity\Codebook\DatasetVariables;
use App\Entity\Dto\CsvConfigDto;
use App\Entity\FileManagement\AdditionalMaterial;
use App\Entity\FileManagement\Dataset;
use App\Service\Crud\Crudable;
Expand All @@ -15,6 +16,7 @@
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Attribute\MapRequestPayload;
use Symfony\Component\Routing\Attribute\Route;
use Symfony\Component\Security\Http\Attribute\IsGranted;

Expand Down Expand Up @@ -70,17 +72,11 @@ public function submitSav(Dataset $dataset): JsonResponse
}

#[Route(path: '/preview/csv/{id}', name: 'preview-csv', methods: ['POST'])]
public function previewCsv(Dataset $dataset, Request $request): JsonResponse
public function previewCsv(Dataset $dataset, #[MapRequestPayload] CsvConfigDto $csvConfig): JsonResponse
{
$this->logger->debug("Enter FileManagementController::previewCSVAction with [FileId: {$dataset->getId()}]");
$delimiter = $request->get('dataset-import-delimiter') ?? ',';
$escape = $request->get('dataset-import-escape') ?? 'double';
$headerRows = filter_var($request->get('dataset-import-header-rows'), FILTER_VALIDATE_INT);
if (!$headerRows) {
$headerRows = 0;
}

$data = $this->csvImportable->csvToArray($dataset->getStorageName(), $delimiter, $escape, $headerRows, 5);
$data = $this->csvImportable->csvToArray($dataset->getStorageName(), $csvConfig->datasetImportDelimiter, $csvConfig->datasetImportEscape, $csvConfig->datasetImportHeaderRows, 5);
if ($data === null) {
return new JsonResponse(null, Response::HTTP_UNPROCESSABLE_ENTITY);
}
Expand All @@ -89,22 +85,16 @@ public function previewCsv(Dataset $dataset, Request $request): JsonResponse
}

#[Route(path: '/submit/csv/{id}', name: 'submit-csv', methods: ['POST'])]
public function submitCSV(Dataset $dataset, Request $request): JsonResponse
public function submitCSV(Dataset $dataset, #[MapRequestPayload] CsvConfigDto $csvConfig): JsonResponse
{
$this->logger->debug("Enter FileManagementController::submitCSVAction with [FileId: {$dataset->getId()}]");
$delimiter = $request->get('dataset-import-delimiter') ?? ',';
$escape = $request->get('dataset-import-escape') ?? 'double';
$remove = $request->get('dataset-import-remove') ?? null;
$headerRows = filter_var($request->get('dataset-import-header-rows'), FILTER_VALIDATE_INT);
if (!$headerRows) {
$headerRows = 0;
}

$data = null;
$error = null;
if ($remove) {
if ($csvConfig->datasetImportRemove) {
$error = $this->crud->deleteDataset($dataset) ? false : 'error.import.csv.codebook.delete';
} else {
$data = $this->csvImportable->csvToArray($dataset->getStorageName(), $delimiter, $escape, $headerRows);
$data = $this->csvImportable->csvToArray($dataset->getStorageName(), $csvConfig->datasetImportDelimiter, $csvConfig->datasetImportEscape, $csvConfig->datasetImportHeaderRows);
if ($data && key_exists('header', $data) && is_iterable($data['header']) && sizeof($data['header']) > 0) {
$varId = 1;
foreach ($data['header'] as $var) {
Expand All @@ -128,7 +118,7 @@ public function submitCSV(Dataset $dataset, Request $request): JsonResponse
}
}

if ($error != null && !$remove) {
if ($error != null && !$csvConfig->datasetImportRemove) {
$this->crud->deleteDataset($dataset);
}

Expand Down
13 changes: 13 additions & 0 deletions src/Entity/Dto/CsvConfigDto.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?php

namespace App\Entity\Dto;

final readonly class CsvConfigDto
{
public function __construct(
public string $datasetImportDelimiter = ',',
public string $datasetImportEscape = 'double',
public int $datasetImportHeaderRows = 0,
public ?bool $datasetImportRemove = null,
) {}
}
12 changes: 6 additions & 6 deletions templates/pages/study/_datasetImportModal.html.twig
Original file line number Diff line number Diff line change
Expand Up @@ -21,18 +21,18 @@
data-submit-url="{{ path("File-submit-csv",{"id": " "}) }}">
<input type="hidden" id="dataset-file-id" name="dataset-file-id" value="">
<div class="flex items-baseline">
<label for="dataset-import-delimiter">Columns are separated by</label>
<select id="dataset-import-delimiter" name="dataset-import-delimiter"
<label for="datasetImportDelimiter">Columns are separated by</label>
<select id="datasetImportDelimiter" name="datasetImportDelimiter"
class="inline-block px-1 py-1 mt-1 bg-white border border-gray-400 rounded-md shadow-sm focus:outline-none ml-1.5">
<option value="," selected>Commas (CSV)</option>
<option value="t">Tabs (TSV)</option>
<option value=";">Semicolons</option>
</select>
</div>
<div class="flex items-baseline">
<label for="dataset-import-escape">Escape character to enclose cells containing column
<label for="datasetImportEscape">Escape character to enclose cells containing column
separators</label>
<select id="dataset-import-escape" name="dataset-import-escape"
<select id="datasetImportEscape" name="datasetImportEscape"
class="inline-block px-1 py-1 mt-1 ml-1.5 bg-white border border-gray-400 rounded-md shadow-sm focus:outline-none">
<option value="none" selected>none</option>
<option value="double">" (double quotes)</option>
Expand All @@ -41,9 +41,9 @@
</div>
<div x-data="{ useHeader: true}" class="mt-0.5">
<div class="flex items-center">
<input type="checkbox" id="dataset-import-header-rows" name="dataset-import-header-rows"
<input type="checkbox" id="datasetImportHeaderRows" name="datasetImportHeaderRows"
value="1" x-model="useHeader" class="w-4 h-4 mr-2">
<label class="block" for="dataset-import-header-rows">First line is the column
<label class="block" for="datasetImportHeaderRows">First line is the column
header</label>
</div>
</div>
Expand Down

0 comments on commit a635fb4

Please sign in to comment.