invitations pour acces aux sources (suite)
[mw_sourceml] / app / controllers / users / sources_invitations.php
diff --git a/app/controllers/users/sources_invitations.php b/app/controllers/users/sources_invitations.php
new file mode 100644 (file)
index 0000000..40f2a2f
--- /dev/null
@@ -0,0 +1,331 @@
+<?php
+
+  class mw_users_sources_invitations extends mw_controller{
+
+    var $user;
+
+    var $status;
+    var $album_status_id;
+    var $morceau_status_id;
+    var $piste_status_id;
+
+    function validate(){
+      $env = $this->env();
+      $data = $env->data();
+      if(($this->status = $data->source_status()) === false){
+        return "Impossible de lire la liste des status de source";
+      }
+      foreach($this->status as $id_source_status => $source_status){
+        if($source_status["nom"] == "album") $this->album_status_id = $id_source_status;
+        if($source_status["nom"] == "morceau") $this->morceau_status_id = $id_source_status;
+        if($source_status["nom"] == "piste") $this->piste_status_id = $id_source_status;
+        if(isset($this->album_status_id) && isset($this->morceau_status_id) && isset($this->piste_status_id)) break;
+      }
+      if(!isset($this->album_status_id) || !isset($this->morceau_status_id) || !isset($this->album_status_id)){
+        $inconnus = "";
+        if(!isset($this->album_status_id)) $inconnus .= ($inconnus ? ", " : "")."album";
+        if(!isset($this->morceau_status_id)) $inconnus .= ($inconnus ? ", " : "")."morceau";
+        if(!isset($this->piste_status_id)) $inconnus .= ($inconnus ? ", " : "")."piste";
+        return "Types de source inconnu: ".$inconnus;
+      }
+      if(!($this->user = $env->user())){
+        return "Vous devez être identifié pour accéder à cette page";
+      }
+      return true;
+    }
+
+    function index(){
+      $env = $this->env();
+      $data = $env->data();
+      if(($sources_access = $data->sources_access()) === false){
+        $env->erreur("Impossible de lire les types d'access");
+        return;
+      }
+      if(($groupes = $data->groupes($this->user["id"])) === false){
+        $env->erreur("Impossible de lire la liste des groupes");
+        return;
+      }
+      $groupes_in = "";
+      foreach($groupes["list"] as $id_groupe => $groupe) $groupes_in .= ($groupes_in ? "," : "").$id_groupe;
+      $invitations = array("list" => array(), "total" => 0);
+      if($groupes_in){
+        if(
+          (
+            $invitations = $data->list_sml_sources_invitations(
+              array(
+                "index_name" => "id",
+                "where"=> "id_author IN(".$groupes_in.") OR id_user=".$this->user["id"],
+                "order_by" => "date_invitation",
+                "order" => "DESC"
+              )
+            )
+          ) === false
+        ){
+          $env->erreur("Impossible de lire la liste des invitations");
+          return;
+        }
+      }
+      foreach($invitations["list"] as $id_invitation => $invitation){
+        if(!($user = $data->user_by_id($invitation["id_user"]))){
+          $env->erreur("impossible de lire les informations de l'utilisateur pour une invitation");
+          return;
+        }
+        $invitations["list"][$id_invitation]["user"] = $user;
+        if(!($source = $data->source($invitation["id_source"]))){
+          $env->erreur("impossible de lire les informations de la source pour une invitation");
+          return;
+        }
+        $invitations["list"][$id_invitation]["source"] = $source;
+      }
+      if(($groupes = $data->groupes()) === false){
+        $env->erreur("Impossible de lire la liste des groupes");
+        return;
+      }
+      $env->set_out("user", $this->user);
+      $env->set_out("groupes", $groupes);
+      $env->set_out("sources_access", $sources_access);
+      $env->set_out("invitations", $invitations);
+      $env->set_out("status", $this->status);
+    }
+
+    function source_groupes(){
+      $env = $this->env();
+      $data = $env->data();
+      if(!($source = $data->source($_GET[$env->param("id")], true))){
+        $env->erreur("Impossible de lire les informations de la source");
+        return;
+      }
+      $source["permissions"] = $data->source_permissions($source, $this->user["id"]);
+      if(!$source["permissions"]["admin"]){
+        $env->erreur("vous n'avez pas la permission d'editer les groupes de la source");
+        return;
+      }
+      if(($sources_access = $data->sources_access()) === false){
+        $env->erreur("Impossible de lire les types d'access");
+        return;
+      }
+      if(($groupes = $data->groupes()) === false){
+        $env->erreur("Impossible de lire la liste des groupes");
+        return;
+      }
+      if(($invitations = $data->list_sml_sources_invitations(array("index_name" => "id", "where"=> "id_source=".$source["id"]))) === false){
+        $env->erreur("Impossible de lire la liste des invitations pour cette source");
+        return;
+      }
+      foreach($invitations["list"] as $id_invitation => $invitation){
+        if(isset($groupes["list"][$invitation["id_author"]])){
+          $invitations["list"][$id_invitation]["author"] = $groupes["list"][$invitation["id_author"]];
+          unset($groupes["list"][$invitation["id_author"]]);
+          $groupes["total"]--;
+        }
+      }
+      foreach($source["groupes"] as $id_groupe => $groupe){
+        if(isset($groupes["list"][$id_groupe])){
+          unset($groupes["list"][$id_groupe]);
+          $groupes["total"]--;
+        }
+      }
+      $env->set_out("groupes", $groupes);
+      $env->set_out("sources_access", $sources_access);
+      $env->set_out("source", $source);
+      $env->set_out("invitations", $invitations);
+    }
+
+    function invite_groupe(){
+      $env = $this->env();
+      $data = $env->data();
+      if(!($source = $data->source($_GET[$env->param("id")], true))){
+        $env->erreur("Impossible de lire les informations de la source");
+        return;
+      }
+      $source["permissions"] = $data->source_permissions($source, $this->user["id"]);
+      if(!$source["permissions"]["admin"]){
+        $env->erreur("vous n'avez pas la permission d'editer les groupes de la source");
+        return;
+      }
+      if(($sources_access = $data->sources_access()) === false){
+        $env->erreur("Impossible de lire les types d'access");
+        return;
+      }
+      if(!($groupe = $data->groupe($_POST["id_groupe"]))){
+        $env->erreur("impossible de lire les informations du groupe");
+      }
+      if(!$_POST["id_sources_access"] || !isset($sources_access[$_POST["id_sources_access"]])){
+        $env->erreur("identifiant d'access de source incorrect");
+      }
+      if(
+        !$data->add_sml_sources_invitations(
+          array(
+            "id_user" => $this->user["id"],
+            "id_source" => $source["id"],
+            "id_author" => $groupe["id"],
+            "id_sources_access" => $_POST["id_sources_access"],
+            "date_invitation" => date("Y-m-d H:i:s")
+          )
+        )
+      ){
+        $env->erreur("Impossible d'ajouter l'invitation");
+        return;
+      }
+      $env->redirect(
+        $env->url("users/sources_invitations"),
+        "l'invitation a été ajoutée"
+      );
+    }
+
+    function annule_invitation_groupe(){
+      $env = $this->env();
+      $data = $env->data();
+      if(!($invitation = $data->get_sml_sources_invitations("id", $_GET[$env->param("id")]))){
+        $env->erreur("Impossible de lire les informations de l'invitation");
+        return;
+      }
+      if(!($morceau = $data->source($invitation["id_source"], true))){
+        $env->erreur("Impossible de lire les informations du morceau");
+        return;
+      }
+      $morceau["permissions"] = $data->source_permissions($morceau, $this->user["id"]);
+      if(!$morceau["permissions"]["admin"]){
+        $env->erreur("vous n'avez pas la permission d'editer les groupes du morceau");
+        return;
+      }
+      if(!$data->del_sml_sources_invitations("id", $invitation["id"])){
+        $env->erreur("Impossible d'annuler l'invitation");
+        return;
+      }
+      $env->redirect(
+        $env->url("users/sources_invitations"),
+        "l'invitation a été annulée"
+      );
+    }
+
+    function accepter_invitation_groupe(){
+      $env = $this->env();
+      $data = $env->data();
+      if(($groupes = $data->groupes($this->user["id"])) === false){
+        $env->erreur("Impossible de lire la liste des groupes");
+        return;
+      }
+      if(!($invitation = $data->get_sml_sources_invitations("id", $_GET[$env->param("id")]))){
+        $env->erreur("Impossible de lire les informations de l'invitation");
+        return;
+      }
+      if(!($source = $data->source($invitation["id_source"], true))){
+        $env->erreur("Impossible de lire les informations de la source pour cette invitation");
+        return;
+      }
+      if(!isset($groupes["list"][$invitation["id_author"]])){
+        $env->erreur("l'invitation s'adresse a un groupe qui n'appartient pas à votre utilisateur");
+        return;
+      }
+      $source["permissions"] = $data->source_permissions($source, $this->user["id"]);
+      if($source["permissions"]["contributeur"]){
+        $env->erreur("vous avez déjà accès à cette source");
+        return;
+      }
+      if(!$data->del_sml_sources_invitations("id", $invitation["id"])){
+        $env->erreur("Impossible d'effacer l'invitation");
+        return;
+      }
+      if(!$data->add_source_groupe($source["id"], $invitation["id_author"], $invitation["id_sources_access"])){
+        $env->erreur("Impossible de vous ajouter des droits sur la source");
+        return;
+      }
+      $env->redirect(
+        $env->url("users/sources_invitations"),
+        "l'invitation a été acceptée"
+      );
+    }
+
+    function refuser_invitation_groupe(){
+      $env = $this->env();
+      $data = $env->data();
+      if(($groupes = $data->groupes($this->user["id"])) === false){
+        $env->erreur("Impossible de lire la liste des groupes");
+        return;
+      }
+      if(!($invitation = $data->get_sml_sources_invitations("id", $_GET[$env->param("id")]))){
+        $env->erreur("Impossible de lire les informations de l'invitation");
+        return;
+      }
+      if(!($source = $data->source($invitation["id_source"], true))){
+        $env->erreur("Impossible de lire les informations de la source pour cette invitation");
+        return;
+      }
+      if(!isset($groupes["list"][$invitation["id_author"]])){
+        $env->erreur("l'invitation s'adresse a un groupe qui n'appartient pas à votre utilisateur");
+        return;
+      }
+      if(!$data->del_sml_sources_invitations("id", $invitation["id"])){
+        $env->erreur("Impossible d'effacer l'invitation");
+        return;
+      }
+      $env->redirect(
+        $env->url("users/sources_invitations"),
+        "l'invitation a été refusée"
+      );
+    }
+
+    function del_groupe(){
+      $env = $this->env();
+      $data = $env->data();
+      if(!($source = $data->source($_GET[$env->param("id")], true))){
+        $env->erreur("Impossible de lire les informations de la source");
+        return;
+      }
+      $source["permissions"] = $data->source_permissions($source, $this->user["id"]);
+      if(!$source["permissions"]["admin"]){
+        $env->erreur("vous n'avez pas la permission d'editer les groupes de la source");
+        return;
+      }
+      $source_class = $this->status[$source["status"]]["nom"];
+      if($source_class == "album"){
+        $redirect = $env->url("users/albums/groupes", array("id" => $source["id"]));
+      }
+      elseif($source_class == "morceau"){
+        $redirect = $env->url("users/morceaux/groupes", array("id" => $source["id"]));
+      }
+      elseif($source_class == "piste"){
+        $redirect = $env->url("users/pistes/groupes", array("id" => $source["id"]));
+      }
+      else{
+        $env->erreur("type de source inconnu");
+        return;
+      }
+      if(!($groupe = $data->groupe($_GET[$env->param("groupe")]))){
+        $env->erreur("impossible de lire les informations du groupe");
+        return;
+      }
+      $ID_UNIQUE_ADMIN = false;
+      foreach($source["groupes"] as $id_groupe => $source_groupe){
+        if($source_groupe["id_groupe_status"] == $data->id_groupe_status_admin()){
+          if(!$ID_UNIQUE_ADMIN) $ID_UNIQUE_ADMIN = $id_groupe;
+          else{
+            $ID_UNIQUE_ADMIN = true;
+            break;
+          }
+        }
+      }
+      if(!$ID_UNIQUE_ADMIN){
+        $env->erreur("aucun administrateur sur cette source");
+        return;
+      }
+      if($ID_UNIQUE_ADMIN !== true){
+        if($groupe["id"] == $ID_UNIQUE_ADMIN){
+          $env->erreur("vous ne pouvez pas enlever l'unique administrateur");
+          return;
+        }
+      }
+      if(!$data->del_source_groupe($source["id"], $groupe["id"])){
+        $env->erreur("Impossible d'enlever le groupe");
+        return;
+      }
+      $env->redirect(
+        $redirect,
+        "le groupe a été enlevé"
+      );
+    }
+
+  }
+
+?>
\ No newline at end of file