Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,15 @@
import br.edu.ifsp.spo.eventos.eventplatformbackend.account.deletion.AccountDeletionException;
import br.edu.ifsp.spo.eventos.eventplatformbackend.account.deletion.AccountDeletionExceptionType;
import br.edu.ifsp.spo.eventos.eventplatformbackend.account.dto.*;
import br.edu.ifsp.spo.eventos.eventplatformbackend.account.signup.VerificationTokenRepository;
import br.edu.ifsp.spo.eventos.eventplatformbackend.common.email.EmailService;
import br.edu.ifsp.spo.eventos.eventplatformbackend.common.exceptions.*;
import br.edu.ifsp.spo.eventos.eventplatformbackend.common.recaptcha.RecaptchaService;
import br.edu.ifsp.spo.eventos.eventplatformbackend.common.security.JwtService;
import br.edu.ifsp.spo.eventos.eventplatformbackend.common.security.JwtUserDetails;
import br.edu.ifsp.spo.eventos.eventplatformbackend.organizer.OrganizerRepository;
import br.edu.ifsp.spo.eventos.eventplatformbackend.organizer_subevent.OrganizerSubeventRepository;
import br.edu.ifsp.spo.eventos.eventplatformbackend.registration.RegistrationRepository;
import com.auth0.jwt.interfaces.DecodedJWT;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
Expand All @@ -35,6 +39,9 @@
@Slf4j
public class AccountService {
private final AccountRepository accountRepository;
private final RegistrationRepository registrationRepository;
private final OrganizerRepository organizerRepository;
private final OrganizerSubeventRepository organizerSubeventRepository;
private final JwtService jwtService;
private final PasswordEncoder passwordEncoder;
private final RecaptchaService recaptchaService;
Expand All @@ -52,6 +59,19 @@ public Account findById(UUID account) {

public void delete(UUID accountId) {
Account account = getAccount(accountId);

if(registrationRepository.existsByAccountId(accountId)) {
throw new BusinessRuleException(BusinessRuleType.ACCOUNT_DELETE_WITH_REGISTRATIONS);
}

if(organizerRepository.existsByAccountId(accountId)) {
throw new BusinessRuleException(BusinessRuleType.ACCOUNT_DELETE_WITH_ORGANIZERS);
}

if(organizerSubeventRepository.existsByAccountId(accountId)) {
throw new BusinessRuleException(BusinessRuleType.ACCOUNT_DELETE_WITH_ORGANIZERS_SUBEVENT);
}

accountRepository.deleteById(accountId);
log.info("Delete account id={}, name={}, email={}", account.getId(), account.getName(), account.getEmail());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ public interface ActivityRepository extends JpaRepository<Activity, UUID> {
boolean existsBySlugAndSubeventId(String slug, UUID subeventId);
boolean existsBySlugAndEventIdAndIdNot(String Slug, UUID eventId, UUID activityId);
boolean existsBySlugAndSubeventIdAndIdNot(String Slug, UUID subeventId, UUID activityId);
boolean existsBySubeventId(UUID subeventId);
boolean existsByEventId(UUID eventId);

@Query("SELECT new br.edu.ifsp.spo.eventos.eventplatformbackend.site.dtos.ActivitySiteDto(act.event.id, act.subevent.id, act.id, act.title, act.slug, act.type, act.modality, act.description, spe.name, ses.id, ses.title, sch.id, sch.executionStart, sch.executionEnd) \n" +
"FROM Activity act\n" +
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import br.edu.ifsp.spo.eventos.eventplatformbackend.event.Event;
import br.edu.ifsp.spo.eventos.eventplatformbackend.event.EventRepository;
import br.edu.ifsp.spo.eventos.eventplatformbackend.event.EventStatus;
import br.edu.ifsp.spo.eventos.eventplatformbackend.session.SessionRepository;
import br.edu.ifsp.spo.eventos.eventplatformbackend.session.SessionService;
import br.edu.ifsp.spo.eventos.eventplatformbackend.site.dtos.ActivitySiteDto;
import br.edu.ifsp.spo.eventos.eventplatformbackend.speaker.Speaker;
Expand All @@ -33,6 +34,7 @@ public class ActivityService {
private final SubeventRepository subeventRepository;
private final ActivitySpeakerRepository activitySpeakerRepository;
private final SpeakerRepository speakerRepository;
private final SessionRepository sessionRepository;
private final SessionService sessionService;
private final AuditService auditService;

Expand Down Expand Up @@ -520,6 +522,14 @@ public void delete(UUID eventId, UUID activityId) {
}
}

if(sessionRepository.existsByActivityId(activityId)) {
throw new BusinessRuleException(BusinessRuleType.ACTIVITY_DELETE_WITH_SESSIONS);
}

if(activitySpeakerRepository.existsByActivityId(activityId)) {
throw new BusinessRuleException(BusinessRuleType.ACTIVITY_DELETE_WITH_SPEAKERS);
}

activityRepository.delete(activity);
log.info("Activity deleted: id={}, title={}", activityId, activity.getTitle());
auditService.logAdminDelete(ResourceName.ACTIVITY, activityId);
Expand Down Expand Up @@ -556,6 +566,14 @@ public void delete(UUID eventId, UUID subeventId, UUID activityId) {
}
}

if(sessionRepository.existsByActivityId(activityId)) {
throw new BusinessRuleException(BusinessRuleType.ACTIVITY_DELETE_WITH_SESSIONS);
}

if(activitySpeakerRepository.existsByActivityId(activityId)) {
throw new BusinessRuleException(BusinessRuleType.ACTIVITY_DELETE_WITH_SPEAKERS);
}

activityRepository.delete(activity);
log.info("Activity deleted: id={}, title={}", activityId, activity.getTitle());
auditService.logAdmin(Action.DELETE, ResourceName.ACTIVITY, activityId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,6 @@
public interface ActivitySpeakerRepository extends JpaRepository<ActivitySpeaker, UUID> {
List<ActivitySpeaker> findAllByActivityId(UUID activityId);
boolean existsBySpeakerIdAndActivityId(UUID speakerId, UUID activityId);
boolean existsByActivityId(UUID activityId);
boolean existsBySpeakerId(UUID speakerId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import br.edu.ifsp.spo.eventos.eventplatformbackend.common.exceptions.*;
import br.edu.ifsp.spo.eventos.eventplatformbackend.location.Location;
import br.edu.ifsp.spo.eventos.eventplatformbackend.location.LocationRepository;
import br.edu.ifsp.spo.eventos.eventplatformbackend.session.SessionScheduleRepository;
import br.edu.ifsp.spo.eventos.eventplatformbackend.space.SpaceRepository;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
Expand All @@ -20,6 +21,7 @@ public class AreaService {
private final AreaRepository areaRepository;
private final LocationRepository locationRepository;
private final SpaceRepository spaceRepository;
private final SessionScheduleRepository sessionScheduleRepository;
private final AuditService auditService;

public Area create(UUID locationId, AreaCreateDto dto) {
Expand Down Expand Up @@ -71,6 +73,8 @@ public void delete(UUID locationId, UUID areaId) {
Area area = getArea(areaId);
checkAreaExistsByLocationId(area, locationId);
checkSpaceExistsByAreaId(areaId);
checkIfAreaHasAssociationWithSessionSchedule(areaId);

areaRepository.deleteById(areaId);
log.info("Delete area id={}, name={}", areaId, area.getName());
auditService.logAdminDelete(ResourceName.AREA, areaId);
Expand Down Expand Up @@ -103,4 +107,10 @@ private void checkAreaExistsByLocationId(Area area, UUID locationId) {
throw new ResourceNotExistsAssociationException(ResourceName.AREA, ResourceName.LOCATION);
}
}

private void checkIfAreaHasAssociationWithSessionSchedule(UUID areaId) {
if(sessionScheduleRepository.existsByAreaId(areaId)) {
throw new ResourceReferentialIntegrityException(ResourceName.AREA, ResourceName.SESSION_SCHEDULE);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ public enum BusinessRuleType {
EVENT_DELETE_WITH_CANCELED_STATUS("Não é possível excluir um evento cancelado"),
EVENT_DELETE_WITH_PUBLISHED_STATUS_AFTER_REGISTRATION_PERIOD_START("Não é possível excluir um evento publicado que o seu período de inscrições já tenha iniciado"),
EVENT_DELETE_WITH_SUBEVENTS("Não é possível excluir um evento com subeventos associados"),
EVENT_DELETE_WITH_ACTIVITIES("Não é possível excluir um evento com atividades associadas"),
EVENT_DELETE_WITH_ORGANIZERS("Não é possível excluir um evento com organizadores associados"),
EVENT_UPDATE_WITH_CANCELED_STATUS("Não é possivel editar um evento cancelado"),
EVENT_UPDATE_WITH_PUBLISHED_STATUS_AFTER_EXECUTION_PERIOD("Não é possível editar um evento publicado que tenha sido finalizado"),
EVENT_UPDATE_WITH_PUBLISHED_STATUS_AND_MODIFIED_SLUG_AFTER_RERISTRATION_PERIOD_START("Não é possível editar O slug de um evento publicado que o seu período de inscrições já tenha iniciado"),
Expand All @@ -33,6 +35,8 @@ public enum BusinessRuleType {
SUBEVENT_BEFORE_EVENT("Data de início do subevento é anterior à data de início do evento"),
SUBEVENT_AFTER_EVENT("A data de fim do subevento é posterior à data de fim do evento"),
SUBEVENT_IS_NOT_ASSOCIATED_EVENT("Subevento não está associado ao evento"),
SUBEVENT_DELETE_WITH_ACTIVITIES("Não é possível excluir um subevento com atividades associadas"),
SUBEVENT_DELETE_WITH_ORGANIZERS("Não é possível excluir um subevento com organizadores associados"),
SUBEVENT_DELETE_WITH_PUBLISHED_STATUS_AFTER_REGISTRATION_PERIOD_START("Não é possível deletar um subevento publicado que o seu período de inscrições já tenha iniciado"),
SUBEVENT_DELETE_WITH_STATUS_CANCELED("Não é possível deletar um subevento cancelado"),
SUBEVENT_UPDATE_WITH_CANCELED_STATUS("Não é possível editar um subevento cancelado"),
Expand Down Expand Up @@ -71,6 +75,8 @@ public enum BusinessRuleType {
ACTIVITY_UPDATE_WITH_EVENT_REGISTRATION_PERIOD_BEFORE_TODAY("Não é possível atualizar uma atividade em que o período de inscrição do evento é antes de hoje"),
ACTIVITY_UPDATE_WITH_SUBEVENT_EXECUTION_PERIOD_BEFORE_TODAY("Não é possível atualizar uma atividade em que o período de execução do subevento é antes de hoje"),
ACTIVITY_UPDATE_WITH_EVENT_PUBLISHED_STATUS_AND_MODIFIED_SLUG_AFTER_RERISTRATION_PERIOD_START("Não é possível editar o slug de uma atividade em um evento publicado em que o seu período de inscrições já tenha iniciado"),
ACTIVITY_DELETE_WITH_SESSIONS("Não é possível excluir uma atividade com sessões associadas"),
ACTIVITY_DELETE_WITH_SPEAKERS("Não é possível excluir uma atividade com ministrantes associados"),
ACTIVITY_DELETE_WITH_PUBLISHED_STATUS_AFTER_SUBEVENT_EXECUTION_PERIOD("Não é possível excluir uma atividade com status publicado após o período de execução do subevento"),
ACTIVITY_DELETE_WITH_STATUS_CANCELED("Não é possível excluir uma atividade com status cancelado"),
ACTIVITY_DELETE_WITH_EVENT_CANCELED_STATUS("Não é possível excluir uma atividade com um evento cancelado"),
Expand Down Expand Up @@ -101,7 +107,9 @@ public enum BusinessRuleType {
SPEAKER_ADD_WITH_SUBEVENT_CANCELED_STATUS("Não é possível adicionar um ministrante em um subevento cancelado"),
SPEAKER_ADD_WITH_ACTIVITY_CANCELED_STATUS("Não é possível adicionar um ministrante em uma atividade cancelada"),
SPEAKER_ADD_ALREADY_EXISTS("O ministrante já está associado a atividade"),
SPEAKER_DELETE_WITH_ACTIVITY("Não é possível excluir um ministrante que está associado a uma atividade"),
SESSION_IS_NOT_ASSOCIATED_TO_ACTIVITY("Sessão não está associada a atividade"),
SESSION_DELETE_WITH_REGISTRATIONS("Não é possível excluir uma sessão com inscrições associadas"),
SESSION_DELETE_WITH_STATUS_CANCELED("Não é possível excluir uma sessão com status cancelado"),
SESSION_DELETE_WITH_ACTIVITY_STATUS_CANCELED("Não é possível excluir uma sessão com uma atividade cancelada"),
SESSION_DELETE_WITH_ACTIVITY_PUBLISHED_STATUS_AND_AFTER_REGISTRATION_PERIOD_START("Não é possível deletar uma sessão em uma atividade publicada e que o período de inscrições já tenha iniciado"),
Expand Down Expand Up @@ -130,8 +138,11 @@ public enum BusinessRuleType {
REGISTRATION_CREATE_ACCOUNT_ALREADY_HAS_REGISTRATION_IN_ACTIVITY("Não é possível se inscrever em mais de uma sessão da mesma atividade"),
REGISTRATION_ACCEPT_WITH_EXPIRED_HOURS("Não é mais possível aceitar a vaga, pois já passou do prazo especificado no e-mail"),
REGISTRATION_DENY_WITH_EXPIRED_HOURS("Não é mais possível recusar a vaga, pois já passou do prazo especificado no e-mail"),
REGISTRATION_ALREADY_WAS_ANSWERED("Não é possível aceitar ou negar mais de uma vez uma vaga liberada");

REGISTRATION_ALREADY_WAS_ANSWERED("Não é possível aceitar ou negar mais de uma vez uma vaga liberada"),
ACCOUNT_DELETE_WITH_REGISTRATIONS("Não é possível excluir uma conta que está associada a uma inscrição"),
ACCOUNT_DELETE_WITH_ORGANIZERS("Não é possível excluir uma conta que está associada a um organizador"),
ACCOUNT_DELETE_WITH_ORGANIZERS_SUBEVENT("Não é possível excluir uma conta que está associada a um organizador de subevento"),
ACCOUNT_DELETE_WITH_VERIFICATION_TOKENS("Não é possível excluir uma conta que está associada a um token de verificação");
String message;

BusinessRuleType(String message) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ public enum ResourceName {
ACTIVITY("Activity"),
DELETION_TOKEN("Deletion token"),
SESSION("Session"),
SESSION_SCHEDULE("Session schedule"),
PASSWORD_RESET_TOKEN("Password reset token"),
ACTIVITY_SPEAKER("Activity Speaker"),
REFRESH_TOKEN("Refresh token"),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@

import br.edu.ifsp.spo.eventos.eventplatformbackend.account.audit.Action;
import br.edu.ifsp.spo.eventos.eventplatformbackend.account.audit.AuditService;
import br.edu.ifsp.spo.eventos.eventplatformbackend.activity.ActivityRepository;
import br.edu.ifsp.spo.eventos.eventplatformbackend.activity.ActivityService;
import br.edu.ifsp.spo.eventos.eventplatformbackend.common.dto.CancellationMessageCreateDto;
import br.edu.ifsp.spo.eventos.eventplatformbackend.common.exceptions.*;
import br.edu.ifsp.spo.eventos.eventplatformbackend.organizer.OrganizerRepository;
import br.edu.ifsp.spo.eventos.eventplatformbackend.subevent.SubeventRepository;
import br.edu.ifsp.spo.eventos.eventplatformbackend.subevent.SubeventService;
import lombok.AllArgsConstructor;
Expand All @@ -22,6 +24,8 @@ public class EventService {
private final EventRepository eventRepository;
private final SubeventRepository subeventRepository;
private final SubeventService subeventService;
private final ActivityRepository activityRepository;
private final OrganizerRepository organizerRepository;
private final ActivityService activityService;
private final AuditService auditService;

Expand Down Expand Up @@ -96,6 +100,14 @@ public void delete(UUID eventId) {
throw new BusinessRuleException(BusinessRuleType.EVENT_DELETE_WITH_SUBEVENTS);
}

if(activityRepository.existsByEventId(eventId)) {
throw new BusinessRuleException(BusinessRuleType.EVENT_DELETE_WITH_ACTIVITIES);
}

if(organizerRepository.existsByEventId(eventId)) {
throw new BusinessRuleException(BusinessRuleType.EVENT_DELETE_WITH_ORGANIZERS);
}

eventRepository.deleteById(eventId);

auditService.logAdminDelete(ResourceName.EVENT, eventId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,8 @@

import br.edu.ifsp.spo.eventos.eventplatformbackend.account.audit.AuditService;
import br.edu.ifsp.spo.eventos.eventplatformbackend.area.AreaRepository;
import br.edu.ifsp.spo.eventos.eventplatformbackend.common.exceptions.ResourceAlreadyExistsException;
import br.edu.ifsp.spo.eventos.eventplatformbackend.common.exceptions.ResourceName;
import br.edu.ifsp.spo.eventos.eventplatformbackend.common.exceptions.ResourceNotFoundException;
import br.edu.ifsp.spo.eventos.eventplatformbackend.common.exceptions.ResourceReferentialIntegrityException;
import br.edu.ifsp.spo.eventos.eventplatformbackend.common.exceptions.*;
import br.edu.ifsp.spo.eventos.eventplatformbackend.session.SessionScheduleRepository;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.builder.DiffResult;
Expand All @@ -20,6 +18,7 @@
public class LocationService {
private final LocationRepository locationRepository;
private final AreaRepository areaRepository;
private final SessionScheduleRepository sessionScheduleRepository;
private final AuditService auditService;

public Location create(LocationCreateDto dto) {
Expand Down Expand Up @@ -64,6 +63,8 @@ public Location findById(UUID locationId) {
public void delete(UUID locationId) {
Location location = getLocation(locationId);
checkAreaExistsByLocationId(locationId);
checkIfLocationHasAssociationWithSessionSchedule(locationId);

locationRepository.deleteById(locationId);
log.info("Delete location id={}, name={}", locationId, location.getName());
auditService.logAdminDelete(ResourceName.LOCATION, locationId);
Expand All @@ -79,4 +80,10 @@ private void checkAreaExistsByLocationId(UUID locationId) {
throw new ResourceReferentialIntegrityException(ResourceName.LOCATION, ResourceName.AREA);
}
}

private void checkIfLocationHasAssociationWithSessionSchedule(UUID locationId) {
if(sessionScheduleRepository.existsByLocationId(locationId)) {
throw new ResourceReferentialIntegrityException(ResourceName.LOCATION, ResourceName.SESSION_SCHEDULE);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,7 @@ public interface OrganizerRepository extends JpaRepository<Organizer, UUID> {
"WHERE e.id = ?1\n" +
"ORDER BY a.name")
List<OrganizerSiteDto> findAllOrganizerByEventId(UUID eventId);

boolean existsByEventId(UUID eventId);
boolean existsByAccountId(UUID accountId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@
public interface OrganizerSubeventRepository extends JpaRepository<OrganizerSubevent, UUID> {
List<OrganizerSubevent> findAllBySubeventId(UUID subeventId);
boolean existsByAccountAndSubeventId(Account account, UUID subeventId);
boolean existsBySubeventId(UUID eventId);
boolean existsByAccountId(UUID accountId);

@Query("SELECT new br.edu.ifsp.spo.eventos.eventplatformbackend.site.dtos.OrganizerSubEventSiteDto(o.id, a.name, o.type)\n" +
"FROM Subevent se\n" +
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

@Repository
public interface RegistrationRepository extends JpaRepository<Registration, UUID> {
boolean existsByAccountId(UUID accountId);
@Query("select count(r) > 0 from Registration r join Activity as a on a.id = r.session.activity.id where a.id = ?2 and r.account.id = ?1 " +
"and (r.registrationStatus = br.edu.ifsp.spo.eventos.eventplatformbackend.registration.RegistrationStatus.CONFIRMED " +
"or r.registrationStatus = br.edu.ifsp.spo.eventos.eventplatformbackend.registration.RegistrationStatus.WAITING_CONFIRMATION)")
Expand All @@ -37,5 +38,5 @@ public interface RegistrationRepository extends JpaRepository<Registration, UUID
"WHERE acc.id = ?1")
List<AccountEventQueryDto> findEventsByAccount(UUID accountId);


boolean existsBySessionId(UUID sessionId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,5 @@ public interface SessionRepository extends JpaRepository<Session, UUID> {
@Lock(LockModeType.PESSIMISTIC_WRITE)
@Query("select s from Session s where s.id = :id")
Optional<Session> findByIdWithPessimisticLock(UUID id);
boolean existsByActivityId(UUID activityId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,8 @@

@Repository
public interface SessionScheduleRepository extends JpaRepository<SessionSchedule, UUID> {
boolean existsBySpaceId(UUID spaceId);
boolean existsByAreaId(UUID areaId);
boolean existsByLocationId(UUID locationId);
List<SessionSchedule> findAllBySpaceIdAndExecutionStartGreaterThanEqual(UUID spaceId, LocalDateTime now);
}
Loading