diff --git a/app/Http/Controllers/App/Maintenance.php b/app/Http/Controllers/App/Maintenance.php index 44b28421..ecbc6c4a 100644 --- a/app/Http/Controllers/App/Maintenance.php +++ b/app/Http/Controllers/App/Maintenance.php @@ -3,17 +3,34 @@ namespace App\Http\Controllers\App; use App\Http\Controllers\Controller; +use App\Models\Language; +use App\Models\LanguageTranslation; +use App\Services\LanguageService; use Artisan; +use DB; +use Gate; +use Illuminate\Contracts\Foundation\Application; +use Illuminate\Contracts\Routing\ResponseFactory; use Illuminate\Http\Request; +use Illuminate\Http\Response; use Schema; class Maintenance extends Controller { + /** + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function __construct() + { + // Check admin permission + Gate::authorize('maintenance'); + } /** * Start maintenance mode */ - public function up() { + public function up() + { $command = Artisan::call('up'); if ($command === 0) { @@ -24,7 +41,8 @@ class Maintenance extends Controller /** * End maintenance mode */ - public function down() { + public function down() + { $command = Artisan::call('down'); if ($command === 0) { @@ -33,17 +51,23 @@ class Maintenance extends Controller } /** - * Upgrade database + * Get new language translations from default translations + * and insert it into database + * + * @return Application|ResponseFactory|Response */ - public function upgrade() + public function upgrade_translations() { - $this->upgrade_database(); + resolve(LanguageService::class) + ->upgrade_language_translations(); + + return response('Done.', 201); } /** * @return int|mixed */ - private function upgrade_database() + public function upgrade_database() { $command = Artisan::call('migrate', [ '--force' => true diff --git a/app/Models/Language.php b/app/Models/Language.php index ade8035b..daf50ef3 100644 --- a/app/Models/Language.php +++ b/app/Models/Language.php @@ -2,7 +2,7 @@ namespace App\Models; -use App\Services\HelperService; +use App\Services\LanguageService; use Illuminate\Support\Str; use Illuminate\Support\Facades\DB; use Illuminate\Database\Eloquent\Model; @@ -41,7 +41,7 @@ class Language extends Model static::creating(function ($language) { $language->id = Str::uuid(); - resolve(HelperService::class) + resolve(LanguageService::class) ->create_default_language_translations( get_setting('license') ?? 'extended', $language->locale ); diff --git a/app/Models/LanguageTranslation.php b/app/Models/LanguageTranslation.php index c6fe28b4..bb7b7a67 100644 --- a/app/Models/LanguageTranslation.php +++ b/app/Models/LanguageTranslation.php @@ -4,6 +4,9 @@ namespace App\Models; use Illuminate\Database\Eloquent\Model; +/** + * @method static whereLang(string $string) + */ class LanguageTranslation extends Model { public $timestamps = false; diff --git a/app/Providers/AuthServiceProvider.php b/app/Providers/AuthServiceProvider.php index 11bcf1d6..2a547782 100644 --- a/app/Providers/AuthServiceProvider.php +++ b/app/Providers/AuthServiceProvider.php @@ -26,8 +26,8 @@ class AuthServiceProvider extends ServiceProvider { $this->registerPolicies(); - // Define admin settings gate - Gate::define('admin-settings', function ($user) { + // Define admin maintenance gate + Gate::define('maintenance', function ($user) { return $user->role === 'admin'; }); } diff --git a/app/Services/HelperService.php b/app/Services/HelperService.php index cbfac7e8..6ca24d30 100644 --- a/app/Services/HelperService.php +++ b/app/Services/HelperService.php @@ -8,7 +8,6 @@ use App\Models\Share; use Aws\Exception\MultipartUploadException; use Aws\S3\MultipartUploader; use DB; -use Illuminate\Http\Request; use Illuminate\Support\Arr; use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Storage; @@ -323,35 +322,4 @@ class HelperService } } } - - /** - * @param $license - * @param $locale - */ - function create_default_language_translations($license, $locale) - { - $translations = [ - 'extended' => collect([ - config("language-translations.extended"), - config("language-translations.regular"), - config("custom-language-translations") - ])->collapse(), - 'regular' => collect([ - config("language-translations.regular"), - config("custom-language-translations") - ])->collapse(), - ]; - - $translations = $translations[strtolower($license)] - ->map(function ($value, $key) use ($locale) { - return [ - 'lang' => $locale, - 'value' => $value, - 'key' => $key, - ]; - })->toArray(); - - DB::table('language_translations') - ->insert($translations); - } } \ No newline at end of file diff --git a/app/Services/LanguageService.php b/app/Services/LanguageService.php new file mode 100644 index 00000000..2bf192ff --- /dev/null +++ b/app/Services/LanguageService.php @@ -0,0 +1,93 @@ + collect([ + config("language-translations.extended"), + config("language-translations.regular"), + config("custom-language-translations") + ])->collapse(), + 'regular' => collect([ + config("language-translations.regular"), + config("custom-language-translations") + ])->collapse(), + ]; + + $translations = $translations[strtolower($license)] + ->map(function ($value, $key) use ($locale) { + return [ + 'lang' => $locale, + 'value' => $value, + 'key' => $key, + ]; + })->toArray(); + + DB::table('language_translations') + ->insert($translations); + } + + /** + * Find newly added translations in default language + * translations file and insert it into database + */ + function upgrade_language_translations() + { + // Get all app locales + $locales = Language::all() + ->pluck('locale'); + + // Get default translations + $translations = LanguageTranslation::whereLang('en') + ->get(); + + $default_translations = [ + 'extended' => collect([ + config("language-translations.extended"), + config("language-translations.regular"), + config("custom-language-translations") + ])->collapse(), + 'regular' => collect([ + config("language-translations.regular"), + config("custom-language-translations") + ])->collapse(), + ]; + + $license = strtolower(get_setting('license')); + + // Find new translations in default translations + $newbies = $default_translations[$license] + ->diff(map_language_translations($translations)); + + // Store new translations for every language + $locales->each(function ($locale) use ($newbies) { + + $translations = $newbies + ->map(function ($value, $key) use ($locale) { + return [ + 'lang' => $locale, + 'value' => $value, + 'key' => $key, + ]; + })->toArray(); + + // Store translations into database + DB::table('language_translations') + ->insert($translations); + }); + } +} \ No newline at end of file diff --git a/public/chunks/shared-page.js b/public/chunks/shared-page.js index 3eb6540f..9bfe0396 100644 --- a/public/chunks/shared-page.js +++ b/public/chunks/shared-page.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[44],{"+sf2":function(e,t,n){"use strict";var a=n("F+Gd");n.n(a).a},ASoH:function(e,t,n){"use strict";var a={name:"AuthContent",props:["loading","icon","text"],data:function(){return{isVisible:!1}},created:function(){this.isVisible=this.visible}},i=(n("s/ZW"),n("KHd+")),o=Object(i.a)(a,(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("button",{staticClass:"button outline"},[n("span",{staticClass:"text-label"},[e._v(e._s(e.text))]),e._v(" "),e.loading?n("span",{staticClass:"icon"},[n("FontAwesomeIcon",{staticClass:"sync-alt",attrs:{icon:"sync-alt"}})],1):e._e(),e._v(" "),!e.loading&&e.icon?n("span",{staticClass:"icon"},[n("FontAwesomeIcon",{attrs:{icon:e.icon}})],1):e._e()])}),[],!1,null,"59e2dfc0",null);t.a=o.exports},"F+Gd":function(e,t,n){var a=n("v56y");"string"==typeof a&&(a=[[e.i,a,""]]);var i={hmr:!0,transform:void 0,insertInto:void 0};n("aET+")(a,i);a.locals&&(e.exports=a.locals)},FdzE:function(e,t,n){"use strict";var a=n("CjXH"),i=n("L2JU"),o=n("xCqy");function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function d(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var s={name:"TreeMenuNavigator",props:["nodes","depth","disabled"],components:{TreeMenuNavigator:c,ChevronRightIcon:a.h,FolderIcon:a.w},computed:function(e){for(var t=1;t0?this.draggedItem.forEach((function(n){"folder"===n.type&&e.nodes.unique_id===n.parent_id&&(t=!0),e.nodes.unique_id===n.unique_id&&"folder"===n.type&&(t=!0,e.disableChildren=!0),e.disabled&&(e.disableChildren=!0)})):(t=!1,this.disableChildren=!1),t},indent:function(){var e=window.innerWidth<=1024?17:22;return{paddingLeft:(0==this.depth?e:e+20*this.depth)+"px"}}}),data:function(){return{isVisible:!1,isSelected:!1,area:!1,draggedItem:[],disableChildren:!1}},methods:{dragFinish:function(){this.fileInfoDetail.includes(this.draggedItem[0])||this.$store.dispatch("moveItem",{to_item:this.nodes,noSelectedItem:this.draggedItem[0]}),this.fileInfoDetail.includes(this.draggedItem[0])&&this.$store.dispatch("moveItem",{to_item:this.nodes,noSelectedItem:null}),this.draggedItem=[],this.area=!1,o.a.$emit("drop")},dragEnter:function(){this.area=!0},dragLeave:function(){this.area=!1},getFolder:function(){o.a.$emit("show-folder",this.nodes),this.$isThisLocation("public")?this.$store.dispatch("browseShared",[{folder:this.nodes,back:!1,init:!1}]):this.$store.dispatch("getFolder",[{folder:this.nodes,back:!1,init:!1}])},showTree:function(){this.isVisible=!this.isVisible}},created:function(){var e=this;o.a.$on("drop",(function(){e.draggedItem=[]})),o.a.$on("dragstart",(function(t){e.fileInfoDetail.includes(t)||(e.draggedItem=[t]),e.fileInfoDetail.includes(t)&&(e.draggedItem=e.fileInfoDetail)})),o.a.$on("show-folder",(function(t){e.isSelected=!1,e.nodes.unique_id==t.unique_id&&(e.isSelected=!0)}))}},l=(n("XrVr"),n("KHd+")),p=Object(l.a)(s,(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("transition",{attrs:{name:"folder"}},[n("div",{staticClass:"folder-item-wrapper"},[n("div",{staticClass:"folder-item",class:{"is-selected":e.isSelected,"is-dragenter":e.area,"is-inactive":e.disabledFolder||e.disabled&&e.draggedItem.length>0},style:e.indent,on:{click:e.getFolder,dragover:function(t){return t.preventDefault(),e.dragEnter(t)},dragleave:e.dragLeave,drop:function(t){return e.dragFinish()}}},[n("chevron-right-icon",{staticClass:"icon-arrow",class:{"is-opened":e.isVisible,"is-visible":0!==e.nodes.folders.length},attrs:{size:"17"},on:{click:function(t){return t.stopPropagation(),e.showTree(t)}}}),e._v(" "),n("folder-icon",{staticClass:"icon",attrs:{size:"17"}}),e._v(" "),n("span",{staticClass:"label"},[e._v(e._s(e.nodes.name))])],1),e._v(" "),e._l(e.nodes.folders,(function(t){return e.isVisible?n("TreeMenuNavigator",{key:t.unique_id,attrs:{disabled:e.disableChildren,depth:e.depth+1,nodes:t}}):e._e()}))],2)])}),[],!1,null,"2e948b10",null),c=t.a=p.exports},GwTe:function(e,t,n){(e.exports=n("I1BE")(!1)).push([e.i,".button[data-v-59e2dfc0] {\n cursor: pointer;\n border-radius: 8px;\n text-decoration: none;\n padding: 12px 32px;\n display: inline-block;\n margin-left: 15px;\n margin-right: 15px;\n white-space: nowrap;\n transition: 150ms all ease;\n background: transparent;\n}\n.button .text-label[data-v-59e2dfc0] {\n transition: 150ms all ease;\n font-size: 1.0625em;\n font-weight: 800;\n line-height: 0;\n}\n.button .icon[data-v-59e2dfc0] {\n margin-left: 12px;\n font-size: 1em;\n}\n.button.solid[data-v-59e2dfc0] {\n background: #00BC7E;\n border: 2px solid #00BC7E;\n}\n.button.solid .text-label[data-v-59e2dfc0] {\n color: white;\n}\n.button.outline[data-v-59e2dfc0] {\n border: 2px solid #1B2539;\n}\n.button.outline .text-label[data-v-59e2dfc0] {\n color: #1B2539;\n}\n.button.outline .icon path[data-v-59e2dfc0] {\n fill: #00BC7E;\n}\n.button.outline[data-v-59e2dfc0]:hover {\n border-color: #00BC7E;\n}\n.button.outline:hover .text-label[data-v-59e2dfc0] {\n color: #00BC7E;\n}\n@media (prefers-color-scheme: dark) {\n.button.outline[data-v-59e2dfc0] {\n background: #131414;\n border-color: #bec6cf;\n}\n.button.outline .text-label[data-v-59e2dfc0] {\n color: #bec6cf;\n}\n}\n.sync-alt[data-v-59e2dfc0] {\n -webkit-animation: spin-data-v-59e2dfc0 1s linear infinite;\n animation: spin-data-v-59e2dfc0 1s linear infinite;\n}\n@-webkit-keyframes spin-data-v-59e2dfc0 {\n0% {\n transform: rotate(0);\n}\n100% {\n transform: rotate(360deg);\n}\n}\n@keyframes spin-data-v-59e2dfc0 {\n0% {\n transform: rotate(0);\n}\n100% {\n transform: rotate(360deg);\n}\n}\n",""])},M7L9:function(e,t,n){"use strict";n.r(t);var a=n("o0o1"),i=n.n(a),o=n("A5+z"),r=n("MooH"),d=n("1GG+"),s=n("9Q3x"),l=n("Tbn2"),p=n("FdzE"),c=n("vIGX"),f=n("yMep"),u=n("LtV2"),v=n("25Ru"),m=n("hXay"),h=n("c4kp"),g=n("2QtR"),b=n("L7Tl"),w=n("Nv84"),x=n("jU4B"),y=n("j8qy"),_=n("mH8o"),k=n("ASoH"),P=n("zTYo"),C=n("PpKh"),O=n("BOt2"),I=n("QS3E"),F=n("c+VV"),D=n("TJPC"),j=n("L2JU"),z=n("xCqy"),B=n("vDqi"),S=n.n(B),$=n("CjXH");function E(e,t,n,a,i,o,r){try{var d=e[o](r),s=d.value}catch(e){return void n(e)}d.done?t(s):Promise.resolve(s).then(a,i)}function A(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function M(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var T={name:"SharedPage",components:{MobileSortingAndPreview:r.a,MobileMultiSelectMenu:d.a,ValidationProvider:o.ValidationProvider,DesktopSortingAndPreview:s.a,ValidationObserver:o.ValidationObserver,TreeMenuNavigator:p.a,FileFullPreview:c.a,ProcessingPopup:l.a,DesktopToolbar:f.a,ContentSidebar:u.a,CreateFolder:b.a,FileItemGrid:v.a,ContentGroup:m.a,AuthContent:y.a,FileBrowser:h.a,ContextMenu:g.a,AuthButton:k.a,MobileMenu:x.a,ButtonBase:w.a,RenameItem:_.a,HomeIcon:$.A,MoveItem:C.a,required:D.a,Vignette:O.a,Spinner:P.a,DragUI:I.a,Alert:F.a},computed:function(e){for(var t=1;t0?this.draggedItem.forEach((function(n){"folder"===n.type&&e.nodes.unique_id===n.parent_id&&(t=!0),e.nodes.unique_id===n.unique_id&&"folder"===n.type&&(t=!0,e.disableChildren=!0),e.disabled&&(e.disableChildren=!0)})):(t=!1,this.disableChildren=!1),t},indent:function(){var e=window.innerWidth<=1024?17:22;return{paddingLeft:(0==this.depth?e:e+20*this.depth)+"px"}}}),data:function(){return{isVisible:!1,isSelected:!1,area:!1,draggedItem:[],disableChildren:!1}},methods:{dragFinish:function(){this.fileInfoDetail.includes(this.draggedItem[0])||this.$store.dispatch("moveItem",{to_item:this.nodes,noSelectedItem:this.draggedItem[0]}),this.fileInfoDetail.includes(this.draggedItem[0])&&this.$store.dispatch("moveItem",{to_item:this.nodes,noSelectedItem:null}),this.draggedItem=[],this.area=!1,o.a.$emit("drop")},dragEnter:function(){this.area=!0},dragLeave:function(){this.area=!1},getFolder:function(){o.a.$emit("show-folder",this.nodes),this.$isThisLocation("public")?this.$store.dispatch("browseShared",[{folder:this.nodes,back:!1,init:!1}]):this.$store.dispatch("getFolder",[{folder:this.nodes,back:!1,init:!1}])},showTree:function(){this.isVisible=!this.isVisible}},created:function(){var e=this;o.a.$on("drop",(function(){e.draggedItem=[]})),o.a.$on("dragstart",(function(t){e.fileInfoDetail.includes(t)||(e.draggedItem=[t]),e.fileInfoDetail.includes(t)&&(e.draggedItem=e.fileInfoDetail)})),o.a.$on("show-folder",(function(t){e.isSelected=!1,e.nodes.unique_id==t.unique_id&&(e.isSelected=!0)}))}},l=(n("XrVr"),n("KHd+")),c=Object(l.a)(s,(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("transition",{attrs:{name:"folder"}},[n("div",{staticClass:"folder-item-wrapper"},[n("div",{staticClass:"folder-item",class:{"is-selected":e.isSelected,"is-dragenter":e.area,"is-inactive":e.disabledFolder||e.disabled&&e.draggedItem.length>0},style:e.indent,on:{click:e.getFolder,dragover:function(t){return t.preventDefault(),e.dragEnter(t)},dragleave:e.dragLeave,drop:function(t){return e.dragFinish()}}},[n("chevron-right-icon",{staticClass:"icon-arrow",class:{"is-opened":e.isVisible,"is-visible":0!==e.nodes.folders.length},attrs:{size:"17"},on:{click:function(t){return t.stopPropagation(),e.showTree(t)}}}),e._v(" "),n("folder-icon",{staticClass:"icon",attrs:{size:"17"}}),e._v(" "),n("span",{staticClass:"label"},[e._v(e._s(e.nodes.name))])],1),e._v(" "),e._l(e.nodes.folders,(function(t){return e.isVisible?n("TreeMenuNavigator",{key:t.unique_id,attrs:{disabled:e.disableChildren,depth:e.depth+1,nodes:t}}):e._e()}))],2)])}),[],!1,null,"2e948b10",null),p=t.a=c.exports},GwTe:function(e,t,n){(e.exports=n("I1BE")(!1)).push([e.i,".button[data-v-59e2dfc0] {\n cursor: pointer;\n border-radius: 8px;\n text-decoration: none;\n padding: 12px 32px;\n display: inline-block;\n margin-left: 15px;\n margin-right: 15px;\n white-space: nowrap;\n transition: 150ms all ease;\n background: transparent;\n}\n.button .text-label[data-v-59e2dfc0] {\n transition: 150ms all ease;\n font-size: 1.0625em;\n font-weight: 800;\n line-height: 0;\n}\n.button .icon[data-v-59e2dfc0] {\n margin-left: 12px;\n font-size: 1em;\n}\n.button.solid[data-v-59e2dfc0] {\n background: #00BC7E;\n border: 2px solid #00BC7E;\n}\n.button.solid .text-label[data-v-59e2dfc0] {\n color: white;\n}\n.button.outline[data-v-59e2dfc0] {\n border: 2px solid #1B2539;\n}\n.button.outline .text-label[data-v-59e2dfc0] {\n color: #1B2539;\n}\n.button.outline .icon path[data-v-59e2dfc0] {\n fill: #00BC7E;\n}\n.button.outline[data-v-59e2dfc0]:hover {\n border-color: #00BC7E;\n}\n.button.outline:hover .text-label[data-v-59e2dfc0] {\n color: #00BC7E;\n}\n@media (prefers-color-scheme: dark) {\n.button.outline[data-v-59e2dfc0] {\n background: #131414;\n border-color: #bec6cf;\n}\n.button.outline .text-label[data-v-59e2dfc0] {\n color: #bec6cf;\n}\n}\n.sync-alt[data-v-59e2dfc0] {\n -webkit-animation: spin-data-v-59e2dfc0 1s linear infinite;\n animation: spin-data-v-59e2dfc0 1s linear infinite;\n}\n@-webkit-keyframes spin-data-v-59e2dfc0 {\n0% {\n transform: rotate(0);\n}\n100% {\n transform: rotate(360deg);\n}\n}\n@keyframes spin-data-v-59e2dfc0 {\n0% {\n transform: rotate(0);\n}\n100% {\n transform: rotate(360deg);\n}\n}\n",""])},IV8A:function(e,t,n){"use strict";var a=n("B1nD");n.n(a).a},M7L9:function(e,t,n){"use strict";n.r(t);var a=n("o0o1"),i=n.n(a),o=n("A5+z"),r=n("MooH"),d=n("1GG+"),s=n("9Q3x"),l=n("Tbn2"),c=n("FdzE"),p=n("vIGX"),u=n("yMep"),v=n("LtV2"),f=n("25Ru"),m=n("hXay"),h=n("c4kp"),g=n("2QtR"),b=n("L7Tl"),w=n("Nv84"),x=n("jU4B"),y=n("j8qy"),_=n("mH8o"),k=n("ASoH"),P=n("zTYo"),C=n("PpKh"),O=n("BOt2"),I=n("QS3E"),D=n("c+VV"),B=n("TJPC"),F=n("L2JU"),j=n("xCqy"),z=n("vDqi"),A=n.n(z),S=n("CjXH");function $(e,t,n,a,i,o,r){try{var d=e[o](r),s=d.value}catch(e){return void n(e)}d.done?t(s):Promise.resolve(s).then(a,i)}function E(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function M(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var T={name:"SharedPage",components:{MobileSortingAndPreview:r.a,MobileMultiSelectMenu:d.a,ValidationProvider:o.ValidationProvider,DesktopSortingAndPreview:s.a,ValidationObserver:o.ValidationObserver,TreeMenuNavigator:c.a,FileFullPreview:p.a,ProcessingPopup:l.a,DesktopToolbar:u.a,ContentSidebar:v.a,CreateFolder:b.a,FileItemGrid:f.a,ContentGroup:m.a,AuthContent:y.a,FileBrowser:h.a,ContextMenu:g.a,AuthButton:k.a,MobileMenu:x.a,ButtonBase:w.a,RenameItem:_.a,HomeIcon:S.A,MoveItem:C.a,required:B.a,Vignette:O.a,Spinner:P.a,DragUI:I.a,Alert:D.a},computed:function(e){for(var t=1;t + import(/* webpackChunkName: "chunks/not-found-shared" */ './views/Shared/NotFoundShared'), + meta: { + requiresAuth: false + }, + }, +] const router = new Router({ mode: 'history', @@ -785,6 +796,7 @@ const router = new Router({ ...routesIndex, ...routesAuth, ...routesUser, + ...routesOthers, ], scrollBehavior(to, from, savedPosition) { if (savedPosition) { diff --git a/routes/maintenance.php b/routes/maintenance.php index d4d477e5..5365d07c 100644 --- a/routes/maintenance.php +++ b/routes/maintenance.php @@ -2,6 +2,14 @@ use App\Http\Controllers\App\Maintenance; -Route::post('/upgrade', [Maintenance::class, 'upgrade']); -Route::get('/down', [Maintenance::class, 'down']); -Route::get('/up', [Maintenance::class, 'up']); \ No newline at end of file +Route::group(['middleware' => ['auth:sanctum']], function () { + + Route::get('/down', [Maintenance::class, 'down']); + Route::get('/up', [Maintenance::class, 'up']); + + Route::group(['prefix' => 'upgrade'], function () { + Route::get('/translations', [Maintenance::class, 'upgrade_translations']); + Route::get('/database', [Maintenance::class, 'upgrade_database']); + }); +}); + diff --git a/tests/Feature/App/AppUpgradeTest.php b/tests/Feature/App/AppUpgradeTest.php new file mode 100644 index 00000000..0130373b --- /dev/null +++ b/tests/Feature/App/AppUpgradeTest.php @@ -0,0 +1,80 @@ +create(['role' => 'admin']); + + Sanctum::actingAs($user); + + DB::table('settings') + ->insert([ + [ + 'name' => 'language', + 'value' => 'en', + ], + [ + 'name' => 'license', + 'value' => 'Extended', + ] + ]); + + collect(['en', 'sk']) + ->map(function ($locale) { + + DB::table('languages') + ->insert([ + 'id' => Str::uuid(), + 'name' => 'English', + 'locale' => $locale + ]); + + DB::table('language_translations') + ->insert([ + [ + 'key' => 'activation.stripe.button', + 'value' => 'Set up your Stripe account', + 'lang' => $locale + ], [ + 'key' => 'activation.stripe.description', + 'value' => 'To charge your users, please set up your Stripe account credentials.', + 'lang' => $locale + ] + ]); + }); + + $this->get('/upgrade/translations') + ->assertStatus(201); + + collect(['en', 'sk']) + ->map(function ($locale) { + + $this->assertDatabaseHas('language_translations', [ + 'key' => 'activation.stripe.title', + 'value' => 'Your Stripe account is not set', + 'lang' => $locale, + ]); + }); + } +}