upgrade functionality for v2.0.10

This commit is contained in:
Čarodej
2022-03-30 13:36:28 +02:00
parent 621f6770c5
commit d362b37cd3
10 changed files with 229 additions and 71 deletions

View File

@@ -60,4 +60,8 @@ return [
],
],
],
'updates' => [
'2_0_10',
],
];

93
package-lock.json generated
View File

@@ -1231,9 +1231,9 @@
}
},
"@stripe/stripe-js": {
"version": "1.24.0",
"resolved": "https://registry.npmjs.org/@stripe/stripe-js/-/stripe-js-1.24.0.tgz",
"integrity": "sha512-8CEILOpzoRhGwvgcf6y+BlPyEq1ZqxAv3gsX7LvokFYvbcyH72GRcHQMGXuZS3s7HqfYQuTSFrvZNL/qdkgA9Q=="
"version": "1.26.0",
"resolved": "https://registry.npmjs.org/@stripe/stripe-js/-/stripe-js-1.26.0.tgz",
"integrity": "sha512-4R1vC75yKaCVFARW3bhelf9+dKt4NP4iZY/sIjGK7AAMBVvZ47eG74NvsAIUdUnhOXSWFMjdFWqv+etk5BDW4g=="
},
"@trysound/sax": {
"version": "0.2.0",
@@ -2088,17 +2088,50 @@
"dev": true
},
"autoprefixer": {
"version": "10.4.2",
"resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.2.tgz",
"integrity": "sha512-9fOPpHKuDW1w/0EKfRmVnxTDt8166MAnLI3mgZ1JCnhNtYWxcJ6Ud5CO/AVOZi/AvFa8DY9RTy3h3+tFBlrrdQ==",
"version": "10.4.4",
"resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.4.tgz",
"integrity": "sha512-Tm8JxsB286VweiZ5F0anmbyGiNI3v3wGv3mz9W+cxEDYB/6jbnj6GM9H9mK3wIL8ftgl+C07Lcwb8PG5PCCPzA==",
"dev": true,
"requires": {
"browserslist": "^4.19.1",
"caniuse-lite": "^1.0.30001297",
"fraction.js": "^4.1.2",
"browserslist": "^4.20.2",
"caniuse-lite": "^1.0.30001317",
"fraction.js": "^4.2.0",
"normalize-range": "^0.1.2",
"picocolors": "^1.0.0",
"postcss-value-parser": "^4.2.0"
},
"dependencies": {
"browserslist": {
"version": "4.20.2",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz",
"integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==",
"dev": true,
"requires": {
"caniuse-lite": "^1.0.30001317",
"electron-to-chromium": "^1.4.84",
"escalade": "^3.1.1",
"node-releases": "^2.0.2",
"picocolors": "^1.0.0"
}
},
"caniuse-lite": {
"version": "1.0.30001322",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001322.tgz",
"integrity": "sha512-neRmrmIrCGuMnxGSoh+x7zYtQFFgnSY2jaomjU56sCkTA6JINqQrxutF459JpWcWRajvoyn95sOXq4Pqrnyjew==",
"dev": true
},
"electron-to-chromium": {
"version": "1.4.101",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.101.tgz",
"integrity": "sha512-XJH+XmJjACx1S7ASl/b//KePcda5ocPnFH2jErztXcIS8LpP0SE6rX8ZxiY5/RaDPnaF1rj0fPaHfppzb0e2Aw==",
"dev": true
},
"node-releases": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz",
"integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==",
"dev": true
}
}
},
"aws-sign2": {
@@ -4159,9 +4192,9 @@
"dev": true
},
"fraction.js": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.2.tgz",
"integrity": "sha512-o2RiJQ6DZaR/5+Si0qJUIy637QMRudSi9kU/FFzx9EZazrIdnBgpU+3sEWCxAVhH2RtxW2Oz+T4p2o8uOPVcgA==",
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz",
"integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==",
"dev": true
},
"fresh": {
@@ -5252,9 +5285,9 @@
"dev": true
},
"laravel-echo": {
"version": "1.11.3",
"resolved": "https://registry.npmjs.org/laravel-echo/-/laravel-echo-1.11.3.tgz",
"integrity": "sha512-VNTnnoF8gK29ovxslnrFDt3xgrKiKKW1kTnKKO1A4kYVj4UCKmNO4x2ehRlfg2UTrG/oggwk95p+S9ftQYjXdw==",
"version": "1.11.4",
"resolved": "https://registry.npmjs.org/laravel-echo/-/laravel-echo-1.11.4.tgz",
"integrity": "sha512-zoWMT7Cb3QVYEq+gyZ/hQvE3sSIiFxZH6c2Wg6tAwg9hukwyOLbDLpy9XT5U1mIC0lK+HFLzetnbfCtrl00jEg==",
"dev": true
},
"laravel-mix": {
@@ -5980,9 +6013,9 @@
"integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ=="
},
"nanoid": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz",
"integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==",
"version": "3.3.2",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.2.tgz",
"integrity": "sha512-CuHBogktKwpm5g2sRgv83jEy2ijFzBwMoYA60orPDR7ynsLijJDqgsi4RDGj3OJpy3Ieb+LYwiRmIOGyytgITA==",
"dev": true
},
"negotiator": {
@@ -6657,9 +6690,9 @@
}
},
"postcss": {
"version": "8.4.8",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.8.tgz",
"integrity": "sha512-2tXEqGxrjvAO6U+CJzDL2Fk2kPHTv1jQsYkSoMeOis2SsYaXRO2COxTdQp99cYvif9JTXaAk9lYGc3VhJt7JPQ==",
"version": "8.4.12",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.12.tgz",
"integrity": "sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg==",
"dev": true,
"requires": {
"nanoid": "^3.3.1",
@@ -7029,9 +7062,9 @@
"dev": true
},
"prettier": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz",
"integrity": "sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==",
"version": "2.6.1",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-2.6.1.tgz",
"integrity": "sha512-8UVbTBYGwN37Bs9LERmxCPjdvPxlEowx2urIL6urHzdb3SDq4B/Z6xLFCblrSnE4iKWcS6ziJ3aOYrc1kz/E2A==",
"dev": true
},
"prettier-plugin-import-sort": {
@@ -8461,9 +8494,9 @@
"integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
},
"twemoji": {
"version": "13.1.0",
"resolved": "https://registry.npmjs.org/twemoji/-/twemoji-13.1.0.tgz",
"integrity": "sha512-e3fZRl2S9UQQdBFLYXtTBT6o4vidJMnpWUAhJA+yLGR+kaUTZAt3PixC0cGvvxWSuq2MSz/o0rJraOXrWw/4Ew==",
"version": "13.1.1",
"resolved": "https://registry.npmjs.org/twemoji/-/twemoji-13.1.1.tgz",
"integrity": "sha512-IIIoq+n1lk1M1+evBKZD3DO0ud02fDQ4ssbgAv8rp3YBWUeNmskjlisFUPPDacQ50XS3bhrd4Kq9Q2gqhxb0dg==",
"requires": {
"fs-extra": "^8.0.1",
"jsonfile": "^5.0.0",
@@ -8664,9 +8697,9 @@
"dev": true
},
"vue-i18n": {
"version": "8.27.0",
"resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-8.27.0.tgz",
"integrity": "sha512-SX35iJHL5PJ4Gfh0Mo/q0shyHiI2V6Zkh51c+k8E9O1RKv5BQyYrCxRzpvPrsIOJEnLaeiovet3dsUB0e/kDzw=="
"version": "8.27.1",
"resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-8.27.1.tgz",
"integrity": "sha512-lWrGm4F25qReJ7XxSnFVb2h3PfW54ldnM4C+YLBGGJ75+Myt/kj4hHSTKqsyDLamvNYpvINMicSOdW+7yuqgIQ=="
},
"vue-loader": {
"version": "15.9.8",

View File

@@ -10,13 +10,13 @@
"production": "mix --production"
},
"devDependencies": {
"autoprefixer": "^10.4.2",
"autoprefixer": "^10.4.4",
"axios": "^0.21.4",
"cross-env": "^5.1",
"laravel-echo": "^1.11.3",
"laravel-echo": "^1.11.4",
"laravel-mix": "^6.0.43",
"postcss": "^8.4.8",
"prettier": "^2.5.1",
"postcss": "^8.4.12",
"prettier": "^2.6.1",
"prettier-plugin-import-sort": "0.0.7",
"prettier-plugin-tailwindcss": "^0.1.8",
"pusher-js": "^7.0.6",
@@ -30,17 +30,17 @@
},
"dependencies": {
"@paypal/paypal-js": "^4.2.2",
"@stripe/stripe-js": "^1.24.0",
"@stripe/stripe-js": "^1.26.0",
"lodash": "^4.17.21",
"node-sass": "^4.14.1",
"pdfvuer": "^1.9.2",
"tailwind-scrollbar-hide": "^1.1.7",
"twemoji": "^13.1.0",
"twemoji": "^13.1.1",
"v-click-outside": "^3.1.2",
"vee-validate": "^3.4.14",
"vue": "^2.6.14",
"vue-feather-icons": "^5.1.0",
"vue-i18n": "^8.27.0",
"vue-i18n": "^8.27.1",
"vue-recaptcha-v3": "^1.9.0",
"vue-router": "^3.5.3",
"vuex": "^3.6.2"

View File

@@ -53,6 +53,18 @@
</div>
</div>
<!--New language strings alert-->
<div
v-if="true"
class="mb-6 flex items-center rounded-xl dark:bg-green-700/30 bg-green-200 p-5 shadow-card cursor-pointer"
@click="upgradeSystem"
>
<alert-octagon-icon size="18" class="vue-feather mr-4 shrink-0 dark:text-green-500 text-green-700" />
<p class="text-sm dark:text-green-500 text-green-700">
There is a new update that need upgrade some stuff on your backend. Please click on this box to upgrade.
</p>
</div>
<!--New language strings alert-->
<div
v-if="data.app.shouldUpgradeTranslations"
@@ -261,6 +273,21 @@ export default {
message: this.$t('popup_error.message'),
})
})
},
upgradeSystem() {
axios.get('/upgrade/system')
.then(() => {
events.$emit('toaster', {
type: 'success',
message: this.$t('Your app was upgraded successfully.'),
})
})
.catch(() => {
events.$emit('alert:open', {
title: this.$t('popup_error.title'),
message: this.$t('popup_error.message'),
})
})
}
},
created() {

View File

@@ -1,8 +1,8 @@
<?php
use Domain\Maintenance\Controllers\MaintenanceModeController;
use Domain\Maintenance\Controllers\UpgradeDatabaseController;
use Domain\Maintenance\Controllers\UpgradeTranslationsController;
use Domain\Maintenance\Controllers\MaintenanceModeController;
use Domain\Maintenance\Controllers\UpgradeSystemController;
Route::group(['middleware' => ['auth:sanctum']], function () {
Route::get('/down', [MaintenanceModeController::class, 'down']);
@@ -10,6 +10,6 @@ Route::group(['middleware' => ['auth:sanctum']], function () {
Route::group(['prefix' => 'upgrade'], function () {
Route::get('/translations', UpgradeTranslationsController::class);
Route::get('/database', UpgradeDatabaseController::class);
Route::get('/system', UpgradeSystemController::class);
});
});

View File

@@ -21,8 +21,8 @@ use Illuminate\Database\Eloquent\Relations\BelongsToMany;
/**
* @method static whereUserId(int|string|null $id)
* @method static find(mixed $id)
* @method static where(string $string, string $user_id)
* @method static findOrFail(string $root_id)
* @method static where(string $key, string $value)
* @method static findOrFail(string $id)
* @method static create(array $array)
* @property string id
* @property string user_id

View File

@@ -0,0 +1,18 @@
<?php
namespace Domain\Maintenance\Actions;
use Gate;
use Artisan;
class UpgradeDatabaseAction
{
public function __invoke(): bool
{
// Check admin permission
Gate::authorize('maintenance');
return Artisan::call('migrate', [
'--force' => true,
]);
}
}

View File

@@ -1,29 +0,0 @@
<?php
namespace Domain\Maintenance\Controllers;
use Gate;
use Artisan;
use App\Http\Controllers\Controller;
class UpgradeDatabaseController extends Controller
{
public function __invoke(): mixed
{
// Check admin permission
Gate::authorize('maintenance');
$command = Artisan::call('migrate', [
'--force' => true,
]);
if ($command === 0) {
echo 'Operation was successful.';
}
if ($command === 1) {
echo 'Operation failed.';
}
return $command;
}
}

View File

@@ -0,0 +1,105 @@
<?php
namespace Domain\Maintenance\Controllers;
use App\Http\Controllers\Controller;
use DB;
use Domain\Files\Models\File;
use Domain\Folders\Models\Folder;
use Domain\Maintenance\Actions\UpgradeDatabaseAction;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use Storage;
ini_set('max_execution_time', -1);
class UpgradeSystemController extends Controller
{
public function __construct(
public UpgradeDatabaseAction $upgradeDatabase,
) {}
public function __invoke(Request $request)
{
// Get already updated versions
// TODO: get from database
$alreadyUpdated = ['2_0_8', '2_0_7'];
// Get versions which has to be upgraded
$needToUpgrade = array_diff(config('vuefilemanager.updates'), $alreadyUpdated);
// Iterate and upgrade
foreach ($needToUpgrade as $version) {
// Get method name
$method = "upgrade_to_$version";
if (method_exists($this, $method)) {
$this->{$method}($request);
return response('Done', 201);
}
}
return response('Whooops, something went wrong!', 500);
}
private function upgrade_to_2_0_10(): void
{
($this->upgradeDatabase)();
Folder::where('parent_id', null)
->where('team_folder', true)
->cursor()
->each(function ($teamFolder) {
// Get all inherited folder from team folder
$childrenFolderIds = Folder::with('folders:id,parent_id')
->where('id', $teamFolder->id)
->get('id');
$teamFolderIds = Arr::flatten(filter_folders_ids($childrenFolderIds));
// Replace user content ownership for author of team folder
DB::table('files')
->whereIn('parent_id', $teamFolderIds)
->cursor()
->each(function ($file) use ($teamFolder) {
// Move image thumbnails
if ($file->type === 'image') {
// Get image thumbnail list
$thumbnailList = getThumbnailFileList($file->basename);
// move thumbnails to the new location
$thumbnailList->each(function ($basename) use ($file, $teamFolder) {
$oldPath = "files/$file->user_id/$basename";
$newPath = "files/$teamFolder->user_id/$basename";
if (Storage::exists($oldPath)) {
Storage::move($oldPath, $newPath);
}
});
}
// Get single file path
$filePath = "files/$file->user_id/$file->basename";
// Move single file
if (Storage::exists($filePath)) {
Storage::move($filePath, "files/$teamFolder->user_id/$file->basename");
}
// Update file permission
File::find($file->id)->update([
'user_id' => $teamFolder->user_id,
'author_id' => $teamFolder->user_id !== $file->user_id ? $file->user_id : null,
]);
});
// Update folder ownership
DB::table('folders')
->whereIn('parent_id', $teamFolderIds)
->update(['user_id' => $teamFolder->user_id]);
});
}
}