From b9233b8343509c0de1abee3fc5465a5bd177efda Mon Sep 17 00:00:00 2001
From: plegall <plg@piwigo.org>
Date: Wed, 13 Nov 2013 12:58:21 +0000
Subject: [PATCH] feature 2976: ability to set group association with
 pwg.users.setInfo

git-svn-id: http://piwigo.org/svn/trunk@25474 68402e56-0260-453c-a942-63ccdbb3a9ee
---
 include/ws_functions/pwg.users.php | 38 ++++++++++++++++++++++++++++++
 ws.php                             |  4 +++-
 2 files changed, 41 insertions(+), 1 deletion(-)

diff --git a/include/ws_functions/pwg.users.php b/include/ws_functions/pwg.users.php
index 42a362ec2..cbc988343 100644
--- a/include/ws_functions/pwg.users.php
+++ b/include/ws_functions/pwg.users.php
@@ -516,6 +516,44 @@ UPDATE '. USER_INFOS_TABLE .' SET ';
     pwg_query($query);
   }
 
+  // manage association to groups
+  if (!empty($params['group_id']))
+  {
+    $query = '
+DELETE
+  FROM '.USER_GROUP_TABLE.'
+  WHERE user_id IN ('.implode(',', $params['user_id']).')
+;';
+    pwg_query($query);
+
+    // we remove all provided groups that do not really exist
+    $query = '
+SELECT
+    id
+  FROM '.GROUPS_TABLE.'
+  WHERE id IN ('.implode(',', $params['group_id']).')
+;';
+    $group_ids = array_from_query($query, 'id');
+
+    // if only -1 (a group id that can't exist) is in the list, then no
+    // group is associated
+    
+    if (count($group_ids) > 0)
+    {
+      $inserts = array();
+      
+      foreach ($group_ids as $group_id)
+      {
+        foreach ($params['user_id'] as $user_id)
+        {
+          $inserts[] = array('user_id' => $user_id, 'group_id' => $group_id);
+        }
+      }
+
+      mass_inserts(USER_GROUP_TABLE, array_keys($inserts[0]), $inserts);
+    }
+  }
+
   return $service->invoke('pwg.users.getList', array(
     'user_id' => $params['user_id'],
     'display' => 'basics,'.implode(',', array_keys($updates_infos)),
diff --git a/ws.php b/ws.php
index b3f7c0076..94ea92503 100644
--- a/ws.php
+++ b/ws.php
@@ -884,6 +884,7 @@ enabled_high, registration_date, registration_date_string, registration_date_sin
                                     'type'=>WS_TYPE_INT|WS_TYPE_POSITIVE),
         'language' =>         array('flags'=>WS_PARAM_OPTIONAL),
         'theme' =>            array('flags'=>WS_PARAM_OPTIONAL),
+        'group_id' => array('flags'=>WS_PARAM_OPTIONAL|WS_PARAM_FORCE_ARRAY, 'type'=>WS_TYPE_INT),
         // bellow are parameters removed in a future version
         'nb_image_page' =>    array('flags'=>WS_PARAM_OPTIONAL,
                                     'type'=>WS_TYPE_INT|WS_TYPE_POSITIVE|WS_TYPE_NOTNULL),
@@ -899,7 +900,8 @@ enabled_high, registration_date, registration_date_string, registration_date_sin
                                     'type'=>WS_TYPE_BOOL),
         ),
       'Updates a user. Leave a field blank to keep the current value.
-<br>"username", "password" and "email" are ignored if "user_id" is an array.',
+<br>"username", "password" and "email" are ignored if "user_id" is an array.
+<br>set "group_id" to -1 if you want to dissociate users from all groups',
       $ws_functions_root . 'pwg.users.php',
       array('admin_only'=>true, 'post_only'=>true)
     );