diff --git a/src/Appwrite/Migration/Version/V18.php b/src/Appwrite/Migration/Version/V18.php new file mode 100644 index 000000000..6fddab5b3 --- /dev/null +++ b/src/Appwrite/Migration/Version/V18.php @@ -0,0 +1,103 @@ + null, + fn () => [] + ); + } + + Console::log('Migrating Project: ' . $this->project->getAttribute('name') . ' (' . $this->project->getId() . ')'); + + Console::info('Migrating Collections'); + $this->migrateCollections(); + + Console::info('Migrating Documents'); + $this->forEachDocument([$this, 'fixDocument']); + } + + /** + * Migrate all Collections. + * + * @return void + */ + protected function migrateCollections(): void + { + foreach ($this->collections as $collection) { + $id = $collection['$id']; + + Console::log("Migrating Collection \"{$id}\""); + + $this->projectDB->setNamespace("_{$this->project->getInternalId()}"); + + switch ($id) { + case 'users': + try { + /** + * Create 'passwordHistory' attribute + */ + $this->createAttributeFromCollection($this->projectDB, $id, 'passwordHistory'); + $this->projectDB->deleteCachedCollection($id); + } catch (\Throwable $th) { + Console::warning("'region' from {$id}: {$th->getMessage()}"); + } + break; + default: + break; + } + + usleep(50000); + } + } + + /** + * Fix run on each document + * + * @param \Utopia\Database\Document $document + * @return \Utopia\Database\Document + */ + protected function fixDocument(Document $document) + { + switch ($document->getCollection()) { + case 'projects': + /** + * Bump version number. + */ + $document->setAttribute('version', '1.2.0'); + break; + case 'users': + /** + * Bump version number. + */ + $document->setAttribute('passwordHistory', []); + + /** + * Set default passwordHistory + */ + $document->setAttribute('auths', array_merge($document->getAttribute('auths', []), [ + 'passwordHistory' => 0 + ])); + + break; + } + + return $document; + } +}