Skip to content

Instantly share code, notes, and snippets.

@mitrallex
Last active July 27, 2018 18:09
Show Gist options
  • Save mitrallex/fa8b3a96f42065104c10822c044e705d to your computer and use it in GitHub Desktop.
Save mitrallex/fa8b3a96f42065104c10822c044e705d to your computer and use it in GitHub Desktop.
laravel-file-hosting-refactor
<?php
class FileController extends Controller
{
/**
* Constructor
*/
public function __construct()
{
$this->middleware('auth');
}
/**
* Fetch files by Type or Id
* @param string $type File type
* @param integer $id File Id
* @return object Files list, JSON
*/
public function index($type, $id = null)
{
$model = new File();
if (!is_null($id)) {
$response = $model::findOrFail($id);
} else {
$records_per_page = ($type == 'video') ? 6 : 15;
$files = $model::where('type', $type)
->where('user_id', Auth::id())
->orderBy('id', 'desc')->paginate($records_per_page);
$response = [
'pagination' => [
'total' => $files->total(),
'per_page' => $files->perPage(),
'current_page' => $files->currentPage(),
'last_page' => $files->lastPage(),
'from' => $files->firstItem(),
'to' => $files->lastItem()
],
'data' => $files
];
}
return response()->json($response);
}
/**
* Upload new file and store it
* @param Request $request Request with form data: filename and file info
* @return boolean True if success, otherwise - false
*/
public function store(Request $request)
{
$this->validate($request, [
'name' => 'required|unique:files',
'file' => 'required|file|mimes:' . File::getAllExtensions() . '|max:' . File::getMaxSize()
]);
$file = new File();
$uploaded_file = $request->file('file');
$original_ext = $uploaded_file->getClientOriginalExtension();
$type = $file->getType($original_ext);
if ($file->upload($type, $uploaded_file, $request['name'], $original_ext)) {
return $file::create([
'name' => $request['name'],
'type' => $type,
'extension' => $original_ext,
'user_id' => Auth::id()
]);
}
return response()->json(false);
}
/**
* Edit specific file
* @param integer $id File Id
* @param Request $request Request with form data: filename
* @return boolean True if success, otherwise - false
*/
public function edit($id, Request $request)
{
$file = File::where('id', $id)->where('user_id', Auth::id())->first();
if ($file->name == $request['name']) {
return response()->json(false);
}
$this->validate($request, [
'name' => 'required|unique:files'
]);
$old_filename = $file->getName($file->type, $file->name, $file->extension);
$new_filename = $file->getName($request['type'], $request['name'], $request['extension']);
if (Storage::disk('local')->exists($old_filename)) {
if (Storage::disk('local')->move($old_filename, $new_filename)) {
$file->name = $request['name'];
return response()->json($file->save());
}
}
return response()->json(false);
}
/**
* Delete file from disk and database
* @param integer $id File Id
* @return boolean True if success, otherwise - false
*/
public function destroy($id)
{
$file = File::findOrFail($id);
if (Storage::disk('local')->exists($file->getName($file->type, $file->name, $file->extension))) {
if (Storage::disk('local')->delete($file->getName($file->type, $file->name, $file->extension))) {
return response()->json($file->delete());
}
}
return response()->json(false);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment