77import org .devkor .apu .saerok_server .domain .ad .core .repository .AdPlacementRepository ;
88import org .devkor .apu .saerok_server .domain .ad .core .repository .AdRepository ;
99import org .devkor .apu .saerok_server .domain .ad .core .repository .SlotRepository ;
10+ import org .devkor .apu .saerok_server .domain .admin .core .entity .AdminAuditAction ;
11+ import org .devkor .apu .saerok_server .domain .admin .core .entity .AdminAuditLog ;
12+ import org .devkor .apu .saerok_server .domain .admin .core .entity .AdminAuditTargetType ;
13+ import org .devkor .apu .saerok_server .domain .admin .core .repository .AdminAuditLogRepository ;
1014import org .devkor .apu .saerok_server .global .shared .exception .NotFoundException ;
15+ import org .devkor .apu .saerok_server .domain .user .core .entity .User ;
16+ import org .devkor .apu .saerok_server .domain .user .core .repository .UserRepository ;
1117import org .springframework .stereotype .Service ;
1218import org .springframework .transaction .annotation .Transactional ;
1319
1420import java .time .LocalDate ;
1521import java .util .List ;
22+ import java .util .LinkedHashMap ;
23+ import java .util .Map ;
1624
1725@ Service
1826@ RequiredArgsConstructor
@@ -22,13 +30,16 @@ public class AdminAdPlacementService {
2230 private final AdPlacementRepository adPlacementRepository ;
2331 private final AdRepository adRepository ;
2432 private final SlotRepository slotRepository ;
33+ private final AdminAuditLogRepository adminAuditLogRepository ;
34+ private final UserRepository userRepository ;
2535
2636 @ Transactional (readOnly = true )
2737 public List <AdPlacement > listPlacements () {
2838 return adPlacementRepository .findAll ();
2939 }
3040
31- public AdPlacement createPlacement (Long adId ,
41+ public AdPlacement createPlacement (Long adminUserId ,
42+ Long adId ,
3243 Long slotId ,
3344 LocalDate startDate ,
3445 LocalDate endDate ,
@@ -39,10 +50,31 @@ public AdPlacement createPlacement(Long adId,
3950 Slot slot = slotRepository .findById (slotId )
4051 .orElseThrow (() -> new NotFoundException ("존재하지 않는 슬롯 id예요." ));
4152 AdPlacement placement = AdPlacement .create (ad , slot , startDate , endDate , weight , enabled );
42- return adPlacementRepository .save (placement );
53+ AdPlacement saved = adPlacementRepository .save (placement );
54+
55+ User admin = loadAdmin (adminUserId );
56+ Map <String , Object > metadata = new LinkedHashMap <>();
57+ metadata .put ("adId" , saved .getAd ().getId ());
58+ metadata .put ("slotId" , saved .getSlot ().getId ());
59+ metadata .put ("startDate" , saved .getStartDate ());
60+ metadata .put ("endDate" , saved .getEndDate ());
61+ metadata .put ("weight" , saved .getWeight ());
62+ metadata .put ("enabled" , saved .getEnabled ());
63+
64+ adminAuditLogRepository .save (AdminAuditLog .of (
65+ admin ,
66+ AdminAuditAction .AD_PLACEMENT_CREATED ,
67+ AdminAuditTargetType .AD_PLACEMENT ,
68+ saved .getId (),
69+ null ,
70+ metadata
71+ ));
72+
73+ return saved ;
4374 }
4475
45- public AdPlacement updatePlacement (Long id ,
76+ public AdPlacement updatePlacement (Long adminUserId ,
77+ Long id ,
4678 Long slotId ,
4779 LocalDate startDate ,
4880 LocalDate endDate ,
@@ -52,18 +84,78 @@ public AdPlacement updatePlacement(Long id,
5284 .orElseThrow (() -> new NotFoundException ("존재하지 않는 광고 배치 id예요." ));
5385
5486 Slot slot = null ;
87+ Long previousSlotId = placement .getSlot () != null ? placement .getSlot ().getId () : null ;
88+ LocalDate previousStartDate = placement .getStartDate ();
89+ LocalDate previousEndDate = placement .getEndDate ();
90+ Short previousWeight = placement .getWeight ();
91+ Boolean previousEnabled = placement .getEnabled ();
5592 if (slotId != null ) {
5693 slot = slotRepository .findById (slotId )
5794 .orElseThrow (() -> new NotFoundException ("존재하지 않는 슬롯 id예요." ));
5895 }
5996
6097 placement .update (slot , startDate , endDate , weight , enabled );
98+
99+ User admin = loadAdmin (adminUserId );
100+ Map <String , Object > previous = new LinkedHashMap <>();
101+ previous .put ("slotId" , previousSlotId );
102+ previous .put ("startDate" , previousStartDate );
103+ previous .put ("endDate" , previousEndDate );
104+ previous .put ("weight" , previousWeight );
105+ previous .put ("enabled" , previousEnabled );
106+
107+ Map <String , Object > metadata = new LinkedHashMap <>();
108+ metadata .put ("adId" , placement .getAd ().getId ());
109+ metadata .put ("slotId" , placement .getSlot ().getId ());
110+ metadata .put ("startDate" , placement .getStartDate ());
111+ metadata .put ("endDate" , placement .getEndDate ());
112+ metadata .put ("weight" , placement .getWeight ());
113+ metadata .put ("enabled" , placement .getEnabled ());
114+ metadata .put ("previous" , previous );
115+
116+ adminAuditLogRepository .save (AdminAuditLog .of (
117+ admin ,
118+ AdminAuditAction .AD_PLACEMENT_UPDATED ,
119+ AdminAuditTargetType .AD_PLACEMENT ,
120+ placement .getId (),
121+ null ,
122+ metadata
123+ ));
61124 return placement ;
62125 }
63126
64- public void deletePlacement (Long id ) {
127+ public void deletePlacement (Long adminUserId , Long id ) {
65128 AdPlacement placement = adPlacementRepository .findById (id )
66129 .orElseThrow (() -> new NotFoundException ("존재하지 않는 광고 배치 id예요." ));
130+ Long adId = placement .getAd ().getId ();
131+ Long slotId = placement .getSlot ().getId ();
132+ LocalDate startDate = placement .getStartDate ();
133+ LocalDate endDate = placement .getEndDate ();
134+ Short weight = placement .getWeight ();
135+ Boolean enabled = placement .getEnabled ();
67136 adPlacementRepository .delete (placement );
137+
138+ User admin = loadAdmin (adminUserId );
139+ Map <String , Object > metadata = new LinkedHashMap <>();
140+ metadata .put ("adId" , adId );
141+ metadata .put ("slotId" , slotId );
142+ metadata .put ("startDate" , startDate );
143+ metadata .put ("endDate" , endDate );
144+ metadata .put ("weight" , weight );
145+ metadata .put ("enabled" , enabled );
146+
147+ adminAuditLogRepository .save (AdminAuditLog .of (
148+ admin ,
149+ AdminAuditAction .AD_PLACEMENT_DELETED ,
150+ AdminAuditTargetType .AD_PLACEMENT ,
151+ id ,
152+ null ,
153+ metadata
154+ ));
155+ }
156+
157+ private User loadAdmin (Long adminUserId ) {
158+ return userRepository .findById (adminUserId )
159+ .orElseThrow (() -> new NotFoundException ("관리자 계정이 존재하지 않아요" ));
68160 }
69161}
0 commit comments