package ru.mcs.diary.subject;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import ru.mcs.diary.common.exception.ResourceNotFoundException;
import ru.mcs.diary.subject.dto.SubjectCreateRequest;
import ru.mcs.diary.teacher.Teacher;
import ru.mcs.diary.teacher.TeacherRepository;
import java.util.List;
@Slf4j
@Service
@RequiredArgsConstructor
public class SubjectService {
private final SubjectRepository subjectRepository;
private final TeacherRepository teacherRepository;
@Transactional(readOnly = true)
public List<Subject> getAllSubjects(Long teacherId) {
return subjectRepository.findAllByTeacherIdOrderByNameAsc(teacherId);
}
@Transactional(readOnly = true)
public Subject getSubject(Long id, Long teacherId) {
return subjectRepository.findByIdAndTeacherId(id, teacherId)
.orElseThrow(() -> new ResourceNotFoundException("Предмет", id));
}
@Transactional
public Subject createSubject(SubjectCreateRequest request, Long teacherId) {
log.info("Creating subject: {}", request.getName());
Teacher teacher = teacherRepository.findById(teacherId)
.orElseThrow(() -> new ResourceNotFoundException("Преподаватель", teacherId));
if (subjectRepository.existsByNameAndTeacherId(request.getName().trim(), teacherId)) {
throw new IllegalArgumentException("Предмет с таким названием уже существует");
}
Subject subject = Subject.builder()
.name(request.getName().trim())
.description(request.getDescription())
.teacher(teacher)
.build();
return subjectRepository.save(subject);
}
@Transactional
public Subject updateSubject(Long id, SubjectCreateRequest request, Long teacherId) {
log.info("Updating subject: {}", id);
Subject subject = getSubject(id, teacherId);
String newName = request.getName().trim();
if (!subject.getName().equals(newName) &&
subjectRepository.existsByNameAndTeacherId(newName, teacherId)) {
throw new IllegalArgumentException("Предмет с таким названием уже существует");
}
subject.setName(newName);
subject.setDescription(request.getDescription());
return subjectRepository.save(subject);
}
@Transactional
public void deleteSubject(Long id, Long teacherId) {
log.info("Deleting subject: {}", id);
Subject subject = getSubject(id, teacherId);
subjectRepository.delete(subject);
}
}