package com.project.beautycenter.service.impl; import com.project.beautycenter.model.*; import com.project.beautycenter.model.exceptions.InvalidAppointmentIdException; import com.project.beautycenter.repository.*; import com.project.beautycenter.service.RezervacijaService; import org.springframework.stereotype.Service; import javax.transaction.Transactional; import java.util.List; @Service public class RezervacijaServiceImpl implements RezervacijaService { private final RezervacijaRepository rezervacijaRepository; private final TerminiRepository terminiRepository; private final KlientiRepository klientiRepository; private final RezervacijaUslugiRepository repository; private final UslugiRepository uslugiRepository; public RezervacijaServiceImpl(RezervacijaRepository rezervacijaRepository, TerminiRepository terminiRepository, KlientiRepository klientiRepository, RezervacijaUslugiRepository repository, UslugiRepository uslugiRepository) { this.rezervacijaRepository = rezervacijaRepository; this.terminiRepository = terminiRepository; this.klientiRepository = klientiRepository; this.repository = repository; this.uslugiRepository = uslugiRepository; } @Override public List listAll() { return this.rezervacijaRepository.findAll(); } @Override public Rezervacija findbyId(Integer id) { return this.rezervacijaRepository.findById(id).orElseThrow(InvalidAppointmentIdException::new); } @Override public Rezervacija create(Klienti klient, Termini termin, Uplata uplata) { Rezervacija rezervacija = new Rezervacija(klient, termin, uplata); return this.rezervacijaRepository.save(rezervacija); } @Override public Rezervacija create(Integer klientId, Integer terminId, List uslugi) { Klienti klient = this.klientiRepository.getById(klientId); Termini termin = this.terminiRepository.getById(terminId); Rezervacija rezervacija = new Rezervacija(); rezervacija.setKlienti(klient); rezervacija.setTermini(termin); this.rezervacijaRepository.save(rezervacija); for (int i = 0; i < uslugi.size(); i++) { RezervacijaUslugiId rUid = new RezervacijaUslugiId(rezervacija.getId(), uslugi.get(i).getId()); RezervacijaUslugi rezU = new RezervacijaUslugi(rUid, rezervacija, uslugi.get(i)); this.repository.save(rezU); } return rezervacija; } @Override @Transactional public Rezervacija update(Integer id, List uslugiIds, Integer klientId, Integer terminId) { Rezervacija rezervacija = this.findbyId(id); Klienti klient = this.klientiRepository.getById(klientId); Termini termin = this.terminiRepository.getById(terminId); rezervacija.setKlienti(klient); rezervacija.setTermini(termin); this.repository.deleteAllByBrRez(rezervacija); rezervacija = this.rezervacijaRepository.save(rezervacija); this.addUslugiForRezervacija(rezervacija, uslugiIds); return rezervacija; } @Override @Transactional public Rezervacija delete(Integer id) { Rezervacija rezervacija = this.findbyId(id); this.repository.deleteAllByBrRez(rezervacija); this.rezervacijaRepository.delete(rezervacija); return rezervacija; } @Transactional protected void addUslugiForRezervacija(Rezervacija rezervacija, List uslugiIds) { if (uslugiIds != null) { uslugiIds.stream() .map(this::findUslugaById) .forEach(usluga -> this.repository .save(new RezervacijaUslugi((new RezervacijaUslugiId(rezervacija.getId(), usluga.getId())) , rezervacija, usluga))); } } private Uslugi findUslugaById(String id) { return this.uslugiRepository.getById(id); } }