163 lines
4.5 KiB
Crystal
163 lines
4.5 KiB
Crystal
require "graphql"
|
|
|
|
module API
|
|
module Schema
|
|
@[GraphQL::Object]
|
|
class Mutation < GraphQL::BaseMutation
|
|
@[GraphQL::Field]
|
|
def login(input : LoginInput) : LoginPayload
|
|
user = Db::User.find_by(email: input.email)
|
|
raise "Auth failed" unless user && Auth.verify_password?(input.password, user.password)
|
|
|
|
LoginPayload.new(
|
|
user: User.new(user),
|
|
token: Auth.create_user_jwt(user.id.not_nil!.to_i),
|
|
)
|
|
end
|
|
|
|
@[GraphQL::Field]
|
|
def update_password(context : Context, password : String) : LoginPayload
|
|
context.authenticated!
|
|
|
|
if Auth.verify_password?(password, context.user.not_nil!.password)
|
|
raise "New password must be different from old password"
|
|
end
|
|
|
|
context.user.not_nil!.update!(password: Auth.hash_password(password))
|
|
|
|
LoginPayload.new(
|
|
user: User.new(context.user.not_nil!),
|
|
token: Auth.create_user_jwt(context.user.not_nil!.id.not_nil!.to_i),
|
|
)
|
|
end
|
|
|
|
@[GraphQL::Field]
|
|
def create_user(context : Context, input : UserCreateInput) : User
|
|
context.admin!
|
|
|
|
user = Db::User.create!(
|
|
firstname: input.firstname,
|
|
lastname: input.lastname,
|
|
email: input.email,
|
|
password: Auth.hash_password(input.password),
|
|
role: input.role.to_s,
|
|
blocked: input.blocked,
|
|
)
|
|
if input.create_external && input.role
|
|
case input.role
|
|
when UserRole::Teacher
|
|
user.teacher = Db::Teacher.create!(user_id: user.id, max_students: input.teacher.not_nil!.max_students)
|
|
when UserRole::Student
|
|
user.student = Db::Student.create!(user_id: user.id, skif: input.student.not_nil!.skif)
|
|
end
|
|
user.save!
|
|
end
|
|
|
|
User.new(user)
|
|
end
|
|
|
|
@[GraphQL::Field]
|
|
def delete_user(context : Context, id : Int32) : Int32
|
|
context.admin!
|
|
|
|
user = Db::User.find!(id)
|
|
user.destroy!
|
|
|
|
id
|
|
end
|
|
|
|
@[GraphQL::Field]
|
|
def create_admin(context : Context, input : AdminCreateInput) : Admin
|
|
context.admin!
|
|
|
|
admin = Db::Admin.create!(user_id: input.user_id)
|
|
Admin.new(admin)
|
|
end
|
|
|
|
@[GraphQL::Field]
|
|
def delete_admin(context : Context, id : Int32) : Int32
|
|
context.admin!
|
|
|
|
admin = Db::Admin.find!(id)
|
|
admin.destroy!
|
|
|
|
id
|
|
end
|
|
|
|
@[GraphQL::Field]
|
|
def create_teacher(context : Context, input : TeacherCreateInput) : Teacher
|
|
context.admin!
|
|
|
|
teacher = Db::Teacher.create!(user_id: input.user_id, max_students: input.max_students)
|
|
Teacher.new(teacher)
|
|
end
|
|
|
|
@[GraphQL::Field]
|
|
def delete_teacher(context : Context, id : Int32) : Int32
|
|
context.admin!
|
|
|
|
teacher = Db::Teacher.find!(id)
|
|
teacher.destroy!
|
|
|
|
id
|
|
end
|
|
|
|
@[GraphQL::Field]
|
|
def register_teacher(context : Context, input : TeacherInput) : Teacher
|
|
context.teacher? external: false
|
|
|
|
Teacher.new(
|
|
Db::Teacher.create!(user_id: context.user.not_nil!.id, max_students: input.max_students, skif: input.skif)
|
|
)
|
|
end
|
|
|
|
@[GraphQL::Field]
|
|
def create_student(context : Context, input : StudentCreateInput) : Student
|
|
context.admin!
|
|
|
|
user = Db::User.find!(input.user_id)
|
|
raise "User not a student" unless UserRole.parse(user.role) == UserRole::Student
|
|
|
|
student = Db::Student.create!(user_id: user.id)
|
|
Student.new(student)
|
|
end
|
|
|
|
@[GraphQL::Field]
|
|
def delete_student(context : Context, id : Int32) : Int32
|
|
context.admin!
|
|
|
|
student = Db::Student.find!(id)
|
|
student.destroy!
|
|
|
|
id
|
|
end
|
|
|
|
@[GraphQL::Field]
|
|
def create_vote(context : Context, input : VoteCreateInput) : Vote
|
|
context.student!
|
|
|
|
skif = context.external.as(Db::Student).skif
|
|
input.teacher_ids.each do |id|
|
|
teacher = Db::Teacher.find(id)
|
|
|
|
if teacher.nil?
|
|
raise "Teachers not found"
|
|
elsif teacher.skif != skif
|
|
if teacher.skif
|
|
raise "Teacher is SKIF, student is not"
|
|
else
|
|
raise "Teacher is not SKIF, student is"
|
|
end
|
|
end
|
|
end
|
|
|
|
student = context.external.not_nil!.as(Db::Student)
|
|
vote = Db::Vote.create!(student_id: student.id)
|
|
Db::TeacherVote.import(input.teacher_ids.map_with_index { |id, i| Db::TeacherVote.new(vote_id: vote.id, teacher_id: id.to_i64, priority: i) })
|
|
|
|
Vote.new(vote)
|
|
end
|
|
end
|
|
end
|
|
end
|