Changes between Version 1 and Version 2 of AdvancedApplicationDevelopment


Ignore:
Timestamp:
05/28/26 05:25:31 (13 days ago)
Author:
181201
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • AdvancedApplicationDevelopment

    v1 v2  
    2222
    2323=== Registering a new user ===
     24
    2425{{{
    2526#!java
    2627    @Transactional
    2728    public User registerUser(String username, String password, String firstName, String lastName, String email, String role) {
     29        logger.info("Attempting to register new user '{}' with role '{}'", username, role);
     30
     31        // 1. Ensure username is unique
    2832        if (userRepository.findByUsername(username).isPresent()) {
     33            logger.error("VALIDATION FAILED: Username '{}' is already taken", username);
    2934            throw new IllegalArgumentException("Username already exists!");
    3035        }
    3136
     37        // 2. Validate Role Assignment
    3238        User newUser;
    3339        if ("OWNER".equalsIgnoreCase(role)) {
     
    3642            newUser = new PetSitter();
    3743        } else {
     44            logger.error("VALIDATION FAILED: Invalid role '{}' provided", role);
    3845            throw new IllegalArgumentException("Invalid role selected!");
    3946        }
     
    4552        newUser.setEmail(email);
    4653
    47         // Saving a PetOwner or PetSitter automatically saves to the parent 'users' table with InhertianceType.JOINED
     54        // 3. Saving a PetOwner or PetSitter automatically cascades to the parent 'users' table with InheritanceType.JOINED
     55        User savedUser;
    4856        if (newUser instanceof PetOwner) {
    49             return petOwnerRepository.save((PetOwner) newUser);
     57            savedUser = petOwnerRepository.save((PetOwner) newUser);
    5058        } else {
    51             return petSitterRepository.save((PetSitter) newUser);
    52         }
     59            savedUser = petSitterRepository.save((PetSitter) newUser);
     60        }
     61       
     62        logger.info("Successfully registered user '{}' with ID {}", savedUser.getUsername(), savedUser.getUserId());
     63        return savedUser;
    5364    }
    5465}}}
    5566
    5667=== Creating a new booking ===
     68
    5769{{{
    5870#!java
    5971    @Transactional
    6072    public Booking createBooking(String ownerId, String sitterId, LocalDate dateFrom, LocalDate dateTo, String address, List<String> petIds, String serviceType) {
    61         PetOwner owner = petOwnerRepository.findById(ownerId).orElseThrow(() -> new IllegalArgumentException("Invalid owner"));
    62         PetSitter sitter = petSitterRepository.findById(sitterId).orElseThrow(() -> new IllegalArgumentException("Invalid sitter"));
     73        logger.info("Attempting to create booking. Owner: {}, Sitter: {}", ownerId, sitterId);
     74
     75        // 1. Initial Validation
     76        if (dateFrom == null || dateTo == null || dateFrom.isAfter(dateTo)) {
     77            logger.error("VALIDATION FAILED: Invalid date range provided");
     78            throw new IllegalArgumentException("Booking dates are invalid");
     79        }
     80        if (petIds == null || petIds.isEmpty()) {
     81            logger.error("VALIDATION FAILED: No pets selected for booking");
     82            throw new IllegalArgumentException("At least one pet must be selected");
     83        }
     84
     85        // 2.Fetch Entities
     86        PetOwner owner = petOwnerRepository.findById(ownerId).orElseThrow(() -> {
     87            logger.error("VALIDATION FAILED: Owner not found with ID: {}", ownerId);
     88            return new IllegalArgumentException("Invalid owner");
     89        });
     90       
     91        PetSitter sitter = petSitterRepository.findById(sitterId).orElseThrow(() -> {
     92            logger.error("VALIDATION FAILED: Sitter not found with ID: {}", sitterId);
     93            return new IllegalArgumentException("Invalid sitter");
     94        });
     95       
    6396        List<Pet> pets = petRepository.findAllById(petIds);
    64 
     97        if (pets.size() != petIds.size()) {
     98            logger.error("VALIDATION FAILED: One or more pet IDs do not exist in the database");
     99            throw new IllegalArgumentException("Invalid pets selected");
     100        }
     101
     102        // 3. Entity Construction
    65103        Booking booking = new Booking();
    66104        booking.setOwner(owner);
     
    78116        }
    79117       
    80         return bookingRepository.save(booking);
     118        // 4. Write Operation
     119        Booking savedBooking = bookingRepository.save(booking);
     120        logger.info("Successfully created booking {} for owner {}", savedBooking.getBookingId(), owner.getUsername());
     121        return savedBooking;
    81122    }
    82123}}}
     
    97138
    98139=== Adding a new pet ===
     140
    99141{{{
    100142#!java
    101143    @Transactional
    102144    public Pet addPet(String name, Integer age, String specialNeeds, String description, String photoUrl, String ownerId, String petTypeId) {
    103         PetOwner owner = petOwnerRepository.findById(ownerId).orElseThrow(() -> new IllegalArgumentException("Invalid owner ID"));
    104         PetType petType = petTypeRepository.findById(petTypeId).orElseThrow(() -> new IllegalArgumentException("Invalid pet type ID"));
     145        logger.info("Attempting to add pet '{}' for owner ID: {}", name, ownerId);
     146
     147        if (name == null || name.isBlank()) {
     148            logger.error("VALIDATION FAILED: Pet name is null or empty");
     149            throw new IllegalArgumentException("Pet name is strictly required");
     150        }
     151
     152        // 1. Read/Verify Owner exists
     153        PetOwner owner = petOwnerRepository.findById(ownerId).orElseThrow(() -> {
     154            logger.error("VALIDATION FAILED: Owner not found with ID: {}", ownerId);
     155            return new IllegalArgumentException("Invalid owner ID");
     156        });
     157       
     158        // 2. Read/Verify PetType exists
     159        PetType petType = petTypeRepository.findById(petTypeId).orElseThrow(() -> {
     160            logger.error("VALIDATION FAILED: Pet type not found with ID: {}", petTypeId);
     161            return new IllegalArgumentException("Invalid pet type ID");
     162        });
    105163       
    106164        Pet pet = new Pet();
     
    113171        pet.setPetType(petType);
    114172       
    115         return petRepository.save(pet);
     173        // 3. Insert the new Pet
     174        Pet savedPet = petRepository.save(pet);
     175        logger.info("Successfully added pet '{}' under owner '{}'", savedPet.getName(), owner.getUsername());
     176       
     177        return savedPet;
    116178    }
    117179}}}
    118180
    119181=== Managing Reviews ===
     182
    120183{{{
    121184#!java
    122185    @Transactional
    123186    public Review addReview(String bookingId, Integer rating, String comment) {
    124         Booking booking = bookingRepository.findById(bookingId).orElseThrow(() -> new IllegalArgumentException("Invalid booking"));
     187        logger.info("Attempting to add review for booking ID: {}", bookingId);
     188
     189        if (rating == null || rating < 1 || rating > 5) {
     190            logger.error("VALIDATION FAILED: Invalid rating: {}", rating);
     191            throw new IllegalArgumentException("Rating must be between 1 and 5");
     192        }
     193
     194        Booking booking = bookingRepository.findById(bookingId).orElseThrow(() -> {
     195            logger.error("VALIDATION FAILED: Booking not found with ID: {}", bookingId);
     196            return new IllegalArgumentException("Invalid booking");
     197        });
     198
     199        // 1. Validate Business Logic
     200        if (!"Completed".equalsIgnoreCase(booking.getStatus())) {
     201            logger.error("VALIDATION FAILED: Cannot review booking in status: {}", booking.getStatus());
     202            throw new IllegalStateException("Only completed bookings can be reviewed");
     203        }
     204
     205        // 2. Create and save the review
    125206        Review review = new Review();
    126207        review.setBooking(booking);
    127208        review.setRating(rating);
    128209        review.setComment(comment);
    129         return reviewRepository.save(review);
    130     }
    131 
     210       
     211        Review savedReview = reviewRepository.save(review);
     212        logger.info("Successfully inserted review for booking: {}", bookingId);
     213       
     214        // 3. Update the booking status
     215        booking.setStatus("Reviewed");
     216        bookingRepository.save(booking);
     217        logger.info("Booking {} status successfully updated to Reviewed", bookingId);
     218       
     219        return savedReview;
     220    }
     221}}}
     222
     223{{{
     224#!java
    132225    @Transactional(readOnly = true)
    133226    public Double getAverageRating(String sitterId) {
    134227        return reviewRepository.getAverageRatingForSitter(sitterId);
     228    }
     229}}}
     230
     231=== Cascading Deletes & Rollback Demonstration ===
     232This method deletes a user and all of their related data. If the application crashes before the final step, all previous deletions in the transaction are automatically rolled back, preventing orphaned data.
     233{{{
     234#!java
     235    @Transactional
     236    public void deleteUserAccount(String userId) {
     237        logger.info("Attempting to securely delete user account with ID: {}", userId);
     238       
     239        // 1. Fetch and delete all bookings associated with the user
     240        List<Booking> ownerBookings = bookingService.getBookingsForOwner(userId);
     241        ownerBookings.forEach(b -> bookingService.deleteBooking(b.getBookingId()));
     242       
     243        List<Booking> sitterBookings = bookingService.getBookingsForSitter(userId);
     244        sitterBookings.forEach(b -> bookingService.deleteBooking(b.getBookingId()));
     245       
     246        // 2. Delete all pets owned by this user
     247        List<Pet> pets = petService.getPetsByOwner(userId);
     248        pets.forEach(p -> petService.deletePetAdmin(p.getPetId()));
     249       
     250        // Uncomment this temporarily for testing, validation for deletion
     251        // if (true) {
     252        //     throw new RuntimeException("Simulated Server Crash!");
     253        // }
     254       
     255        // 3. Delete the user finally
     256        userRepository.deleteById(userId);
     257        logger.info("Successfully deleted user account and all related data for ID: {}", userId);
    135258    }
    136259}}}