feat: store click data on redirect

This commit is contained in:
Juan Rodriguez
2024-07-12 07:46:25 +02:00
parent 2f796dbdab
commit dbc81796d6
4 changed files with 29 additions and 5 deletions
+22 -4
View File
@@ -1,4 +1,8 @@
require "uuid"
require "geoip2"
require "user_agent_parser"
UserAgent.load_regexes(File.read("data/regexes.yaml"))
require "../lib/controller.cr"
@@ -38,11 +42,26 @@ module App::Controllers::Link
raise App::NotFoundException.new(env) if !link
spawn do
link.click_counter = link.click_counter! + 1
user_agent_str = env.request.headers["User-Agent"]
user_agent = UserAgent.new(user_agent_str)
changeset = Database.update(link)
language_header = env.request.headers["Accept-Language"]? || "Unknown"
language = language_header.split(',').first.split(';').first
referer = env.request.headers["Referer"]?
click = Click.new
click.id = UUID.v4.to_s
click.link = link
click.language = language
click.user_agent = user_agent_str
click.browser = user_agent.family
click.os = user_agent.os.try &.family || "Unknown"
click.source = referer ? URI.parse(referer).host : "Unknown"
changeset = Database.insert(click)
if changeset.errors.any?
Log.error { "Increase click counter failed: #{changeset.errors}" }
Log.error { "Logging click event failed: #{changeset.errors}" }
end
end
@@ -85,7 +104,6 @@ module App::Controllers::Link
end
link.url = body["url"].to_s
link.click_counter = 0
changeset = Database.update(link)
if !changeset.valid?
-1
View File
@@ -15,7 +15,6 @@ module App::Serializers
builder.field("id", @link.id)
builder.field("refer", @refer)
builder.field("origin", @link.url)
builder.field("clicks", @link.click_counter)
end
end
end
+4
View File
@@ -48,3 +48,7 @@ shards:
git: https://github.com/crystal-lang/crystal-sqlite3.git
version: 0.19.0
user_agent_parser:
git: https://github.com/busyloop/user_agent_parser.git
version: 2.0.1
+3
View File
@@ -22,6 +22,9 @@ dependencies:
micrate:
github: amberframework/micrate
version: 0.15.1
user_agent_parser:
github: busyloop/user_agent_parser
version: 2.0.1
development_dependencies:
dotenv: