Complete initial admin_users script, including deactivate, reactivate, really delete...
[scpubgit/stemmatology.git] / lib / Text / Tradition / UserStore.pm
1 package Text::Tradition::UserStore;
2
3 use strict;
4 use warnings;
5
6 use Moose;
7 use KiokuX::User::Util qw(crypt_password);
8
9 extends 'KiokuX::Model';
10
11 use Text::Tradition::User;
12 # use Text::Tradition::Directory;
13
14 has MIN_PASS_LEN => ( is => 'ro', isa => 'Num', default => sub { 8 } );
15
16 # has 'directory' => ( 
17 #     is => 'rw', 
18 #     isa => 'KiokuX::Model',
19 #     handles => []
20 #     );
21
22 ## TODO: Some of these methods should probably optionally take $user objects
23 ## instead of hashrefs.
24
25 ## It also occurs to me that all these methods don't need to be named
26 ## XX_user, but leaving that way for now incase we merge this code
27 ## into ::Directory for one-store.
28
29 ## To die or not to die, on error, this is the question.
30 sub add_user {
31     my ($self, $userinfo) = @_;
32     my $username = $userinfo->{username};
33     my $password = $userinfo->{password};
34
35     return unless $username && $self->validate_password($password);
36
37     my $user = Text::Tradition::User->new(
38         id => $username,
39         password => crypt_password($password),
40     );
41
42     my $scope = $self->new_scope;
43     $self->store($user->kiokudb_object_id, $user);
44
45     return $user;
46 }
47
48 sub find_user {
49     my ($self, $userinfo) = @_;
50     my $username = $userinfo->{username};
51
52     my $scope = $self->new_scope;
53     return $self->lookup(Text::Tradition::User->id_for_user($username));
54     
55 }
56
57 sub modify_user {
58     my ($self, $userinfo) = @_;
59     my $username = $userinfo->{username};
60     my $password = $userinfo->{password};
61
62     return unless $username && $self->validate_password($password);
63
64     my $user = $self->find_user({ username => $username });
65     return unless $user;
66
67     my $scope = $self->new_scope;
68     $user->password(crypt_password($password));
69
70     $self->update($user);
71
72     return $user;
73 }
74
75 sub deactivate_user {
76     my ($self, $userinfo) = @_;
77     my $username = $userinfo->{username};
78
79     return if !$username;
80
81     my $user = $self->find_user({ username => $username });
82     return if !$user;
83
84     $user->active(0);
85     foreach my $tradition (@{ $user->traditions }) {
86         ## Not implemented yet
87         # $tradition->public(0);
88     }
89     my $scope = $self->new_scope;
90
91     ## Should we be using Text::Tradition::Directory also?
92     $self->update(@{ $user->traditions });
93
94     $self->update($user);
95
96     return $user;
97 }
98
99 sub reactivate_user {
100     my ($self, $userinfo) = @_;
101     my $username = $userinfo->{username};
102
103     return if !$username;
104
105     my $user = $self->find_user({ username => $username });
106     return if !$user;
107
108     return $user if $user->active;
109
110     $user->active(1);
111     my $scope = $self->new_scope;
112     $self->update($user);
113
114     return $user;    
115 }
116
117 sub delete_user {
118     my ($self, $userinfo) = @_;
119     my $username = $userinfo->{username};
120
121     return if !$username;
122
123     my $user = $self->find_user({ username => $username });
124     return if !$user;
125
126     my $scope = $self->new_scope;
127
128     ## Should we be using Text::Tradition::Directory for this bit?
129     $self->delete( @{ $user->traditions });
130
131     ## Poof, gone.
132     $self->delete($user);
133
134     return 1;
135 }
136
137 sub validate_password {
138     my ($self, $password) = @_;
139
140     return if !$password;
141     return if length($password) < $self->MIN_PASS_LEN;
142
143     return 1;
144 }
145
146 1;