89 lines
2.2 KiB
Crystal
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
|