Concierge-Users
view release on metacpan or search on metacpan
lib/Concierge/Users/File.pm view on Meta::CPAN
my @row = map { $record{$_} } $self->{fields}->@*;
# Write row
if ($self->{csv}->print($fh, \@row)) {
print $fh "\n";
close $fh;
return { success => 1, message => "User '$user_id' created" };
} else {
close $fh;
return { success => 0, message => "Failed to create initial user record: " . $self->{csv}->error_diag() };
}
}
# Fetch user by ID
sub fetch {
my ($self, $user_id) = @_;
my $user_file = $self->_get_user_file();
open my $fh, '<:encoding(UTF-8)', $user_file
or return {
success => 0,
data => '',
message => "Cannot open user file: $!"
};
# Skip header
my $header = <$fh>;
chomp $header;
my @fields = $self->{csv}->parse($header) ? $self->{csv}->fields() : ();
# Search for user
while (my $line = <$fh>) {
chomp $line;
next unless $line;
$self->{csv}->parse($line);
my @values = $self->{csv}->fields();
my %user;
@user{@fields} = @values;
if ($user{user_id} eq $user_id) {
close $fh;
return {
success => 1,
data => \%user,
message => ''
};
}
}
close $fh;
return {
success => 0,
data => '',
message => "User '$user_id' not found"
};
}
# Update user
sub update {
my ($self, $user_id, $updates) = @_;
# Remove readonly fields from updates
my %readonly = map { $_ => 1 } qw(user_id created_date last_mod_date);
delete $updates->{$_} for keys %readonly;
# Add last_mod_date timestamp
$updates->{last_mod_date} = $self->current_timestamp();
my $user_file = $self->_get_user_file();
# Read entire file
open my $fh_in, '<:encoding(UTF-8)', $user_file
or return { success => 0, message => "Failed to read user file: $!" };
my @lines;
my $header = <$fh_in>;
push @lines, $header;
chomp $header;
$self->{csv}->parse($header);
my @fields = $self->{csv}->fields();
my $found = 0;
while (my $line = <$fh_in>) {
chomp $line;
$self->{csv}->parse($line);
my @values = $self->{csv}->fields();
my %user;
@user{@fields} = @values;
if ($user{user_id} eq $user_id) {
# Update user with provided data
foreach my $field (keys %$updates) {
$user{$field} = $updates->{$field};
}
$found = 1;
}
# Write back user data
my @row;
foreach my $field (@fields) {
push @row, $user{$field} || '';
}
my $output;
if ($self->{csv}->combine(@row)) {
$output = $self->{csv}->string();
push @lines, $output;
}
}
close $fh_in;
return { success => 0, message => "User '$user_id' not found" } unless $found;
# Write entire file back
open my $fh_out, '>:encoding(UTF-8)', $user_file
( run in 0.737 second using v1.01-cache-2.11-cpan-39bf76dae61 )