mentorenwahl/docker/backend/src/backend/api/schema/mutation.cr
Dominic Grimm 0da7f11239
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
Added login page
2022-02-02 15:38:36 +01:00

167 lines
4.7 KiB
Crystal

require "CrystalEmail"
module Backend
module API
module Schema
@[GraphQL::Object]
class Mutation < GraphQL::BaseMutation
@[GraphQL::Field]
def login(email : String, password : String) : LoginPayload
raise "Auth failed" if email.empty? || password.empty? || !CrystalEmail::Rfc5322::Public.validates?(email)
user = Db::User.find_by(email: email)
raise "Auth failed" unless user && Auth.verify_password?(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,
)
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 send_teachers_registration_email(context : Context) : Bool
context.admin!
Worker::Jobs::SendTeachersRegistrationEmailJob.new.enqueue
true
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 Db::UserRole.parse(user.role).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
end