159 lines
3.7 KiB
Crystal
159 lines
3.7 KiB
Crystal
# Mentorenwahl: A fullstack application for assigning mentors to students based on their whishes.
|
|
# Copyright (C) 2022 Dominic Grimm
|
|
|
|
# This program is free software: you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation, either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
module Backend
|
|
module Api
|
|
module Schema
|
|
@[GraphQL::Object]
|
|
# User model
|
|
class User < GraphQL::BaseObject
|
|
include Helpers::DbObject
|
|
|
|
db_object Db::User
|
|
|
|
@[GraphQL::Field]
|
|
# User's first name
|
|
def firstname : String
|
|
find!.firstname
|
|
end
|
|
|
|
@[GraphQL::Field]
|
|
# User's last name
|
|
def lastname : String
|
|
find!.lastname
|
|
end
|
|
|
|
@[GraphQL::Field]
|
|
# User's full name
|
|
def name : String
|
|
find!.name
|
|
end
|
|
|
|
@[GraphQL::Field]
|
|
# User's LDAP username
|
|
def username : String
|
|
find!.username
|
|
end
|
|
|
|
@[GraphQL::Field]
|
|
# User's email
|
|
def email : String
|
|
find!.email
|
|
end
|
|
|
|
@[GraphQL::Field]
|
|
# User is admin
|
|
def admin : Bool
|
|
find!.admin
|
|
end
|
|
|
|
@[GraphQL::Field]
|
|
# User's role
|
|
def role : UserRole
|
|
role = Db::UserRole.parse(find!.role)
|
|
case role
|
|
when .teacher?
|
|
UserRole::Teacher
|
|
when .student?
|
|
UserRole::Student
|
|
else
|
|
raise "Unknown role: #{role}"
|
|
end
|
|
end
|
|
|
|
@[GraphQL::Field]
|
|
# User's external ID
|
|
def external_id : Int32?
|
|
case Db::UserRole.parse(find!.role)
|
|
when .teacher?
|
|
find!.teacher
|
|
when .student?
|
|
find!.student
|
|
end.not_nil!.id.not_nil!.to_i
|
|
rescue NilAssertionError
|
|
nil
|
|
end
|
|
|
|
@[GraphQL::Field]
|
|
# User's external teacher object
|
|
def teacher : Teacher?
|
|
teacher = find!.teacher
|
|
if teacher
|
|
Teacher.new(teacher)
|
|
end
|
|
end
|
|
|
|
@[GraphQL::Field]
|
|
# User's external student object
|
|
def student : Student?
|
|
student = find!.student
|
|
if student
|
|
Student.new(student)
|
|
end
|
|
end
|
|
end
|
|
|
|
@[GraphQL::InputObject]
|
|
# User creation input
|
|
class UserCreateInput < GraphQL::BaseInputObject
|
|
getter username
|
|
getter role
|
|
|
|
@[GraphQL::Field]
|
|
def initialize(
|
|
@username : String,
|
|
@role : UserRole
|
|
)
|
|
end
|
|
end
|
|
|
|
@[GraphQL::Object]
|
|
# Login payload returned after successful login
|
|
class LoginPayload < GraphQL::BaseObject
|
|
# Logged in user
|
|
property user
|
|
|
|
# JWT token
|
|
property token
|
|
|
|
def initialize(
|
|
@user : User,
|
|
@token : String
|
|
)
|
|
end
|
|
|
|
@[GraphQL::Field]
|
|
# Logged in user
|
|
def user : User
|
|
@user
|
|
end
|
|
|
|
@[GraphQL::Field]
|
|
# Raw bearer token
|
|
def token : String
|
|
@token
|
|
end
|
|
|
|
@[GraphQL::Field]
|
|
# Ready to use bearer token
|
|
def bearer : String
|
|
Auth::BEARER + @token
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|