Concierge-Users
view release on metacpan or search on metacpan
lib/Concierge/Users/Meta.pm view on Meta::CPAN
my $field_name = $override->{field_name};
unless ($field_name) {
carp "Field override missing field_name; skipping";
next;
}
# Check if field is protected; only format_as and label may be overridden
if ( $field_name =~ /^(?:user_id|last_login_date|last_mod_date|created_date)$/) {
my %allowed = map { $_ => 1 } qw/format_as label/;
my @apply = grep { $allowed{$_} } keys %$override;
my @blocked = grep { !$allowed{$_} && $_ ne 'field_name' } keys %$override;
carp "Field '$field_name' is protected; ignoring: " . join(', ', sort @blocked)
if @blocked;
$merged_definitions{$field_name}{$_} = $override->{$_} for @apply;
next;
}
# Check if field exists in merged_definitions
unless ($merged_definitions{$field_name}) {
carp "Cannot override unknown field '$field_name'; field must be included via include_standard_fields or app_fields";
next;
}
lib/Concierge/Users/Meta.pm view on Meta::CPAN
Each must contain C<field_name> to identify the target:
field_overrides => [
{
field_name => 'email',
required => 1,
label => 'Work Email',
},
],
B<Protected fields> (structural attributes blocked; C<format_as> and
C<label> are allowed): C<user_id>, C<last_login_date>, C<last_mod_date>,
C<created_date>.
B<Protected attributes> that cannot be changed: C<field_name>,
C<category>.
Auto-behaviors:
=over 4
t/02-setup.t view on Meta::CPAN
};
# ==============================================================================
# Test Group 10: Field Overrides - Protected Fields
# ==============================================================================
subtest 'Field overrides - protected fields' => sub {
use Capture::Tiny qw/ capture_stderr /;
my $storage_dir = "$temp_base/protected-fields";
# Blocked attribute on user_id: warns with new message, setup still succeeds
my $config1 = make_config($storage_dir . '/test1', 'database', {
field_overrides => [
{
field_name => 'user_id',
max_length => 50,
},
],
});
my ($stderr1, $result1) = capture_stderr sub {
Concierge::Users->setup($config1);
};
like($stderr1, qr/Field 'user_id' is protected; ignoring: max_length/,
'Warns about blocked attribute on protected user_id field');
ok($result1->{success}, 'Setup still succeeds despite blocked override on protected field');
# Blocked attribute on created_date: warns, setup succeeds
my $config2 = make_config($storage_dir . '/test2', 'database', {
field_overrides => [
{
field_name => 'created_date',
required => 1,
},
],
});
my ($stderr2, $result2) = capture_stderr sub {
Concierge::Users->setup($config2);
};
like($stderr2, qr/Field 'created_date' is protected; ignoring: required/,
'Warns about blocked attribute on protected created_date field');
ok($result2->{success}, 'Setup succeeds');
# Blocked attribute on last_mod_date: warns, setup succeeds
my $config3 = make_config($storage_dir . '/test3', 'database', {
field_overrides => [
{
field_name => 'last_mod_date',
required => 1,
},
],
});
my ($stderr3, $result3) = capture_stderr sub {
Concierge::Users->setup($config3);
};
like($stderr3, qr/Field 'last_mod_date' is protected; ignoring: required/,
'Warns about blocked attribute on protected last_mod_date field');
ok($result3->{success}, 'Setup succeeds');
# Allowed overrides (format_as, label) on protected fields: applied silently
my $config4 = make_config($storage_dir . '/test4', 'database', {
field_overrides => [
{ field_name => 'user_id', format_as => 'uid' },
{ field_name => 'last_login_date', format_as => 'dt',
label => 'Last Login' },
{ field_name => 'last_mod_date', format_as => 'dt' },
{ field_name => 'created_date', label => 'Created' },
( run in 1.899 second using v1.01-cache-2.11-cpan-bbe5e583499 )