blob: ad42969891c119fef5783d7dc8c941365f80d79c [file] [log] [blame]
package UI::User;
#
# Copyright 2015 Comcast Cable Communications Management, LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#
#
# JvD Note: you always want to put Utils as the first use. Sh*t don't work if it's after the Mojo lines.
use UI::Utils;
use Mojo::Base 'Mojolicious::Controller';
use Digest::SHA1 qw(sha1_hex);
use Mojolicious::Validator;
use Mojolicious::Validator::Validation;
use Email::Valid;
use Data::GUID;
use Data::Dumper;
# List of Users
sub index {
my $self = shift;
&navbarpage($self);
}
# NOTE: Do NOT attempt to call this method 'new' or 'init'
# because Mojo will death spiral.
# Setup a New user for "Add User".
sub add {
my $self = shift;
&stash_role($self);
$self->stash( tm_user => {}, fbox_layout => 1, mode => 'add' );
}
# Read
sub read {
my $self = shift;
my @data;
my $orderby = "username";
$orderby = $self->param('orderby') if ( defined $self->param('orderby') );
my $dbh = $self->db->resultset("TmUser")->search( undef, { prefetch => [ { 'role' => undef } ], order_by => 'me.' . $orderby } );
while ( my $row = $dbh->next ) {
push(
@data, {
"id" => $row->id,
"username" => $row->username,
"full_name" => $row->full_name,
"company" => $row->company,
"role" => $row->role->id,
"uid" => 0,
"gid" => 0,
"email" => $row->email,
"new_user" => $row->new_user,
"rolename" => $row->role->name,
"phone_number" => $row->phone_number,
}
);
}
$self->render( json => \@data );
}
# Renders the "Send Registration" screen
sub register {
my $self = shift;
my $sent = $self->req->param('sent');
if ( defined($sent) ) {
$sent = 'true';
}
else {
$sent = 'false';
}
&stash_role($self);
$self->stash( tm_user => {}, sent => $sent, fbox_layout => 1, mode => 'add' );
}
# Reset the User Profile password
sub password_reset {
my $self = shift;
my $id = $self->param('id');
my $email_to = $self->param('tm_user.email');
my $data = $self->db->resultset('TmUser')->search( { id => $id } )->single;
&stash_role($self);
my $email_notice = "Successfully sent reset password to: '" . $email_to . "'";
$self->app->log->info($email_notice);
$self->flash( message => $email_notice );
my $token = $self->new_guid();
$self->send_password_reset_email( $email_to, $token );
my %delivery_services = get_delivery_services( $self, $id );
$self->stash(
mode => 'edit',
tm_user => $data,
fbox_layout => 1,
delivery_services => \%delivery_services
);
return $self->render('user/edit');
}
# Sends the email from the registration screen
sub send_registration {
my $self = shift;
my $instance_name =
$self->db->resultset('Parameter')->search( { -and => [ name => 'tm.instance_name', config_file => 'global' ] } )->get_column('value')->single();
$self->stash( instance_name => $instance_name );
if ( $self->is_send_register_valid() ) {
my $token = $self->new_guid();
my $email_to = $self->param('tm_user.email');
$self->send_registration_email( $email_to, $token );
$self->create_registration_user( $email_to, $token );
return $self->redirect_to('/user/register?sent=true');
}
else {
$self->stash( tm_user => {}, fbox_layout => 1 );
return $self->render('user/register');
}
}
sub edit {
my $self = shift;
my $sep = "__NEWLINE__"; # the line separator sub that with \n in the .ep javascript
my $id = $self->param('id');
my $dbh = $self->db->resultset('TmUser')->search( { id => $id } );
my $data = $dbh->single;
&stash_role($self);
# TODO: drichardson - mode helps to enable/disable features in the _form.html.erb (is there a better way? ) $self->stash(
my %delivery_services = get_delivery_services( $self, $id );
$self->stash(
tm_user => $data,
mode => 'edit',
fbox_layout => 1,
delivery_services => \%delivery_services
);
return $self->render('user/edit');
}
sub get_delivery_services {
my $self = shift;
my $id = shift;
my @ds_ids = $self->db->resultset('DeliveryserviceTmuser')->search( { tm_user_id => $id } )->get_column('deliveryservice')->all;
my %delivery_services;
for my $ds_id (@ds_ids) {
my $desc = $self->db->resultset('Deliveryservice')->search( { id => $ds_id } )->get_column('xml_id')->single;
$delivery_services{$ds_id} = $desc;
}
return %delivery_services;
}
# Update
sub update {
my $self = shift;
my $tm_user_id = $self->param('id');
my @ds_ids = $self->param('deliveryservices');
$self->associated_delivery_services( $tm_user_id, \@ds_ids );
# Prevent these from getting updated
# Do not modify the local_passwd if it comes across as blank.
my $local_passwd = $self->param("tm_user.local_passwd");
my $confirm_local_passwd = $self->param("tm_user.confirm_local_passwd");
if ( $self->is_valid("edit") ) {
my $dbh = $self->db->resultset('TmUser')->find( { id => $tm_user_id } );
$dbh->username( $self->param('tm_user.username') );
$dbh->full_name( $self->param('tm_user.full_name') );
$dbh->role( $self->param('tm_user.role') );
$dbh->uid(0);
$dbh->gid(0);
# ignore the local_passwd and confirm_local_passwd if it comes across as blank (or it didn't change)
if ( defined($local_passwd) && $local_passwd ne '' ) {
$dbh->local_passwd( sha1_hex( $self->param('tm_user.local_passwd') ) );
}
if ( defined($confirm_local_passwd) && $confirm_local_passwd ne '' ) {
$dbh->confirm_local_passwd( sha1_hex( $self->param('tm_user.confirm_local_passwd') ) );
}
$dbh->company( $self->param('tm_user.company') );
$dbh->email( $self->param('tm_user.email') );
$dbh->full_name( $self->param('tm_user.full_name') );
$dbh->address_line1( $self->param('tm_user.address_line1') );
$dbh->address_line2( $self->param('tm_user.address_line2') );
$dbh->city( $self->param('tm_user.city') );
$dbh->state_or_province( $self->param('tm_user.state_or_province') );
$dbh->phone_number( $self->param('tm_user.phone_number') );
$dbh->postal_code( $self->param('tm_user.postal_code') );
$dbh->country( $self->param('tm_user.country') );
$dbh->update();
$self->flash( message => "User was updated successfully." );
$self->stash( mode => 'edit' );
return $self->redirect_to( '/user/' . $tm_user_id . '/edit' );
}
else {
$self->edit();
}
}
sub associated_delivery_services {
my $self = shift;
my $tm_user_id = shift;
my $ds_ids = shift;
my $new_id = -1;
# Sweep the existing DeliveryserviceTmUser relationships
my $delete = $self->db->resultset('DeliveryserviceTmuser')->search( { tm_user_id => $tm_user_id } );
$delete->delete();
# Attached the saved delivery services
foreach my $ds_id ( @{$ds_ids} ) {
my $ds_name = $self->db->resultset('Deliveryservice')->search( { id => $ds_id } )->get_column('xml_id')->single();
my $insert = $self->db->resultset('DeliveryserviceTmuser')->create( { deliveryservice => $ds_id, tm_user_id => $tm_user_id } );
$new_id = $insert->tm_user_id;
$insert->insert();
&log( $self, "Associated Delivery service " . $ds_name . " <-> with tm_user_id: " . $tm_user_id, "UICHANGE" );
}
}
# Create
sub create {
my $self = shift;
&stash_role($self);
$self->stash( fbox_layout => 1, mode => 'add', tm_user => {} );
if ( $self->is_valid("add") ) {
my $new_id = $self->create_user();
if ( $new_id != -1 ) {
$self->flash( message => 'User created successfully.' );
return $self->redirect_to('/close_fancybox.html');
}
}
else {
return $self->render('user/add');
}
}
sub is_valid {
my $self = shift;
my $mode = shift;
$self->field('tm_user.full_name')->is_required;
$self->field('tm_user.username')->is_required;
$self->field('tm_user.email')->is_required;
if ( $mode =~ /add/ ) {
$self->field('tm_user.local_passwd')->is_required;
$self->field('tm_user.confirm_local_passwd')->is_required;
$self->is_username_taken( $self->param('tm_user.username') );
}
$self->field('tm_user.local_passwd')->is_equal( 'tm_user.confirm_local_passwd', "The 'Password' and 'Confirm Password' must match." );
$self->field('tm_user.local_passwd')->is_like( qr/^.{8,100}$/, "Password must be greater than 7 chars." );
return $self->valid;
}
sub is_send_register_valid {
my $self = shift;
$self->field('tm_user.email')->is_required;
return $self->valid;
}
sub create_user {
my $self = shift;
my $new_id = -1;
my $dbh = $self->db->resultset('TmUser')->create(
{
full_name => $self->param('tm_user.full_name'),
username => $self->param('tm_user.username'),
phone_number => $self->param('tm_user.phone_number'),
email => $self->param('tm_user.email'),
local_passwd => sha1_hex( $self->param('tm_user.local_passwd') ),
confirm_local_passwd => sha1_hex( $self->param('tm_user.confirm_local_passwd') ),
role => $self->param('tm_user.role'),
new_user => 0,
local_user => 1,
uid => 0,
gid => 0,
company => $self->param('tm_user.company'),
address_line1 => $self->param('tm_user.address_line1'),
address_line2 => $self->param('tm_user.address_line2'),
city => $self->param('tm_user.city'),
state_or_province => $self->param('tm_user.state_or_province'),
postal_code => $self->param('tm_user.postal_code'),
country => $self->param('tm_user.country'),
}
);
$new_id = $dbh->insert();
# if the insert has failed, we don't even get here, we go to the exception page.
&log( $self, "Create tm_user with name " . $self->param('tm_user.username'), "UICHANGE" );
return $new_id;
}
sub new_guid {
return Data::GUID->new;
}
1;