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
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 # DB model field helpers
module DbObject module DbObject
# Defines DB model field helper functions # Defines DB model field helper functions
macro db_object(type) 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 %} {% 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] @[GraphQL::Field]
# {{ space_name }}'s ID # {{ space_name }}'s ID
def id : Int32 def id : Int32
@id @model.id.not_nil!.to_i32
end end
end end
end end

View file

@ -27,19 +27,19 @@ module Backend
@[GraphQL::Field] @[GraphQL::Field]
# Student's user # Student's user
def user : User def user : User
User.new(find!.user) User.new(@model.user)
end end
@[GraphQL::Field] @[GraphQL::Field]
# Student at SKIF # Student at SKIF
def skif : Bool def skif : Bool
find!.skif @model.skif
end end
@[GraphQL::Field] @[GraphQL::Field]
# Student's vote # Student's vote
def vote : Vote? def vote : Vote?
find!.vote.try { |v| Vote.new(v) } @model.vote.try { |v| Vote.new(v) }
end end
end end

View file

@ -27,19 +27,19 @@ module Backend
@[GraphQL::Field] @[GraphQL::Field]
# Teacher's user # Teacher's user
def user : User def user : User
User.new(find!.user) User.new(@model.user)
end end
@[GraphQL::Field] @[GraphQL::Field]
# Teacher's max students # Teacher's max students
def max_students : Int32 def max_students : Int32
find!.max_students @model.max_students
end end
@[GraphQL::Field] @[GraphQL::Field]
# Teacher is at SKIF # Teacher is at SKIF
def skif : Bool def skif : Bool
find!.skif @model.skif
end end
end end

View file

@ -27,13 +27,13 @@ module Backend
@[GraphQL::Field] @[GraphQL::Field]
# Voted teacher # Voted teacher
def teacher : Teacher def teacher : Teacher
Teacher.new(find!.teacher.not_nil!) Teacher.new(@model.teacher.not_nil!)
end end
@[GraphQL::Field] @[GraphQL::Field]
# Teacher vote's priority # Teacher vote's priority
def priority : Int32 def priority : Int32
find!.priority @model.priority
end end
end end

View file

@ -27,43 +27,43 @@ module Backend
@[GraphQL::Field] @[GraphQL::Field]
# User's first name # User's first name
def first_name : String def first_name : String
find!.first_name @model.first_name
end end
@[GraphQL::Field] @[GraphQL::Field]
# User's last name # User's last name
def last_name : String def last_name : String
find!.last_name @model.last_name
end end
@[GraphQL::Field] @[GraphQL::Field]
# User's full name # User's full name
def name : String def name : String
find!.name @model.name
end end
@[GraphQL::Field] @[GraphQL::Field]
# User's LDAP username # User's LDAP username
def username : String def username : String
find!.username @model.username
end end
@[GraphQL::Field] @[GraphQL::Field]
# User's email # User's email
def email : String def email : String
find!.email @model.email
end end
@[GraphQL::Field] @[GraphQL::Field]
# User is admin # User is admin
def admin : Bool def admin : Bool
find!.admin @model.admin
end end
@[GraphQL::Field] @[GraphQL::Field]
# User's role # User's role
def role : UserRole def role : UserRole
role = Db::UserRole.parse(find!.role) role = Db::UserRole.parse(@model.role)
case role case role
when .teacher? when .teacher?
UserRole::Teacher UserRole::Teacher
@ -77,11 +77,11 @@ module Backend
@[GraphQL::Field] @[GraphQL::Field]
# User's external ID # User's external ID
def external_id : Int32? def external_id : Int32?
case Db::UserRole.parse(find!.role) case Db::UserRole.parse(@model.role)
when .teacher? when .teacher?
find!.teacher @model.teacher
when .student? when .student?
find!.student @model.student
end.not_nil!.id.not_nil!.to_i end.not_nil!.id.not_nil!.to_i
rescue NilAssertionError rescue NilAssertionError
nil nil
@ -90,7 +90,7 @@ module Backend
@[GraphQL::Field] @[GraphQL::Field]
# User's external teacher object # User's external teacher object
def teacher : Teacher? def teacher : Teacher?
teacher = find!.teacher teacher = @model.teacher
if teacher if teacher
Teacher.new(teacher) Teacher.new(teacher)
end end
@ -99,7 +99,7 @@ module Backend
@[GraphQL::Field] @[GraphQL::Field]
# User's external student object # User's external student object
def student : Student? def student : Student?
student = find!.student student = @model.student
if student if student
Student.new(student) Student.new(student)
end end

View file

@ -27,13 +27,13 @@ module Backend
@[GraphQL::Field] @[GraphQL::Field]
# Student who voted # Student who voted
def student : Student def student : Student
Student.new(find!.student) Student.new(@model.student)
end end
@[GraphQL::Field] @[GraphQL::Field]
# Teacher votes for student # Teacher votes for student
def teacher_votes : Array(TeacherVote) def teacher_votes : Array(TeacherVote)
find!.teacher_votes.map { |tv| TeacherVote.new(tv) } @model.teacher_votes.map { |tv| TeacherVote.new(tv) }
end end
end end