<%args> $object $name => undef $SETS => undef <%init> return undef unless ref $SETS; return undef unless $name; my @props = $object->structure(); my ($prop) = grep { $_->{attr} eq $name } @props; return undef unless ref $prop; if ( $state->{users}->use_credentials && $object->id ) { my %struct; while ( my ($key, $val) = each %$SETS ) { my $template = $name.'_name_'; if ( $key =~ /^$template/ ) { my $id = $key =~ /(\d+)/ ? $1 : 'new'; if ( $keeper->{users}->_email_format( $val ) ) { $struct{$id}{orig} = $val; $struct{$id}{name} = $keeper->{users}->_email_reduction($val); $struct{$id}{id} = $id; } } $template = $name.'_active_'; if ( $key =~ /^$template/ ) { my $id = $key =~ /(\d+)/ ? $1 : 'new'; if ( $val ) { $struct{$id}{status} = 1; $struct{$id}{id} = $id; } } } if ( exists $SETS->{$name.'.delete'} ) { if ( ref $SETS->{$name.'.delete'} eq 'ARRAY' ) { map { $struct{$_}{delete} = 1 } @{$SETS->{$name.'.delete'}}; } elsif ( $SETS->{$name.'.delete'} ) { $struct{$SETS->{$name.'.delete'}}{delete} = 1; } } if ( exists $SETS->{$name.'.main'} && $SETS->{$name.'.main'} && exists $struct{$SETS->{$name.'.main'}} && !exists $struct{$SETS->{$name.'.main'}}{delete} ) { $struct{$SETS->{$name.'.main'}}{main} = 1; } elsif ( exists $struct{new} ) { $struct{new}{main} = 1; } else { my @main = grep { exists $_->{name} && exists $_->{main} && $_->{main} && !exists $_->{delete} } values %struct; unless ( @main ) { my @valid = grep { exists $_->{name} && !exists $_->{delete} } values %struct; if ( @valid ) { $valid[0]->{main} = 1; } } } my @delete_ids = map { $_->{id} } grep { $_->{id} && exists $_->{delete} } values %struct; if ( @delete_ids ) { my $sql = $keeper->SQL->prepare('delete from profile_credentials where class = ? and uid = ? and id in ('.join(',', map {'?'} @delete_ids).')'); $sql->execute( 'users::Email', $object->id, @delete_ids ); $sql->finish; } my @credentials = $keeper->get_documents( class => 'users::Email', uid => $object->id, order_by => 'main desc, name', ); foreach my $cred ( @credentials ) { my $check = exists $struct{$cred->id} ? $struct{$cred->id} : undef; my $store = 0; if ( ref $check && exists $check->{name} && ($cred->name ne $check->{name} || $cred->name_orig ne $check->{orig}) ) { my $exists_foreign = $keeper->get_documents( class => 'users::Email', name => $check->{name}, uid_not => $object->id, count => 1 ); unless ( $exists_foreign ) { $cred->name( $check->{name} ); $cred->name_orig( $check->{orig} ); $store = 1; } } if ( ref $check && int($check->{main}) != int($cred->main) ) { $cred->main( int($check->{main}) ); $store = 1; } if ( ref $check && int($check->{status}) != int($cred->status) ) { $cred->status( int($check->{status}) ); $store = 1; } if ( $store ) { $cred->store; } } if ( exists $struct{new} && exists $struct{new}{name} ) { my @found = grep { $_->name eq $struct{new}{name} } @credentials; unless ( @found ) { my $check = $struct{new}; my $exists_foreign = $keeper->get_documents( class => 'users::Email', name => $check->{name}, count => 1 ); unless ( $exists_foreign ) { my $cred = $object->create_credential( email => $check->{orig}, main => $check->{main}, status => ($check->{status} || 0) ); push @credentials, $cred if ref $cred; } } } my ($main) = grep { $_->main } @credentials; $object->{$name.'s'} = \@credentials; return $main; } else { return $keeper->{users}->_email_format( $SETS->{$name} ); }