StockController.java 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. package com.danielbohry.stocks.api.stock;
  2. import com.danielbohry.stocks.domain.Quote;
  3. import com.danielbohry.stocks.service.StockService;
  4. import io.swagger.v3.oas.annotations.Hidden;
  5. import lombok.AllArgsConstructor;
  6. import lombok.extern.slf4j.Slf4j;
  7. import org.springframework.http.ResponseEntity;
  8. import org.springframework.web.bind.annotation.*;
  9. import org.springframework.web.multipart.MultipartFile;
  10. import java.io.BufferedReader;
  11. import java.io.InputStreamReader;
  12. import java.math.BigDecimal;
  13. import java.util.List;
  14. import java.util.Objects;
  15. import static java.nio.charset.StandardCharsets.UTF_8;
  16. import static java.time.LocalDateTime.now;
  17. import static java.util.Collections.emptyList;
  18. @Slf4j
  19. @RestController
  20. @RequestMapping("api/stocks")
  21. @AllArgsConstructor
  22. @CrossOrigin
  23. public class StockController {
  24. private final StockService service;
  25. @GetMapping
  26. public ResponseEntity<List<Quote>> find(@RequestParam(value = "q", required = false) String query) {
  27. if (query == null) {
  28. return ResponseEntity.ok(emptyList());
  29. }
  30. List<Quote> response = service.get(query);
  31. return ResponseEntity.ok(response);
  32. }
  33. @GetMapping("{code}")
  34. public ResponseEntity<Quote> getByCode(@PathVariable String code) {
  35. Quote response = service.getByCode(code.toUpperCase());
  36. return ResponseEntity.ok(response);
  37. }
  38. @Hidden
  39. @PostMapping("/upload-csv")
  40. public ResponseEntity<StockUploadCSVResponse> uploadCsvFile(@RequestParam("file") MultipartFile file, @RequestParam("currency") String currency) {
  41. if (file.isEmpty()) {
  42. return ResponseEntity.badRequest().build();
  43. }
  44. try (BufferedReader reader = new BufferedReader(new InputStreamReader(file.getInputStream(), UTF_8))) {
  45. List<Quote> quotes = reader.lines()
  46. .map(r -> convert(r, currency))
  47. .filter(Objects::nonNull)
  48. .toList();
  49. List<Quote> response = service.update(quotes);
  50. return ResponseEntity.ok(new StockUploadCSVResponse(response.size() + " entries updated."));
  51. } catch (Exception e) {
  52. log.error("Failed to import csv", e);
  53. return ResponseEntity.status(400).build();
  54. }
  55. }
  56. private Quote convert(String input, String currency) {
  57. String[] value = input.split(",");
  58. log.info("Importing [{}]", (Object) value);
  59. if (value[3] != null && !value[3].equals("#N/A")) {
  60. BigDecimal price = new BigDecimal(value[3]);
  61. return price.compareTo(BigDecimal.ZERO) > 0
  62. ? new Quote(value[0], value[1], currency, price, now())
  63. : null;
  64. } else if (value[0] != null && Objects.equals(value[3], "#N/A")) {
  65. return null;
  66. } else {
  67. return null;
  68. }
  69. }
  70. }