Concierge-Users
view release on metacpan or search on metacpan
lib/Concierge/Users/Database.pm view on Meta::CPAN
my $result = $self->{dbh}->do($rename_sql);
unless ($result) {
return {
success => 0,
message => "Failed to archive existing table: " . $self->{dbh}->errstr
};
}
return { success => 1 };
}
# Add bare record with user_id and null_values
sub add {
my ($self, $user_id, $initial_record) = @_;
return { success => 0, message => "Add Record failed: missing user_id" }
unless $user_id;
return { success => 0, message => "Add Record failed: missing initial record" }
unless $initial_record;
my %record = $initial_record->%*;
$record{created_date} = $self->current_timestamp();
# Add last_mod_date timestamp
$record{last_mod_date} = $self->current_timestamp();
# Insert into database
my @fields = keys %record;
my @placeholders = map { '?' } @fields;
my @values = @record{@fields};
my $sql = "INSERT INTO $self->{table_name} (" .
join(', ', @fields) . ") VALUES (" .
join(', ', @placeholders) . ")";
my $sth = $self->{dbh}->prepare($sql);
if ($sth->execute(@values)) {
return { success => 1, message => "Initial record created for user '$user_id'" };
} else {
return { success => 0, message => "Failed to create initial user record: " . $self->{dbh}->errstr };
}
}
# Fetch user by ID
sub fetch {
my ($self, $user_id) = @_;
my $sql = "SELECT * FROM $self->{table_name} WHERE user_id = ?";
my $sth = $self->{dbh}->prepare($sql);
$sth->execute($user_id);
my $user_data = $sth->fetchrow_hashref();
return {
success => $user_data ? 1 : 0,
data => $user_data,
message => $user_data ? '' : "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 @fields = keys %$updates;
my @values = values %$updates;
push @values, $user_id; # For WHERE clause
my $sql = "UPDATE $self->{table_name} SET " .
join(', ', map { "$_ = ?" } @fields) .
" WHERE user_id = ?";
my $sth = $self->{dbh}->prepare($sql);
unless ($sth) {
return { success => 0, message => "Failed to prepare update: " . $self->{dbh}->errstr };
}
if ($sth->execute(@values)) {
return { success => 1, message => "User '$user_id' updated" };
} else {
return { success => 0, message => "Failed to update user: " . $self->{dbh}->errstr };
}
}
# List users with filters
sub list {
my ($self, $filters, $options) = @_;
# Build WHERE clause from DSL filter structure
my @where_clauses;
my @where_values;
if (ref $filters eq 'HASH' && exists $filters->{or_groups}) {
# Parse DSL filter structure
my @or_groups;
foreach my $and_group (@{$filters->{or_groups}}) {
my @and_clauses;
foreach my $condition (@$and_group) {
my ($field, $op, $value) = ($condition->{field}, $condition->{op}, $condition->{value});
my $clause;
if ($op eq '=') {
$clause = "$field = ?";
push @where_values, $value;
} elsif ($op eq ':') {
$clause = "$field LIKE ?";
push @where_values, "%$value%";
} elsif ($op eq '!') {
$clause = "$field NOT LIKE ?";
push @where_values, "%$value%";
} elsif ($op eq '>') {
$clause = "$field > ?";
push @where_values, $value;
} elsif ($op eq '<') {
( run in 0.622 second using v1.01-cache-2.11-cpan-39bf76dae61 )