sunchayn/received

View on GitHub
app/Http/Controllers/Send/Folders.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php

namespace App\Http\Controllers\Send;

use App\Events\FilesUploaded;
use App\Http\Requests\Send\FilesUploadRequest;
use App\Http\Requests\Send\FolderUnlockRequest;
use App\Models\Folder;
use App\Models\User;
use App\Repositories\FoldersRepository;
use App\Repositories\UsersRepository;

class Folders extends \App\Http\Controllers\Controller
{
    /**
     * POST /send/{username}/unlock.
     *
     * Check folder availability for upload
     *
     * @param FolderUnlockRequest $request
     * @param FoldersRepository $folders
     * @param UsersRepository $users
     * @param $username
     * @return \Illuminate\Http\JsonResponse
     */
    public function unlock(
        FolderUnlockRequest $request,
        FoldersRepository $folders,
        UsersRepository $users,
        $username
    ) {
        $user = $users->getByUsername($username);

        /**
         * @var Folder $folder
         */
        $password = $request->validated()['password'];
        $folder = $folders->getFolderByPassword($user, $password);

        if (! $folder) {
            return $this->validationErrors([
                'password' => ['There\'s no public bucket matching the given credentials.'],
            ]);
        }

        // It does not allow uploading files to private folders
        if (! $folder->isShared()) {
            return $this->forbidden();
        }

        // It does not allow uploading files to users without subscription
        if (! $folder->user->subscription) {
            return $this->validationErrors([
                'size' => ['This bucket does not have enough storage space to accept more files.'],
            ]);
        }

        return $this->jsonData([
            'remainingStorage' => $folder->user->subscription->remainingStorage(),
        ]);
    }

    /**
     * POST /send/{username}/upload.
     *
     * Upload files to the specified folder by password.
     *
     * @param FilesUploadRequest $request
     * @param FoldersRepository $folders
     * @param UsersRepository $users
     * @param $username
     * @return \Illuminate\Http\JsonResponse
     */
    public function upload(
        FilesUploadRequest $request,
        FoldersRepository $folders,
        UsersRepository $users,
        $username
    ) {
        $data = $request->validated();

        /**
         * @var User $user
         */
        $user = $users->getByUsername($username);

        /**
         * @var Folder $folder
         */
        $folder = $folders->getFolderByPassword($user, $data['password']);

        if (! $folder) {
            return $this->validationErrors([
                'password' => ['There\'s no public bucket matching the given credentials.'],
            ]);
        }

        // It does not allow uploading files to users without subscription
        if (! $user->subscription) {
            return $this->validationErrors([
                'size' => ['This bucket does not have enough storage space to accept more files.'],
            ], [
                'code' => 1,
            ]);
        }

        // It does not allow uploading files to invalid folders
        if (! $folders->canUploadFiles($data['files'], $user->subscription)) {
            return $this->validationErrors([
                'size' => ['This bucket does not have enough storage space to accept more files.'],
            ], [
                'remaining_storage' => $user->subscription->remainingStorage(),
                'code' => 2,
            ]);
        }

        $files = $folders->uploadFiles($data['files'], $folder);

        event(new FilesUploaded($user, $folder, $files));

        return $this->jsonSuccess('The files has been successfully uploaded.');
    }
}