Skip to content
This repository was archived by the owner on May 1, 2024. It is now read-only.
This repository was archived by the owner on May 1, 2024. It is now read-only.

Refactor user service implementation #73

@Francesco146

Description

@Francesco146

Refactor this:

// UserMutationServiceImpl.java
    public Availability createReservation(UUID availabilityId, User user)
            throws UserNotFoundException, AvailabilityNotFoundException, InvalidAvailabilityIDException {

        Optional<Availability> availabilityOptional = availabilityRepository.findById(availabilityId);

        if (!userRepository.existsById(user.getId())) throw new UserNotFoundException("User not found");
        if (availabilityOptional.isEmpty()) throw new AvailabilityNotFoundException("Availability not found");

        Availability availabilityRequested = availabilityOptional.get();

        if (availabilityRequested.getStatus() == Status.TAKEN)
            throw new InvalidAvailabilityIDException("Availability already taken");

        boolean isRitiroPassaporto = availabilityRequested
                .getRequest()
                .getRequestType()
                .getName()
                .equals("ritiro passaporto");

        ArrayList<Availability> rilascioPassaportiOfUser = availabilityRepository
                .findByUser(user)
                .stream()
                .filter(availability -> availability.getStatus() == Status.TAKEN)
                .filter(availability -> availability.getRequest()
                        .getRequestType()
                        .getName()
                        .equals("rilascio passaporto"))
                .sorted((availability1, availability2) ->
                        availability2.getDate().compareTo(availability1.getDate()))
                .collect(Collectors.toCollection(ArrayList::new));

        Date rilascioDatePlusOneMonth = DateUtils
                .addMonths(
                        rilascioPassaportiOfUser
                                .getLast()
                                .getDate(),
                        1
                );

        boolean isDateValid = !rilascioPassaportiOfUser.isEmpty() &&
                availabilityRequested
                        .getDate()
                        .after(rilascioDatePlusOneMonth);


        if (isRitiroPassaporto && !isDateValid)
            throw new InvalidAvailabilityIDException("Availability not valid for the request");


        availabilityRequested.setStatus(Status.TAKEN);
        availabilityRequested.setUser(user);

        availabilityRepository.save(availabilityRequested);

        return availabilityRequested;
    }

and this:

// UserQueryServiceImpl.java
    public ReportDetails getReportDetailsByAvailabilityID(String availabilityId, JWT token)
            throws SecurityException, InvalidAvailabilityIDException {
        Object userToken = jwtService.getUserOrWorkerFromToken(token);
        if (!(userToken instanceof User))
            throw new SecurityException("Only user can access reports");

        Optional<Availability> optionalAvailability = reservationRepository.findById(UUID.fromString(availabilityId));

        if (optionalAvailability.isEmpty())
            throw new InvalidAvailabilityIDException("Invalid Availability ID");

        Availability availability = optionalAvailability.get();
        if (!availability.getStatus().equals(Status.TAKEN))
            throw new InvalidAvailabilityIDException("Can't get report of free availabilities");

        User user = availability.getUser();
        String fiscalCodeAvailability = user.getFiscalCode();

        if (!fiscalCodeAvailability.equals(((User) userToken).getFiscalCode()))
            throw new SecurityException("Only user whose record belongs to can access it");

        Request request = availability.getRequest();
        Office office = availability.getOffice();
        RequestType requestType = request.getRequestType();

        return new ReportDetails(
                fiscalCodeAvailability,
                user.getName(),
                user.getSurname(),
                user.getCityOfBirth(),
                user.getDateOfBirth(),
                availability.getDate(),
                request.getStartTime(),
                requestType.getName(),
                office.getName(),
                office.getAddress()
        );
    }

Metadata

Metadata

Assignees

Labels

code_qualityCode Quality ImprovementsenhancementNew feature or request

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions