use utf8; package MJB::DB::Result::Blog; # Created by DBIx::Class::Schema::Loader # DO NOT MODIFY THE FIRST PART OF THIS FILE =head1 NAME MJB::DB::Result::Blog =cut use strict; use warnings; use base 'DBIx::Class::Core'; =head1 COMPONENTS LOADED =over 4 =item * L =item * L =back =cut __PACKAGE__->load_components("InflateColumn::DateTime", "InflateColumn::Serializer"); =head1 TABLE: C =cut __PACKAGE__->table("blog"); =head1 ACCESSORS =head2 id data_type: 'integer' is_auto_increment: 1 is_nullable: 0 sequence: 'blog_id_seq' =head2 person_id data_type: 'integer' is_foreign_key: 1 is_nullable: 0 =head2 domain_id data_type: 'integer' is_foreign_key: 1 is_nullable: 1 =head2 max_static_file_count data_type: 'integer' default_value: 100 is_nullable: 0 =head2 max_static_file_size data_type: 'integer' default_value: 5 is_nullable: 0 =head2 max_static_webroot_size data_type: 'integer' default_value: 50 is_nullable: 0 =head2 minutes_wait_after_build data_type: 'integer' default_value: 10 is_nullable: 0 =head2 builds_per_hour data_type: 'integer' default_value: 3 is_nullable: 0 =head2 builds_per_day data_type: 'integer' default_value: 12 is_nullable: 0 =head2 build_priority data_type: 'integer' default_value: 1 is_nullable: 0 =head2 is_enabled data_type: 'boolean' default_value: true is_nullable: 0 =head2 created_at data_type: 'timestamp with time zone' default_value: current_timestamp is_nullable: 0 =cut __PACKAGE__->add_columns( "id", { data_type => "integer", is_auto_increment => 1, is_nullable => 0, sequence => "blog_id_seq", }, "person_id", { data_type => "integer", is_foreign_key => 1, is_nullable => 0 }, "domain_id", { data_type => "integer", is_foreign_key => 1, is_nullable => 1 }, "max_static_file_count", { data_type => "integer", default_value => 100, is_nullable => 0 }, "max_static_file_size", { data_type => "integer", default_value => 5, is_nullable => 0 }, "max_static_webroot_size", { data_type => "integer", default_value => 50, is_nullable => 0 }, "minutes_wait_after_build", { data_type => "integer", default_value => 10, is_nullable => 0 }, "builds_per_hour", { data_type => "integer", default_value => 3, is_nullable => 0 }, "builds_per_day", { data_type => "integer", default_value => 12, is_nullable => 0 }, "build_priority", { data_type => "integer", default_value => 1, is_nullable => 0 }, "is_enabled", { data_type => "boolean", default_value => \"true", is_nullable => 0 }, "created_at", { data_type => "timestamp with time zone", default_value => \"current_timestamp", is_nullable => 0, }, ); =head1 PRIMARY KEY =over 4 =item * L =back =cut __PACKAGE__->set_primary_key("id"); =head1 RELATIONS =head2 domain Type: belongs_to Related object: L =cut __PACKAGE__->belongs_to( "domain", "MJB::DB::Result::Domain", { id => "domain_id" }, { is_deferrable => 0, join_type => "LEFT", on_delete => "NO ACTION", on_update => "NO ACTION", }, ); =head2 jobs Type: has_many Related object: L =cut __PACKAGE__->has_many( "jobs", "MJB::DB::Result::Job", { "foreign.blog_id" => "self.id" }, { cascade_copy => 0, cascade_delete => 0 }, ); =head2 person Type: belongs_to Related object: L =cut __PACKAGE__->belongs_to( "person", "MJB::DB::Result::Person", { id => "person_id" }, { is_deferrable => 0, on_delete => "NO ACTION", on_update => "NO ACTION" }, ); =head2 repoes Type: has_many Related object: L =cut __PACKAGE__->has_many( "repoes", "MJB::DB::Result::Repo", { "foreign.blog_id" => "self.id" }, { cascade_copy => 0, cascade_delete => 0 }, ); # Created by DBIx::Class::Schema::Loader v0.07049 @ 2022-11-11 23:06:57 # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:VQHf6EwwxUUAGeyMVk6KAw 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; } 1;