Add better tracking.

This commit is contained in:
sergiotarxz 2023-05-02 20:52:39 +02:00
parent ca3a8d4fce
commit 6ebfc8cbe5
2 changed files with 42 additions and 9 deletions

View File

@ -25,6 +25,9 @@ sub MIGRATIONS {
path TEXT,
FOREIGN KEY (path) REFERENCES paths(path)
)',
'ALTER TABLE paths ADD column last_seen TIMESTAMP;',
'ALTER TABLE paths ALTER COLUMN last_seen SET DEFAULT NOW();',
'ALTER TABLE requests ADD PRIMARY KEY (uuid)',
);
}
1;

View File

@ -5,6 +5,8 @@ use v5.34.1;
use strict;
use warnings;
use feature 'signatures';
use JSON;
use Const::Fast;
@ -25,22 +27,50 @@ sub new {
return bless {}, $class;
}
sub register_request {
my $self = shift;
my $c = shift;
my $path = $c->req->url->path;
sub _add_path($self, $url) {
my $dbh = BurguillosInfo::DB->connect($app);
$dbh->do( <<'EOF', undef, $c->req->url->path );
INSERT INTO paths (path) VALUES (?) ON CONFLICT DO NOTHING;
$dbh->do( <<'EOF', undef, $url );
INSERT INTO paths (path) VALUES($1)
ON CONFLICT (path) DO
UPDATE SET last_seen = NOW() where paths.path = $1;
EOF
my $remote_address = $c->tx->remote_address;
my $user_agent = $c->req->headers->user_agent;
my $params_json = encode_json( $c->req->params->to_hash );
}
sub _update_null_last_seen_paths_if_any($self) {
my $dbh = BurguillosInfo::DB->connect($app);
$dbh->do( <<'EOF', undef);
UPDATE paths
SET last_seen = requests_for_path.last_date
FROM (
SELECT requests.path, max(requests.date) as last_date
FROM requests
GROUP BY requests.path
) requests_for_path
WHERE paths.last_seen IS NULL AND requests_for_path.path = paths.path;
EOF
}
sub _register_request_query($self, $remote_address, $user_agent, $params_json, $path) {
my $dbh = BurguillosInfo::DB->connect($app);
$dbh->do(
<<'EOF', undef, $remote_address, $user_agent, $params_json, $path );
INSERT INTO requests(remote_address, user_agent, params, path)
VALUES (?, ?, ?, ?);
EOF
}
sub register_request {
my $self = shift;
my $c = shift;
my $path = $c->req->url->path;
my $dbh = BurguillosInfo::DB->connect($app);
$self->_add_path($path);
$self->_update_null_last_seen_paths_if_any();
my $remote_address = $c->tx->remote_address;
my $user_agent = $c->req->headers->user_agent;
my $params_json = encode_json( $c->req->params->to_hash );
$self->_register_request_query($remote_address, $user_agent, $params_json, $path);
say "Registered $remote_address with user agent $user_agent visited $path with $params_json";
}