Added rudimentary HTTP interface
This commit is contained in:
51
TrsrDB/HTTP/Account.pm
Normal file
51
TrsrDB/HTTP/Account.pm
Normal file
@@ -0,0 +1,51 @@
|
||||
use strict;
|
||||
|
||||
package TrsrDB::HTTP::Account;
|
||||
use Mojo::Base 'Mojolicious::Controller';
|
||||
use Carp qw(croak);
|
||||
|
||||
sub list {
|
||||
my $self = shift;
|
||||
|
||||
my $accounts = $self->app->db->resultset("Account");
|
||||
|
||||
my %args = $self->stash("user")->grade ? () : ( type => undef );
|
||||
$accounts = $accounts->search(\%args, { order_by => { -asc => [qw/type ID/] } });
|
||||
|
||||
$self->stash( accounts => $accounts );
|
||||
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
sub history {
|
||||
my $self = shift;
|
||||
my $history = $self->app->db->resultset("History")->search({
|
||||
account => $self->stash("account")
|
||||
}, { order_by => { -desc => [qw/date/] } });
|
||||
$self->stash( history => $history );
|
||||
}
|
||||
|
||||
sub transfer {
|
||||
my $self = shift;
|
||||
my $db = $self->app->db;
|
||||
my $account = $db->resultset("Account")->find( $self->stash("account") );
|
||||
|
||||
if ( $self->req->method eq 'GET' ) {
|
||||
$self->stash(
|
||||
credits => $account->available_credits_rs,
|
||||
arrears => $account->current_arrears_rs,
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
$db->make_transfers(
|
||||
$self->every_param('credits')
|
||||
=> $self->every_param('debits')
|
||||
);
|
||||
|
||||
return;
|
||||
|
||||
}
|
||||
1;
|
||||
|
||||
66
TrsrDB/HTTP/Credit.pm
Normal file
66
TrsrDB/HTTP/Credit.pm
Normal file
@@ -0,0 +1,66 @@
|
||||
use strict;
|
||||
|
||||
package TrsrDB::HTTP::Credit;
|
||||
use Mojo::Base 'Mojolicious::Controller';
|
||||
use Carp qw(croak);
|
||||
|
||||
sub list {
|
||||
my $self = shift;
|
||||
|
||||
my $accounts = $self->app->db->resultset("Account");
|
||||
|
||||
my %args = $self->stash("user")->grade ? () : ( type => undef );
|
||||
$args{ID} = $self->stash("account");
|
||||
my $account = $accounts->find(\%args);
|
||||
|
||||
if ( !$account ) {
|
||||
$self->reply->not_found;
|
||||
return;
|
||||
}
|
||||
|
||||
$self->stash( credits => $account->credits_rs );
|
||||
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
sub upsert {
|
||||
my $self = shift;
|
||||
|
||||
my $db = $self->app->db;
|
||||
my $id = $self->stash("id");
|
||||
my $method = $id ? 'find_or_new' : 'new';
|
||||
my $credit = $db->resultset("Credit")->$method(
|
||||
{ $id ? (credId => $id) : (), account => $self->stash("account") }
|
||||
);
|
||||
$self->stash( credit => $credit );
|
||||
|
||||
if ( $self->req->method eq 'GET' ) {
|
||||
return;
|
||||
}
|
||||
|
||||
for my $field ( qw/account date purpose value/ ) {
|
||||
my $value = $self->param($field);
|
||||
$credit->$field($value);
|
||||
}
|
||||
$credit->update_or_insert();
|
||||
|
||||
my $to_revoke = $self->every_param("revoke");
|
||||
if ( @$to_revoke ) {
|
||||
$db->resultset("Transfer")->search({
|
||||
billId => $to_revoke, credId => $id
|
||||
})->delete;
|
||||
}
|
||||
|
||||
my $to_spend_for = $self->every_param("spendFor");
|
||||
if ( @$to_spend_for ) {
|
||||
$db->make_transfers( $self->param("billId") => $to_spend_for);
|
||||
}
|
||||
|
||||
$self->redirect_to('home');
|
||||
|
||||
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
78
TrsrDB/HTTP/Debit.pm
Normal file
78
TrsrDB/HTTP/Debit.pm
Normal file
@@ -0,0 +1,78 @@
|
||||
use strict;
|
||||
|
||||
package TrsrDB::HTTP::Debit;
|
||||
use Mojo::Base 'Mojolicious::Controller';
|
||||
use Carp qw(croak);
|
||||
|
||||
sub list {
|
||||
my $self = shift;
|
||||
|
||||
my $accounts = $self->app->db->resultset("Account");
|
||||
|
||||
my %args = $self->stash("user")->grade ? () : ( type => undef );
|
||||
$args{ID} = $self->stash("account");
|
||||
my $account = $accounts->find(\%args);
|
||||
|
||||
if ( !$account ) {
|
||||
$self->reply->not_found;
|
||||
return;
|
||||
}
|
||||
|
||||
$self->stash( debits => $account->debits_rs );
|
||||
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
sub upsert {
|
||||
my $self = shift;
|
||||
|
||||
my $db = $self->app->db;
|
||||
my $id = $self->stash("id");
|
||||
my $account = $self->stash("account");
|
||||
my $method = $id ? 'find_or_new' : 'new';
|
||||
my $debit = $db->resultset("Debit")->$method(
|
||||
{ $id ? (billId => $id) : (), debtor => $account }
|
||||
);
|
||||
|
||||
$self->stash( debit => $debit );
|
||||
|
||||
if ( $self->req->method eq 'GET' ) {
|
||||
my $targets
|
||||
= $db->resultset("Credit")->search({ account => { '!=' => $account } },
|
||||
{ join => 'income',
|
||||
'+select' => [ { count => 'income.targetCredit', -as => 'targetted_by' } ],
|
||||
group_by => ['income.targetCredit'],
|
||||
having => \[ 'ifnull(sum(income.paid),0) = me.value' ],
|
||||
order_by => { -asc => [qw/account/] },
|
||||
}
|
||||
);
|
||||
my @targets = map { [ $_->credId, $_->account->ID, $_->purpose ] } $targets->all;
|
||||
$self->stash( targets => \@targets, targets_count => $targets->count );
|
||||
return;
|
||||
}
|
||||
|
||||
for my $field ( qw/billId debtor date purpose value targetCredit/ ) {
|
||||
my $value = $self->param($field);
|
||||
$debit->$field($value);
|
||||
}
|
||||
$debit->update_or_insert();
|
||||
|
||||
my $to_revoke = $self->every_param("revoke");
|
||||
if ( @$to_revoke ) {
|
||||
$db->resultset("Transfer")->search({
|
||||
billId => $id, credId => $to_revoke
|
||||
})->delete;
|
||||
}
|
||||
|
||||
my $to_pay_with = $self->every_param("payWith");
|
||||
if ( @$to_pay_with ) {
|
||||
$db->make_transfers( $to_pay_with => $self->param("billId") );
|
||||
}
|
||||
|
||||
$self->redirect_to('home');
|
||||
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
41
TrsrDB/HTTP/User.pm
Normal file
41
TrsrDB/HTTP/User.pm
Normal file
@@ -0,0 +1,41 @@
|
||||
use strict;
|
||||
|
||||
package TrsrDB::HTTP::User;
|
||||
use Mojo::Base 'Mojolicious::Controller';
|
||||
#use Carp qw(croak);
|
||||
|
||||
sub login {
|
||||
my $self = shift;
|
||||
my $user_id = $self->param('user') // return;
|
||||
my $db = $self->app->db;
|
||||
|
||||
my $password = $self->param('password');
|
||||
my $user = $db->resultset("User")->find(
|
||||
$user_id =~ m{@} ? { email => $user_id } : $user_id
|
||||
);
|
||||
|
||||
if ( !$user ) {
|
||||
$self->render( retry_msg => 'authfailure' );
|
||||
return;
|
||||
}
|
||||
elsif ( $password && $user->password_equals($password) ) {
|
||||
$self->session("user_id" => $user_id );
|
||||
$self->redirect_to("home");
|
||||
}
|
||||
else {
|
||||
$self->render( $password ? (retry_msg => 'authfailure') : () );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
sub logout {
|
||||
my ($self) = @_;
|
||||
|
||||
$self->session(expires => 1);
|
||||
|
||||
# $self->stash( retry_msg => 'loggedOut' );
|
||||
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
Reference in New Issue
Block a user