tethys/app/Http/Controllers/Publish/IndexController.php
Arno Kaimbacher faa68cc223 8. Minimum 4 char bei den Atributen Titel und zusätzliche Titel (server und clientseitig)
8.1. Minimum 4 Charactaer bei den Atributen Description und zusätzliche Beschreibungen (server und clientseitig)
9. einheitliches Löschsymbol bei (zusätliche Titel, zusätzliche Beschreibungen, Keywords, Files und Datas References
16. Reject note vom Editor und Reviewer maximal 500 Zeichen (client- und serverseitig)
 - Datenbankänderungen auch vorgenommen
18. Edit Button am Ende nachdem ein Datesatz angelegt wurde
23. Vue Component "PersonTable" auf TypeScript umgeschrieben
2020-06-10 21:09:27 +02:00

726 lines
29 KiB
PHP

<?php
//https://www.5balloons.info/multi-page-step-form-in-laravel-with-validation/
namespace App\Http\Controllers\Publish;
use App\Models\Dataset;
use App\Http\Controllers\Controller;
use App\Models\License;
use App\Models\File;
use App\Models\Project;
use App\Models\Title;
use App\Models\Description;
use App\Rules\RdrFiletypes;
use App\Rules\RdrFilesize;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Validator;
use App\Models\DatasetReference;
use App\Models\Subject;
use App\Models\Page;
use App\Models\Person;
use Illuminate\Support\Facades\Auth;
use App\Models\Coverage;
class IndexController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$builder = Dataset::query();
$datasets = $builder
//->where('server_state', 'inprogress')
->whereIn('server_state', ['inprogress', 'unpublished'])
->get();
return view('publish.index', compact('datasets'));
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function createStep1(Request $request)
{
#$dataset = $request->session()->get('dataset');
$licenses = License::select('id', 'name_long', 'link_licence')
->orderBy('sort_order')
->get();
$languages = DB::table('languages')
->where('active', true)
->pluck('part1', 'part1');
// ->toArray();
// $projects = Project::pluck('label', 'id');
$relatedIdentifierTypes = ["doi", "handle", "isbn", "issn", "url", "urn"];
$relatedIdentifierTypes = array_combine($relatedIdentifierTypes, $relatedIdentifierTypes);
$relationTypes = ["IsCitedBy", "Cites", "IsSupplementTo", "IsSupplementedBy", "IsContinuedBy", "Continues", "HasMetadata", "IsMetadataFor","IsNewVersionOf", "IsPreviousVersionOf", "IsPartOf", "HasPart", "IsReferencedBy", "References", "IsDocumentedBy", "Documents", "IsCompiledBy", "Compiles", "IsVariantFormOf", "IsOriginalFormOf", "IsIdenticalTo", "IsReviewedBy", "Reviews", "IsDerivedFrom", "IsSourceOf"];
$relationTypes = array_combine($relationTypes, $relationTypes);
$titleTypes = ['Sub' => 'Sub', 'Alternative' => 'Alternative', 'Translated' => 'Translated', 'Other' => 'Other'];
$keywordTypes = ['uncontrolled' => 'uncontrolled'];
$descriptionTypes = ['Methods' => 'Methods', 'Series_information' => 'Series_information', 'Technical_info' => 'Technical_info', 'Translated' => 'Translated', 'Other' => 'Other'];
$page = Page::query()->where('page_slug', 'terms-and-conditions')->firstOrFail();
//$relationTypes = array('updates' => 'updates', 'updated-by' => 'updated-by', 'other' => 'other');
return view(
'publish.create-step1',
compact('licenses', 'languages', 'relatedIdentifierTypes', 'relationTypes', 'titleTypes', 'keywordTypes', 'descriptionTypes', 'page')
);
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function storeStep1(Request $request)
{
$validatedData = $this->validate($request, [
'Type' => 'required|min:4',
'rights' => 'required|boolean|in:1',
]);
// $validatedData = $request->validate([
// 'name' => 'required|unique:products',
// 'amount' => 'required|numeric',
// 'company' => 'required',
// 'available' => 'required',
// 'description' => 'required',
// ]);
if (empty($request->session()->get('dataset'))) {
// $dataset = new Dataset();
//$dataset->fill($validatedData);
// $dataset->type = $request->input('type');
$dataset = $request->except('rights', '_token');
$request->session()->put('dataset', $dataset);
} else {
$dataset = $request->session()->get('dataset');
//$dataset->fill($validatedData);
$dataset['Type'] = $request->input('Type');
$request->session()->put('dataset', $dataset);
}
return redirect()->route('dataset.create2');
}
/**
* Show the step 2 Form for creating a new dataset.
*
* @return \Illuminate\Http\Response
*/
public function createStep2(Request $request)
{
//if no dataset is'nt in session variable return to step1
if (empty($request->session()->get('dataset'))) {
return redirect()->route('dataset.create1');
}
$dataset = $request->session()->get('dataset');
//fill select variable
$languages = DB::table('languages')
->where('active', true)
->pluck('part2_t', 'part2_t');
return view('publish.create-step2', compact('dataset', 'languages'));
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function storeStep2(Request $request)
{
$validatedData = $this->validate($request, [
'Type' => 'required|min:4',
'BelongsToBibliography' => 'required|boolean',
"TitleMain.Value" => 'required|min:5|max:255',
"TitleMain.Language" => 'required|min:3',
"TitleAbstract.Value" => 'required|min:5|max:255',
"TitleAbstract.Language" => 'required|min:3',
]);
$optionalData = $request->all();
// $dataset = $request->except('rights', '_token', 'input_img');
$dataset = $request->session()->get('dataset');
//update dataset with validated data
$dataset['Type'] = $validatedData['Type'];
$dataset['BelongsToBibliography'] = $validatedData['BelongsToBibliography'];
$dataset['TitleMain']['Value'] = $validatedData['TitleMain']['Value'];
$dataset['TitleMain']['Language'] = $validatedData['TitleMain']['Language'];
$dataset['TitleAbstract']['Value'] = $validatedData['TitleAbstract']['Value'];
$dataset['TitleAbstract']['Language'] = $validatedData['TitleAbstract']['Language'];
if (isset($optionalData['CreatingCorporation'])) {
$dataset['CreatingCorporation'] = $optionalData['CreatingCorporation'];
}
if (isset($optionalData['EmbargoDate'])) {
$dataset['EmbargoDate'] = $optionalData['EmbargoDate'];
}
if (!isset($dataset['DatasetFile'])) {
$this->validate($request, [
'dataset_file' => 'required|image|mimes:jpeg,png,jpg,gif,svg|max:2048',
]);
//update session variable
// $dataset = $request->session()->get('dataset');
$image = $request->file('dataset_file');
$fileName = "productImage-" . time() . '.' . $image->getClientOriginalExtension();
$path = $image->storeAs(
'files',
$fileName
);
// $path = Storage::putFile('files', $image, $fileName);
//$dataset = $request->session()->get('dataset');
$dataset['DatasetFile'] = $fileName;
}
$request->session()->put('dataset', $dataset);
return redirect()->route('dataset.create3');
}
/**
* Show the Product Review page
*
* @return \Illuminate\Http\Response
*/
public function createStep3(Request $request)
{
//if no dataset is'nt in session variable return to step1
if (empty($request->session()->get('dataset'))) {
return redirect()->route('dataset.create1');
}
$dataset = $request->session()->get('dataset');
return view('publish.create-step3', compact('dataset'));
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function storeTest(Request $request)
{
//$data = $request->all();
$data = json_decode($request->getContent(), true);
$validator = Validator::make($data, [
'type' => 'required|min:4',
'belongs_to_bibliography' => 'required|boolean',
]);
if ($validator->passes()) {
//TODO Handle your data
return response()->json(array(
'response' => 'success'));
} else {
//TODO Handle your error
//pass validator errors as errors object for ajax response
return response()->json(['errors' => $validator->errors()->all()], 422);
}
}
//https://laravel.io/forum/06-11-2014-how-to-save-eloquent-model-with-relations-in-one-go
//attach vs save https://stackoverflow.com/questions/35756469/laravel-5-many-to-many-attach-versus-save
public function store(Request $request)
{
$data = $request->all();
// $validatedData = $this->validate($request, [
// 'type' => 'required|min:4',
// 'rights' => 'required|boolean|in:1',
// ]);
$rules = [
// 'server_state' => 'required',
'type' => 'required|min:5',
'rights' => 'required|boolean|in:1',
'belongs_to_bibliography' => 'required|boolean',
'title_main.value' => 'required|min:4',
'title_main.language' => 'required',
'abstract_main.value' => 'required|min:4',
'abstract_main.language' => 'required',
'coverage.x_min' => [
'nullable',
'regex:/^[-]?((((1[0-7][0-9])|([0-9]?[0-9]))\.(\d+))|180(\.0+)?)$/'
],
'coverage.y_min' => [
'nullable',
'regex:/^[-]?(([0-8]?[0-9])\.(\d+))|(90(\.0+)?)$/'
],
'coverage.x_max' => [
'nullable',
'regex:/^[-]?((((1[0-7][0-9])|([0-9]?[0-9]))\.(\d+))|180(\.0+)?)$/'
],
'coverage.y_max' => [
'nullable',
'regex:/^[-]?(([0-8]?[0-9])\.(\d+))|(90(\.0+)?)$/'
],
];
if (null != $request->file('files')) {
$files = count($request->file('files')) - 1;
foreach (range(0, $files) as $index) {
// $rules['files.' . $index] = 'image|max:2048';
$rules['files.' . $index . '.file'] = [new RdrFilesize($index + 1), 'file', 'required', new RdrFiletypes()];
}
}
$validator = Validator::make($request->all(), $rules);
if ($validator->passes()) {
//store dataset todo
//$data = $request->all();
$input = $request->except('files', 'licenses', 'abstract_main', 'title_main', 'references', 'titles');
// array_push($input, "Himbeere");
// $input += ['server_state' => 'created' ];
if (isset($data['server_state'])) {
$input['server_state'] = $data['server_state'];
} else {
$input['server_state'] = 'inprogress';
}
$dataset = new Dataset($input);
DB::beginTransaction(); //Start transaction!
try {
$dataset->save();
//store related files
if (isset($data['files'])) {
foreach ($data['files'] as $uploadedFile) {
$file = $uploadedFile['file'];
$label = urldecode($uploadedFile['label']);
$sorting = $uploadedFile['sorting'];
$fileName = "file-" . time() . '.' . $file->getClientOriginalExtension();
$mimeType = $file->getMimeType();
$datasetFolder = 'files/' . $dataset->id;
$path = $file->storeAs($datasetFolder, $fileName);
$size = Storage::size($path);
//$path = Storage::putFile('files', $image, $fileName);
$file = new File([
'path_name' => $path,
'file_size' => $size,
'mime_type' => $mimeType,
'label' => $label,
'sort_order' => $sorting,
'visible_in_frontdoor' => 1,
'visible_in_oai' => 1
]);
//$test = $file->path_name;
$dataset->files()->save($file);
$file->createHashValues();
}
}
//store licenses:
$licenses = $request->input('licenses');
$dataset->licenses()->sync($licenses);
$data_to_sync = [];
//store authors
if (isset($data['authors'])) {
//$data_to_sync = [];
foreach ($request->get('authors') as $key => $person) {
$pivot_data = ['role' => 'author', 'sort_order' => $key + 1];
// if ($galery_id == $request->get('mainPicture')) $pivot_data = ['main' => 1];
if (isset($person['id'])) {
//$data_to_sync[$person['id']] = $pivot_data;
$dataset->persons()->attach($person['id'], $pivot_data);
} else {
$dataPerson = new Person($person);
$dataPerson->status = true;
$dataPerson->name_type = "Organizational";
$dataset->persons()->save($dataPerson, $pivot_data);
}
}
//$dataset->persons()->sync($data_to_sync);
}
//store contributors
// if (isset($data['contributors'])) {
// //$data_to_sync = [];
// foreach ($request->get('contributors') as $key => $contributor_id) {
// $pivot_data = ['role' => 'contributor', 'sort_order' => $key + 1];
// //$data_to_sync[$contributor_id] = $pivot_data;
// $dataset->persons()->attach($contributor_id, $pivot_data);
// }
// //$dataset->persons()->sync($data_to_sync);
// }
if (isset($data['contributors'])) {
//$data_to_sync = [];
foreach ($request->get('contributors') as $key => $contributor) {
$pivot_data = ['role' => 'contributor', 'sort_order' => $key + 1];
if (isset($contributor['id'])) {
//$data_to_sync[$person['id']] = $pivot_data;
$dataset->persons()->attach($contributor['id'], $pivot_data);
} else {
$dataContributor = new Person($contributor);
$dataContributor->status = true;
$dataContributor->name_type = "Organizational";
$dataset->persons()->save($dataContributor, $pivot_data);
}
}
}
//store submitters
// if (isset($data['submitters'])) {
// //$data_to_sync = [];
// foreach ($request->get('submitters') as $key => $submitter_id) {
// $pivot_data = ['role' => 'submitter', 'sort_order' => $key + 1];
// $data_to_sync[$submitter_id] = $pivot_data;
// }
// //$dataset->persons()->sync($data_to_sync);
// }
//$dataset->persons()->sync($data_to_sync);
//save main title:
if (isset($data['title_main'])) {
$formTitle = $request->input('title_main');
$title = new Title();
$title->value = $formTitle['value'];
$title->language = $formTitle['language'];
$title->type = 'Main';
//$dataset->addMainTitle($title);
$dataset->titles()->save($title);
}
//save additional titles
if (isset($data['titles'])) {
foreach ($request->get('titles') as $key => $title) {
$titleReference = new Title($title);
$dataset->titles()->save($titleReference);
}
}
//save main abstract:
if (isset($data['abstract_main'])) {
$formAbstract = $request->input('abstract_main');
$abstract = new Description();
$abstract->value = $formAbstract['value'];
$abstract->language = $formAbstract['language'];
$abstract->type = 'Abstract';
//$dataset->addMainAbstract($abstract);
$dataset->abstracts()->save($abstract);
}
//save additional descriptions
if (isset($data['descriptions'])) {
foreach ($request->get('descriptions') as $key => $description) {
$descriptionReference = new Description($description);
$dataset->abstracts()->save($descriptionReference);
}
}
//save references
if (isset($data['references'])) {
foreach ($request->get('references') as $key => $reference) {
$dataReference = new DatasetReference($reference);
$dataset->references()->save($dataReference);
}
}
//save keywords
if (isset($data['keywords'])) {
foreach ($request->get('keywords') as $key => $keyword) {
$dataKeyword = new Subject($keyword);
$dataset->subjects()->save($dataKeyword);
}
}
// if (isset($data['geolocation'])) {
// $formGeolocation = $request->input('geolocation');
// if ($formGeolocation['xmin'] !== null && $formGeolocation['ymin'] !== null &&
// $formGeolocation['xmax'] !== null && $formGeolocation['ymax'] !== null) {
// $geolocation = new GeolocationBox($formGeolocation);
// $dataset->geolocation()->save($geolocation);
// //$geolocation->dataset()->associate($dataset)->save();
// }
// }
if (isset($data['coverage'])) {
$formCoverage = $request->input('coverage');
$coverage = new Coverage($formCoverage);
$dataset->coverage()->save($coverage);
//$coverage->dataset()->associate($dataset)->save();
}
// Create relation between Dataset and actual User.
$user = Auth::user();
$dataset->user()->associate($user)->save();
// $error = 'Always throw this error';
// throw new \Exception($error);
// all good//commit everything
DB::commit();
} catch (\Exception $e) {
DB::rollback();
if (isset($datasetFolder)) {
Storage::deleteDirectory($datasetFolder);
}
return response()->json([
'success' => false,
'error' => [
'code' => $e->getCode(),
'message' => $e->getMessage(),
],
], 422);
//throw $e;
} catch (\Throwable $e) {
DB::rollback();
if (isset($datasetFolder)) {
Storage::deleteDirectory($datasetFolder);
}
return response()->json([
'success' => false,
'error' => [
'code' => $e->getCode(),
'message' => $e->getMessage(),
],
], 422);
//throw $e;
}
return response()->json(array(
'success' => true,
'edit' => route('publish.workflow.submit.edit', ['id' => $dataset->id]),
'release' => route('publish.workflow.submit.release', ['id' => $dataset->id]),
'delete' => route('publish.workflow.submit.delete', ['id' => $dataset->id]),
));
} else {
//TODO Handle validation error
//pass validator errors as errors object for ajax response
$errors = $validator->errors();
return response()->json([
'success' => false,
'errors' => $errors->all(),
], 422);
}
}
public function storeTest1(Request $request)
{
$data = $request->all();
// $validatedData = $this->validate($request, [
// 'type' => 'required|min:4',
// 'rights' => 'required|boolean|in:1',
// ]);
$rules = [
'server_state' => 'required',
'type' => 'required|min:5',
'rights' => 'required|boolean|in:1',
'belongs_to_bibliography' => 'required|boolean',
'title_main.value' => 'required|min:5',
'title_main.language' => 'required',
'abstract_main.value' => 'required|min:5',
'abstract_main.language' => 'required',
];
if (null != $request->file('files')) {
$files = count($request->file('files')) -1;
foreach (range(0, $files) as $index) {
// $rules['files.' . $index] = 'image|max:2048';
$rules['files.' . $index . '.file'] = ['required', 'file', new RdrFiletypes(), new RdrFilesize($index)];
}
}
$validator = Validator::make($request->all(), $rules);
if ($validator->passes()) {
//store dataset todo
//$data = $request->all();
$input = $request->except('files', 'licenses', 'abstract_main', 'title_main', 'references');
// array_push($input, "Himbeere");
$dataset = new Dataset($input);
DB::beginTransaction(); //Start transaction!
try {
// $dataset->save();
//store related files
if (isset($data['files'])) {
foreach ($data['files'] as $uploadedFile) {
$file = $uploadedFile['file'];
$label = urldecode($uploadedFile['label']);
$sorting = $uploadedFile['sorting'];
$fileName = "file-" . time() . '.' . $file->getClientOriginalExtension();
$mimeType = $file->getMimeType();
$datasetFolder = 'files/' . $dataset->id;
// $path = $file->storeAs($datasetFolder, $fileName);
// $size = Storage::size($path);
//$path = Storage::putFile('files', $image, $fileName);
// $file = new File([
// 'path_name' => $path,
// 'file_size' => $size,
// 'mime_type' => $mimeType,
// 'label' => $label,
// 'sort_order' => $sorting,
// 'visible_in_frontdoor' => 1,
// 'visible_in_oai' => 1
// ]);
//$test = $file->path_name;
// $dataset->files()->save($file);
// $file->createHashValues();
}
}
//store licenses:
$licenses = $request->input('licenses');
// $dataset->licenses()->sync($licenses);
//store authors
if (isset($data['authors'])) {
$data_to_sync = [];
foreach ($request->get('authors') as $key => $person_id) {
$pivot_data = ['role' => 'author', 'sort_order' => $key + 1];
// if ($galery_id == $request->get('mainPicture')) $pivot_data = ['main' => 1];
$data_to_sync[$person_id] = $pivot_data;
}
// $dataset->persons()->sync($data_to_sync);
}
//store contributors
if (isset($data['contributors'])) {
$data_to_sync = [];
foreach ($request->get('contributors') as $key => $contributor_id) {
$pivot_data = ['role' => 'contributor', 'sort_order' => $key + 1];
$data_to_sync[$contributor_id] = $pivot_data;
}
// $dataset->persons()->sync($data_to_sync);
}
//store submitters
if (isset($data['submitters'])) {
$data_to_sync = [];
foreach ($request->get('submitters') as $key => $submitter_id) {
$pivot_data = ['role' => 'submitter', 'sort_order' => $key + 1];
$data_to_sync[$submitter_id] = $pivot_data;
}
// $dataset->persons()->sync($data_to_sync);
}
//save main title:
if (isset($data['title_main'])) {
$formTitle = $request->input('title_main');
$title = new Title();
$title->value = $formTitle['value'];
$title->language = $formTitle['language'];
// $dataset->addMainTitle($title);
}
//save main abstract:
if (isset($data['abstract_main'])) {
$formAbstract = $request->input('abstract_main');
$abstract = new Title();
$abstract->value = $formAbstract['value'];
$abstract->language = $formAbstract['language'];
// $dataset->addMainAbstract($abstract);
}
//save references
if (isset($data['references'])) {
foreach ($request->get('references') as $key => $reference) {
$dataReference = new DatasetReference($reference);
// $dataset->references()->save($dataReference);
}
}
// $error = 'Always throw this error';
// throw new \Exception($error);
// all good//commit everything
// DB::commit();
} catch (\Exception $e) {
DB::rollback();
if (isset($datasetFolder)) {
Storage::deleteDirectory($datasetFolder);
}
return response()->json([
'success' => false,
'error' => [
'code' => $e->getCode(),
'message' => $e->getMessage(),
],
], 422);
//throw $e;
} catch (\Throwable $e) {
DB::rollback();
if (isset($datasetFolder)) {
Storage::deleteDirectory($datasetFolder);
}
return response()->json([
'success' => false,
'error' => [
'code' => $e->getCode(),
'message' => $e->getMessage(),
],
], 422);
//throw $e;
}
return response()->json(array(
'success' => true,
'redirect' => route('settings.document.edit', ['id' => $dataset->server_state]),
));
} else {
//TODO Handle validation error
//pass validator errors as errors object for ajax response
return response()->json([
'success' => false,
'errors' => $validator->errors()->all(),
], 422);
}
}
/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
//
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function edit($id)
{
//
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
//
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id)
{
//
}
}