use
5.010001;
sub
is_base_class {
return
0 }
my
$TABLE_NAME
=
'users'
;
sub
TABLE {
return
$TABLE_NAME
}
sub
PRIMARY_KEY {
return
'id'
}
my
$COLUMNS
= [
'id'
,
'group_id'
,
'login_name'
,
'login_password'
,
'first_name'
,
'last_name'
,
'email'
,
'description'
,
'created_by'
,
'changed_by'
,
'tstamp'
,
'reg_date'
,
'disabled'
,
'start_date'
,
'stop_date'
];
sub
COLUMNS {
return
$COLUMNS
}
my
$ALIASES
= {};
sub
ALIASES {
return
$ALIASES
}
my
$CHECKS
= {
'changed_by'
=> {
'allow'
=>
qr/(?^x:^\d{1,}$)/
},
'disabled'
=> {
'required'
=> 1,
'defined'
=> 1,
'allow'
=>
qr/(?^x:^\d{1,1}$)/
,
'default'
=>
'1'
},
'tstamp'
=> {
'required'
=> 1,
'defined'
=> 1,
'allow'
=>
qr/(?^x:^\d{1,10}$)/
},
'login_password'
=> {
'required'
=> 1,
'defined'
=> 1,
'allow'
=>
qr/^[A-Fa-f0-9]{40}$/
x
},
'stop_date'
=> {
'allow'
=>
qr/(?^x:^-?\d{1,}$)/
},
'description'
=> {
'allow'
=>
qr/(?^x:^.{1,255}$)/
,
'default'
=>
'NULL'
},
'last_name'
=> {
'allow'
=>
qr/(?^x:^.{1,100}$)/
},
'email'
=> {
'required'
=> 1,
'defined'
=> 1,
'allow'
=>
$Email::Address::addr_spec
},
'group_id'
=> {
'allow'
=>
qr/(?^x:^-?\d{1,}$)/
},
'reg_date'
=> {
'required'
=> 1,
'defined'
=> 1,
'allow'
=>
qr/(?^x:^-?\d{1,}$)/
},
'start_date'
=> {
'required'
=> 1,
'defined'
=> 1,
'allow'
=>
qr/(?^x:^-?\d{1,}$)/
},
'id'
=> {
'allow'
=>
qr/(?^x:\d{1,}$)/
},
'login_name'
=> {
'required'
=> 1,
'defined'
=> 1,
'allow'
=>
qr/(?^x:^.{1,100}$)/
},
'created_by'
=> {
'allow'
=>
qr/(?^x:^-?\d{1,}$)/
},
'first_name'
=> {
'allow'
=>
qr/(?^x:^.{1,100}$)/
}
};
sub
CHECKS {
return
$CHECKS
}
__PACKAGE__->QUOTE_IDENTIFIERS(0);
sub
by_login_name {
state
$sql
=
$_
[0]->SQL(
'SELECT'
) .
' WHERE login_name=?'
;
return
shift
->query(
$sql
,
shift
);
}
sub
name {
ref
(
$_
[0]) || Carp::croak(
"The method $_[0]::name must be called only on instances!"
);
return
$_
[0]->{name} ||=
do
{
Mojo::Util::trim(
(
$_
[0]->{data}{first_name} ||
''
) .
' '
. (
$_
[0]->{data}{last_name} ||
''
))
||
$_
[0]->{data}{login_name};
};
}
sub
add {
my
$class
=
shift
;
my
$args
=
$class
->_get_obj_args(
@_
);
state
$dbix
=
$class
->dbix;
state
$GR
=
'Ado::Model::Groups'
;
my
(
$group
,
$user
);
my
$try
=
eval
{
$dbix
->begin_work;
$group
=
$GR
->create(
name
=>
$args
->{login_name},
disabled
=> 0,
description
=>
'Primary group for user '
.
$args
->{login_name},
created_by
=>
$args
->{created_by} || 1,
);
$user
=
$class
->create(
first_name
=>
$args
->{first_name},
last_name
=>
$args
->{last_name},
login_name
=>
$args
->{login_name},
login_password
=>
$args
->{login_password},
email
=>
$args
->{email},
disabled
=>
$args
->{disabled},
tstamp
=>
time
,
reg_date
=>
time
,
created_by
=>
$args
->{created_by},
changed_by
=>
$args
->{changed_by},
stop_date
=>
$args
->{stop_date},
start_date
=>
$args
->{start_date},
group_id
=>
$group
->id,
);
Ado::Model::UserGroup->create(
user_id
=>
$user
->id,
group_id
=>
$group
->id
);
$dbix
->commit;
};
unless
(
$try
) {
$dbix
->rollback or croak(
$dbix
->error);
carp(
"ERROR adding user(rolling back):[$@]"
);
}
return
$user
;
}
sub
add_to_group {
my
$self
=
shift
;
my
$args
=
$self
->_get_obj_args(
@_
);
state
$dbix
=
$self
->dbix;
state
$GR
=
'Ado::Model::Groups'
;
my
$ingroup
;
my
$try
=
eval
{
$dbix
->begin_work;
if
(!((
$ingroup
=
$GR
->by_name(
$args
->{ingroup}))->id)) {
$ingroup
=
$GR
->create(
name
=>
$args
->{ingroup},
disabled
=> 0,
description
=>
'Additional group initially created for user '
.
$self
->login_name,
created_by
=>
$args
->{created_by} || 1,
);
}
Ado::Model::UserGroup->create(
user_id
=>
$self
->id,
group_id
=>
$ingroup
->id
);
$dbix
->commit;
};
unless
(
$try
) {
$dbix
->rollback or croak(
$dbix
->error);
carp(
"ERROR adding user to group (rolling back):[$@]"
);
}
return
$ingroup
;
}
__PACKAGE__->SQL(
SELECT_group_names
=>
<<"SQL");
SELECT name
FROM groups
WHERE id IN (SELECT group_id FROM user_group WHERE user_id=?)
SQL
sub
ingroup {
my
(
$self
,
$group
) =
@_
;
$self
->{ingroup}
||=
$self
->dbix->query(__PACKAGE__->SQL(
'SELECT_group_names'
),
$self
->id)->flat;
return
List::Util::first {
$_
eq
$group
} @{
$self
->{ingroup}}
if
$group
;
return
@{
$self
->{ingroup}};
}
1;