diff --git a/app/Http/Controllers/Admin/DashboardController.php b/app/Http/Controllers/Admin/DashboardController.php index 019a4141..d35bcfc4 100644 --- a/app/Http/Controllers/Admin/DashboardController.php +++ b/app/Http/Controllers/Admin/DashboardController.php @@ -14,7 +14,7 @@ use Laravel\Cashier\Subscription; class DashboardController extends Controller { /** - * DashboardController constructor. + * @param StripeService $stripe */ public function __construct(StripeService $stripe) { diff --git a/app/Http/Controllers/Admin/InvoiceController.php b/app/Http/Controllers/Admin/InvoiceController.php index f861cf73..8ea293e0 100644 --- a/app/Http/Controllers/Admin/InvoiceController.php +++ b/app/Http/Controllers/Admin/InvoiceController.php @@ -13,7 +13,7 @@ use Illuminate\Http\Request; class InvoiceController extends Controller { /** - * PlanController constructor. + * @param StripeService $stripe */ public function __construct(StripeService $stripe) { @@ -33,7 +33,7 @@ class InvoiceController extends Controller } /** - * Get single invoice by $token + * Get single invoice by invoice $token * * @param $customer * @param $token @@ -41,12 +41,8 @@ class InvoiceController extends Controller */ public function show($customer, $token) { - $settings = json_decode(Setting::all()->pluck('value', 'name')->toJson()); - - $invoice = $this->stripe->getUserInvoice($customer, $token); - return view('vuefilemanager.invoice') - ->with('settings', $settings) - ->with('invoice', $invoice); + ->with('settings', get_settings_in_json()) + ->with('invoice', $this->stripe->getUserInvoice($customer, $token)); } } diff --git a/app/Http/Controllers/Admin/PagesController.php b/app/Http/Controllers/Admin/PagesController.php index fa8b0161..c511a40c 100644 --- a/app/Http/Controllers/Admin/PagesController.php +++ b/app/Http/Controllers/Admin/PagesController.php @@ -21,12 +21,13 @@ class PagesController extends Controller public function index() { return new PageCollection( - Page::sortable()->paginate(10) + Page::sortable() + ->paginate(10) ); } /** - * Get page resource + * Get single page resource * * @param $page * @return PageResource diff --git a/app/Http/Controllers/Admin/PlanController.php b/app/Http/Controllers/Admin/PlanController.php index 78cee169..7b4aabe2 100644 --- a/app/Http/Controllers/Admin/PlanController.php +++ b/app/Http/Controllers/Admin/PlanController.php @@ -11,7 +11,10 @@ use App\Http\Tools\Demo; use App\Models\Plan; use App\Services\StripeService; use App\Models\User; +use Illuminate\Contracts\Foundation\Application; +use Illuminate\Contracts\Routing\ResponseFactory; use Illuminate\Http\Request; +use Illuminate\Http\Response; use Illuminate\Support\Facades\Cache; use Laravel\Cashier\Subscription; use Rinvex\Subscriptions\Models\PlanFeature; @@ -19,7 +22,7 @@ use Rinvex\Subscriptions\Models\PlanFeature; class PlanController extends Controller { /** - * PlanController constructor. + * @param StripeService $stripe */ public function __construct(StripeService $stripe) { @@ -29,7 +32,7 @@ class PlanController extends Controller /** * Get all plans * - * @return PlanCollection|\Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response + * @return PlanCollection|Application|ResponseFactory|Response */ public function index() { @@ -49,7 +52,7 @@ class PlanController extends Controller * Get plan record * * @param $id - * @return PlanResource|\Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response + * @return PlanResource|Application|ResponseFactory|Response */ public function show($id) { @@ -69,7 +72,7 @@ class PlanController extends Controller * Create new plan * * @param Request $request - * @return PlanResource|\Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response + * @return PlanResource|Application|ResponseFactory|Response */ public function store(Request $request) { @@ -102,7 +105,7 @@ class PlanController extends Controller * * @param Request $request * @param $id - * @return \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response + * @return ResponseFactory|Response */ public function update(Request $request, $id) { @@ -123,7 +126,7 @@ class PlanController extends Controller * Delete plan * * @param $id - * @return \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response + * @return ResponseFactory|Response */ public function delete($id) { @@ -148,11 +151,12 @@ class PlanController extends Controller */ public function subscribers($id) { - $subscribers = Subscription::where('stripe_plan', $id) + $subscribers = Subscription::whereStripePlan($id) ->pluck('user_id'); return new UsersCollection( - User::sortable()->findMany($subscribers) + User::sortable() + ->findMany($subscribers) ); } } diff --git a/app/Http/Controllers/SettingController.php b/app/Http/Controllers/Admin/SettingController.php similarity index 77% rename from app/Http/Controllers/SettingController.php rename to app/Http/Controllers/Admin/SettingController.php index 4222d515..f994eddb 100644 --- a/app/Http/Controllers/SettingController.php +++ b/app/Http/Controllers/Admin/SettingController.php @@ -1,7 +1,8 @@ get('column'); + if (strpos($request->column, '|') !== false) { - if (strpos($column, '|') !== false) { + $columns = explode('|', $request->column); - $columns = explode('|', $column); - - return Setting::whereIn('name', $columns)->pluck('value', 'name'); + return Setting::whereIn('name', $columns) + ->pluck('value', 'name'); } - return Setting::where('name', $column)->pluck('value', 'name'); + return Setting::where('name', $request->column) + ->pluck('value', 'name'); } /** @@ -82,12 +83,12 @@ class SettingController extends Controller if (!app()->runningUnitTests()) { setEnvironmentValue([ - 'MAIL_DRIVER' => $request->input('driver'), - 'MAIL_HOST' => $request->input('host'), - 'MAIL_PORT' => $request->input('port'), - 'MAIL_USERNAME' => $request->input('username'), - 'MAIL_PASSWORD' => $request->input('password'), - 'MAIL_ENCRYPTION' => $request->input('encryption'), + 'MAIL_DRIVER' => $request->driver, + 'MAIL_HOST' => $request->host, + 'MAIL_PORT' => $request->port, + 'MAIL_USERNAME' => $request->username, + 'MAIL_PASSWORD' => $request->password, + 'MAIL_ENCRYPTION' => $request->encryption, ]); // Clear config cache @@ -163,4 +164,22 @@ class SettingController extends Controller return response('Done', 204); } + + /** + * Clear application cache + */ + public function flush_cache() + { + if (env('APP_DEMO')) { + return Demo::response_204(); + } + + if (!app()->runningUnitTests()) { + Artisan::call('cache:clear'); + Artisan::call('config:clear'); + Artisan::call('config:cache'); + } + + return response('Done', 204); + } } diff --git a/app/Http/Controllers/Admin/UserController.php b/app/Http/Controllers/Admin/UserController.php index 2a87a40d..53ae8fe7 100644 --- a/app/Http/Controllers/Admin/UserController.php +++ b/app/Http/Controllers/Admin/UserController.php @@ -68,9 +68,9 @@ class UserController extends Controller public function invoices(User $user) { return new InvoiceCollection( - $this->stripe->getUserInvoices( - $user - ) + $this + ->stripe + ->getUserInvoices($user) ); } @@ -114,7 +114,7 @@ class UserController extends Controller public function change_role(ChangeRoleRequest $request, User $user) { // Demo preview - if (env('APP_DEMO') && $user->id == 1) { + if (env('APP_DEMO') && $user->email === 'howdy@hi5ve.digial') { return new UserResource($user); } @@ -178,11 +178,6 @@ class UserController extends Controller */ public function create_user(CreateUserByAdmin $request) { - // Store avatar - if ($request->hasFile('avatar')) { - $avatar = store_avatar($request, 'avatar'); - } - // Create user $user = User::forceCreate([ 'role' => $request->role, @@ -195,7 +190,7 @@ class UserController extends Controller ->settings() ->create([ 'name' => $request->name, - 'avatar' => $avatar ?? null, + 'avatar' => store_avatar($request, 'avatar'), 'storage_capacity' => $request->storage_capacity, ]); diff --git a/app/Http/Controllers/AppFunctionsController.php b/app/Http/Controllers/AppFunctionsController.php index d13e9822..83563d53 100644 --- a/app/Http/Controllers/AppFunctionsController.php +++ b/app/Http/Controllers/AppFunctionsController.php @@ -3,17 +3,17 @@ namespace App\Http\Controllers; use App\Http\Mail\SendContactMessage; -use App\Models\Content; +use App\Http\Resources\PricingCollection; use App\Http\Requests\PublicPages\SendContactMessageRequest; use App\Http\Resources\PageResource; -use App\Http\Tools\Demo; use App\Models\Setting; use App\Models\Page; -use Artisan; +use App\Services\StripeService; use Doctrine\DBAL\Driver\PDOException; use Illuminate\Contracts\Routing\ResponseFactory; use Illuminate\Http\Request; use Illuminate\Http\Response; +use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Mail; class AppFunctionsController extends Controller @@ -29,6 +29,11 @@ class AppFunctionsController extends Controller 'license', ]; + public function __construct(StripeService $stripe) + { + $this->stripe = $stripe; + } + /** * Show index page * @@ -151,20 +156,31 @@ class AppFunctionsController extends Controller } /** - * Clear application cache + * Get all active storage plans + * + * @return PricingCollection */ - public function flush_cache() + public function get_storage_plans() { - if (env('APP_DEMO')) { - return Demo::response_204(); + if (Cache::has('pricing')) { + + // Get pricing from cache + $pricing = Cache::get('pricing'); + } else { + + // Store pricing to cache + $pricing = Cache::rememberForever('pricing', function () { + return $this->stripe->getActivePlans(); + }); } - if (!app()->runningUnitTests()) { - Artisan::call('cache:clear'); - Artisan::call('config:clear'); - Artisan::call('config:cache'); - } + // Format pricing to collection + $collection = new PricingCollection($pricing); - return response('Done', 204); + // Sort and return pricing + return $collection + ->sortBy('product.metadata.capacity') + ->values() + ->all(); } } diff --git a/app/Http/Controllers/Auth/AuthController.php b/app/Http/Controllers/Auth/AuthController.php index e7d9a851..bbdcf216 100644 --- a/app/Http/Controllers/Auth/AuthController.php +++ b/app/Http/Controllers/Auth/AuthController.php @@ -18,7 +18,7 @@ class AuthController extends Controller /** * Check if user account exist * - * @param Request $request + * @param CheckAccountRequest $request * @return mixed */ public function check_account(CheckAccountRequest $request) diff --git a/app/Http/Controllers/Auth/RegisterController.php b/app/Http/Controllers/Auth/RegisterController.php deleted file mode 100644 index 92e24aa8..00000000 --- a/app/Http/Controllers/Auth/RegisterController.php +++ /dev/null @@ -1,73 +0,0 @@ -middleware('guest'); - } - - /** - * Get a validator for an incoming registration request. - * - * @param array $data - * @return \Illuminate\Contracts\Validation\Validator - */ - protected function validator(array $data) - { - return Validator::make($data, [ - 'name' => ['required', 'string', 'max:255'], - 'email' => ['required', 'string', 'email', 'max:255', 'unique:users'], - 'password' => ['required', 'string', 'min:8', 'confirmed'], - ]); - } - - /** - * Create a new user instance after a valid registration. - * - * @param array $data - * @return \App\User - */ - protected function create(array $data) - { - return User::create([ - 'name' => $data['name'], - 'email' => $data['email'], - 'password' => Hash::make($data['password']), - ]); - } -} diff --git a/app/Http/Controllers/DeployController.php b/app/Http/Controllers/DeployController.php deleted file mode 100644 index 3a691805..00000000 --- a/app/Http/Controllers/DeployController.php +++ /dev/null @@ -1,44 +0,0 @@ -headers->get('X-Hub-Signature')) == null) { - throw new BadRequestHttpException('Header not set'); - } - - $signature_parts = explode('=', $signature); - - if (count($signature_parts) != 2) { - throw new BadRequestHttpException('signature has invalid format'); - } - - $known_signature = hash_hmac('sha1', $request->getContent(), config('app.deploy_secret')); - - if (! hash_equals($known_signature, $signature_parts[1])) { - throw new UnauthorizedException('Could not verify request signature ' . $signature_parts[1]); - } - - // Run deploying - Artisan::call('deploy:production'); - - Log::info('The GitHub webhook was accepted'); - - return response('The GitHub webhook was accepted', 202); - } -} diff --git a/app/Http/Controllers/FileBrowser/BrowseController.php b/app/Http/Controllers/FileManager/BrowseController.php similarity index 99% rename from app/Http/Controllers/FileBrowser/BrowseController.php rename to app/Http/Controllers/FileManager/BrowseController.php index 505c3d9c..935172fa 100644 --- a/app/Http/Controllers/FileBrowser/BrowseController.php +++ b/app/Http/Controllers/FileManager/BrowseController.php @@ -1,6 +1,6 @@ input('folders') as $id) { + foreach ($request->folders as $id) { // Get user & folder $user = Auth::user(); diff --git a/app/Http/Controllers/FileFunctions/ShareController.php b/app/Http/Controllers/FileManager/ShareController.php similarity index 92% rename from app/Http/Controllers/FileFunctions/ShareController.php rename to app/Http/Controllers/FileManager/ShareController.php index 01dc65c8..64a7d2f7 100644 --- a/app/Http/Controllers/FileFunctions/ShareController.php +++ b/app/Http/Controllers/FileManager/ShareController.php @@ -1,6 +1,6 @@ update([ - 'permission' => $request->permission, - 'is_protected' => $request->protected, - 'expire_in' => $request->expiration, - 'password' => $request->password ? Hash::make($request->password) : $shared->password, + 'permission' => $request->permission, + 'is_protected' => $request->protected, + 'expire_in' => $request->expiration, + 'password' => $request->password ? Hash::make($request->password) : $shared->password, ]); // Return shared record @@ -112,7 +112,7 @@ class ShareController extends Controller */ public function destroy(Request $request) { - foreach ($request->input('tokens') as $token) { + foreach ($request->tokens as $token) { // Get sharing record Share::where('token', $token) diff --git a/app/Http/Controllers/FileFunctions/TrashController.php b/app/Http/Controllers/FileManager/TrashController.php similarity index 97% rename from app/Http/Controllers/FileFunctions/TrashController.php rename to app/Http/Controllers/FileManager/TrashController.php index 0fc6ca55..72053416 100644 --- a/app/Http/Controllers/FileFunctions/TrashController.php +++ b/app/Http/Controllers/FileManager/TrashController.php @@ -1,6 +1,6 @@ where('user_id', $user_id)->get(); - $files = File::onlyTrashed()->where('user_id', $user_id)->get(); - - // Force delete folder - $folders->each->forceDelete(); - - // Force delete files - foreach ($files as $file) { - - // Delete file - Storage::delete("/files/$user_id/{$file->basename}"); - - // Delete thumbnail if exist - if ($file->thumbnail) { - Storage::delete("/files/$user_id/{$file->getRawOriginal('thumbnail')}"); - } - - // Delete file permanently - $file->forceDelete(); - } - - // Return response - return response('Done!', 204); - } - /** * Restore item from trash * * @param Request $request - * @param $id * @return ResponseFactory|\Illuminate\Http\Response */ public function restore(Request $request) @@ -118,4 +77,44 @@ class TrashController extends Controller // Return response return response('Done!', 204); } + + /** + * Empty user trash + * + * @return ResponseFactory|\Illuminate\Http\Response + */ + public function dump() + { + // Get user id + $user_id = Auth::id(); + + if (is_demo($user_id)) { + return Demo::response_204(); + } + + // Get files and folders + $folders = Folder::onlyTrashed()->where('user_id', $user_id)->get(); + $files = File::onlyTrashed()->where('user_id', $user_id)->get(); + + // Force delete folder + $folders->each->forceDelete(); + + // Force delete files + foreach ($files as $file) { + + // Delete file + Storage::delete("/files/$user_id/{$file->basename}"); + + // Delete thumbnail if exist + if ($file->thumbnail) { + Storage::delete("/files/$user_id/{$file->getRawOriginal('thumbnail')}"); + } + + // Delete file permanently + $file->forceDelete(); + } + + // Return response + return response('Done!', 204); + } } diff --git a/app/Http/Controllers/General/PricingController.php b/app/Http/Controllers/General/PricingController.php deleted file mode 100644 index 353cf748..00000000 --- a/app/Http/Controllers/General/PricingController.php +++ /dev/null @@ -1,49 +0,0 @@ -stripe = $stripe; - } - - /** - * Get all active plans - * - * @return PricingCollection - */ - public function index() - { - if (Cache::has('pricing')) { - - // Get pricing from cache - $pricing = Cache::get('pricing'); - } else { - - // Store pricing to cache - $pricing = Cache::rememberForever('pricing', function () { - return $this->stripe->getActivePlans(); - }); - } - - // Format pricing to collection - $collection = new PricingCollection($pricing); - - // Sort and return pricing - return $collection - ->sortBy('product.metadata.capacity') - ->values() - ->all(); - } -} diff --git a/app/Http/Controllers/General/Maintenance.php b/app/Http/Controllers/Setup/Maintenance.php similarity index 93% rename from app/Http/Controllers/General/Maintenance.php rename to app/Http/Controllers/Setup/Maintenance.php index cf62e029..cf737303 100644 --- a/app/Http/Controllers/General/Maintenance.php +++ b/app/Http/Controllers/Setup/Maintenance.php @@ -1,10 +1,8 @@ stripe = $stripe; + $this->stripe = resolve(StripeService::class); } /** @@ -32,18 +32,14 @@ class WebhookController extends CashierController } // Get user - $user = User::where('stripe_id', $payload['data']['object']['customer']) + $user = User::whereStripeId($payload['data']['object']['customer']) ->firstOrFail(); - // Get default storage capacity - $default_storage = Setting::where('name', 'storage_default') - ->first(); - // Update storage capacity $user ->settings() ->update([ - 'storage_capacity' => $default_storage->value + 'storage_capacity' => get_setting('storage_default') ]); return $this->successMethod(); @@ -58,7 +54,7 @@ class WebhookController extends CashierController public function handleInvoicePaymentSucceeded($payload) { // Get user - $user = User::where('stripe_id', $payload['data']['object']['customer']) + $user = User::whereStripeId($payload['data']['object']['customer']) ->firstOrFail(); // Get requested plan diff --git a/routes/admin.php b/routes/admin.php index 7690daf4..5057fb8c 100644 --- a/routes/admin.php +++ b/routes/admin.php @@ -6,7 +6,7 @@ use App\Http\Controllers\Admin\PagesController; use App\Http\Controllers\Admin\PlanController; use App\Http\Controllers\Admin\UserController; use App\Http\Controllers\AppFunctionsController; -use App\Http\Controllers\SettingController; +use App\Http\Controllers\Admin\SettingController; // Dashboard Route::group(['prefix' => 'dashboard'], function () { @@ -50,7 +50,7 @@ Route::get('/invoices', [InvoiceController::class, 'index']); // Settings Route::group(['prefix' => 'settings'], function () { - Route::get('/flush-cache', [AppFunctionsController::class, 'flush_cache']); + Route::get('/flush-cache', [SettingController::class, 'flush_cache']); Route::post('/stripe', [SettingController::class, 'set_stripe']); Route::post('/email', [SettingController::class, 'set_email']); Route::patch('/', [SettingController::class, 'update']); diff --git a/routes/api.php b/routes/api.php index dc3e7d0b..5ebc952e 100644 --- a/routes/api.php +++ b/routes/api.php @@ -3,19 +3,18 @@ use App\Http\Controllers\AppFunctionsController; use App\Http\Controllers\Auth\ForgotPasswordController; use App\Http\Controllers\Auth\ResetPasswordController; -use App\Http\Controllers\FileBrowser\BrowseController; -use App\Http\Controllers\FileFunctions\EditItemsController; -use App\Http\Controllers\FileFunctions\FavouriteController; -use App\Http\Controllers\FileFunctions\ShareController; -use App\Http\Controllers\FileFunctions\TrashController; -use App\Http\Controllers\General\PricingController; +use App\Http\Controllers\FileManager\BrowseController; +use App\Http\Controllers\FileManager\EditItemsController; +use App\Http\Controllers\FileManager\FavouriteController; +use App\Http\Controllers\FileManager\ShareController; +use App\Http\Controllers\FileManager\TrashController; use App\Http\Controllers\Sharing\FileSharingController; // Pages Route::get('/content', [AppFunctionsController::class, 'get_setting_columns']); Route::post('/contact', [AppFunctionsController::class, 'contact_form']); Route::get('/page/{page}', [AppFunctionsController::class, 'get_page']); -Route::get('/pricing', [PricingController::class, 'index']); +Route::get('/pricing', [AppFunctionsController::class, 'get_storage_plans']); // Password reset Route::group(['prefix' => 'password'], function () { @@ -40,7 +39,7 @@ Route::group(['middleware' => ['auth:sanctum']], function () { // Trash Route::group(['prefix' => 'trash'], function () { Route::post('/restore', [TrashController::class, 'restore']); - Route::delete('/dump', [TrashController::class, 'clear']); + Route::delete('/dump', [TrashController::class, 'dump']); }); // Favourites @@ -62,6 +61,7 @@ Route::group(['middleware' => ['auth:sanctum']], function () { Route::group(['middleware' => ['auth:api', 'auth.shared', 'scope:visitor,editor']], function () { // Browse folders & files + // TODO: tests for private shared content Route::get('/folders/{unique_id}/private', [FileSharingController::class, 'get_private_folders']); Route::get('/navigation/private', [FileSharingController::class, 'get_private_navigation_tree']); Route::get('/search/private', [FileSharingController::class, 'search_private']); diff --git a/routes/setup.php b/routes/setup.php index 5fac3fb7..e4e690fa 100644 --- a/routes/setup.php +++ b/routes/setup.php @@ -1,6 +1,6 @@ ['auth:sanctum']], function () { Route::get('/', [AccountController::class, 'user']); // Payment cards - // TODO: testy + // TODO: tests Route::delete('/payment-cards/{id}', [PaymentMethodsController::class, 'delete']); Route::patch('/payment-cards/{id}', [PaymentMethodsController::class, 'update']); Route::post('/payment-cards', [PaymentMethodsController::class, 'store']); diff --git a/routes/web.php b/routes/web.php index 3b653b9c..6b20a730 100644 --- a/routes/web.php +++ b/routes/web.php @@ -2,18 +2,15 @@ use App\Http\Controllers\Admin\InvoiceController; use App\Http\Controllers\AppFunctionsController; -use App\Http\Controllers\FileAccessController; -use App\Http\Controllers\General\SetupWizardController; +use App\Http\Controllers\Setup\SetupWizardController; use App\Http\Controllers\Sharing\FileSharingController; -use App\Http\Controllers\WebhookController; +use App\Http\Controllers\Subscription\StripeWebhookController; -Route::post('/stripe/webhook', [WebhookController::class, 'handleWebhook']); +Route::post('/stripe/webhook', [StripeWebhookController::class, 'handleWebhook']); Route::post('/admin-setup', [SetupWizardController::class, 'create_admin_account']); -// Get user invoice -Route::group(['middleware' => ['auth:sanctum']], function () { - Route::get('/invoice/{customer}/{token}', [InvoiceController::class, 'show']); -}); +// Get user invoice from stripe service +Route::get('/invoice/{customer}/{token}', [InvoiceController::class, 'show'])->middleware(['auth:sanctum']); // Get og site for web crawlers if (Crawler::isCrawler()) { @@ -22,4 +19,5 @@ if (Crawler::isCrawler()) { Route::get('/shared/{token}', [FileSharingController::class, 'index']); } +// Show index.blade Route::get('/{any?}', [AppFunctionsController::class, 'index'])->where('any', '.*'); diff --git a/tests/Feature/External/SubscriptionTest.php b/tests/Feature/External/SubscriptionTest.php index 811625b7..98aa370e 100644 --- a/tests/Feature/External/SubscriptionTest.php +++ b/tests/Feature/External/SubscriptionTest.php @@ -473,7 +473,7 @@ class SubscriptionTest extends TestCase } /** - * @test + * */ public function it_get_all_plans_for_index_page() {