168 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
			
		
		
	
	
			168 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
<?php
 | 
						|
 | 
						|
namespace Modules\Admin\app\Http\Controllers;
 | 
						|
 | 
						|
use App\Http\Controllers\Controller;
 | 
						|
use App\Traits\HasFilterRequest;
 | 
						|
use App\Traits\HasOrderByRequest;
 | 
						|
use App\Traits\HasSearchRequest;
 | 
						|
use Illuminate\Http\Request;
 | 
						|
use Illuminate\Support\Facades\Storage;
 | 
						|
use Modules\Admin\app\Models\Document;
 | 
						|
 | 
						|
class DocumentController extends Controller
 | 
						|
{
 | 
						|
    use HasOrderByRequest;
 | 
						|
    use HasFilterRequest;
 | 
						|
    use HasSearchRequest;
 | 
						|
    
 | 
						|
    public function all(Request $request)
 | 
						|
    {
 | 
						|
        $documents = new Document;
 | 
						|
 | 
						|
        // Order by
 | 
						|
        $this->orderByRequest($documents, $request);
 | 
						|
        $documents->orderBy('title', 'asc');
 | 
						|
        // Filter
 | 
						|
        $this->filterRequest(
 | 
						|
            builder: $documents,
 | 
						|
            request: $request,
 | 
						|
            filterKeys: [
 | 
						|
                'title' => self::F_TEXT,
 | 
						|
            ]
 | 
						|
        );
 | 
						|
        $this->searchRequest(
 | 
						|
            builder: $documents,
 | 
						|
            value: $request->get('search'),
 | 
						|
            fields: [
 | 
						|
                'title',
 | 
						|
            ]
 | 
						|
        );
 | 
						|
 | 
						|
        $responseData = $documents->get();
 | 
						|
        return AbstractController::ResultSuccess($responseData);
 | 
						|
    }
 | 
						|
 | 
						|
    public function create(Request $request)
 | 
						|
    {
 | 
						|
        $request->validate([
 | 
						|
            'title' => 'required|string|max:255',
 | 
						|
            'type' => 'required|in:file,link',
 | 
						|
            'uri'   => 'nullable|array',
 | 
						|
            'uri.*' => 'nullable|url',
 | 
						|
            'files' => 'nullable|array',
 | 
						|
            'files.*' => 'file|mimes:doc,docx,xls,xlsx,pdf|max:20480',
 | 
						|
            'is_active' => 'required|boolean',
 | 
						|
        ]);
 | 
						|
 | 
						|
        if($request->type == "file") {
 | 
						|
            $uploadedFiles = [];
 | 
						|
            if ($request->hasFile('files')) {
 | 
						|
                foreach ($request->file('files') as $file) {
 | 
						|
                    $path = $file->store('uploads', options: 'public');
 | 
						|
                    $uploadedFiles[] = "storage/{$path}";
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            $document = Document::create([
 | 
						|
                'title' => $request->title,
 | 
						|
                'type' => $request->type,
 | 
						|
                'uri' =>  implode(',', $uploadedFiles),
 | 
						|
                'is_active' => $request->is_active,
 | 
						|
            ]);
 | 
						|
 | 
						|
            return AbstractController::ResultSuccess($document, "Document created successfully!");
 | 
						|
        }
 | 
						|
 | 
						|
        $document = Document::create([
 | 
						|
            'title' => $request->title,
 | 
						|
            'type' => $request->type,
 | 
						|
            'uri' =>  implode(',', $request->uri),
 | 
						|
            'is_active' => $request->is_active,
 | 
						|
        ]);
 | 
						|
 | 
						|
        return AbstractController::ResultSuccess($document, "Document created successfully!");
 | 
						|
    }
 | 
						|
 | 
						|
    public function update(Request $request)
 | 
						|
    {
 | 
						|
        $request->validate([
 | 
						|
            'id' => 'required|exists:documents,id',
 | 
						|
            'title' => 'required|string|max:255',
 | 
						|
            'type' => 'required|in:file,link',
 | 
						|
            'uri'   => 'nullable|array',
 | 
						|
            'uri.*' => 'nullable|url',
 | 
						|
            'files' => 'nullable|array',
 | 
						|
            'files.*' => 'file|mimes:doc,docx,xls,xlsx,pdf|max:20480',
 | 
						|
            'existing_files' => 'nullable|array',
 | 
						|
            'is_active' => 'required|boolean',
 | 
						|
        ]);
 | 
						|
 | 
						|
        $document = Document::find($request->input('id'));
 | 
						|
        if (!$document) {
 | 
						|
            return AbstractController::ResultError("Document not found.");
 | 
						|
        }
 | 
						|
 | 
						|
        if ($request->type === "file") {
 | 
						|
            $existingFiles = explode(',', $document->uri);
 | 
						|
            $selectedExistingFiles = $request->existing_files ?? [];
 | 
						|
 | 
						|
            $filesToDelete = array_diff($existingFiles, $selectedExistingFiles);
 | 
						|
            foreach ($filesToDelete as $file) {
 | 
						|
                $filePath = str_replace('storage/', 'public/', $file);
 | 
						|
                if (Storage::exists($filePath)) {
 | 
						|
                    Storage::delete($filePath);
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            $uploadedFiles = $selectedExistingFiles;
 | 
						|
            if ($request->hasFile('files')) {
 | 
						|
                foreach ($request->file('files') as $file) {
 | 
						|
                    $path = $file->store('uploads', 'public');
 | 
						|
                    $uploadedFiles[] = "storage/{$path}";
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            $document->update([
 | 
						|
                'title' => $request->title,
 | 
						|
                'type' => $request->type,
 | 
						|
                'uri' => implode(',', $uploadedFiles),
 | 
						|
                'is_active' => $request->is_active,
 | 
						|
            ]);
 | 
						|
 | 
						|
            return AbstractController::ResultSuccess($document, "Document updated successfully!");
 | 
						|
        }
 | 
						|
 | 
						|
        $document->update([
 | 
						|
            'title' => $request->title,
 | 
						|
            'type' => $request->type,
 | 
						|
            'uri' =>  implode(',', $request->uri),
 | 
						|
            'is_active' => $request->is_active,
 | 
						|
        ]);
 | 
						|
 | 
						|
        return AbstractController::ResultSuccess($document, "Document updated successfully!");
 | 
						|
    }
 | 
						|
 | 
						|
    public function delete(Request $request)
 | 
						|
    {
 | 
						|
        $id = $request->input('id');
 | 
						|
        $document = Document::find($id);
 | 
						|
        if (!$document) {
 | 
						|
            return AbstractController::ResultError("Document not found");
 | 
						|
        }
 | 
						|
 | 
						|
        if ($document->type === "file") {
 | 
						|
            $existingFiles = explode(',', $document->uri);
 | 
						|
            foreach ($existingFiles as $file) {
 | 
						|
                $filePath = str_replace('storage/', 'public/', $file);
 | 
						|
                if (Storage::exists($filePath)) {
 | 
						|
                    Storage::delete($filePath);
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        $document->delete();
 | 
						|
        return AbstractController::ResultSuccess("Document deleted successfully!");
 | 
						|
    }
 | 
						|
}
 |