Fix API performance #73
6 changed files with 32 additions and 48 deletions
|
@ -42,46 +42,30 @@ module Backend
|
|||
end
|
||||
end
|
||||
|
||||
# DB model finder helpers
|
||||
module ObjectFinders
|
||||
# Defines finder
|
||||
macro finders(type)
|
||||
# Finds object by ID
|
||||
def find : {{ type }}?
|
||||
{{ type }}.find(@id)
|
||||
end
|
||||
|
||||
# :ditto:
|
||||
def find! : {{ type }}
|
||||
obj = find
|
||||
raise "#{{{ type }}} not found" unless obj
|
||||
|
||||
obj
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# DB model field helpers
|
||||
module DbObject
|
||||
# Defines DB model field helper functions
|
||||
macro db_object(type)
|
||||
{% space_name = type.names.last.underscore.gsub(/_/, " ").capitalize %}
|
||||
|
||||
include ::Backend::Api::Schema::Helpers::ObjectDbInit
|
||||
include ::Backend::Api::Schema::Helpers::ObjectFinders
|
||||
|
||||
db_init {{ type }}
|
||||
finders {{ type }}
|
||||
|
||||
property id
|
||||
private property model
|
||||
private property id
|
||||
|
||||
def initialize(@id : Int32, @model : {{ type }})
|
||||
end
|
||||
|
||||
def initialize(@id : Int32)
|
||||
@model = {{ type }}.find(@id).not_nil!
|
||||
end
|
||||
|
||||
def initialize(obj : {{ type }})
|
||||
@id = obj.id.not_nil!.to_i
|
||||
def initialize(@model : {{ type }})
|
||||
@id = model.id.not_nil!.to_i
|
||||
end
|
||||
|
||||
{% space_name = type.names.last.underscore.gsub(/_/, " ").capitalize %}
|
||||
|
||||
@[GraphQL::Field]
|
||||
# {{ space_name }}'s ID
|
||||
def id : Int32
|
||||
|
|
|
@ -27,19 +27,19 @@ module Backend
|
|||
@[GraphQL::Field]
|
||||
# Student's user
|
||||
def user : User
|
||||
User.new(find!.user)
|
||||
User.new(@model.user)
|
||||
end
|
||||
|
||||
@[GraphQL::Field]
|
||||
# Student at SKIF
|
||||
def skif : Bool
|
||||
find!.skif
|
||||
@model.skif
|
||||
end
|
||||
|
||||
@[GraphQL::Field]
|
||||
# Student's vote
|
||||
def vote : Vote?
|
||||
find!.vote.try { |v| Vote.new(v) }
|
||||
@model.vote.try { |v| Vote.new(v) }
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -27,19 +27,19 @@ module Backend
|
|||
@[GraphQL::Field]
|
||||
# Teacher's user
|
||||
def user : User
|
||||
User.new(find!.user)
|
||||
User.new(@model.user)
|
||||
end
|
||||
|
||||
@[GraphQL::Field]
|
||||
# Teacher's max students
|
||||
def max_students : Int32
|
||||
find!.max_students
|
||||
@model.max_students
|
||||
end
|
||||
|
||||
@[GraphQL::Field]
|
||||
# Teacher is at SKIF
|
||||
def skif : Bool
|
||||
find!.skif
|
||||
@model.skif
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -27,13 +27,13 @@ module Backend
|
|||
@[GraphQL::Field]
|
||||
# Voted teacher
|
||||
def teacher : Teacher
|
||||
Teacher.new(find!.teacher.not_nil!)
|
||||
Teacher.new(@model.teacher.not_nil!)
|
||||
end
|
||||
|
||||
@[GraphQL::Field]
|
||||
# Teacher vote's priority
|
||||
def priority : Int32
|
||||
find!.priority
|
||||
@model.priority
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -27,43 +27,43 @@ module Backend
|
|||
@[GraphQL::Field]
|
||||
# User's first name
|
||||
def first_name : String
|
||||
find!.first_name
|
||||
@model.first_name
|
||||
end
|
||||
|
||||
@[GraphQL::Field]
|
||||
# User's last name
|
||||
def last_name : String
|
||||
find!.last_name
|
||||
@model.last_name
|
||||
end
|
||||
|
||||
@[GraphQL::Field]
|
||||
# User's full name
|
||||
def name : String
|
||||
find!.name
|
||||
@model.name
|
||||
end
|
||||
|
||||
@[GraphQL::Field]
|
||||
# User's LDAP username
|
||||
def username : String
|
||||
find!.username
|
||||
@model.username
|
||||
end
|
||||
|
||||
@[GraphQL::Field]
|
||||
# User's email
|
||||
def email : String
|
||||
find!.email
|
||||
@model.email
|
||||
end
|
||||
|
||||
@[GraphQL::Field]
|
||||
# User is admin
|
||||
def admin : Bool
|
||||
find!.admin
|
||||
@model.admin
|
||||
end
|
||||
|
||||
@[GraphQL::Field]
|
||||
# User's role
|
||||
def role : UserRole
|
||||
role = Db::UserRole.parse(find!.role)
|
||||
role = Db::UserRole.parse(@model.role)
|
||||
case role
|
||||
when .teacher?
|
||||
UserRole::Teacher
|
||||
|
@ -77,11 +77,11 @@ module Backend
|
|||
@[GraphQL::Field]
|
||||
# User's external ID
|
||||
def external_id : Int32?
|
||||
case Db::UserRole.parse(find!.role)
|
||||
case Db::UserRole.parse(@model.role)
|
||||
when .teacher?
|
||||
find!.teacher
|
||||
@model.teacher
|
||||
when .student?
|
||||
find!.student
|
||||
@model.student
|
||||
end.not_nil!.id.not_nil!.to_i
|
||||
rescue NilAssertionError
|
||||
nil
|
||||
|
@ -90,7 +90,7 @@ module Backend
|
|||
@[GraphQL::Field]
|
||||
# User's external teacher object
|
||||
def teacher : Teacher?
|
||||
teacher = find!.teacher
|
||||
teacher = @model.teacher
|
||||
if teacher
|
||||
Teacher.new(teacher)
|
||||
end
|
||||
|
@ -99,7 +99,7 @@ module Backend
|
|||
@[GraphQL::Field]
|
||||
# User's external student object
|
||||
def student : Student?
|
||||
student = find!.student
|
||||
student = @model.student
|
||||
if student
|
||||
Student.new(student)
|
||||
end
|
||||
|
|
|
@ -27,13 +27,13 @@ module Backend
|
|||
@[GraphQL::Field]
|
||||
# Student who voted
|
||||
def student : Student
|
||||
Student.new(find!.student)
|
||||
Student.new(@model.student)
|
||||
end
|
||||
|
||||
@[GraphQL::Field]
|
||||
# Teacher votes for student
|
||||
def teacher_votes : Array(TeacherVote)
|
||||
find!.teacher_votes.map { |tv| TeacherVote.new(tv) }
|
||||
@model.teacher_votes.map { |tv| TeacherVote.new(tv) }
|
||||
end
|
||||
end
|
||||
|
||||
|
|
Loading…
Reference in a new issue