openlucius-2.0.0-alpha3/modules/apps/ol_files/src/Services/OlFolders.php

modules/apps/ol_files/src/Services/OlFolders.php
<?php

namespace Drupal\ol_files\Services;

use Drupal\Core\Url;
use Drupal\ol_folder\Entity\OlFolder;
use Drupal\user\Entity\User;
use Symfony\Component\HttpFoundation\RedirectResponse;

/**
 * Class OlMembers.
 */
class OlFolders{

  /**
  * @var $database
  */
  protected $database;

  /**
   * @var $route
   */
  protected $route;

  /**
   * @var $messenger
   */
  protected $messenger;

  /**
   * @var $current_user
   */
  protected $current_user;

  /**
   * @var $members
   */
  protected $members;

  /**
   * @var $stream
   */
  protected $stream;

  /**
   * OlFolder constructor.
   *
   * @param $route
   * @param $connection
   * @param $messenger
   * @param $current_user
   * @param $members
   * @param $files
   */
  public function __construct($route, $connection, $messenger, $current_user, $members, $stream) {
    $this->route = $route;
    $this->database = $connection;
    $this->messenger = $messenger;
    $this->current_user = $current_user;
    $this->members = $members;
    $this->stream = $stream;
  }

  /**
   * @param $name
   * @return int|string|null
   * @throws \Drupal\Core\Entity\EntityStorageException
   */
  public function saveFolder($name){
    $gid = $this->route->getParameter('gid');
    $folder = OlFolder::create([
      'name' => $name,
      'group_id' => $gid,
    ]);
    $folder->save();
    $id = $folder->id();
    $stream_body = t('Added a folder: @folder', array('@folder' => $name));
    $this->stream->addStreamItem($gid, 'folder_added', $stream_body, 'folder', $id);
    return $id;
  }

  /**
   * @param null $folder_id
   */
  public function removeFolder($folder_id = null){
    // Get current gid.
    $gid = $this->route->getParameter('gid');
    // Check if current user may remove folder.
    if($this->canAdminFolder($folder_id)) {
      // Get folder id, if not provided.
      $folder_id = (empty($folder_id)) ? $this->route->getParameter('folder_id') : $folder_id;
      // Get folder name for stream item.
      $folder_name = $this->getFolderName($folder_id);
      // Delete folder entity.
      \Drupal::database()->delete('ol_folder')
        ->condition('id', $folder_id, '=')
        ->execute();
      // Delete folder reference from files.
      \Drupal::database()->update('ol_file')
        ->fields(['folder_id' => null])
        ->condition('folder_id', $folder_id)
        ->execute();
      // Add stream item.
      $stream_body = t('Removed a folder: @folder', array('@folder' => $folder_name));
      $this->stream->addStreamItem($gid, 'folder_removed', $stream_body, 'folder', $folder_id);
      \Drupal::messenger()->addStatus(t('Folder removed successfully.'));
    }
    $path = Url::fromRoute('ol_files.group_files',['gid' => $gid, 'folder_id' => $folder_id])->toString();
    $response = new RedirectResponse($path);
    $response->send();
  }

  /**
   * @param $name
   * @param null $folder_id
   */
  public function updateFolder($name, $folder_id = null){
    // Check if current user may remove folder.
    if($this->canAdminFolder($folder_id)) {
      \Drupal::database()->update('ol_folder')
        ->fields(['name' => $name])
        ->condition('id', $folder_id)
        ->execute();
    }
  }

  /**
   * @param $gid
   * @return mixed
   */
  function getFoldersData($gid){
    $folders = $this->getFolders($gid);
    foreach ($folders as $folder){
      // Needed for badge.
      $folder->count_files = $this->countFilesInFolder($folder->id);
      // Needed to show/hide drop down.
      $folder->can_admin = $this->canAdminFolder($folder->id);
    }
    return $folders;
  }

  /**
   * @param null $gid
   * @return mixed
   */
  public function getFolders($gid = null){
    $gid = (empty($gid)) ? $this->route->getParameter('gid') : $gid;
    $query = \Drupal::database()->select('ol_folder', 'of');
    $query->addField('of', 'id');
    $query->addField('of', 'name');
    $query->condition('of.group_id', $gid);
    $query->condition('of.status', 1);
    $query->orderBy('of.name');
    return $query->execute()->fetchAll();
  }

  /**
   * @param $folder_id
   * @return mixed
   */
  private function countFilesInFolder($folder_id){
    $query = \Drupal::database()->select('ol_file', 'of');
    $query->addField('of', 'folder_id');
    $query->condition('of.folder_id', $folder_id);
    $query->condition('of.status', 1);
    return $query->countQuery()->execute()->fetchField();
  }

  /**
   * @param $group_id
   * @return array
   */
  function getFoldersInCurrentGroup($group_id = null){
    $group_id = (empty($group_id)) ? $this->route->getParameter('gid') : $group_id;
    $current_folders = $this->getFolders($group_id);
    $folders = array();
    $folders[0] = '--'. t('Choose folder') .'--';
    foreach ($current_folders as $folder){
      $folders[$folder->id] = $folder->name;
    }
    return $folders;
  }

  /**
   * @param $folder_id
   * @return bool
   */
  private function canAdminFolder($folder_id = null){
    // If user is group admin, return true.
    if(is_numeric($this->members->isGroupAdmin())) {
      return TRUE;
    }
    // Get folder id, if not provided.
    $folder_id = (empty($folder_id)) ? $this->route->getParameter('folder_id') : $folder_id;
    // User is not group admin of current group, check if user is folder owner.
    $query = \Drupal::database()->select('ol_folder', 'of');
    $query->addField('of', 'user_id');
    $query->condition('of.id', $folder_id);
    $query->condition('of.status', 1);
    $uid =  $query->execute()->fetchField();
    return ($uid == $this->current_user->id());
  }

  /**
   * @param $file_id
   * @param null $group_id
   */
  function removeFileFromFolder($id, $group_id = null){
    // Only remove if file owner or group admin
    if($this->members->isGroupAdmin() || $this->isFileOwner($id) ){
      $group_id = (empty($group_id)) ? $this->route->getParameter('gid') : $group_id;
      \Drupal::database()->update('ol_file')
        ->fields(['folder_id' => 0])
        ->condition('group_id', $group_id)
        ->condition('id', $id)
        ->execute();
      \Drupal::messenger()->addStatus(t('Your file was successfully removed from folder.'));
    }
    else{
      \Drupal::messenger()->addWarning(t('No access.'));
    }
  }

  /**
   * This is duplicate, see files service, to avoid Circular reference.
   * @param $fid
   * @return bool
   */
  private function isFileOwner($id){
    $query = \Drupal::database()->select('ol_file', 'fr');
    $query->addField('fr', 'user_id');
    $query->condition('fr.id', $id);
    $uid = $query->execute()->fetchField();
    return ($uid == $this->current_user->id());
  }

  /**
   * @param $folder_id
   * @return mixed
   */
  private function getFolderName($folder_id){
    $query = \Drupal::database()->select('ol_folder', 'olf');
    $query->addField('olf', 'name');
    $query->condition('olf.id', $folder_id);
    return $query->execute()->fetchField();
  }

  /**
   * @param $id_folder
   * @param $fid
   * @param null $gid
   */
  public function placeFileInFolder($id_folder, $id, $gid = null){
    // Get gid if empty.
    $gid = (empty($gid)) ? $this->route->getParameter('gid') : $gid;
    // Update file record with folder id.
    \Drupal::database()->update('ol_file')
      ->fields(['folder_id' => $id_folder])
      ->condition('group_id', $gid)
      ->condition('id', $id)
      ->execute();
    // Message.
    \Drupal::messenger()->addStatus(t('Your file was successfully moved.'));
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc