package Ġvec . domain . service . impl Ċ Ċ import Ġorg . springframework . stereotype . Component Ċ import Ġorg . springframework . transaction . annotation . Transactional Ċ import Ġreactor . core . publisher . Mono Ċ import Ġreactor . kotlin . core . publisher . switch If Empty Ċ import Ġvec . domain . entity . Cart Ċ import Ġvec . domain . entity . Cart Product Ċ import Ġvec . domain . entity . Product Ċ import Ġvec . domain . entity . User Ċ import Ġvec . domain . repository . Cart Product Repository Ċ import Ġvec . domain . repository . Cart Repository Ċ import Ġvec . domain . repository . Product Repository Ċ import Ġvec . domain . service . E Commerce Cart Service Ċ import Ġvec . domain . service . Security Service Ċ import Ġjava . time . LocalDateTime Ċ Ċ @ Component Ċ @ Transactional Ċ class ĠE Commerce Cart ServiceImpl ( ĊĠĠĠ Ġprivate Ġval Ġcart Product Repository : ĠCart Product Repository , ĊĠĠĠ Ġprivate Ġval Ġcart Repository : ĠCart Repository , ĊĠĠĠ Ġprivate Ġval Ġproduct Repository : ĠProduct Repository , ĊĠĠĠ Ġprivate Ġval Ġsecurity Service : ĠSecurity Service , Ċ ) Ġ: ĠE Commerce Cart Service Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġadd ( user : ĠUser , Ġproduct : ĠProduct , Ġquantity : ĠLong ): ĠMono < Cart Product > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠMono . defer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsecurity Service . require Role Consumer ( user ) ĊĠĠĠĠĠĠĠ Ġ}. flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproduct Repository . findById ( product . id ) ĊĠĠĠĠĠĠĠ Ġ}. flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcart Repository . findBy UserId ( user . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. switch If Empty Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcart Repository . save ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCart ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserId Ġ= Ġuser . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcart Product Repository . findBy Cart Id And ProductId ( it . id , Ġproduct . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. switch If Empty Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMono . just ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCart Product ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcart Id Ġ= Ġit . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠproductId Ġ= Ġproduct . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquantity Ġ= Ġ 0 L , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadded Date Ġ= ĠLocalDateTime . now (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . increase Quantity ( quantity ) ĊĠĠĠĠĠĠĠ Ġ}. flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcart Product Repository . save ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ