package com.danielbohry.stocks.api.stock; import com.danielbohry.stocks.domain.Quote; import com.danielbohry.stocks.service.StockService; import io.swagger.v3.oas.annotations.Hidden; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import java.io.BufferedReader; import java.io.InputStreamReader; import java.math.BigDecimal; import java.util.List; import java.util.Objects; import static java.nio.charset.StandardCharsets.UTF_8; import static java.time.LocalDateTime.now; import static java.util.Collections.emptyList; @Slf4j @RestController @RequestMapping("api/stocks") @AllArgsConstructor @CrossOrigin public class StockController { private final StockService service; @GetMapping public ResponseEntity> find(@RequestParam(value = "q", required = false) String query) { if (query == null) { return ResponseEntity.ok(emptyList()); } List response = service.get(query); return ResponseEntity.ok(response); } @GetMapping("{code}") public ResponseEntity getByCode(@PathVariable String code) { Quote response = service.getByCode(code.toUpperCase()); return ResponseEntity.ok(response); } @Hidden @PostMapping("/upload-csv") public ResponseEntity uploadCsvFile(@RequestParam("file") MultipartFile file, @RequestParam("currency") String currency) { if (file.isEmpty()) { return ResponseEntity.badRequest().build(); } try (BufferedReader reader = new BufferedReader(new InputStreamReader(file.getInputStream(), UTF_8))) { List quotes = reader.lines() .map(r -> convert(r, currency)) .filter(Objects::nonNull) .toList(); List response = service.update(quotes); return ResponseEntity.ok(new StockUploadCSVResponse(response.size() + " entries updated.")); } catch (Exception e) { log.error("Failed to import csv", e); return ResponseEntity.status(400).build(); } } private Quote convert(String input, String currency) { String[] value = input.split(","); log.info("Importing [{}]", (Object) value); if (value[3] != null && !value[3].equals("#N/A")) { BigDecimal price = new BigDecimal(value[3]); return price.compareTo(BigDecimal.ZERO) > 0 ? new Quote(value[0], value[1], currency, price, now()) : null; } else if (value[0] != null && Objects.equals(value[3], "#N/A")) { return null; } else { return null; } } }