mentorenwahl/docker/backend/src/mw/context.cr
2022-01-08 13:29:22 +01:00

89 lines
2.2 KiB
Crystal

require "http/request"
require "graphql"
require "granite"
module MW
class Context < GraphQL::Context
getter user : Db::User?
getter role : Schema::UserRole?
getter external : (Db::Admin | Db::Teacher | Db::Student)?
# ameba:disable Metrics/CyclomaticComplexity
def initialize(request : HTTP::Request, *rest)
super(*rest)
token = request.headers["Authorization"]?
if token && token[..Auth::BEARER.size - 1] == Auth::BEARER
payload = Auth.decode_jwt?(token[Auth::BEARER.size..])
return unless payload
data = payload["data"].as_h
@user = Db::User.find(data["user_id"].as_i)
return if @user.nil? || @user.not_nil!.blocked
if @user
tmp_role = Schema::UserRole.parse?(@user.as(Db::User).role).not_nil!
if tmp_role
@external =
case Schema::UserRole.parse?(@user.not_nil!.role)
when Schema::UserRole::Admin
@user.not_nil!.admin
when Schema::UserRole::Teacher
@user.not_nil!.teacher
when Schema::UserRole::Student
@user.not_nil!.student
end
@role = tmp_role if @external
end
end
end
end
def authenticated? : Bool
!(@role.nil? && @external.nil?)
end
def authenticated! : Bool
raise "Not authenticated" unless authenticated?
true
end
def role?(role : Schema::UserRole) : Bool
@role == role == case @external
when Db::Admin
Schema::UserRole::Admin
when Db::Teacher
Schema::UserRole::Teacher
when Db::Student
Schema::UserRole::Student
end
end
def role!(role : Schema::UserRole) : Bool
raise "Invalid permissions" unless role? role
true
end
def admin? : Bool
role? Schema::UserRole::Admin
end
def admin! : Bool
role! Schema::UserRole::Admin
end
def self.db_eq_role?(external : Granite::Base, role : Schema::UserRole) : Bool
role == case external
when Db::Admin
Schema::UserRole::Admin
when Db::Teacher
Schema::UserRole::Teacher
when Db::Student
Schema::UserRole::Student
end
end
end
end