From a2aa586daed7881a3f54ce4feeb8739bf8ffa1dc Mon Sep 17 00:00:00 2001 From: Juan Rodriguez Date: Fri, 12 Jul 2024 07:58:21 +0200 Subject: [PATCH] feat: get all links clicks join --- app/controllers/link.cr | 2 +- app/models/link.cr | 1 + app/serializers/click.cr | 22 ++++++++++++++++++++++ app/serializers/link.cr | 2 ++ 4 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 app/serializers/click.cr diff --git a/app/controllers/link.cr b/app/controllers/link.cr index 61be0a2..c871af2 100644 --- a/app/controllers/link.cr +++ b/app/controllers/link.cr @@ -95,7 +95,7 @@ module App::Controllers::Link user = env.get("user").as(User) query = Database::Query.where(user_id: user.id.as(String)) - links = Database.all(Link, query) + links = Database.all(Link, query, preload: [:clicks]) response = {"data" => links.map { |link| App::Serializers::Link.new(link) }} response.to_json diff --git a/app/models/link.cr b/app/models/link.cr index 281a647..2499e41 100644 --- a/app/models/link.cr +++ b/app/models/link.cr @@ -11,6 +11,7 @@ module App::Models field :url, String belongs_to :user, User + has_many :clicks, Click end unique_constraint :slug diff --git a/app/serializers/click.cr b/app/serializers/click.cr new file mode 100644 index 0000000..f00c553 --- /dev/null +++ b/app/serializers/click.cr @@ -0,0 +1,22 @@ +require "json" + +require "../models/click" + +module App::Serializers + class Click + def initialize(@click : App::Models::Click) + end + + def to_json(builder : JSON::Builder) + builder.object do + builder.field("id", @click.id) + builder.field("user_agent", @click.user_agent) + builder.field("language", @click.language) + builder.field("browser", @click.browser) + builder.field("os", @click.os) + builder.field("source", @click.source) + builder.field("created_at", @click.created_at) + end + end + end +end diff --git a/app/serializers/link.cr b/app/serializers/link.cr index 9f93d78..60ec040 100644 --- a/app/serializers/link.cr +++ b/app/serializers/link.cr @@ -1,6 +1,7 @@ require "json" require "../models/link" +require "./click" module App::Serializers class Link @@ -15,6 +16,7 @@ module App::Serializers builder.field("id", @link.id) builder.field("refer", @refer) builder.field("origin", @link.url) + builder.field("clicks", @link.clicks.map { |click| App::Serializers::Click.new(click) }) end end end