Fix API performance #73

Merged
dergrimm merged 2 commits from fix-api-performance into main 2022-03-03 19:46:35 +00:00
6 changed files with 32 additions and 67 deletions

View file

@ -32,60 +32,25 @@ module Backend
end
end
# DB model leverage helpers
module ObjectDbInit
# Defines a DB model specific initializer
macro db_init(type)
def initialize(obj : {{ type }})
initialize(obj.id.not_nil!)
end
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)
private property model
def initialize(@model : {{ type }})
end
def initialize(id : Int32)
@model = {{ type }}.find(id).not_nil!
end
{% 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
def initialize(@id : Int32)
end
def initialize(obj : {{ type }})
@id = obj.id.not_nil!.to_i
end
@[GraphQL::Field]
# {{ space_name }}'s ID
def id : Int32
@id
@model.id.not_nil!.to_i32
end
end
end

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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