diff --git a/lib/Lacuna/DB/Result.pm b/lib/Lacuna/DB/Result.pm index d72b88e7..40f69c9e 100644 --- a/lib/Lacuna/DB/Result.pm +++ b/lib/Lacuna/DB/Result.pm @@ -3,9 +3,7 @@ package Lacuna::DB::Result; no warnings qw(uninitialized); use namespace::autoclean -except => ['meta']; -use base 'DBIx::Class::Core'; - -__PACKAGE__->load_components('TimeStamp', 'InflateColumn::DateTime', 'InflateColumn::Serializer', 'Core'); +use base 'Lacuna::DB::ResultBase'; __PACKAGE__->table('noexist_basetable'); __PACKAGE__->add_columns( @@ -13,21 +11,4 @@ __PACKAGE__->add_columns( ); __PACKAGE__->set_primary_key('id'); -# override default DBIx::Class constructor to set defaults from schema -sub new { - my $class = shift; - my $self = $class->SUPER::new(@_); - foreach my $col ($self->result_source->columns) { - my $default = $self->result_source->column_info($col)->{default_value}; - $self->$col($default) if (defined $default && !defined $self->$col()); - } - return $self; -} - -sub random { - my $self = shift; - return $self->search( undef, { order_by => 'rand()' })->first; -} - - 1; diff --git a/lib/Lacuna/DB/Result/SitterAuths.pm b/lib/Lacuna/DB/Result/SitterAuths.pm new file mode 100644 index 00000000..8762f557 --- /dev/null +++ b/lib/Lacuna/DB/Result/SitterAuths.pm @@ -0,0 +1,36 @@ +package Lacuna::DB::Result::SitterAuths; + +use Moose; +use utf8; +use DateTime; + +# no "id" column. +extends 'Lacuna::DB::ResultBase'; + +__PACKAGE__->load_components('TimeStamp', 'InflateColumn::DateTime', 'InflateColumn::Serializer', 'Core'); + +__PACKAGE__->table('sitter_auths'); +__PACKAGE__->add_columns( + baby_id => { data_type => 'int', is_nullable => 0 }, + sitter_id => { data_type => 'int', is_nullable => 0 }, + expiry => { data_type => 'datetime', is_nullable => 0 }, +); +__PACKAGE__->set_primary_key('baby_id','sitter_id'); + +__PACKAGE__->belongs_to('baby', 'Lacuna::DB::Result::Empire', 'baby_id', { on_delete => 'cascade' }); +__PACKAGE__->belongs_to('sitter', 'Lacuna::DB::Result::Empire', 'sitter_id', { on_delete => 'cascade' }); + +sub _new_auth_date +{ + Lacuna->db->resultset("SitterAuths")->new_auth_date; +} + +sub reauthorise +{ + my ($self) = @_; + + $self->expiry($self->_new_auth_date); +} + +no Moose; +__PACKAGE__->meta->make_immutable(inline_constructor => 0); diff --git a/lib/Lacuna/DB/ResultBase.pm b/lib/Lacuna/DB/ResultBase.pm new file mode 100644 index 00000000..e0b31280 --- /dev/null +++ b/lib/Lacuna/DB/ResultBase.pm @@ -0,0 +1,25 @@ +package Lacuna::DB::ResultBase; + +use namespace::autoclean -except => ['meta']; + +use base 'DBIx::Class::Core'; + +__PACKAGE__->load_components('TimeStamp', 'InflateColumn::DateTime', 'InflateColumn::Serializer', 'Core'); + +# override default DBIx::Class constructor to set defaults from schema +sub new { + my $class = shift; + my $self = $class->SUPER::new(@_); + foreach my $col ($self->result_source->columns) { + my $default = $self->result_source->column_info($col)->{default_value}; + $self->$col($default) if (defined $default && !defined $self->$col()); + } + return $self; +} + +sub random { + my $self = shift; + return $self->search( undef, { order_by => 'rand()' })->first; +} + +1; diff --git a/lib/Lacuna/DB/ResultSet/SitterAuths.pm b/lib/Lacuna/DB/ResultSet/SitterAuths.pm new file mode 100644 index 00000000..05665a14 --- /dev/null +++ b/lib/Lacuna/DB/ResultSet/SitterAuths.pm @@ -0,0 +1,57 @@ +package Lacuna::DB::ResultSet::SitterAuths; + +use Moose; +use utf8; +extends 'Lacuna::DB::ResultSet'; +use DateTime; + +sub remove_auths_from_alliance +{ + my ($self, $user) = @_; + + # if it was a name or id, convert to object so we can find the alliance_id. + $user = $self->user($user) unless ref $user; + + my @ids = Lacuna->db->resultset('empire')-> + search( + { + alliance_id => $user->alliance_id, + } + )->get_column('id')->all; + + $self->search({ baby_id => { -in => \@ids }, sitter_id => $user->id })->delete; + $self->search({ sitter_id => { -in => \@ids }, baby_id => $user->id })->delete; +} + +sub new_auth_date { DateTime->now->add(days => 60) } + +sub hire_sitter +{ + my ($self, %opts) = @_; + die "Invalid hiring" unless ($opts{sitter} || $opts{sitter_id}) && ($opts{baby} || $opts{baby_id}); + + my $sitter = $opts{sitter} || $self->empire($opts{sitter_id}); + my $baby = $opts{baby} || $self->empire($opts{baby_id}); + + __PACKAGE__->new({ + sitter_id => $sitter->id, + baby_id => $baby->id, + expiry => new_auth_date(), + })->insert; +} + +sub clean_expired +{ + my ($self) = @_; + + my $db = Lacuna->db; + my $dtf = $db->storage->datetime_parser; + my $too_old = $dtf->format_datetime(DateTime->now); + + $self->search({ expiry => { '<', $too_old } })->delete; +} + +#sub + +no Moose; +__PACKAGE__->meta->make_immutable(inline_constructor => 0); diff --git a/var/upgrades/sitter.sql b/var/upgrades/sitter.sql new file mode 100644 index 00000000..4cd40f1a --- /dev/null +++ b/var/upgrades/sitter.sql @@ -0,0 +1,12 @@ +-- Table: sitter_auths +-- +CREATE TABLE sitter_auths ( + baby_id integer NOT NULL, + sitter_id integer NOT NULL, + expiry datetime NOT NULL, + INDEX sitter_auths_idx_baby_id (baby_id), + INDEX sitter_auths_idx_sitter_id (sitter_id), + PRIMARY KEY (baby_id, sitter_id), + CONSTRAINT sitter_auths_fk_baby_id FOREIGN KEY (baby_id) REFERENCES empire (id) ON DELETE CASCADE, + CONSTRAINT sitter_auths_fk_sitter_id FOREIGN KEY (sitter_id) REFERENCES empire (id) ON DELETE CASCADE +) ENGINE=InnoDB--