From 6ac34fc63a0c7cf98e29fc4ec3053393ccc4d73a Mon Sep 17 00:00:00 2001 From: Dominic Grimm Date: Thu, 3 Mar 2022 19:22:54 +0100 Subject: [PATCH 1/2] Created model property for DB oriented API models for eliminiating a query for each field --- .../backend/src/backend/api/schema/helpers.cr | 36 ++++++------------- .../backend/src/backend/api/schema/student.cr | 6 ++-- .../backend/src/backend/api/schema/teacher.cr | 6 ++-- .../src/backend/api/schema/teacher_vote.cr | 4 +-- docker/backend/src/backend/api/schema/user.cr | 24 ++++++------- docker/backend/src/backend/api/schema/vote.cr | 4 +-- 6 files changed, 32 insertions(+), 48 deletions(-) diff --git a/docker/backend/src/backend/api/schema/helpers.cr b/docker/backend/src/backend/api/schema/helpers.cr index 137841b..6986548 100644 --- a/docker/backend/src/backend/api/schema/helpers.cr +++ b/docker/backend/src/backend/api/schema/helpers.cr @@ -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 diff --git a/docker/backend/src/backend/api/schema/student.cr b/docker/backend/src/backend/api/schema/student.cr index 586e519..4f803b3 100644 --- a/docker/backend/src/backend/api/schema/student.cr +++ b/docker/backend/src/backend/api/schema/student.cr @@ -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 diff --git a/docker/backend/src/backend/api/schema/teacher.cr b/docker/backend/src/backend/api/schema/teacher.cr index 992c7f8..47e27ca 100644 --- a/docker/backend/src/backend/api/schema/teacher.cr +++ b/docker/backend/src/backend/api/schema/teacher.cr @@ -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 diff --git a/docker/backend/src/backend/api/schema/teacher_vote.cr b/docker/backend/src/backend/api/schema/teacher_vote.cr index 4bc29c4..e053119 100644 --- a/docker/backend/src/backend/api/schema/teacher_vote.cr +++ b/docker/backend/src/backend/api/schema/teacher_vote.cr @@ -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 diff --git a/docker/backend/src/backend/api/schema/user.cr b/docker/backend/src/backend/api/schema/user.cr index 9561f17..38d1994 100644 --- a/docker/backend/src/backend/api/schema/user.cr +++ b/docker/backend/src/backend/api/schema/user.cr @@ -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 diff --git a/docker/backend/src/backend/api/schema/vote.cr b/docker/backend/src/backend/api/schema/vote.cr index cf24394..82978d8 100644 --- a/docker/backend/src/backend/api/schema/vote.cr +++ b/docker/backend/src/backend/api/schema/vote.cr @@ -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 From db9d8e6395a8d53abe54a87ef1306ea4d8b4ab16 Mon Sep 17 00:00:00 2001 From: Dominic Grimm Date: Thu, 3 Mar 2022 20:45:43 +0100 Subject: [PATCH 2/2] Simplifiy DB helper --- .../backend/src/backend/api/schema/helpers.cr | 29 ++++--------------- 1 file changed, 5 insertions(+), 24 deletions(-) diff --git a/docker/backend/src/backend/api/schema/helpers.cr b/docker/backend/src/backend/api/schema/helpers.cr index 6986548..9c4174c 100644 --- a/docker/backend/src/backend/api/schema/helpers.cr +++ b/docker/backend/src/backend/api/schema/helpers.cr @@ -32,36 +32,17 @@ 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 field helpers module DbObject # Defines DB model field helper functions macro db_object(type) - include ::Backend::Api::Schema::Helpers::ObjectDbInit - - db_init {{ type }} - 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(@model : {{ type }}) - @id = model.id.not_nil!.to_i + end + + def initialize(id : Int32) + @model = {{ type }}.find(id).not_nil! end {% space_name = type.names.last.underscore.gsub(/_/, " ").capitalize %} @@ -69,7 +50,7 @@ module Backend @[GraphQL::Field] # {{ space_name }}'s ID def id : Int32 - @id + @model.id.not_nil!.to_i32 end end end