Skip to content

Commit 1a58326

Browse files
committed
Payment flow changes, Product Reviews impl.
1 parent e19db78 commit 1a58326

File tree

35 files changed

+506
-157
lines changed

35 files changed

+506
-157
lines changed

bookstore-account-service/src/main/java/com/devd/spring/bookstoreaccountservice/controller/AuthController.java

-2
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44
import com.devd.spring.bookstoreaccountservice.web.CreateOAuthClientRequest;
55
import com.devd.spring.bookstoreaccountservice.web.CreateOAuthClientResponse;
66
import com.devd.spring.bookstoreaccountservice.web.CreateUserResponse;
7-
import com.devd.spring.bookstoreaccountservice.web.JwtAuthenticationResponse;
8-
import com.devd.spring.bookstoreaccountservice.web.SignInRequest;
97
import com.devd.spring.bookstoreaccountservice.web.SignUpRequest;
108
import org.springframework.beans.factory.annotation.Autowired;
119
import org.springframework.http.HttpStatus;

bookstore-account-service/src/main/java/com/devd/spring/bookstoreaccountservice/controller/UserController.java

+9
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@
1414
import org.springframework.http.ResponseEntity;
1515
import org.springframework.security.access.prepost.PreAuthorize;
1616
import org.springframework.web.bind.annotation.CrossOrigin;
17+
import org.springframework.web.bind.annotation.DeleteMapping;
1718
import org.springframework.web.bind.annotation.GetMapping;
19+
import org.springframework.web.bind.annotation.PathVariable;
1820
import org.springframework.web.bind.annotation.PostMapping;
1921
import org.springframework.web.bind.annotation.PutMapping;
2022
import org.springframework.web.bind.annotation.RequestBody;
@@ -72,5 +74,12 @@ public ResponseEntity<?> updateUserInfo(@RequestBody @Valid UpdateUserRequest up
7274
return new ResponseEntity<>(HttpStatus.OK);
7375
}
7476

77+
@DeleteMapping("/user/{userId}")
78+
@PreAuthorize("hasAuthority('ADMIN_USER')")
79+
public ResponseEntity<?> deleteUserById(@PathVariable("userId") String userId){
80+
userService.deleteUserById(userId);
81+
return ResponseEntity.status(HttpStatus.NO_CONTENT).build();
82+
}
83+
7584
//TODO CRUD for user
7685
}

bookstore-account-service/src/main/java/com/devd/spring/bookstoreaccountservice/repository/UserRepository.java

+5
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,12 @@
55
import java.util.Optional;
66
import org.springframework.data.repository.CrudRepository;
77

8+
import javax.transaction.Transactional;
9+
810
/**
911
* @author: Devaraj Reddy, Date : 2019-05-17
1012
*/
13+
@Transactional
1114
public interface UserRepository extends CrudRepository<User, Long> {
1215

1316
Optional<User> findByUserName(String username);
@@ -16,6 +19,8 @@ public interface UserRepository extends CrudRepository<User, Long> {
1619

1720
Optional<User> findByUserId(String userId);
1821

22+
void deleteByUserId(String userId);
23+
1924
Boolean existsByUserName(String userName);
2025

2126
Boolean existsByEmail(String email);

bookstore-account-service/src/main/java/com/devd/spring/bookstoreaccountservice/service/UserService.java

+2
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,6 @@ public interface UserService {
1919
GetUserInfoResponse getUserInfo();
2020

2121
void updateUserInfo(UpdateUserRequest updateUserRequest);
22+
23+
void deleteUserById(String userId);
2224
}

bookstore-account-service/src/main/java/com/devd/spring/bookstoreaccountservice/service/impl/UserServiceImpl.java

+6
Original file line numberDiff line numberDiff line change
@@ -176,4 +176,10 @@ public void updateUserInfo(UpdateUserRequest updateUserRequest) {
176176
userRepository.save(userByUserName);
177177
}
178178

179+
@Override
180+
public void deleteUserById(String userId) {
181+
// getUserByUserId(userId);
182+
userRepository.deleteByUserId(userId);
183+
}
184+
179185
}

bookstore-catalog-service/src/main/java/com/devd/spring/bookstorecatalogservice/config/ResourceServerConfig.java

+1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ public void configure(HttpSecurity http) throws Exception {
2626
.antMatchers("/actuator/**", "/api-docs/**", "/h2-console/**", "/signin").permitAll()
2727
.antMatchers(HttpMethod.POST, "/oauth/token").permitAll()
2828
.antMatchers(HttpMethod.GET, "/product**/**").permitAll()
29+
.antMatchers(HttpMethod.GET, "/review/**").permitAll()
2930
.antMatchers("/**").authenticated();
3031
}
3132
}

bookstore-catalog-service/src/main/java/com/devd/spring/bookstorecatalogservice/controller/ReviewController.java

+9-1
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,18 @@
11
package com.devd.spring.bookstorecatalogservice.controller;
22

3+
import com.devd.spring.bookstorecatalogservice.repository.dao.Review;
34
import com.devd.spring.bookstorecatalogservice.service.ReviewService;
45
import com.devd.spring.bookstorecatalogservice.web.CreateOrUpdateReviewRequest;
56
import org.springframework.beans.factory.annotation.Autowired;
67
import org.springframework.http.ResponseEntity;
8+
import org.springframework.web.bind.annotation.GetMapping;
79
import org.springframework.web.bind.annotation.PostMapping;
810
import org.springframework.web.bind.annotation.RequestBody;
11+
import org.springframework.web.bind.annotation.RequestParam;
912
import org.springframework.web.bind.annotation.RestController;
1013

1114
import javax.validation.Valid;
15+
import java.util.List;
1216

1317
/**
1418
* @author Devaraj Reddy, Date : 08-Nov-2020
@@ -26,5 +30,9 @@ public ResponseEntity<?> createOrUpdateReview(@RequestBody @Valid CreateOrUpdate
2630
return ResponseEntity.ok().build();
2731
}
2832

29-
33+
@GetMapping("/review")
34+
public ResponseEntity<?> getAllReviewsForProduct(@RequestParam("productId") String productId) {
35+
List<Review> reviewsForProduct = reviewService.getReviewsForProduct(productId);
36+
return ResponseEntity.ok(reviewsForProduct);
37+
}
3038
}

bookstore-catalog-service/src/main/java/com/devd/spring/bookstorecatalogservice/service/impl/ReviewServiceImpl.java

+9-6
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@
1717
import java.util.List;
1818
import java.util.Optional;
1919

20+
import static com.devd.spring.bookstorecommons.util.CommonUtilityMethods.getUserIdFromToken;
21+
import static com.devd.spring.bookstorecommons.util.CommonUtilityMethods.getUserNameFromToken;
22+
2023
/**
2124
* @author Devaraj Reddy, Date : 08-Nov-2020
2225
*/
@@ -35,17 +38,16 @@ public class ReviewServiceImpl implements ReviewService {
3538
@Override
3639
public void createOrUpdateReview(CreateOrUpdateReviewRequest createOrUpdateReviewRequest) {
3740
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
38-
String userName = (String) authentication.getPrincipal();
39-
40-
GetUserInfoResponse user = accountFeignClient.getUserInfo();
41+
String userIdFromToken = getUserIdFromToken(authentication);
42+
String userNameFromToken = getUserNameFromToken(authentication);
4143

4244
//check whether product exists.
4345
ProductResponse product = productService.getProduct(createOrUpdateReviewRequest.getProductId());
4446
if (product == null) {
4547
throw new RuntimeException("Product doesn't exist!");
4648
}
4749

48-
Optional<Review> review = reviewRepository.findByUserIdAndProductId(user.getUserId(), createOrUpdateReviewRequest.getProductId());
50+
Optional<Review> review = reviewRepository.findByUserIdAndProductId(userIdFromToken, createOrUpdateReviewRequest.getProductId());
4951

5052
if (review.isPresent()) {
5153
Review updatedReview = review.get();
@@ -54,8 +56,9 @@ public void createOrUpdateReview(CreateOrUpdateReviewRequest createOrUpdateRevie
5456
} else {
5557
Review newReview = Review.builder()
5658
.reviewMessage(createOrUpdateReviewRequest.getReviewMessage())
57-
.userId(user.getUserId())
58-
.userName(userName)
59+
.ratingValue(createOrUpdateReviewRequest.getRatingValue())
60+
.userId(userIdFromToken)
61+
.userName(userNameFromToken)
5962
.productId(createOrUpdateReviewRequest.getProductId())
6063
.build();
6164
reviewRepository.save(newReview);

bookstore-feign/src/main/java/com/devd/spring/bookstorecommons/feign/PaymentFeignClient.java

+5
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
package com.devd.spring.bookstorecommons.feign;
22

3+
import com.devd.spring.bookstorecommons.web.CreatePaymentRequest;
4+
import com.devd.spring.bookstorecommons.web.CreatePaymentResponse;
35
import com.devd.spring.bookstorecommons.web.GetPaymentMethodResponse;
46
import org.springframework.cloud.openfeign.FeignClient;
57
import org.springframework.web.bind.annotation.GetMapping;
68
import org.springframework.web.bind.annotation.PathVariable;
9+
import org.springframework.web.bind.annotation.PostMapping;
710

811
/**
912
* @author Devaraj Reddy, Date : 15-Dec-2020
@@ -14,4 +17,6 @@ public interface PaymentFeignClient {
1417
@GetMapping("/paymentMethod/{paymentMethodId}")
1518
GetPaymentMethodResponse getMyPaymentMethodById(@PathVariable("paymentMethodId") String paymentMethodId);
1619

20+
@PostMapping("/pay")
21+
CreatePaymentResponse doPayment(CreatePaymentRequest createPaymentRequest);
1722
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.devd.spring.bookstorecommons.web;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Data;
5+
import lombok.NoArgsConstructor;
6+
7+
8+
/**
9+
* @author Devaraj Reddy - 17-Dec-2020
10+
*/
11+
@Data
12+
@AllArgsConstructor
13+
@NoArgsConstructor
14+
public class CreatePaymentRequest {
15+
private int amount;
16+
private String currency;
17+
private String paymentMethodId;
18+
19+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.devd.spring.bookstorecommons.web;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Builder;
5+
import lombok.Data;
6+
import lombok.NoArgsConstructor;
7+
8+
import java.time.LocalDateTime;
9+
10+
/**
11+
* @author Devaraj Reddy - 17-Dec-2020
12+
*/
13+
@Data
14+
@AllArgsConstructor
15+
@NoArgsConstructor
16+
@Builder
17+
public class CreatePaymentResponse {
18+
private String paymentId;
19+
private LocalDateTime paymentDate;
20+
private boolean captured;
21+
private String receipt_url;
22+
}

bookstore-frontend-react-app/src/App.js

+4-1
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,13 @@ import ShippingScreen from './screens/ShippingScreen';
1313
import PaymentScreen from './screens/PaymentScreen';
1414
import PlaceOrderScreen from './screens/PlaceOrderScreen';
1515
import OrderScreen from './screens/OrderScreen';
16+
import { createBrowserHistory } from 'history';
17+
18+
export const history = createBrowserHistory();
1619

1720
function App() {
1821
return (
19-
<BrowserRouter>
22+
<BrowserRouter history={history}>
2023
<Header></Header>
2124
<main className='py-3'>
2225
<Container>

bookstore-frontend-react-app/src/actions/productActions.js

+21-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ import {
55
PRODUCT_DETAILS_REQUEST,
66
PRODUCT_DETAILS_SUCCESS,
77
PRODUCT_DETAILS_FAIL,
8+
PRODUCT_REVIEWS_REQUEST,
9+
PRODUCT_REVIEWS_SUCCESS,
10+
PRODUCT_REVIEWS_FAIL,
811
PRODUCT_DELETE_SUCCESS,
912
PRODUCT_DELETE_REQUEST,
1013
PRODUCT_DELETE_FAIL,
@@ -22,7 +25,7 @@ import {
2225
PRODUCT_TOP_FAIL
2326
} from '../constants/productConstants';
2427
import { getErrorMessage } from '../service/CommonUtils';
25-
import { getAllProductsDetailApi, getProductDetailApi } from '../service/RestApiCalls';
28+
import { getAllProductsDetailApi, getProductDetailApi, getProductReviewsApi } from '../service/RestApiCalls';
2629

2730
export const listProductsAction = () => async (dispatch) => {
2831
try {
@@ -57,3 +60,20 @@ export const listProductDetailsAction = (productId) => async (dispatch) => {
5760
});
5861
}
5962
};
63+
64+
export const listProductReviewsAction = (productId) => async (dispatch) => {
65+
try {
66+
dispatch({ type: PRODUCT_REVIEWS_REQUEST });
67+
//Get Product Reviews
68+
const productReviews = await getProductReviewsApi(productId);
69+
dispatch({
70+
type: PRODUCT_REVIEWS_SUCCESS,
71+
payload: productReviews
72+
});
73+
} catch (error) {
74+
dispatch({
75+
type: PRODUCT_REVIEWS_FAIL,
76+
payload: getErrorMessage(error)
77+
});
78+
}
79+
};

bookstore-frontend-react-app/src/components/Rating.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ const Rating = ({ value, text, color }) => {
1818
<span>
1919
<i style={{ color }} className={value >= 5 ? 'fas fa-star' : value >= 3.5 ? 'fas fa-star-half-alt' : 'far fa-star'}></i>
2020
</span>
21-
<span className='mx-2'>[{text && text}]</span>
21+
{text && <span className='mx-2'>[{text && text}]</span>}
2222
</div>
2323
);
2424
};

bookstore-frontend-react-app/src/constants/productConstants.js

+4
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ export const PRODUCT_DETAILS_REQUEST = 'PRODUCT_DETAILS_REQUEST';
66
export const PRODUCT_DETAILS_SUCCESS = 'PRODUCT_DETAILS_SUCCESS';
77
export const PRODUCT_DETAILS_FAIL = 'PRODUCT_DETAILS_FAIL';
88

9+
export const PRODUCT_REVIEWS_REQUEST = 'PRODUCT_REVIEWS_REQUEST';
10+
export const PRODUCT_REVIEWS_SUCCESS = 'PRODUCT_REVIEWS_SUCCESS';
11+
export const PRODUCT_REVIEWS_FAIL = 'PRODUCT_REVIEWS_FAIL';
12+
913
export const PRODUCT_DELETE_REQUEST = 'PRODUCT_DELETE_REQUEST';
1014
export const PRODUCT_DELETE_SUCCESS = 'PRODUCT_DELETE_SUCCESS';
1115
export const PRODUCT_DELETE_FAIL = 'PRODUCT_DELETE_FAIL';

bookstore-frontend-react-app/src/reducers/productReducers.js

+15
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ import {
66
PRODUCT_DETAILS_REQUEST,
77
PRODUCT_DETAILS_SUCCESS,
88
PRODUCT_DETAILS_FAIL,
9+
PRODUCT_REVIEWS_REQUEST,
10+
PRODUCT_REVIEWS_SUCCESS,
11+
PRODUCT_REVIEWS_FAIL,
912
PRODUCT_DELETE_SUCCESS,
1013
PRODUCT_DELETE_REQUEST,
1114
PRODUCT_DELETE_FAIL,
@@ -48,3 +51,15 @@ export const productDetailsReducer = (state = { products: [] }, action) => {
4851
return state;
4952
}
5053
};
54+
export const productReviewsReducer = (state = { reviews: [] }, action) => {
55+
switch (action.type) {
56+
case PRODUCT_REVIEWS_REQUEST:
57+
return { loading: true, ...state };
58+
case PRODUCT_REVIEWS_SUCCESS:
59+
return { loading: false, reviews: action.payload };
60+
case PRODUCT_REVIEWS_FAIL:
61+
return { loading: false, error: action.payload };
62+
default:
63+
return state;
64+
}
65+
};

bookstore-frontend-react-app/src/reducers/userReducers.js

+2
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import {
2626
USER_UPDATE_FAIL,
2727
USER_UPDATE_PROFILE_RESET
2828
} from '../constants/userConstants';
29+
import { history } from '../App';
2930

3031
export const userLoginReducer = (state = {}, action) => {
3132
switch (action.type) {
@@ -53,6 +54,7 @@ export const userRegisterReducer = (state = {}, action) => {
5354
case 'USER_REGISTER_RESET':
5455
return { loading: false, error: null };
5556
case 'USER_LOGOUT':
57+
history.push('/login');
5658
return {};
5759
default:
5860
return state;

0 commit comments

Comments
 (0)