Skip to content

Commit

Permalink
Convert BaseSerializer into a module
Browse files Browse the repository at this point in the history
  • Loading branch information
akadusei committed Jul 22, 2024
1 parent 0acd54c commit 3fc3681
Show file tree
Hide file tree
Showing 12 changed files with 115 additions and 96 deletions.
3 changes: 1 addition & 2 deletions src/app.cr
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,7 @@ require "./queries/mixins/**"
require "./queries/**"
require "./operations/mixins/**"
require "./operations/**"
require "./serializers/base_serializer"
require "./serializers/success_serializer"
require "./serializers/mixins/**"
require "./serializers/**"
require "./emails/base_email"
require "./emails/**"
Expand Down
23 changes: 0 additions & 23 deletions src/serializers/base_serializer.cr

This file was deleted.

6 changes: 4 additions & 2 deletions src/serializers/bearer_login_serializer.cr
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
struct BearerLoginSerializer < SuccessSerializer
struct BearerLoginSerializer
include Mixins::SuccessSerializer

def initialize(
@bearer_login : BearerLogin? = nil,
@bearer_logins : Array(BearerLogin)? = nil,
Expand All @@ -21,7 +23,7 @@ struct BearerLoginSerializer < SuccessSerializer
end

private def data_json : NamedTuple
data = super
data = previous_def
data = add_bearer_login(data)
data = add_bearer_logins(data)
data = add_token(data)
Expand Down
6 changes: 4 additions & 2 deletions src/serializers/email_confirmation_serializer.cr
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
struct EmailConfirmationSerializer < SuccessSerializer
struct EmailConfirmationSerializer
include Mixins::SuccessSerializer

def initialize(
@email_confirmation : EmailConfirmation? = nil,
@email_confirmations : Array(EmailConfirmation)? = nil,
Expand All @@ -22,7 +24,7 @@ struct EmailConfirmationSerializer < SuccessSerializer
end

private def data_json : NamedTuple
data = super
data = previous_def
data = add_email_confirmation(data)
data = add_email_confirmations(data)
data = add_token(data)
Expand Down
6 changes: 4 additions & 2 deletions src/serializers/error_serializer.cr
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
struct ErrorSerializer < BaseSerializer
struct ErrorSerializer
include Mixins::Serializer

def initialize(
@error_message : String,
@details : String? = nil,
Expand All @@ -12,7 +14,7 @@ struct ErrorSerializer < BaseSerializer
end

private def data_json : NamedTuple
super.merge(error: error_json)
previous_def.merge(error: error_json)
end

private def error_json
Expand Down
6 changes: 4 additions & 2 deletions src/serializers/failure_serializer.cr
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
struct FailureSerializer < BaseSerializer
struct FailureSerializer
include Mixins::Serializer

def initialize(
@errors : Hash(Symbol, Array(String))? = nil,
@message : String? = nil
Expand All @@ -10,7 +12,7 @@ struct FailureSerializer < BaseSerializer
end

private def data_json : NamedTuple
data = super
data = previous_def

@errors.try do |errors|
data = data.merge({errors: errors}) unless errors.empty?
Expand Down
6 changes: 4 additions & 2 deletions src/serializers/login_serializer.cr
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
struct LoginSerializer < SuccessSerializer
struct LoginSerializer
include Mixins::SuccessSerializer

def initialize(
@login : Login? = nil,
@logins : Array(Login)? = nil,
Expand All @@ -21,7 +23,7 @@ struct LoginSerializer < SuccessSerializer
end

private def data_json : NamedTuple
data = super
data = previous_def
data = add_login(data)
data = add_logins(data)
data = add_token(data)
Expand Down
25 changes: 25 additions & 0 deletions src/serializers/mixins/serializer.cr
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
module Mixins::Serializer
enum Status
Success
Failure
Error
end

private abstract def status : Status

macro included
include Lucille::Serializer

@message : String?

def render : NamedTuple
json = {status: status}
@message.try { |message| json = json.merge({message: message}) }
data_json.empty? ? json : json.merge({data: data_json})
end

private def data_json : NamedTuple
NamedTuple.new
end
end
end
61 changes: 61 additions & 0 deletions src/serializers/mixins/success_serializer.cr
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
module Mixins::SuccessSerializer
macro included
include Mixins::Serializer

@pages : Lucky::Paginator?

def render : NamedTuple
json = previous_def

@pages.try do |pages|
json = json.merge({pages: {
current: pages.page,
items: {
count: pages.per_page,
end: pages.item_range.end,
start: pages.item_range.begin,
total: pages.item_count,
},
next: pages.next_page,
previous: pages.previous_page,
series: pages_series(pages),
total: pages.total,
}})
end

json
end

def self.list(list : Array, *args, **named_args)
list.map { |item| item(item, *args, **named_args) }
end

private def status : Status
Status::Success
end

# The idea here is to free the frontend from having to calculate
# pagination parameters itself. We are therefore sending along the
# pagination series as built by *Lucky*.

# Here, a negative number represents the current page, a `0`
# represents a gap. Eg: `[1,0,5,-6,7,0,11]`.
private def pages_series(pages)
pages.series(
begin: 1,
end: 1,
left_of_current: 2,
right_of_current: 2
).map do |item|
case item
in Lucky::Paginator::CurrentPage
-item.number
in Lucky::Paginator::Page
item.number
in Lucky::Paginator::Gap
0
end
end
end
end
end
6 changes: 4 additions & 2 deletions src/serializers/password_reset_serializer.cr
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
struct PasswordResetSerializer < SuccessSerializer
struct PasswordResetSerializer
include Mixins::SuccessSerializer

def initialize(
@password_reset : PasswordReset? = nil,
@password_resets : Array(PasswordReset)? = nil,
Expand All @@ -21,7 +23,7 @@ struct PasswordResetSerializer < SuccessSerializer
end

private def data_json : NamedTuple
data = super
data = previous_def
data = add_password_reset(data)
data = add_password_resets(data)
data = add_token(data)
Expand Down
57 changes: 0 additions & 57 deletions src/serializers/success_serializer.cr

This file was deleted.

6 changes: 4 additions & 2 deletions src/serializers/user_serializer.cr
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
struct UserSerializer < SuccessSerializer
struct UserSerializer
include Mixins::SuccessSerializer

def initialize(
@user : User? = nil,
@users : Array(User)? = nil,
Expand All @@ -22,7 +24,7 @@ struct UserSerializer < SuccessSerializer
end

private def data_json : NamedTuple
data = super
data = previous_def
data = add_user(data)
data = add_users(data)
data = add_token(data)
Expand Down

0 comments on commit 3fc3681

Please sign in to comment.