Skip to content

Commit 39c0b17

Browse files
committed
カートの追加と削除ができた
1 parent c61cc5c commit 39c0b17

File tree

28 files changed

+407
-54
lines changed

28 files changed

+407
-54
lines changed

business/src/main/java/com/isystk/sample/common/FrontUrl.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ public class FrontUrl {
1010
**/
1111
public static final String TOP = "/";
1212

13+
public static final String REGISTER = "/register";
14+
1315
/**
1416
* ---- APIs ----
1517
**/
@@ -18,7 +20,7 @@ public class FrontUrl {
1820

1921
public static final String API_V1_STOCKS = "/api/v1/stocks";
2022

21-
public static final String API_V1_MEMBER = "/api/v1/member";
23+
public static final String API_V1_MYCARTS = "/api/v1/mycarts";
2224

2325
public static final String API_V1_ENTRY_REGIST = "/api/v1/entry/regist";
2426

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.isystk.sample.domain.dto;
2+
3+
import com.isystk.sample.domain.entity.Cart;
4+
import com.isystk.sample.domain.entity.Stock;
5+
import com.isystk.sample.domain.entity.User;
6+
import lombok.Getter;
7+
import lombok.Setter;
8+
9+
@Getter
10+
@Setter
11+
public class CartRepositoryDto extends Cart {
12+
13+
Stock stock;
14+
}
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
package com.isystk.sample.domain.repository;
2+
3+
import static java.util.stream.Collectors.toList;
4+
5+
import com.isystk.sample.common.service.BaseRepository;
6+
import com.isystk.sample.common.util.DateUtils;
7+
import com.isystk.sample.common.util.ObjectMapperUtils;
8+
import com.isystk.sample.domain.dao.CartDao;
9+
import com.isystk.sample.domain.dao.StockDao;
10+
import com.isystk.sample.domain.dto.CartCriteria;
11+
import com.isystk.sample.domain.dto.CartRepositoryDto;
12+
import com.isystk.sample.domain.dto.StockCriteria;
13+
import com.isystk.sample.domain.entity.Cart;
14+
import com.isystk.sample.domain.entity.Stock;
15+
import java.math.BigInteger;
16+
import java.util.List;
17+
import java.util.Map;
18+
import java.util.stream.Collectors;
19+
import lombok.val;
20+
import org.springframework.beans.factory.annotation.Autowired;
21+
import org.springframework.stereotype.Repository;
22+
23+
/**
24+
* マイカートリポジトリ
25+
*/
26+
@Repository
27+
public class CartRepository extends BaseRepository {
28+
29+
@Autowired
30+
StockDao stockDao;
31+
32+
@Autowired
33+
CartDao cartDao;
34+
35+
/**
36+
* ユーザに紐づくカート情報を複数取得します。
37+
*
38+
* @param userId
39+
* @return
40+
*/
41+
public List<CartRepositoryDto> findCart(BigInteger userId) {
42+
CartCriteria criteria = new CartCriteria();
43+
criteria.setUserIdEq(userId);
44+
return convertCartDto(cartDao.findAll(criteria));
45+
}
46+
47+
/**
48+
* RepositoryDto に変換します。
49+
*
50+
* @param cartList
51+
* @return
52+
*/
53+
private List<CartRepositoryDto> convertCartDto(List<Cart> cartList) {
54+
// cartListからstockIdのListを抽出
55+
List<BigInteger> stockIdList = cartList.stream().map(e -> e.getStockId())
56+
.collect(Collectors.toList());
57+
58+
// stockId をkeyとした、stockListのMapを生成
59+
StockCriteria stockCriteria = new StockCriteria();
60+
stockCriteria.setIdIn(stockIdList);
61+
Map<BigInteger, List<Stock>> stockMap = stockDao.findAll(stockCriteria)
62+
.stream().collect(Collectors.groupingBy(Stock::getId));
63+
64+
// cartList を元に、cartDtoList へコピー
65+
var cartDtoList = ObjectMapperUtils.mapAll(cartList, CartRepositoryDto.class)
66+
.stream().map((e) -> {
67+
e.setStock(stockMap.get(e.getStockId()).get(0));
68+
return e;
69+
}).collect(toList());
70+
return cartDtoList;
71+
}
72+
73+
/**
74+
* ユーザに紐づくカートに商品を追加します。
75+
*
76+
* @param userId
77+
* @param stockId
78+
* @return
79+
*/
80+
public List<CartRepositoryDto> addCart(BigInteger userId, BigInteger stockId) {
81+
val time = DateUtils.getNow();
82+
83+
// 商品テーブル
84+
val cart = new Cart();
85+
cart.setUserId(userId);
86+
cart.setStockId(stockId);
87+
cart.setCreatedAt(time); // 作成日
88+
cart.setUpdatedAt(time); // 更新日
89+
cart.setDeleteFlg(false); // 削除フラグ
90+
cart.setVersion(0L); // 楽観ロック改定番号
91+
cartDao.insert(cart);
92+
93+
return findCart(userId);
94+
}
95+
96+
/**
97+
* ユーザに紐づくカートから商品を削除します。
98+
*
99+
* @param userId
100+
* @param cartId
101+
* @return
102+
*/
103+
public List<CartRepositoryDto> removeCart(BigInteger userId, BigInteger cartId) {
104+
var cart = cartDao.selectById(cartId).orElseThrow();
105+
cartDao.delete(cart);
106+
return findCart(userId);
107+
}
108+
109+
}

business/src/main/java/com/isystk/sample/domain/repository/StockRepository.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,7 @@ public class StockRepository extends BaseRepository {
4141
* @return
4242
*/
4343
public List<StockRepositoryDto> findAll(StockCriteria criteria) {
44-
var options = createSelectOptions(1, Integer.MAX_VALUE);
45-
return convertDto(stockDao.findAll(criteria, options, toList()));
44+
return convertDto(stockDao.findAll(criteria));
4645
}
4746

4847
/**
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
*/
2121
@Controller
2222
@Slf4j
23-
public class LoginHtmlController extends AbstractHtmlController {
23+
public class LoginController extends AbstractHtmlController {
2424

2525
@Autowired
2626
StaffHelper staffHelper;

web-front/resources/src/constants/api.ts

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,6 @@ const getBffUrl = (path: string): string => {
1313
export const API_ENDPOINT = {
1414
/** ログイン状態チェック */
1515
SESSION: getBffUrl('/session'),
16-
/** ログイン状態チェック */
17-
LOGIN_CHECK: getBffUrl('/loginCheck'),
1816
/** ログイン */
1917
LOGIN: getBffUrl('/authenticate'),
2018
/** ログアウト */
@@ -35,13 +33,13 @@ export const API_ENDPOINT = {
3533
/** 商品一覧データ取得 */
3634
STOCKS: getBffUrl('/stocks'),
3735
/** マイカートデータ取得 */
38-
MYCARTS: getBffUrl('/mycart'),
36+
MYCARTS: getBffUrl('/mycarts'),
3937
/** カートに商品を追加する */
40-
ADD_MYCART: getBffUrl('/addMycart'),
38+
MYCARTS_ADD: getBffUrl('/mycarts/add'),
4139
/** カートから商品を削除する */
42-
REMOVE_MYCART: getBffUrl('/cartdelete'),
40+
MYCARTS_REMOVE: getBffUrl('/mycarts/remove'),
4341
/** Stripe用のペイメント作成 */
44-
CREATE_PAYMENT: getBffUrl('/createPayment'),
42+
MYCARTS_PAYMENT: getBffUrl('/mycarts/payment'),
4543
/** 決算処理後の後処理 */
46-
CHECKOUT: getBffUrl('/checkout'),
44+
MYCARTS_CHECKOUT: getBffUrl('/mycarts/checkout'),
4745
}

web-front/resources/src/index.tsx

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,7 @@ const render = (session: Session) => {
3636
}
3737

3838
const init = () => {
39-
const url = API_ENDPOINT.SESSION
40-
const data = {
41-
_csrf:
42-
document
43-
.querySelector('meta[name="csrf-token"]')
44-
?.getAttribute('content') || '',
45-
}
46-
API.post(url, data).then((response) => {
39+
API.post(API_ENDPOINT.SESSION).then((response) => {
4740
render(response.data[0])
4841
})
4942
}

web-front/resources/src/pages/mycart/index.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,12 @@ const MyCart: FC<Props> = ({ appRoot }) => {
3232
{carts.data.map((cart, index) => (
3333
<div className="block01_item" key={index}>
3434
<img
35-
src={`/thumb/stocks/${cart.imgpath}`}
35+
src={`/thumb/stocks/${cart.stock?.imgpath}`}
3636
alt=""
3737
className="block01_img"
3838
/>
39-
<p>{cart.name} </p>
40-
<p className="c-red mb20">{cart.price}</p>
39+
<p>{cart.stock?.name} </p>
40+
<p className="c-red mb20">{cart.stock?.price}</p>
4141
<input
4242
type="button"
4343
value="カートから削除する"

web-front/resources/src/services/cart.ts

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import MainService from '@/services/main'
22
import { API } from '@/utilities/api'
33
import { API_ENDPOINT } from '@/constants/api'
4+
import { Stock } from '@/services/shop'
45

56
type Carts = {
67
data: Cart[]
@@ -12,13 +13,11 @@ type Carts = {
1213

1314
type Cart = {
1415
id: number
15-
name: string
16-
detail: string
17-
price: number
18-
imgpath: string
19-
quantity: number
16+
stock_id: number
17+
user_id: number
2018
created_at: Date
2119
updated_at: Date
20+
stock: Stock
2221
}
2322

2423
type Form = {
@@ -49,7 +48,7 @@ export default class CartService {
4948
try {
5049
const response = await API.post(API_ENDPOINT.MYCARTS)
5150
if (response.result) {
52-
this.carts = response.carts
51+
this.carts = response.data[0]
5352
}
5453
} catch (e) {
5554
alert('マイカートの取得に失敗しました')
@@ -64,11 +63,11 @@ export default class CartService {
6463
// ローディングを表示する
6564
this.main.showLoading()
6665
try {
67-
const response = await API.post(API_ENDPOINT.ADD_MYCART, {
66+
const response = await API.post(API_ENDPOINT.MYCARTS_ADD, {
6867
stock_id: stockId,
6968
})
7069
if (response.result) {
71-
this.carts = response.carts
70+
this.carts = response.data[0]
7271
result = true
7372
}
7473
} catch (e) {
@@ -80,16 +79,16 @@ export default class CartService {
8079
return result
8180
}
8281

83-
async removeCart(stockId: number): Promise<boolean> {
82+
async removeCart(cartId: number): Promise<boolean> {
8483
let result = false
8584
// ローディングを表示する
8685
this.main.showLoading()
8786
try {
88-
const response = await API.post(API_ENDPOINT.REMOVE_MYCART, {
89-
stock_id: stockId,
87+
const response = await API.post(API_ENDPOINT.MYCARTS_REMOVE, {
88+
cart_id: cartId,
9089
})
9190
if (response.result) {
92-
this.carts = response.carts
91+
this.carts = response.data[0]
9392
result = true
9493
}
9594
} catch (e) {
@@ -107,13 +106,13 @@ export default class CartService {
107106
this.main.showLoading()
108107
try {
109108
//paymentIntentの作成を(ローカルサーバ経由で)リクエスト
110-
const response = await API.post(API_ENDPOINT.CREATE_PAYMENT, {
109+
const response = await API.post(API_ENDPOINT.MYCARTS_PAYMENT, {
111110
amount: values.amount,
112111
username: values.username,
113112
})
114113

115114
//レスポンスからclient_secretを取得
116-
const client_secret = response.client_secret
115+
const client_secret = response.data[0].client_secret
117116

118117
//client_secretを利用して(確認情報をStripeに投げて)決済を完了させる
119118
const confirmRes = await stripe.confirmCardPayment(client_secret, {
@@ -127,11 +126,11 @@ export default class CartService {
127126
})
128127

129128
if (
130-
confirmRes.paymentIntent &&
131-
confirmRes.paymentIntent.status === 'succeeded'
129+
confirmRes.data[0].paymentIntent &&
130+
confirmRes.data[0].paymentIntent.status === 'succeeded'
132131
) {
133132
// 決算処理が完了したら、注文履歴に追加してマイカートから商品を削除する。
134-
const response = await API.post(API_ENDPOINT.CHECKOUT, {})
133+
const response = await API.post(API_ENDPOINT.MYCARTS_CHECKOUT, {})
135134

136135
result = response.result
137136
}

web-front/resources/src/utilities/api.ts

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,36 @@ const get = async (url: string): Promise<any> => {
66
}
77

88
const post = async (url: string, values?: any, config?: any): Promise<any> => {
9-
return await request('post', url, values, config)
9+
const data = {
10+
...values,
11+
_csrf:
12+
document
13+
.querySelector('meta[name="csrf-token"]')
14+
?.getAttribute('content') || '',
15+
}
16+
return await request('post', url, data, config)
1017
}
1118

1219
const put = async (url: string, values?: any, config?: any): Promise<any> => {
13-
return await request('put', url, values, config)
20+
const data = {
21+
...values,
22+
_csrf:
23+
document
24+
.querySelector('meta[name="csrf-token"]')
25+
?.getAttribute('content') || '',
26+
}
27+
return await request('put', url, data, config)
1428
}
1529

1630
const del = async (url: string, values?: any, config?: any): Promise<any> => {
17-
return await request('delete', url, values, config)
31+
const data = {
32+
...values,
33+
_csrf:
34+
document
35+
.querySelector('meta[name="csrf-token"]')
36+
?.getAttribute('content') || '',
37+
}
38+
return await request('delete', url, data, config)
1839
}
1940

2041
const request = async (

0 commit comments

Comments
 (0)