diff --git a/net/common/rpc-service.c b/net/common/rpc-service.c index 53290e3..e5fd054 100644 --- a/net/common/rpc-service.c +++ b/net/common/rpc-service.c @@ -300,6 +300,10 @@ ccnet_start_rpc(CcnetSession *session) ccnet_rpc_get_descendants_groups, "get_descendants_groups", searpc_signature_objlist__int()); + searpc_server_register_function ("ccnet-threaded-rpcserver", + ccnet_rpc_get_groups_members, + "get_groups_members", + searpc_signature_objlist__string()); searpc_server_register_function ("ccnet-threaded-rpcserver", ccnet_rpc_create_org, @@ -1674,4 +1678,16 @@ ccnet_rpc_get_primary_id (const char *email, GError **error) return ccnet_user_manager_get_primary_id (user_mgr, email); } +GList * +ccnet_rpc_get_groups_members (const char *group_ids, GError **error) +{ + if (!group_ids || g_strcmp0(group_ids, "") == 0) { + g_set_error (error, CCNET_DOMAIN, CCNET_ERR_INTERNAL, "Bad arguments"); + return NULL; + } + CcnetGroupManager *group_mgr = ((CcnetServerSession *)session)->group_mgr; + + return ccnet_group_manager_get_groups_members (group_mgr, group_ids, error); +} + #endif /* CCNET_SERVER */ diff --git a/net/common/rpc-service.h b/net/common/rpc-service.h index 6608df9..334cbf7 100644 --- a/net/common/rpc-service.h +++ b/net/common/rpc-service.h @@ -347,4 +347,7 @@ ccnet_rpc_login_relay (const char *relay_id, const char *email, int ccnet_rpc_logout_relay (const char *relay_id, GError **error); +GList * +ccnet_rpc_get_groups_members (const char *group_ids, GError **error); + #endif /* RPC_SERVICE_H */ diff --git a/net/common/session.h b/net/common/session.h index 06ad27e..6238ef1 100644 --- a/net/common/session.h +++ b/net/common/session.h @@ -13,6 +13,8 @@ #include #include +#include + #include "ccnet-session-base.h" #include "processor.h" diff --git a/net/server/group-mgr.c b/net/server/group-mgr.c index 8ed0d0c..4a136d7 100644 --- a/net/server/group-mgr.c +++ b/net/server/group-mgr.c @@ -1312,3 +1312,64 @@ ccnet_group_manager_search_groups (CcnetGroupManager *mgr, return g_list_reverse (ret); } + +static gboolean +get_groups_members_cb (CcnetDBRow *row, void *data) +{ + GList **users = data; + const char *user = ccnet_db_row_get_column_text (row, 0); + + char *user_l = g_ascii_strdown (user, -1); + CcnetGroupUser *group_user = g_object_new (CCNET_TYPE_GROUP_USER, + "user_name", user_l, + NULL); + g_free (user_l); + *users = g_list_append(*users, group_user); + + return TRUE; +} + +/* group_ids is json format: "[id1, id2, id3, ...]" */ +GList * +ccnet_group_manager_get_groups_members (CcnetGroupManager *mgr, const char *group_ids, + GError **error) +{ + CcnetDB *db = mgr->priv->db; + GList *ret = NULL; + GString *sql = g_string_new (""); + int i, group_id; + json_t *j_array = NULL, *j_obj; + json_error_t j_error; + + g_string_printf (sql, "SELECT DISTINCT user_name FROM GroupUser WHERE group_id IN ("); + j_array = json_loadb (group_ids, strlen(group_ids), 0, &j_error); + if (!j_array) { + g_set_error (error, CCNET_DOMAIN, 0, "Bad args."); + g_string_free (sql, TRUE); + return NULL; + } + size_t id_num = json_array_size (j_array); + + for (i = 0; i < id_num; i++) { + j_obj = json_array_get (j_array, i); + group_id = json_integer_value (j_obj); + if (group_id <= 0) { + g_set_error (error, CCNET_DOMAIN, 0, "Bad args."); + g_string_free (sql, TRUE); + json_decref (j_array); + return NULL; + } + g_string_append_printf (sql, "%d", group_id); + if (i + 1 < id_num) + g_string_append_printf (sql, ","); + } + g_string_append_printf (sql, ")"); + json_decref (j_array); + + if (ccnet_db_statement_foreach_row (db, sql->str, get_groups_members_cb, &ret, 0) < 0) + ccnet_warning("Failed to get groups members for group [%s].\n", group_ids); + + g_string_free (sql, TRUE); + + return ret; +} diff --git a/net/server/group-mgr.h b/net/server/group-mgr.h index c857ac1..f03f90f 100644 --- a/net/server/group-mgr.h +++ b/net/server/group-mgr.h @@ -138,5 +138,8 @@ ccnet_group_manager_get_descendants_groups (CcnetGroupManager *mgr, int group_id GList * ccnet_group_manager_get_ancestor_groups (CcnetGroupManager *mgr, int group_id); +GList * +ccnet_group_manager_get_groups_members (CcnetGroupManager *mgr, const char *group_ids, + GError **error); #endif /* GROUP_MGR_H */ diff --git a/python/ccnet/rpc.py b/python/ccnet/rpc.py index fedf29e..fe87b90 100644 --- a/python/ccnet/rpc.py +++ b/python/ccnet/rpc.py @@ -446,3 +446,7 @@ class CcnetThreadedRpcClient(RpcClientBase): @searpc_func("string", ["string"]) def get_primary_id(self, email): pass + + @searpc_func("objlist", ["string"]) + def get_groups_members(self, group_ids): + pass