File Coverage

blib/lib/Wishlist/Model.pm
Criterion Covered Total %
statement 26 30 86.6
branch 4 6 66.6
condition n/a
subroutine 8 10 80.0
pod 0 7 0.0
total 38 53 71.7


line stmt bran cond sub pod time code
1             package Wishlist::Model;
2 2     2   13 use Mojo::Base -base;
  2         5  
  2         11  
3              
4 2     2   261 use Carp ();
  2         4  
  2         24  
5 2     2   777 use Passwords ();
  2         67860  
  2         925  
6              
7             has sqlite => sub { Carp::croak 'sqlite is required' };
8              
9             sub add_user {
10 1     1 0 44864 my ($self, $user) = @_;
11             Carp::croak 'password is required'
12 1 50       8 unless $user->{password};
13 1         9 $user->{password} = Passwords::password_hash($user->{password});
14 1         1504213 return $self
15             ->sqlite
16             ->db
17             ->insert(users => $user)
18             ->last_insert_id;
19             }
20              
21             sub check_password {
22 4     4 0 2886309 my ($self, $username, $password) = @_;
23 4 100       20 return undef unless $password;
24 2         12 my $user = $self
25             ->sqlite
26             ->db
27             ->select(
28             'users' => ['password'],
29             {username => $username},
30             )->hash;
31 2 50       1258 return undef unless $user;
32             return Passwords::password_verify(
33             $password,
34             $user->{password},
35 2         117 );
36             }
37              
38             sub user {
39 2     2 0 2808 my ($self, $username) = @_;
40 2         5 my $sql = <<' SQL';
41             select
42             user.id,
43             user.name,
44             user.username,
45             (
46             select
47             json_group_array(item)
48             from (
49             select json_object(
50             'id', items.id,
51             'title', items.title,
52             'url', items.url,
53             'purchased', items.purchased
54             ) as item
55             from items
56             where items.user_id=user.id
57             )
58             ) as items
59             from users user
60             where user.username=?
61             SQL
62 2         10 return $self
63             ->sqlite
64             ->db
65             ->query($sql, $username)
66             ->expand(json => 'items')
67             ->hash;
68             }
69              
70             sub all_users {
71 2     2 0 1245 my $self = shift;
72 2         8 return $self
73             ->sqlite
74             ->db
75             ->select(
76             'users' => [qw/username name/],
77             undef,
78             {-asc => 'name'},
79             )
80             ->hashes;
81             }
82              
83             sub add_item {
84 1     1 0 4 my ($self, $user, $item) = @_;
85 1         4 $item->{user_id} = $user->{id};
86 1         18 return $self
87             ->sqlite
88             ->db
89             ->insert('items' => $item)
90             ->last_insert_id;
91             }
92              
93             sub update_item {
94 0     0 0   my ($self, $item, $purchased) = @_;
95             return $self
96             ->sqlite
97             ->db
98             ->update(
99             'items',
100             {purchased => $purchased},
101             {id => $item->{id}},
102 0           )->rows;
103             }
104              
105             sub remove_item {
106 0     0 0   my ($self, $item) = @_;
107             return $self
108             ->sqlite
109             ->db
110             ->delete(
111             'items',
112             {id => $item->{id}},
113 0           )->rows;
114             }
115              
116             1;
117