Skip to content
Snippets Groups Projects

Resolve "Data ingress for context information for tiki-wiki"

5 files
+ 301
17
Compare changes
  • Side-by-side
  • Inline
Files
5
<?php
namespace SmartDataContext\Controller;
use SmartDataContext\Persistence\MinIOClient;
use SmartDataContext\Persistence\SmartDataContextCrud;
use SmartDataContext\Persistence\DBManager;
use SmartDataContext\Domain\SmartDataContext;
@@ -8,8 +9,6 @@ use SmartDataContext\Domain\SmartDataContext;
use Slim\Psr7\Request;
use Slim\Psr7\Response;
use OpenApi\Attributes as OA;
class Crud {
private function _basicValidation($params, $request, $response) {
@@ -44,9 +43,6 @@ class Crud {
# Validate parameters
$errors = array_merge(
SmartDataContext::ValidateContent($content),
SmartDataContext::ValidateFeatures($features),
SmartDataContext::ValidateTimestamp($t0,$t1),
SmartDataContext::ValidateContent($content),
SmartDataContext::ValidateFeatures($features),
SmartDataContext::ValidateTimestamp($t0,$t1),
@@ -76,7 +72,10 @@ class Crud {
return $this->return_error($response, $errors, 400);
}
$smartdatacontextids = $this->_get_value_or_default($body, 'smartDataContextIds', []);
$smartdatacontextids = $this->_get_value_or_default($body, 'smartDataContextIds', null);
if (! isset($smartdatacontextids)) {
return $this->return_error($response, ['Missing smartDataContextIds'], 400);
}
if (! is_array($smartdatacontextids)) {
$smartdatacontextids = [$smartdatacontextids];
}
@@ -106,7 +105,10 @@ class Crud {
return $this->return_error($response, $errors, 400);
}
$smartdatacontextids = $this->_get_value_or_default($body, 'smartDataContextIds', []);
$smartdatacontextids = $this->_get_value_or_default($body, 'smartDataContextIds', null);
if (! isset($smartdatacontextids)) {
return $this->return_error($response, ['Missing smartDataContextIds'], 400);
}
if (! is_array($smartdatacontextids)) {
$smartdatacontextids = [$smartdatacontextids];
}
@@ -246,4 +248,198 @@ class Crud {
return $body[$key];
}
}
function update(Request $request, Response $response, array $params) {
// Basic validation
[$domain, $body, $errors] = $this->_basicValidation($params, $request, $response);
if ($errors) {
return $this->return_error($response, $errors, 400);
}
$id = $this->_get_value_or_default($params, 'id', null);
if (!$id) {
return $this->return_error($response, ["missing SmartDataContextID"], 400);
}
// Validate properties only present in the request body
$updateData = [];
if (isset($body['content'])) {
$contentErrors = SmartDataContext::ValidateContent($body['content']);
if ($contentErrors) {
$errors = array_merge($errors, $contentErrors);
}
$updateData['content'] = $body['content'];
}
if (isset($body['features'])) {
$featuresErrors = SmartDataContext::ValidateFeatures($body['features']);
if ($featuresErrors) {
$errors = array_merge($errors, $featuresErrors);
}
$updateData['features'] = $body['features'];
}
$t0Set = isset($body['t0']);
$t1Set = isset($body['t1']);
if ($t0Set && $t1Set) {
$timestampErrors = SmartDataContext::ValidateTimestamp($body['t0'], $body['t1']);
if ($timestampErrors) {
$errors = array_merge($errors, $timestampErrors);
}
$updateData['t0'] = $body['t0'];
$updateData['t1'] = $body['t1'];
} elseif ($t0Set || $t1Set) {
// Error if only one of t0 or t1 is set
$errors[] = "Both t0 and t1 must be provided together.";
}
if (isset($body['smartDataSources'])) {
$smartDataSourcesErrors = SmartDataContext::ValidateSmartDataSources($body['smartDataSources']);
if ($smartDataSourcesErrors) {
$errors = array_merge($errors, $smartDataSourcesErrors);
}
$updateData['smartDataSources'] = $body['smartDataSources'];
}
if (isset($body['smartDataUnits'])) {
$smartDataUnitsErrors = SmartDataContext::ValidateSmartDataUnits($body['smartDataUnits']);
if ($smartDataUnitsErrors) {
$errors = array_merge($errors, $smartDataUnitsErrors);
}
$updateData['smartDataUnits'] = $body['smartDataUnits'];
}
if ($errors) {
return $this->return_error($response, $errors, 400);
}
// Call the update method from SmartDataContextCrud
$persistence = new SmartDataContextCrud($this->_get_db());
$result = $persistence->update($domain, $id, $updateData);
if ($result['success']) {
return $this->return_json($response, $result['contents']);
} else {
return $this->return_error($response, $result['errors'], 400);
}
}
function addUnstructuredData(Request $request, Response $response, array $params) {
$domain = $this->_get_value_or_default($params, 'domain', null);
$errors = [];
if (! $domain) {
$errors[] = "missing domain";
}
$smartdatacontextid = $this->_get_value_or_default($params, 'id', null);
if (! $smartdatacontextid) {
$errors[] = "missing SmartDataContext ID";
}
$contentype = $request->getHeader("Content-Type")[0];
if (! $contentype) {
$errors[] = "missing Header Content-Type";
}
$filename = $request->getHeader("Filename")[0];
if (! $filename) {
$errors[] = "missing Header Filename";
}
if ($errors) {
return $this->return_error($response, $errors, 400);
}
$persistence = new SmartDataContextCrud($this->_get_db());
$minio = new MinIOClient();
$objectid = $minio->storeUnstructuredData($domain, $request->getBody());
$result = $persistence->addUnstructuredData($domain, $smartdatacontextid, $objectid, $contentype, $filename);
if ($result['success']) {
return $this->return_json($response, ["objectId" => $objectid]);
} else {
$minio->deleteObject($domain, $objectid);
return $this->return_error($response, $result['errors'], 400);
}
}
function removeUnstructuredData(Request $request, Response $response, array $params) {
[$domain, $body, $errors] = $this->_basicValidation($params, $request, $response);
if ($errors) {
return $this->return_error($response, $errors, 400);
}
$errors = [];
$smartdatacontextid = $this->_get_value_or_default($body, 'smartDataContextId', null);
if (! isset($smartdatacontextid)) {
$errors[] = 'Missing smartDataContextId';
}
$objectid = $this->_get_value_or_default($body, 'objectId', null);
if (! isset($objectid)) {
$errors[] = 'Missing objectId';
}
if ($errors) {
return $this->return_error($response, $errors, 400);
}
$minio = new MinIOClient();
$persistence = new SmartDataContextCrud($this->_get_db());
$result = $persistence->removeUnstructuredData($domain, $smartdatacontextid, $objectid);
if ($result['success']) {
$minio->deleteObject($domain, $objectid);
return $this->return_json($response, $result['result']);
} else {
return $this->return_error($response, $result['errors'], 400);
}
}
function getUnstructuredData(Request $request, Response $response, array $params) {
[$domain, $body, $errors] = $this->_basicValidation($params, $request, $response);
$smartdatacontextid = $this->_get_value_or_default($body, 'smartDataContextId', null);
if (! isset($domain)) {
$errors[] = "missing smartDataContextId";
}
$objectid = $this->_get_value_or_default($body, 'objectId', null);
if (! isset($domain)) {
$errors[] = "missing objectId";
}
if ($errors) {
return $this->return_error($response, $errors, 400);
}
$persistence = new SmartDataContextCrud($this->_get_db());
$smartdatacontext = $persistence->get($domain, $smartdatacontextid);
if (!$smartdatacontext['success']) {
return $this->return_error($response, ['SmartDataContext not found!'], 500);
}
if (!$smartdatacontext['contents']['unstructuredData']) {
return $this->return_error($response, ['SmartDataContext without unstructured data!'], 500);
}
$objectMetaData = null;
foreach ($smartdatacontext['contents']['unstructuredData'] as $unstructuredData) {
if ($unstructuredData['id'] == $objectid) {
$objectMetaData = $unstructuredData;
break;
}
}
if (!$objectMetaData) {
return $this->return_error($response, ['objectId not found!'], 500);
}
$minio = new MinIOClient();
$objectStream = $minio->getObject($domain, $objectid);
if ($objectStream) {
$response = $response
->withHeader('Content-Type', $objectMetaData['mimetype'])
->withHeader('Content-Disposition', 'attachment; filename="' . $objectMetaData['filename'] . '"');
return $response->withBody($objectStream);
} else {
return $this->return_error($response, ["Failed to retrieve object from MinIO"], 500);
}
}
}
\ No newline at end of file
Loading