Skip to content

Commit a391dd5

Browse files
committed
refactor: do not expose TransactionRepository
now that we have a TransactionService, all calls from controller etc. layers should go through it instead of directly accessing repository layer.
1 parent 3d05723 commit a391dd5

File tree

5 files changed

+43
-24
lines changed

5 files changed

+43
-24
lines changed

src/main/java/de/rwth/idsg/steve/service/TransactionService.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,15 @@
2020

2121
import de.rwth.idsg.steve.repository.TransactionRepository;
2222
import de.rwth.idsg.steve.repository.dto.Transaction;
23+
import de.rwth.idsg.steve.repository.dto.TransactionDetails;
2324
import de.rwth.idsg.steve.web.dto.TransactionQueryForm;
2425
import lombok.RequiredArgsConstructor;
2526
import lombok.extern.slf4j.Slf4j;
2627
import org.springframework.stereotype.Service;
2728

29+
import java.io.Writer;
30+
import java.util.List;
31+
2832
/**
2933
* @author Sevket Goekay <[email protected]>
3034
* @since 02.10.2025
@@ -36,6 +40,22 @@ public class TransactionService {
3640

3741
private final TransactionRepository transactionRepository;
3842

43+
public List<Transaction> getTransactions(TransactionQueryForm form) {
44+
return transactionRepository.getTransactions(form);
45+
}
46+
47+
public void writeTransactionsCSV(TransactionQueryForm form, Writer writer) {
48+
transactionRepository.writeTransactionsCSV(form, writer);
49+
}
50+
51+
public List<Integer> getActiveTransactionIds(String chargeBoxId) {
52+
return transactionRepository.getActiveTransactionIds(chargeBoxId);
53+
}
54+
55+
public TransactionDetails getDetails(int transactionPk) {
56+
return transactionRepository.getDetails(transactionPk);
57+
}
58+
3959
public Transaction getTransaction(int transactionPk) {
4060
TransactionQueryForm form = new TransactionQueryForm();
4161
form.setTransactionPk(transactionPk);

src/main/java/de/rwth/idsg/steve/web/api/TransactionsRestController.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@
1919
package de.rwth.idsg.steve.web.api;
2020

2121
import de.rwth.idsg.steve.SteveException;
22-
import de.rwth.idsg.steve.repository.TransactionRepository;
2322
import de.rwth.idsg.steve.repository.dto.Transaction;
23+
import de.rwth.idsg.steve.service.TransactionService;
2424
import de.rwth.idsg.steve.web.api.ApiControllerAdvice.ApiErrorResponse;
2525
import de.rwth.idsg.steve.web.dto.TransactionQueryForm;
2626
import io.swagger.v3.oas.annotations.Operation;
@@ -57,7 +57,7 @@ A transaction represents a charging session at a charge box (i.e. charging stati
5757
@RequiredArgsConstructor
5858
public class TransactionsRestController {
5959

60-
private final TransactionRepository transactionRepository;
60+
private final TransactionService transactionService;
6161

6262
@Operation(description = """
6363
Returns a list of transactions based on the query parameters.
@@ -77,7 +77,7 @@ public List<Transaction> get(@Valid @ParameterObject TransactionQueryForm.Transa
7777
throw new SteveException.BadRequest("returnCSV=true is not supported for API calls");
7878
}
7979

80-
var response = transactionRepository.getTransactions(params);
80+
var response = transactionService.getTransactions(params);
8181
log.debug("Read response for query: {}", response);
8282
return response;
8383
}

src/main/java/de/rwth/idsg/steve/web/controller/AjaxCallController.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
import com.fasterxml.jackson.databind.ObjectMapper;
2424
import de.rwth.idsg.steve.repository.ChargePointRepository;
2525
import de.rwth.idsg.steve.repository.ReservationRepository;
26-
import de.rwth.idsg.steve.repository.TransactionRepository;
26+
import de.rwth.idsg.steve.service.TransactionService;
2727
import lombok.RequiredArgsConstructor;
2828
import lombok.extern.slf4j.Slf4j;
2929
import org.springframework.http.MediaType;
@@ -33,7 +33,6 @@
3333
import org.springframework.web.bind.annotation.RequestMethod;
3434
import org.springframework.web.bind.annotation.ResponseBody;
3535

36-
import jakarta.annotation.PostConstruct;
3736
import jakarta.servlet.http.HttpServletResponse;
3837

3938
import java.io.IOException;
@@ -56,7 +55,7 @@ public class AjaxCallController {
5655
private final ObjectMapper objectMapper = createMapper();
5756

5857
private final ChargePointRepository chargePointRepository;
59-
private final TransactionRepository transactionRepository;
58+
private final TransactionService transactionService;
6059
private final ReservationRepository reservationRepository;
6160

6261
// -------------------------------------------------------------------------
@@ -81,7 +80,7 @@ public void getConnectorIds(@PathVariable("chargeBoxId") String chargeBoxId,
8180
@RequestMapping(value = TRANSACTION_IDS_PATH)
8281
public void getTransactionIds(@PathVariable("chargeBoxId") String chargeBoxId,
8382
HttpServletResponse response) throws IOException {
84-
String s = serializeArray(transactionRepository.getActiveTransactionIds(chargeBoxId));
83+
String s = serializeArray(transactionService.getActiveTransactionIds(chargeBoxId));
8584
writeOutput(response, s);
8685
}
8786

src/main/java/de/rwth/idsg/steve/web/controller/TransactionsReservationsController.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@
2121
import de.rwth.idsg.steve.repository.ChargePointRepository;
2222
import de.rwth.idsg.steve.repository.ReservationRepository;
2323
import de.rwth.idsg.steve.repository.ReservationStatus;
24-
import de.rwth.idsg.steve.repository.TransactionRepository;
2524
import de.rwth.idsg.steve.service.OcppTagService;
25+
import de.rwth.idsg.steve.service.TransactionService;
2626
import de.rwth.idsg.steve.service.TransactionStopService;
2727
import de.rwth.idsg.steve.web.dto.ReservationQueryForm;
2828
import de.rwth.idsg.steve.web.dto.TransactionQueryForm;
@@ -51,7 +51,7 @@
5151
@RequestMapping(value = "/manager", method = RequestMethod.GET)
5252
public class TransactionsReservationsController {
5353

54-
private final TransactionRepository transactionRepository;
54+
private final TransactionService transactionService;
5555
private final ReservationRepository reservationRepository;
5656
private final ChargePointRepository chargePointRepository;
5757
private final OcppTagService ocppTagService;
@@ -79,7 +79,7 @@ public String getTransactions(Model model) {
7979
TransactionQueryForm params = new TransactionQueryForm();
8080
initList(model);
8181

82-
model.addAttribute("transList", transactionRepository.getTransactions(params));
82+
model.addAttribute("transList", transactionService.getTransactions(params));
8383
model.addAttribute(PARAMS, params);
8484
return "data-man/transactions";
8585
}
@@ -92,7 +92,7 @@ public String stopTransaction(@PathVariable("transactionPk") int transactionPk)
9292

9393
@RequestMapping(value = TRANSACTIONS_DETAILS_PATH)
9494
public String getTransactionDetails(@PathVariable("transactionPk") int transactionPk, Model model) {
95-
model.addAttribute("details", transactionRepository.getDetails(transactionPk));
95+
model.addAttribute("details", transactionService.getDetails(transactionPk));
9696
return "data-man/transactionDetails";
9797
}
9898

@@ -112,11 +112,11 @@ public String getTransactionsQuery(@Valid @ModelAttribute(PARAMS) TransactionQue
112112
String headerValue = String.format("attachment; filename=\"%s\"", fileName);
113113
response.setContentType("text/csv");
114114
response.setHeader(headerKey, headerValue);
115-
transactionRepository.writeTransactionsCSV(params, response.getWriter());
115+
transactionService.writeTransactionsCSV(params, response.getWriter());
116116
return null;
117117

118118
} else {
119-
model.addAttribute("transList", transactionRepository.getTransactions(params));
119+
model.addAttribute("transList", transactionService.getTransactions(params));
120120
initList(model);
121121
model.addAttribute(PARAMS, params);
122122
return "data-man/transactions";

src/test/java/de/rwth/idsg/steve/web/api/TransactionRestControllerTest.java

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@
1818
*/
1919
package de.rwth.idsg.steve.web.api;
2020

21-
import de.rwth.idsg.steve.repository.TransactionRepository;
2221
import de.rwth.idsg.steve.repository.dto.Transaction;
22+
import de.rwth.idsg.steve.service.TransactionService;
2323
import de.rwth.idsg.steve.web.dto.TransactionQueryForm;
2424
import org.joda.time.DateTime;
2525
import org.junit.jupiter.api.BeforeEach;
@@ -55,13 +55,13 @@
5555
public class TransactionRestControllerTest extends AbstractControllerTest {
5656

5757
@Mock
58-
private TransactionRepository transactionRepository;
58+
private TransactionService transactionService;
5959

6060
private MockMvc mockMvc;
6161

6262
@BeforeEach
6363
public void setup() {
64-
mockMvc = MockMvcBuilders.standaloneSetup(new TransactionsRestController(transactionRepository))
64+
mockMvc = MockMvcBuilders.standaloneSetup(new TransactionsRestController(transactionService))
6565
.setControllerAdvice(new ApiControllerAdvice())
6666
.setMessageConverters(new MappingJackson2HttpMessageConverter(objectMapper))
6767
.alwaysExpect(content().contentType("application/json"))
@@ -75,7 +75,7 @@ public void test1() throws Exception {
7575
List<Transaction> results = Collections.emptyList();
7676

7777
// when
78-
when(transactionRepository.getTransactions(any())).thenReturn(results);
78+
when(transactionService.getTransactions(any())).thenReturn(results);
7979

8080
// then
8181
mockMvc.perform(get("/api/v1/transactions"))
@@ -90,7 +90,7 @@ public void test2() throws Exception {
9090
List<Transaction> results = List.of(Transaction.builder().id(234).build());
9191

9292
// when
93-
when(transactionRepository.getTransactions(any())).thenReturn(results);
93+
when(transactionService.getTransactions(any())).thenReturn(results);
9494

9595
// then
9696
mockMvc.perform(get("/api/v1/transactions"))
@@ -104,7 +104,7 @@ public void test2() throws Exception {
104104
@DisplayName("Downstream bean throws exception, expected 500")
105105
public void test3() throws Exception {
106106
// when
107-
when(transactionRepository.getTransactions(any())).thenThrow(new RuntimeException("failed"));
107+
when(transactionService.getTransactions(any())).thenThrow(new RuntimeException("failed"));
108108

109109
// then
110110
mockMvc.perform(get("/api/v1/transactions"))
@@ -173,7 +173,7 @@ public void test8() throws Exception {
173173
.build();
174174

175175
// when
176-
when(transactionRepository.getTransactions(any())).thenReturn(List.of(transaction));
176+
when(transactionService.getTransactions(any())).thenReturn(List.of(transaction));
177177

178178
// then
179179
mockMvc.perform(get("/api/v1/transactions")
@@ -216,14 +216,14 @@ public void test10() throws Exception {
216216
ArgumentCaptor<TransactionQueryForm.TransactionQueryFormForApi> formToCapture = ArgumentCaptor.forClass(TransactionQueryForm.TransactionQueryFormForApi.class);
217217

218218
// when
219-
when(transactionRepository.getTransactions(any())).thenReturn(Collections.emptyList());
219+
when(transactionService.getTransactions(any())).thenReturn(Collections.emptyList());
220220

221221
// then
222222
mockMvc.perform(get("/api/v1/transactions")
223223
.param("type", "ACTIVE"))
224224
.andExpect(status().isOk());
225225

226-
verify(transactionRepository).getTransactions(formToCapture.capture());
226+
verify(transactionService).getTransactions(formToCapture.capture());
227227
TransactionQueryForm.TransactionQueryFormForApi capturedForm = formToCapture.getValue();
228228

229229
assertEquals(capturedForm.getType(), TransactionQueryForm.QueryType.ACTIVE);
@@ -237,14 +237,14 @@ public void test11() throws Exception {
237237
ArgumentCaptor<TransactionQueryForm.TransactionQueryFormForApi> formToCapture = ArgumentCaptor.forClass(TransactionQueryForm.TransactionQueryFormForApi.class);
238238

239239
// when
240-
when(transactionRepository.getTransactions(any())).thenReturn(Collections.emptyList());
240+
when(transactionService.getTransactions(any())).thenReturn(Collections.emptyList());
241241

242242
// then
243243
mockMvc.perform(get("/api/v1/transactions")
244244
.param("periodType", "LAST_30"))
245245
.andExpect(status().isOk());
246246

247-
verify(transactionRepository).getTransactions(formToCapture.capture());
247+
verify(transactionService).getTransactions(formToCapture.capture());
248248
TransactionQueryForm.TransactionQueryFormForApi capturedForm = formToCapture.getValue();
249249

250250
assertEquals(capturedForm.getType(), TransactionQueryForm.QueryType.ALL);

0 commit comments

Comments
 (0)