Move LDAP user data in user API model
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing

This commit is contained in:
Dominic Grimm 2022-03-07 18:10:55 +01:00
parent d264d76b06
commit 37a60a89ed
No known key found for this signature in database
GPG key ID: 27C59510125F3C8A
11 changed files with 52 additions and 66 deletions

View file

@ -19,39 +19,33 @@ module Backend
module Schema
# Schema helper macros
module Helpers
# Object helpers
module ObjectMacros
# Defines field property and GraphQL specific getter
macro field(type)
property {{ type.var }} {% if type.value %} = {{ type.value }}{% end %}
# Defines field property and GraphQL specific getter
macro field(type)
property {{ type.var }} {% if type.value %} = {{ type.value }}{% end %}
@[GraphQL::Field]
def {{ type.var }} : {{ type.type }}
@{{ type.var }}
end
@[GraphQL::Field]
def {{ type.var }} : {{ type.type }}
@{{ type.var }}
end
end
# DB model field helpers
module DbObject
# Defines DB model field helper functions
macro db_object(type)
private property model
# Defines DB model field helper functions
macro db_object(type)
private property model
def initialize(@model : {{ type }})
end
def initialize(@model : {{ type }})
end
def initialize(id : Int32)
@model = {{ type }}.find!(id)
end
def initialize(id : Int32)
@model = {{ type }}.find!(id)
end
{% space_name = type.names.last.underscore.gsub(/_/, " ").capitalize %}
{% space_name = type.names.last.underscore.gsub(/_/, " ").capitalize %}
@[GraphQL::Field]
# {{ space_name }}'s ID
def id : Int32
@model.id.not_nil!.to_i
end
@[GraphQL::Field]
# {{ space_name }}'s ID
def id : Int32
@model.id.not_nil!.to_i
end
end
end

View file

@ -20,7 +20,7 @@ module Backend
@[GraphQL::Object]
# Student model
class Student < GraphQL::BaseObject
include Helpers::DbObject
include Helpers
db_object Db::Student

View file

@ -20,7 +20,7 @@ module Backend
@[GraphQL::Object]
# Teacher model
class Teacher < GraphQL::BaseObject
include Helpers::DbObject
include Helpers
db_object Db::Teacher

View file

@ -20,7 +20,7 @@ module Backend
@[GraphQL::Object]
# Teacher vote model
class TeacherVote < GraphQL::BaseObject
include Helpers::DbObject
include Helpers
db_object Db::TeacherVote

View file

@ -20,26 +20,34 @@ module Backend
@[GraphQL::Object]
# User model
class User < GraphQL::BaseObject
include Helpers::DbObject
include Helpers
db_object Db::User
# LDAP user data
getter ldap : Ldap::User?
# Refreshes LDAP user data
def refresh_ldap : Ldap::User
(@ldap ||= Ldap::User.from_json(Redis::CLIENT.get("ldap:user:#{id}").as(String))).not_nil!
end
@[GraphQL::Field]
# User's first name
def first_name : String
@model.first_name
refresh_ldap.first_name
end
@[GraphQL::Field]
# User's last name
def last_name : String
@model.last_name
refresh_ldap.last_name
end
@[GraphQL::Field]
# User's full name
def name : String
@model.name
refresh_ldap.name
end
@[GraphQL::Field]
@ -51,7 +59,7 @@ module Backend
@[GraphQL::Field]
# User's email
def email : String
@model.email
refresh_ldap.email
end
@[GraphQL::Field]

View file

@ -20,7 +20,7 @@ module Backend
@[GraphQL::Object]
# Vote model
class Vote < GraphQL::BaseObject
include Helpers::DbObject
include Helpers
db_object Db::Vote

View file

@ -20,9 +20,6 @@ module Backend
class User < Granite::Base
table users
# LDAP user data
getter ldap : Ldap::User?
has_one :teacher
has_one :student
@ -38,31 +35,6 @@ module Backend
# User is admin
column admin : Bool = false
# User's first name
def first_name : String
refresh_ldap.first_name
end
# User's last name
def last_name : String
refresh_ldap.last_name
end
# User's full name
def name : String
"#{first_name} #{last_name}"
end
# User's email
def email : String
refresh_ldap.email
end
# Refreshes LDAP user data
def refresh_ldap : Ldap::User
(@ldap ||= Ldap::User.from_json(Redis::CLIENT.get("ldap:user:#{@id}").as(String))).not_nil!
end
validate :role, "needs to be a valid role" do |user|
UserRole.parse(user.role).in?(UserRole.values)
end

View file

@ -39,6 +39,11 @@ module Backend
def initialize(@first_name : String, @last_name : String, @email : String)
end
# Name
def name : String
"#{first_name} #{last_name}"
end
# Creates user data from LDAP entry
def self.from_raw(raw : Raw) : self
self.new(

View file

@ -22,7 +22,7 @@ module Backend
address email: Backend.config.smtp.username, name: Backend.config.smtp.name
end
def initialize(user : Db::User)
def initialize(user : Ldap::User)
to name: user.name, email: user.email
subject "Mentorenwahl Lehrer Registrierung"
text Kilt.render("#{__DIR__}/templates/teacher_registration_mailer.txt.ecr")

View file

@ -27,7 +27,13 @@ module Backend
.map(&.as(String).split(":")[2].to_i64)
.concat(Db::User.all.map(&.id.not_nil!))
.uniq!
.each { |id| CacheLdapUserJob.new(id).enqueue }
.each do |id|
spawn do
CacheLdapUserJob.new(id).enqueue
end
end
Fiber.yield
end
end
end

View file

@ -32,8 +32,9 @@ module Backend
fail
end
log "Sending teacher registration email to #{user.email} (#{user.id})"
Mailers::TeacherRegistrationMailer.new(user).deliver
ldap_user = Ldap.user(Ldap::Constructor.uid(user.username))
log "Sending teacher registration email to #{ldap_user.email} (#{user.id})"
Mailers::TeacherRegistrationMailer.new(ldap_user).deliver
channel.send(nil)
end