use strict;
use warnings;
+use List::MoreUtils qw(all);
use base qw/Catalyst::Authentication::User/;
use base qw/Class::Accessor::Fast/;
sub new {
my ( $class, $config, $c) = @_;
- if (!defined($config->{'user_model'})) {
- $config->{'user_model'} = $config->{'user_class'};
- }
+ $config->{user_model} = $config->{user_class}
+ unless defined $config->{user_model};
my $self = {
resultset => $c->model($config->{'user_model'}),
bless $self, $class;
+ Catalyst::Exception->throw(
+ "\$c->model('${ \$self->config->{user_model} }') did not return a resultset."
+ . " Did you set user_model correctly?"
+ ) unless $self->{resultset};
+ $self->config->{'id_field'} = [$self->{'resultset'}->result_source->primary_columns]
+ unless exists $self->config->{'id_field'};
- if (not $self->{'resultset'}) {
- Catalyst::Exception->throw("\$c->model('${ \$self->config->{user_model} }') did not return a resultset. Did you set user_model correctly?");
- }
-
- ## Note to self- add handling of multiple-column primary keys.
- if (!exists($self->config->{'id_field'})) {
- my @pks = $self->{'resultset'}->result_source->primary_columns;
- if ($#pks == 0) {
- $self->config->{'id_field'} = $pks[0];
- } else {
- Catalyst::Exception->throw("user table does not contain a single primary key column - please specify 'id_field' in config!");
- }
- }
+ $self->config->{'id_field'} = [$self->config->{'id_field'}]
+ unless ref $self->config->{'id_field'} eq 'ARRAY';
- if (!$self->{'resultset'}->result_source->has_column($self->config->{'id_field'})) {
- Catalyst::Exception->throw("id_field set to " . $self->config->{'id_field'} . " but user table has no column by that name!");
- }
+ Catalyst::Exception->throw(
+ "id_field set to "
+ . join(q{,} => @{ $self->config->{'id_field'} })
+ . " but user table has no column by that name!"
+ ) unless all { $self->{'resultset'}->result_source->has_column($_) } @{ $self->config->{'id_field'} };
## if we have lazyloading turned on - we should not query the DB unless something gets read.
## that's the idea anyway - still have to work out how to manage that - so for now we always force
if (keys %{$searchargs}) {
$self->_user($self->resultset->search($searchargs)->first);
} else {
- Catalyst::Exception->throw("Failed to load user data. You passed [" . join(',', keys %{$authinfo}) . "] to authenticate() but your user source (" . $self->config->{'user_model'} . ") only has these columns: [" . join( ",", $self->resultset->result_source->columns ) . "] Check your authenticate() call.");
+ Catalyst::Exception->throw(
+ "Failed to load user data. You passed [" . join(',', keys %{$authinfo}) . "]"
+ . " to authenticate() but your user source (" . $self->config->{'user_model'} . ")"
+ . " only has these columns: [" . join( ",", $self->resultset->result_source->columns ) . "]"
+ . " Check your authenticate() call."
+ );
}
}
} elsif (exists($self->config->{'role_relation'})) {
my $relation = $self->config->{'role_relation'};
if ($self->_user->$relation->result_source->has_column($self->config->{'role_field'})) {
- @roles = map { $_->get_column($self->config->{'role_field'}) } $self->_user->$relation->search(undef, { columns => [ $self->config->{'role_field'}]})->all();
+ @roles = map {
+ $_->get_column($self->config->{role_field})
+ } $self->_user->$relation->search(undef, {
+ columns => [ $self->config->{role_field} ]
+ })->all;
$self->_roles(\@roles);
} else {
Catalyst::Exception->throw("role table does not have a column called " . $self->config->{'role_field'});
# return $self;
#
## if use_userdata_from_session is defined in the config, we fill in the user data from the session.
- if (exists($self->config->{'use_userdata_from_session'}) && $self->config->{'use_userdata_from_session'} != 0)
- {
+ if (exists($self->config->{'use_userdata_from_session'}) && $self->config->{'use_userdata_from_session'} != 0) {
my $obj = $self->resultset->new_result({ %$frozenuser });
$obj->in_storage(1);
$self->_user($obj);
return $self;
- } else {
- my $id;
- if (ref($frozenuser) eq 'HASH') {
- $id = $frozenuser->{$self->config->{'id_field'}};
- } else {
- $id = $frozenuser;
- }
- return $self->load( { $self->config->{'id_field'} => $id }, $c);
}
+
+ if (ref $frozenuser eq 'HASH') {
+ return $self->load({
+ map { ($_ => $frozenuser->{$_}) }
+ @{ $self->config->{id_field} }
+ });
+ }
+
+ return $self->load( { $self->config->{'id_field'} => $frozenuser }, $c);
}
sub get {