# ================================================================== # Gossamer Forum - Advanced web community # # Website : http://gossamer-threads.com/ # Support : http://gossamer-threads.com/scripts/support/ # Revision : $Id: Group.pm,v 1.14 2002/08/27 23:02:26 jagerman Exp $ # # Copyright (c) 2001 Gossamer Threads Inc. All Rights Reserved. # Redistribution in part or in whole strictly prohibited. Please # see LICENSE file for full details. # ================================================================== package GForum::Table::Group; # ================================================================== use strict; use GForum qw/$DB $USER $CFG/; use GT::SQL::Table; use GT::AutoLoader; use vars qw/@ISA $VERSION $DEBUG $ERRORS $ERROR_MESSAGE $AUTH/; @ISA = qw/GT::SQL::Table/; $VERSION = sprintf "%d.%03d", q$Revision: 1.14 $ =~ /(\d+)\.(\d+)/; $DEBUG = 0; $ERROR_MESSAGE = 'GT::SQL'; $ERRORS = { SYSTEM_GROUP_DELETE => '%s is a system group and cannot be deleted', SYSTEM_GROUP_MODIFY => '%s is a system group and cannot be modified' }; sub add { my @args = @_; GT::Plugins->dispatch($CFG->{admin_root_path} . '/Plugins/GForum', 'add_group', sub { my ($self, @args) = @_; return $self->_plg_add(@args) }, @args); } $COMPILE{_plg_add} = __LINE__ . <<'END_OF_SUB'; sub _plg_add { # ------------------------------------------------------------------- # Add a group. # my $self = shift; local $self->{schema}->{cols}->{group_users} = {}; # Fool GT::SQL::Table::add - that was 'group_users' gets through to insert() $self->SUPER::add(@_); } END_OF_SUB sub insert { # ------------------------------------------------------------------- # Insert a group. The only thing this has to do other than GT::SQL's # insert is to look for a "group_users" field, which can be either an # array reference of user ids, or a \n-delimited list of usernames. # Either way, these users will be inserted into the group immediately # after the group is created. # my $self = shift; my $group = ref $_[0] eq 'HASH' ? {%{$_[0]}} : {@_}; my $group_users = delete $group->{group_users}; my $return = $self->SUPER::insert($group) or return; my @users; if (ref $group_users eq 'ARRAY') { # A list of user_ids to insert. @users = @$group_users; @users = $DB->table('User')->select(user_id => { user_id => \@users })->fetchall_list if @users; # Strip out any non-existant users } elsif ($group_users and not ref $group_users) { # Assume that this is a \n-delimited list of users to add to the group @users = grep /\S/, split /\r?\n/, $group_users; @users = $DB->table('User')->select(user_id => { user_username => \@users })->fetchall_list; # Convert usernames => user_id's, and strip out non-existant users } return $return unless @users; my $gid = $return->insert_id; $DB->table('UserGroup')->insert_multiple(['group_id_fk', 'user_id_fk'], map [$gid, $_], @users); return $return; } sub modify { my @args = @_; GT::Plugins->dispatch($CFG->{admin_root_path} . '/Plugins/GForum', 'modify_group', sub { my ($self, @args) = @_; return $self->_plg_modify(@args) }, @args); } sub _plg_modify { my $self = shift; local $self->{schema}->{cols}->{group_users} = {}; # Fool GT::SQL::Table::add - so that 'group_users' gets through to update() $self->SUPER::modify(@_); } sub update { my ($self, $set, $where, $opts) = @_; my $group_users = delete $set->{group_users}; my $return = $self->SUPER::update($set, $where, $opts) unless $group_users and not keys %$set; my @users; if (ref $group_users eq 'ARRAY') { # A list of user_ids to insert. @users = @$group_users; @users = $DB->table('User')->select(user_id => { user_id => \@users })->fetchall_list if @users; # Strip out any non-existant users } elsif ($group_users and not ref $group_users) { # Assume that this is a \n-delimited list of users to add to the group @users = grep /\S/, split /\r?\n/, $group_users; @users = $DB->table('User')->select(user_id => { user_username => \@users })->fetchall_list; # Convert usernames => user_id's, and strip out non-existant users } elsif (not defined $group_users) { # This update doesn't affect group members return $return; } my @gids = $self->select(group_id => $where)->fetchall_list; return $return unless @gids; $DB->table('UserGroup')->delete({ group_id_fk => \@gids }); return $return unless @users; my @mult_values; for my $g (@gids) { for my $u (@users) { push @mult_values, [$g, $u]; } } $DB->table('UserGroup')->insert_multiple(['group_id_fk', 'user_id_fk'], @mult_values); return $return; } sub delete { my @args = @_; GT::Plugins->dispatch($CFG->{admin_root_path} . '/Plugins/GForum', 'delete_group', sub { my ($self, @args) = @_; return $self->_plg_delete(@args) }, @args); } $COMPILE{_plg_delete} = __LINE__ . <<'END_OF_SUB'; sub _plg_delete { my $self = shift; if (@_ == 1 and not ref $_[0]) { # It's just a single group ID my $gid = shift; my $name = $self->get($gid => 'ARRAY' => ['group_name'])->[0]; for (@$CFG{qw/id_group_guest id_group_not_validated id_group_registered id_group_moderator/}) { if ($gid == $_) { return $self->error(SYSTEM_GROUP_DELETE => WARN => $name); } } return $self->SUPER::delete($gid); } else { my ($where) = GT::SQL::Table::_extract_where(grep !/^(?:abort|cascade|ignore|cleanup)$/, @_); my $sth = $self->select($where, ['group_id']); my @groups = map $_->[0], @{$sth->fetchall_arrayref}; for (my $i = 0; $i < @groups; $i++) { for (@$CFG{qw/id_group_guest id_group_not_validated id_group_registered id_group_moderator/}) { if ($groups[$i] == $_) { splice @groups, $i--, 1; my $name = $self->get($_ => 'ARRAY' => ['group_name'])->[0]; $self->error(SYSTEM_GROUP_DELETE => WARN => $name); next; } } } if (@groups) { if (@groups == 1) { return $self->SUPER::delete($groups[0]); } else { return $self->SUPER::delete({ group_id => \@groups }); } } } return; } END_OF_SUB 1;