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 )