X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=angular-server.pl;h=aff04f00d35a1ed02dfe88f7c2b2b7cb3308e7f5;hb=1f4c5ccaceed19a94d25ca1ee774b658da5a7cd4;hp=29db13a075e59c2476ceed26eff23a23497d9c55;hpb=e115ad28d9d1ce09a48afa1e2af7d3912ff412fa;p=angular-drzb diff --git a/angular-server.pl b/angular-server.pl index 29db13a..aff04f0 100755 --- a/angular-server.pl +++ b/angular-server.pl @@ -6,7 +6,8 @@ use Time::HiRes; use Clone qw(clone); use Mojo::UserAgent; -our $VERSION = '0.3'; +our $VERSION = `git describe`; +chomp $VERSION; sub new_uuid { Time::HiRes::time * 100000 } @@ -18,9 +19,13 @@ my $couchdb_database = 'drzb2013v2'; my $couchdb_view = "http://10.60.0.92:5984/_utils/document.html?$couchdb_database"; my $client = Mojo::UserAgent->new; +our $view_cache; + sub _couchdb_put { my ( $url, $data ) = @_; + $view_cache = undef; + $data->{'$entity'} = $1 if $url =~ m{/(\w+)\.\d+/$/}; my $json = Mojo::JSON->new->encode( $data ); @@ -68,6 +73,16 @@ helper locale => sub { return $locale{ $lang } || "MISSING $lang $_[1]"; }; +helper ip => sub { + my $self = shift; + return + $self->req->headers->header('X-Forwarded-For') + || $self->req->headers->header('X-Real-IP') + || $self->tx->{remote_address} + ; +}; + + get '/js/services.js' => sub { my $self = shift; $self->stash( VERSION => $VERSION ); @@ -95,6 +110,12 @@ get '/lang/:lang/.template' => sub { $self->render( $self->stash('template') , lang => $self->stash('lang') ); }; +get '/lang/:lang/template/*template' => sub { # angular-ui templates + my $self = shift; + my $path = '/template/' . $self->stash('template'); + warn "# render_static $path"; + $self->render_static( $path ); +}; get '/data/' => sub { my $self = shift; @@ -174,6 +195,12 @@ any [ 'post' ] => '/data/:database/:entity' => sub { $json->{entity} = $entity; warn "NEW $id\n"; } + + $json->{x_audit} = { + t => Time::HiRes::time, + ip => $self->ip(), + }; + warn "## $database $entity $id body ",dump($self->req->body, $json); my $new = _couchdb_put "/$database/$entity.$id" => $json; @@ -200,6 +227,19 @@ get '/:database/_design/:design/_view/:view' => sub { if ( my $param = $self->req->url->query->clone->remove('callback')->remove('format')->to_string ) { $url .= '?' . $param } + + if ( exists $view_cache->{$url}->{time} ) { + if ( time() - $view_cache->{$url}->{time} < 60 ) { + warn "HIT CouchDB cache $url"; + $view_cache->{$url}->{hit}++; + return _render_jsonp( $self, $view_cache->{$url}->{json} ); + } else { + warn "REFRESH CouchDB cache $url"; + $view_cache->{$url}->{refresh}++; + } + } else { + $view_cache->{$url}->{miss}++; + } warn "CouchDB proxy $url"; my $json = _couchdb_get($url); @@ -213,16 +253,40 @@ get '/:database/_design/:design/_view/:view' => sub { organizations => { map => q| function(doc) { if ( doc.user.organization != '' ) { - emit(doc.user.organization, 1); - if ( doc.user.persons ) { - doc.user.persons.forEach( function(person) { - emit(person.organization, 1); + if ( doc.user.organization ) + emit(doc.user.organization, 1); + if ( doc.work.persons ) { + doc.work.persons.forEach( function(person) { + if ( person.organization ) + emit(person.organization, 1); }); } } }q|, reduce => q| function(keys,values,rereduce) { return sum(values); } |, - } + }, + authors => { + map => q| +function(doc) { + if ( doc.work.persons ) { + doc.work.persons.forEach( function(person) { + emit(person.surname+person.firstname , + person + ); + }); + } + if ( doc.work.symposium_works ) { + doc.work.symposium_works.forEach( function(work) { + work.persons.forEach( function(person) { + emit(person.surname+person.firstname , + person + ); + }); + }); + } +} + |, + }, } }; $json = _couchdb_get($url) @@ -231,7 +295,24 @@ if ( doc.user.organization != '' ) { if ( $format eq 'key_array' ) { # array of keys sorted by value $json->{rows} = [ map { $_->{key} } sort { $b->{value} <=> $a->{value} } @{ $json->{rows} } ]; + } elsif ( $format eq 'key_distinct' ) { + + my $found; + $json->{rows} = [ grep { ++$found->{ $_->{key} } == 1 } @{ $json->{rows} } ]; + $json->{distinct_rows} = scalar @{ $json->{rows} }; + warn "## distinct stats ", dump( $found ); + + } elsif ( $format ) { + + die "unknown format: $format"; + } + + $view_cache->{$url}->{time} = time(); + $view_cache->{$url}->{json} = $json; + + warn "# view_cache ",dump($view_cache); + _render_jsonp( $self, $json ); }; @@ -247,13 +328,13 @@ hook after_dispatch => sub { return if $self->res->headers->header('ETag'); - my $our_etag = Mojo::ByteStream->new($body)->md5_sum; + my $our_etag = Mojo::ByteStream->new($body . $VERSION)->md5_sum; $self->res->headers->header('ETag' => $our_etag); my $browser_etag = $self->req->headers->header('If-None-Match'); return unless $browser_etag && $browser_etag eq $our_etag; - $self->app->log->info("HTTP cache hit ", dump( $self->req->url->to_string ), $our_etag ); + $self->app->log->debug("HTTP cache hit " . $self->req->url->to_string . " $our_etag" ); $self->res->code(304); $self->res->body('');