Newer
Older
teacher-diary / src / main / java / ru / mcs / diary / subject / SubjectService.java
@malexple malexple 19 days ago 2 KB add groups
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);
    }
}