Bottaajat/cultura

View on GitHub
app/Http/Controllers/MaterialController.php

Summary

Maintainability
C
7 hrs
Test Coverage
<?php

namespace App\Http\Controllers;

use File, Auth, Validator;
use Illuminate\Http\Request;

use App\Http\Requests;
use App\Models\Material;
use App\Models\Exercise;

class MaterialController extends Controller
{
  public function __construct() {
    $this->middleware('auth');
  }

  public function index(Request $request) {
    if (!belongsToSchool(Auth::user())) {
      return back()->withErrors("Selataksesi materiaalia, sinun täytyy olla jonkin koulun jäsen");
    }
    $exercise_list = Exercise::when(Auth::user()->school != NULL, 
        function ($query)  {
          return $query->Where('school_id', '=', Auth::user()->school->id);
        })
      ->lists('name', 'id');
    $search = $request->input('search');

    if (strlen($search) > 0) {
      $materials = Material::Where(
          function ($query) use ($search) {
            $query->where('label', 'like', "%$search%")
            ->orWhere('type', "$search")
            ->orWhere('id', "$search")
            ->orWhereHas('exercise', function ($query) use ($search) {
                $query->where('name', 'like', "%$search%");
              });
          })
        ->when(Auth::user()->school != NULL, 
          function ($query)  {
            return $query->WhereHas('exercise', function ($query) {
              $query->where('school_id', '=', Auth::user()->school->id);
            });
          })
        ->paginate(10)
        ->appends(['search' => $search]);
      return view('material.index', array('materials' => $materials,
                'exercise_list' => $exercise_list, 'search' => $search));
    }
    else
      $materials = Material::
        When(Auth::user()->school != NULL, function ($query) {
          return $query->WhereHas('exercise', function ($query) {
            $query->where('school_id', '=', Auth::user()->school->id);
          });
        })
        ->paginate(10);
      return view('material.index', array('materials' => $materials, 
                'exercise_list' => $exercise_list ));
  }

  /**
  * Store a newly created resource in storage.
  *
  * @param  \Illuminate\Http\Request  $request
  * @return \Illuminate\Http\Response
  */
  public function store(Request $request) {
    $exercise = Exercise::find($request->input('exercise_id'));    
    if ($this->checkPermissions($exercise)) {
      $validate = $this->validator($request->all());
      if($validate->fails()) return back()->withErrors($validate);

      $material = new Material();
      $material->label = $request->input('label');
      $material->contents = $request->input('contents');
      $material->type = $request->input('type');
      
      if (!$this->setExercise($request, $material)) {
        return back()->withErrors('Et voi muuttaa materiaalia harjoitukseen!');
      }
      if(!$this->handleFiles($request, $material)) {
        return back()->withErrors('Vain kuva ja äänitiedostot ovat sallittuja! (Valitse tyyppi)');
      }
      $material->save();
      return back()->with('success', 'Materiaali lisätty!');
    } else {
      return back()->withErrors('Et voi lisätä tälle harjoitukselle materiaalia!');
    }
  }

  /**
   * Update the specified resource in storage.
   *
   * @param  \Illuminate\Http\Request  $request
   * @param  int  $id
   * @return \Illuminate\Http\Response
   */
  public function update(Request $request, $id) {
    $material = Material::find($id);
    $exercise = $material->exercise;
    if ($this->checkPermissions($exercise)) {
    
      $validate = $this->validator($request->all());
      if($validate->fails()) {
        return back()->withErrors($validate);
      }
      $material->label = $request->input('label');
      $material->contents = $request->input('content');

      if ($request->hasFile('file')) {
        if(!$this->handleFiles($request, $material)) {
          return back()->withErrors('Virheellinen tiedostoformaatti!');
        }
      } else if ($request->input('type') == "text" && $material->src) {
          File::delete(public_path() . $material->src);
      }
      
      $material->type = $request->input('type');
      
      if (!$this->setExercise($request, $material)) {
        return back()->withErrors('Et voi muuttaa materiaalia harjoitukseen!');
      }
      $material->save();
      return back()->with('success', 'Materiaali päivitetty!');
    } else {
      return back()->withErrors('Et voi päivittää tätä materiaalia!');
    }
  }

  /**
   * Remove the specified resource from storage.
   *
   * @param  int  $id
   * @return \Illuminate\Http\Response
   */
  public function destroy($id) {
    $material = Material::find($id);
    $exercise = $material->exercise;
    if ($this->checkPermissions($exercise)) {
      if ($material->glossary != null) { 
        $material->glossary->delete();
      }
      File::delete(public_path() . $material->src);
      $material->delete();
      return back()->with('success', 'Materiaali poistettu!');
    } else {
      return back()->withErrors('Et voi poistaa tätä materiaalia!')->withInput();
    }
  }
  
  
  // Tarkistaa että käyttäjä on kirjautunut ja että hänellä on oikeudet hallintaan
  private function checkPermissions($exercise) {
    if(!Auth::user()->is_admin && $exercise->school == NULL)
      return false;
    if(!Auth::user()->is_admin && Auth::user()->school->id != $exercise->school->id)
      return false;
    return true;
  }
  
  private function handleFiles(Request $request, $material) {

    if ($request->hasFile('file')) {
      $extension = $request->file('file')->getClientOriginalExtension();
      
      if ($request->input('type') == "image" 
                && allowedExtension($extension, allowedImageExtensions()))
          return handleFile($request, $material, public_path() . "/img/");
      
      if ($request->input('type') == "sound" 
                && allowedExtension($extension, allowedAudioExtensions()))
          return handleFile($request, $material, public_path() . "/audio/");
    }
    else if ($request->input('type') == "text") {
      return true;
    }
    return false;
  }
  
  // Tarkistaa että käyttäjä voi lisätä harjoitukseen materiaalia
  private function setExercise(Request $request, $material) {
    $new_exercise = Exercise::find($request->input('exercise_id'));
    if ($new_exercise != NULL && 
          checkMembership(Auth::user(), $new_exercise->school)) {
      $material->exercise()->associate($new_exercise->id);
      return true;
    } else {
      return false;
    }
  }
  
  protected function validator(array $data) {
    return Validator::make($data, [
      'label' => 'required|max:255',
      'contents' => 'max:1000',
    ]);
  }
}