Merge pull request #9947 from appwrite/add-readable-error

Add readable error for csv imports
This commit is contained in:
Jake Barnby 2025-06-17 14:51:34 -04:00 committed by GitHub
commit 5d62613cbc
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 52 additions and 20 deletions

View file

@ -1286,6 +1286,7 @@ return [
]
],
],
'deployments' => [
'$collection' => ID::custom(Database::METADATA),
'$id' => ID::custom('deployments'),

View file

@ -185,13 +185,33 @@ class Migrations extends Action
*/
protected function updateMigrationDocument(Document $migration, Document $project, Realtime $queueForRealtime): Document
{
$errorMessages = [];
$clonedMigrationDocument = clone $migration;
// we cannot use #sensitive because
// `errors` is nested which requires an override.
$errors = $clonedMigrationDocument->getAttribute('errors', []);
foreach ($errors as $error) {
$decoded = json_decode($error, true);
if (is_array($decoded) && isset($decoded['trace'])) {
unset($decoded['trace']);
$errorMessages[] = json_encode($decoded);
}
}
// set the errors back without trace
$clonedMigrationDocument->setAttribute('errors', $errorMessages);
/** Trigger Realtime Events */
$queueForRealtime
->setProject($project)
->setSubscribers(['console', $project->getId()])
->setEvent('migrations.[migrationId].update')
->setParam('migrationId', $migration->getId())
->setPayload($migration->getArrayCopy())
->setPayload($clonedMigrationDocument->getArrayCopy(), ['options', 'credentials'])
->trigger();
return $this->dbForProject->updateDocument('migrations', $migration->getId(), $migration);
@ -306,26 +326,13 @@ class Migrations extends Action
$errorMessages = [];
foreach ($sourceErrors as $error) {
$message = "Error occurred while fetching '{$error->getResourceName()}:{$error->getResourceId()}' from source with message: '{$error->getMessage()}'";
if ($error->getPrevious()) {
$message .= " Message: ".$error->getPrevious()->getMessage() . " File: ".$error->getPrevious()->getFile() . " Line: ".$error->getPrevious()->getLine();
}
$errorMessages[] = $message;
$errorMessages[] = json_encode($error);
}
foreach ($destinationErrors as $error) {
$message = "Error occurred while pushing '{$error->getResourceName()}:{$error->getResourceId()}' to destination with message: '{$error->getMessage()}'";
if ($error->getPrevious()) {
$message .= " Message: ".$error->getPrevious()->getMessage() . " File: ".$error->getPrevious()->getFile() . " Line: ".$error->getPrevious()->getLine();
}
/** @var MigrationException $error */
$errorMessages[] = $message;
$errorMessages[] = json_encode($error);
}
$migration->setAttribute('errors', $errorMessages);
$this->updateMigrationDocument($migration, $projectDocument, $queueForRealtime);
return;
}
@ -355,12 +362,10 @@ class Migrations extends Action
$errorMessages = [];
foreach ($sourceErrors as $error) {
/** @var MigrationException $error */
$errorMessages[] = "Error occurred while fetching '{$error->getResourceName()}:{$error->getResourceId()}' from source with message '{$error->getMessage()}'";
$errorMessages[] = json_encode($error);
}
foreach ($destinationErrors as $error) {
/** @var MigrationException $error */
$errorMessages[] = "Error occurred while pushing '{$error->getResourceName()}:{$error->getResourceId()}' to destination with message '{$error->getMessage()}'";
$errorMessages[] = json_encode($error);
}
$migration->setAttribute('errors', $errorMessages);

View file

@ -4,6 +4,7 @@ namespace Appwrite\Utopia\Response\Model;
use Appwrite\Utopia\Response;
use Appwrite\Utopia\Response\Model;
use Utopia\Database\Document;
class Migration extends Model
{
@ -107,4 +108,29 @@ class Migration extends Model
{
return Response::MODEL_MIGRATION;
}
public function filter(Document $document): Document
{
$errors = $document->getAttribute('errors', []);
if (empty($errors)) {
return $document;
}
foreach ($errors as $index => $error) {
$decoded = json_decode($error, true);
// frontend doesn't need too many details.
if (is_array($decoded)) {
$errors[$index] = json_encode([
'code' => $decoded['code'] ?? 0,
'message' => $decoded['message'] ?? null,
]);
}
}
// errors now only have code and message.
$document->setAttribute('errors', $errors);
return $document;
}
}