An OX Controller
file: code/Winxle-Admin/WinxleRequest.pm
1: package Winxle::Request;
2:
3: use 5.014;
4: use Moose;
5: use JSON::XS qw();
6: use namespace::autoclean;
7:
8: extends 'OX::Request';
9:
10: has stash => ( is => 'ro', default => sub { {} } );
11:
12: has 'is_xhr' => ( is => 'ro', isa => 'Bool', lazy_build => 1 );
13:
14: sub _build_is_xhr {
15: my $self = shift;
16: my $req_with = $self->headers->header('X-Requested-With');
17: return 1 if ( $req_with && lc($req_with) eq 'xmlhttprequest' );
18: return;
19: }
20:
21: has 'base_url' => ( is => 'ro', isa => 'Str', lazy_build => 1 );
22:
23: sub _build_base_url {
24: my $self = shift;
25: my $uri = $self->uri;
26: my $port = $uri->port;
27: if ( !$port || $port == 80 || $port == 443 ) {
28: return $uri->scheme . '://' . $uri->host . '/';
29: }
30: else {
31: return $uri->scheme . '://' . $uri->host_port . '/';
32: }
33: }
34:
35: sub absolute_url {
36: my ( $self, $url ) = @_;
37: $url =~ s{^/}{};
38: return $self->base_url . $url;
39: }
40:
41: sub _json_encode {
42: my ( $self, @rest ) = @_;
43: my $json = JSON::XS->new->allow_nonref->pretty(1);
44: return $json->encode(@rest);
45: }
46:
47: sub got_json {
48: my $self = shift;
49: my $got = $self->content;
50: return JSON::XS::decode_json($got);
51: }
52:
53: sub new_json_response {
54: my ( $self, $data ) = @_;
55:
56: return $self->new_response(
57: headers => [ content_type => 'application/json' ],
58: status => 200,
59: content => $self->_json_encode($data),
60: );
61: }
62:
63: sub new_json_error {
64: my ( $self, $message, $status ) = @_;
65: $status||=400;
66: return $self->new_response(
67: headers => [ content_type => 'application/json' ],
68: status => $status,
69: content => $self->_json_encode(
70: { status => 'error', message => "$message" }
71: ),
72: );
73: }
74:
75: sub redirect {
76: my ( $self, $target ) = @_;
77: my $res = $self->new_response();
78: if ( ref($target) eq 'HASH' ) {
79: $target = $self->uri_for($target);
80: }
81: $res->redirect($target);
82: return $res->finalize;
83: }
84:
85: __PACKAGE__->meta->make_immutable;
86:
87: 1;