From 7c12a58d125df75c3b9d6ab682738b83ae51adfc Mon Sep 17 00:00:00 2001 From: Kaitlyn Parkhurst Date: Fri, 16 Sep 2022 12:41:26 -0700 Subject: [PATCH] Add build stuff. --- DB/lib/MJB/DB/Result/Blog.pm | 96 +++++++++++++++++++++++++++++++++++- 1 file changed, 95 insertions(+), 1 deletion(-) diff --git a/DB/lib/MJB/DB/Result/Blog.pm b/DB/lib/MJB/DB/Result/Blog.pm index a782d20..f7dadac 100644 --- a/DB/lib/MJB/DB/Result/Blog.pm +++ b/DB/lib/MJB/DB/Result/Blog.pm @@ -231,6 +231,100 @@ __PACKAGE__->has_many( # Created by DBIx::Class::Schema::Loader v0.07049 @ 2022-09-15 21:45:36 # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:L3dxpgcZP09t4/pKOLFDUA +use DateTime; + +sub repo { + my ( $self ) = @_; + + return $self->search_related( 'repoes' )->first; + +} + +sub get_builds { + my ( $self ) = @_; + + return [ map { +{ + id => $_->id, + job_id => $_->job_id, + date => $_->created_at->strftime( "%F %T %Z" ), + } } $self->search_related( 'builds', { }, { order_by => { -DESC => 'created_at' } } ) ]; +} + +sub build_count { + my ( $self, @time ) = @_; + + if ( ! @time ) { + return $self->search_related( 'builds', { }, { } )->count; + } + + return $self->search_related( 'builds', + { + created_at => { + '>=', + $self->result_source->schema->storage->datetime_parser->format_datetime( + DateTime->now->subtract( @time ) + ) + } + }, + { + }, + )->count; +} + +sub minutes_since_last_build { + my ( $self ) = @_; + + my ( $build ) = $self->search_related( 'builds', { }, { order_by => { -DESC => 'created_at' }, limit => 1 } )->all; + + return undef unless $build; + + return DateTime->now->subtract_datetime( $build->created_at )->in_units( 'minutes' ); + +} + +sub get_build_allowance { + my ( $self ) = @_; + + # Create a data structure with the build restrictions. + # + # If there is no build yet, set minutes_since_last_build to one more than + # minutes_wait_after_build so this test passes to make the first build. + my $data = { + can_build => undef, + total_builds => $self->build_count, + + wait_minutes => { + required => $self->minutes_wait_after_build, + current => defined $self->minutes_since_last_build ? $self->minutes_since_last_build : ( $self->minutes_wait_after_build + 1 ), + can_build => undef, + }, + + builds_over_hour => { + allowed => $self->builds_per_hour, + used => $self->build_count( hours => 1 ), + can_build => undef, + }, + + builds_over_day => { + allowed => $self->builds_per_day, + used => $self->build_count( hours => 24 ), + can_build => undef, + }, + }; + + # Calculcate the results of the rules. + $data->{wait_minutes}{can_build} = $data->{wait_minutes}{required} <= $data->{wait_minutes}{current} ? 1 : 0; + $data->{builds_over_hour}{can_build} = $data->{builds_over_hour}{allowed} > $data->{builds_over_hour}{used} ? 1 : 0; + $data->{builds_over_day}{can_build} = $data->{builds_over_day}{allowed} > $data->{builds_over_day}{used} ? 1 : 0; + + # If all limits can build, we're good. + $data->{can_build} = ( + $data->{wait_minutes}{can_build} && $data->{builds_over_hour}{can_build} && $data->{builds_over_day}{can_build} + ? 1 + : 0 + ); + + return $data; +} -# You can replace this text with custom code or comments, and it will be preserved on regeneration 1;