Skip to content
Merged
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 @@ -2,10 +2,9 @@

import lombok.RequiredArgsConstructor;
import org.example.backend.model.Discount;
import org.example.backend.security.CartItemTransferDto;
import org.example.backend.service.DiscountsService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;

import java.util.List;

Expand All @@ -20,4 +19,10 @@ public class DiscountsController {
public List<Discount> getAllDiscounts(){
return service.getAllDiscounts();
}

@PostMapping("/changeCart")
public List<String> changeCart(@RequestBody CartItemTransferDto cartItem){
System.out.println("Received item from frontend:" + cartItem);
return service.changeCart(cartItem);
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
package org.example.backend.security;

import lombok.Builder;
import lombok.With;

import java.util.List;

@With
@Builder
public record AppUser(String id,String providerId,String provider,String userName, String avatarUrl) {
public record AppUser(String id, String providerId, String provider, String userName, String avatarUrl, List<String> shoppingCart) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@
import lombok.Builder;
import lombok.With;

import java.util.List;

@With
@Builder
public record AppUserDto(String id,String userName, String avatarUrl) {
public record AppUserDto(String id, String userName, String avatarUrl, List<String> shoppingCart) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,6 @@ public AppUserDto getMe(@AuthenticationPrincipal AppUserPrincipal user){
return null;
}
AppUser appUser=user.getAppUser();
return new AppUserDto(appUser.id(),appUser.userName(),appUser.avatarUrl());
return new AppUserDto(appUser.id(),appUser.userName(),appUser.avatarUrl(), appUser.shoppingCart());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package org.example.backend.security;
public record CartItemTransferDto(String userId,String productId,Boolean addTrueFalseDelete) {}
//if add item is true item is added to the cart
// else item is removed from the cart
//(reason) duplicate code on add and delete
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import org.springframework.security.oauth2.core.user.OAuth2User;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Map;

@Service
Expand Down Expand Up @@ -65,6 +66,7 @@ private AppUser createAppUser(OAuth2User oAuth2User, String uniqueId, String pro
.providerId(providerId)
.userName(name)
.avatarUrl(avatarUrl)
.shoppingCart(new ArrayList<>())
.build();

return userRepo.save(newUser);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import org.springframework.security.oauth2.core.oidc.user.OidcUser;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Map;

@Service
Expand Down Expand Up @@ -45,6 +46,7 @@ private AppUser createAppUser(OidcUser oidcUser, String uniqueId, String provide
.providerId(providerId)
.userName(name)
.avatarUrl(avatarUrl)
.shoppingCart(new ArrayList<>())
.build();

System.out.println("Saved user:" + newUser);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,56 @@

import org.example.backend.model.Discount;
import org.example.backend.repository.DiscountRepository;
import org.example.backend.security.AppUser;
import org.example.backend.security.AppUserRepository;
import org.example.backend.security.CartItemTransferDto;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.NoSuchElementException;

@Service
public class DiscountsService {
private final DiscountRepository repo;

public DiscountsService(DiscountRepository repo) {
private final AppUserRepository userRepo;
public DiscountsService(DiscountRepository repo, AppUserRepository userRepo) {
this.repo = repo;
this.userRepo = userRepo;
}

public List<Discount> getAllDiscounts() {
return repo.findAll();
}
public List<Discount> findByStore(String Provider) {
return repo.findDiscountByProvider(Provider);

public List<String> changeCart(CartItemTransferDto cartItem) {
AppUser user = userRepo.findById(cartItem.userId())
.orElseThrow(() ->
new NoSuchElementException("User with id " + cartItem.userId() + " not found"));
List<String> currentCart = user.shoppingCart();
System.out.println("Current cart: " + currentCart);
if (currentCart == null) {
currentCart = new ArrayList<>();
}
List<String> updatedCart = new ArrayList<>(currentCart);

if(cartItem.addTrueFalseDelete()){
updatedCart.add(cartItem.productId());
}else{
updatedCart.remove(cartItem.productId());
}
System.out.println("Updated cart: " + updatedCart);

AppUser updatedUser = new AppUser(
user.id(),
user.providerId(),
user.provider(),
user.userName(),
user.avatarUrl(),
updatedCart
);
userRepo.save(updatedUser);
System.out.println("Updated user: " + updatedUser);
return updatedUser.shoppingCart();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@
import org.springframework.security.oauth2.core.user.OAuth2User;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;

import java.util.ArrayList;

import static org.mockito.Mockito.mock;
import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.oauth2Login;
import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.oidcLogin;
Expand All @@ -30,7 +33,8 @@ void getMe_whenLoggedInWithOidc_returnsAppUserDto() throws Exception {
"123456789",
"google",
"George",
"George.jpg"))
"George.jpg",
new ArrayList<>()))
)))
.andExpect(status().isOk())
.andExpect(jsonPath("$.id").value("google:123456789"))
Expand All @@ -48,7 +52,8 @@ void getMe_whenLoggedInWithOAuth2_returnsAppUserDto() throws Exception {
"123456789",
"github",
"Gerry",
"Gerry.jpg"))
"Gerry.jpg",
new ArrayList<>()))
)))
.andExpect(status().isOk())
.andExpect(jsonPath("$.id").value("github:123456789"))
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
package org.example.backend.service;

import org.example.backend.model.Discount;
import org.example.backend.repository.DiscountRepository;
import org.example.backend.security.AppUser;
import org.example.backend.security.AppUserRepository;
import org.example.backend.security.CartItemTransferDto;
import org.junit.jupiter.api.Test;

import java.util.List;
import java.util.NoSuchElementException;
import java.util.Optional;

import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.*;

class DiscountsServiceTest {

private final DiscountRepository repo = mock(DiscountRepository.class);
private final AppUserRepository userRepo = mock(AppUserRepository.class);
private final DiscountsService service = new DiscountsService(repo, userRepo);

@Test
void getAllDiscounts_whenDiscountsExist_thenReturnListOfDiscounts() {
// GIVEN
Discount discount1 = new Discount("1", "Discount 1", "Description 1", "10","aldi");
Discount discount2 = new Discount("2", "Discount 2", "Description 2", "20","lidl");
List<Discount> expected = List.of(discount1, discount2);
when(repo.findAll()).thenReturn(expected);

// WHEN
List<Discount> actual = service.getAllDiscounts();

// THEN
assertEquals(expected, actual);
verify(repo).findAll();
}

@Test
void changeCart_whenAddTrue_shouldAddToCart() {
// GIVEN
CartItemTransferDto cartItem = new CartItemTransferDto("user1", "product1", true);
AppUser user = new AppUser("user1", "providerId", "provider", "username", "avatarUrl", List.of());
when(userRepo.findById("user1")).thenReturn(Optional.of(user));

// WHEN
List<String> actual = service.changeCart(cartItem);

// THEN
List<String> expected = List.of("product1");
assertEquals(expected, actual);
verify(userRepo).findById("user1");
verify(userRepo).save(any(AppUser.class));
}

@Test
void changeCart_whenAddFalse_shouldRemoveFromCart() {
// GIVEN
CartItemTransferDto cartItem = new CartItemTransferDto("user1", "product1", false);
AppUser user = new AppUser("user1", "providerId", "provider", "username", "avatarUrl", List.of("product1", "product2"));
when(userRepo.findById("user1")).thenReturn(Optional.of(user));

// WHEN
List<String> actual = service.changeCart(cartItem);

// THEN
List<String> expected = List.of("product2");
assertEquals(expected, actual);
verify(userRepo).findById("user1");
verify(userRepo).save(any(AppUser.class));
}

@Test
void changeCart_whenUserNotFound_shouldThrowNoSuchElementException() {
// GIVEN
CartItemTransferDto cartItem = new CartItemTransferDto("user1", "product1", true);
when(userRepo.findById("user1")).thenReturn(Optional.empty());

// WHEN & THEN
assertThrows(NoSuchElementException.class, () -> service.changeCart(cartItem));
verify(userRepo).findById("user1");
verify(userRepo, never()).save(any(AppUser.class));
}
}
6 changes: 3 additions & 3 deletions frontend/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<link rel="icon" type="image/svg+xml" href="/BestDiscounts.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Vite + React + TS</title>
<title>Best Discounts</title>
</head>
<body>
<div id="root"></div>
<script type="module" src="/src/main.tsx"></script>
<script type="module" src="./src/main.tsx"></script>
</body>
</html>
34 changes: 22 additions & 12 deletions frontend/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions frontend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
"axios": "^1.11.0",
"react": "^19.1.1",
"react-dom": "^19.1.1",
"react-icons": "^5.5.0",
"react-router-dom": "^7.8.2"
},
"devDependencies": {
Expand Down
8 changes: 8 additions & 0 deletions frontend/public/BestDiscounts.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 0 additions & 1 deletion frontend/public/vite.svg

This file was deleted.

Loading