Group
Extension

App-Manoc/lib/App/Manoc/Controller/Vlan.pm

package App::Manoc::Controller::Vlan;
#ABSTRACT: Vlan controller

use Moose;

our $VERSION = '2.99.4'; ##TRIAL VERSION

use namespace::autoclean;
use App::Manoc::Form::Vlan;

BEGIN { extends 'App::Manoc::ControllerBase::CRUD'; }

__PACKAGE__->config(
    # define PathPart
    action => {
        setup => {
            PathPart => 'vlan',
        }
    },
    class               => 'ManocDB::Vlan',
    form_class          => 'App::Manoc::Form::Vlan',
    json_columns        => [ 'id', 'name', 'description' ],
    view_object_perm    => undef,
    object_list_options => {
        prefetch => 'vlan_range',
        order_by => { -asc => [ 'me.lan_segment_id', 'vid' ] }
    }
);


sub vid : Chained('base') : PathPart('vid') : Args(1) {
    my ( $self, $c, $vid ) = @_;

    $self->view_object_perm and
        $c->require_permission( $c->stash->{resultset}, $self->view_object_perm );

    my $qp            = $c->req->query_parameters;
    my $segment_param = $qp->{lansegment};

    my $search_params = { vid => $vid };
    if ( defined($segment_param) ) {
        $search_params->{lansegment_id} = $segment_param;
    }

    my $object_list = [ $c->stash->{resultset}->search($search_params)->all ];

    if ( @$object_list == 1 ) {
        my $id = $object_list->[0]->id;
        $c->debug and
            $c->log->debug("Only one vlan found, redirect to vlan/view $id");
        $c->go( '/vlan/view', [$id], [] );
    }

    $c->stash(
        vid         => $vid,
        object_list => $object_list
    );

}

before 'list' => sub {
    my ( $self, $c ) = @_;

    my $segment      = $c->stash->{cur_segment};
    my $segment_list = [
        $c->model('ManocDB::LanSegment')->search(
            {},
            {
                order_by => ['me.name'],
            }
        )->all()
    ];

    my @range_list = $c->model('ManocDB::VlanRange')->search(
        {
            lan_segment_id => $segment->id,
        },
        {
            order_by => { -asc => ['me.start'] },
        }
    )->all();
    my @vlan_list = @{ $c->stash->{object_list} };

    my @mixed_vlan_range_list;
    while ( @vlan_list && @range_list ) {
        if ( $range_list[0]->start <= $vlan_list[0]->vid ) {
            my $range = shift @range_list;
            push @mixed_vlan_range_list, { range => $range };
        }
        else {
            my $vlan = shift @vlan_list;
            push @mixed_vlan_range_list, { vlan => $vlan };
        }
    }
    while ( my $range = shift @range_list ) {
        push @mixed_vlan_range_list, { range => $range };
    }
    while ( my $vlan = shift @vlan_list ) {
        push @mixed_vlan_range_list, { vlan => $vlan };
    }

    $c->stash(
        segment_list          => $segment_list,
        mixed_vlan_range_list => \@mixed_vlan_range_list,
    );

};


override get_object_list_filter => sub {
    my ( $self, $c ) = @_;

    my %filter;

    my $qp = $c->req->query_parameters;

    my $segment;
    if ( my $segment_param = $qp->{lansegment} ) {
        $c->debug and $c->log->debug("looking for segment=$segment_param");
        $segment = $c->model('ManocDB::LanSegment')->find( { id => $segment_param } );
        $c->debug and $c->log->debug( $segment ? "segment found" : "segment not found" );
    }
    if ( !$segment ) {
        $segment =
            $c->model('ManocDB::LanSegment')->search( {}, { order_by => { -asc => ['id'] } } )
            ->first();
        $c->debug and $c->log->debug("Use first segment found");
    }

    $filter{"me.lan_segment_id"} = $segment->id;
    $c->stash( cur_segment => $segment );

    return \%filter;
};


before 'create' => sub {
    my ( $self, $c ) = @_;

    my $form_defaults = {};

    my $lan_segment_id = $c->req->query_parameters->{'lansegment'};
    my $lan_segment;
    if ( defined($lan_segment_id) ) {
        $lan_segment = $c->model('ManocDB::LanSegment')->find( { id => $lan_segment_id } );
    }
    else {
        if ( $c->model('ManocDB::LanSegment')->count == 1 ) {
            $lan_segment = $c->model('ManocDB::LanSegment')->single();
        }
    }
    $c->debug and $c->log->debug( $lan_segment ? "segment found" : "segment not foud" );
    $form_defaults->{lan_segment} = $lan_segment;

    my $vid = $c->req->query_parameters->{'vid'};
    $vid and $form_defaults->{vid} = $vid;

    my $name = $c->req->query_parameters->{'name'};
    $name and $form_defaults->{name} = $name;

    $c->stash( form_defaults => $form_defaults );
};


sub object_delete {
    my ( $self, $c ) = @_;
    my $vlan = $c->stash->{'object'};

    if ( $vlan->ip_ranges->count ) {
        $c->flash( error_msg => 'There are subnets in this vlan' );
        return;
    }

    $vlan->delete;
}


sub get_form_success_url {
    my ( $self, $c ) = @_;

    my $vlan           = $c->stash->{object};
    my $lan_segment_id = $vlan->lan_segment_id;

    return $c->uri_for_action( "vlan/list", { lansegment => $lan_segment_id } );
}

__PACKAGE__->meta->make_immutable;

1;

__END__

=pod

=head1 NAME

App::Manoc::Controller::Vlan - Vlan controller

=head1 VERSION

version 2.99.4

=head1 ACTIONS

=head2 vid

View Vlan by vid

=head2 create

=head1 METHODS

=head2 get_object_list_filter

=head2 object_delete

=head2 get_form_success_url

=head1 AUTHORS

=over 4

=item *

Gabriele Mambrini <gmambro@cpan.org>

=item *

Enrico Liguori

=back

=head1 COPYRIGHT AND LICENSE

This software is copyright (c) 2017 by Gabriele Mambrini.

This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.

=cut


Powered by Groonga
Maintained by Kenichi Ishigaki <ishigaki@cpan.org>. If you find anything, submit it on GitHub.