| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- package com.danielbohry.stocks.api.stock;
- import com.danielbohry.stocks.context.UserContextHolder;
- import com.danielbohry.stocks.domain.Quote;
- import com.danielbohry.stocks.domain.StockInfo;
- import com.danielbohry.stocks.service.StockInfoService;
- 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;
- @Slf4j
- @RestController
- @RequestMapping("api/stocks")
- @AllArgsConstructor
- @CrossOrigin
- public class StockController {
- private final StockService service;
- private final StockInfoService infoService;
- @GetMapping
- public ResponseEntity<List<Quote>> find(@RequestParam(value = "q", required = false) String query) {
- List<Quote> response = (query == null || query.isBlank())
- ? service.getAll()
- : service.get(query);
- return ResponseEntity.ok(response);
- }
- @GetMapping("{code}")
- public ResponseEntity<Quote> getByCode(@PathVariable String code) {
- Quote response = service.getByCode(code.toUpperCase());
- return ResponseEntity.ok(response);
- }
- @GetMapping("{code}/info")
- public ResponseEntity<StockInfo> getStockInfo(@PathVariable String code) {
- StockInfo response = infoService.get(code);
- return ResponseEntity.ok(response);
- }
- @Hidden
- @PostMapping("/upload-csv")
- public ResponseEntity<StockUploadCSVResponse> 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<Quote> quotes = reader.lines()
- .map(r -> convert(r, currency))
- .filter(Objects::nonNull)
- .toList();
- List<Quote> 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();
- }
- }
- @Hidden
- @PostMapping("/generate")
- public ResponseEntity<Void> generateStockInfo() {
- if (UserContextHolder.isAdmin()) {
- infoService.generate();
- }
- return ResponseEntity.ok().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;
- }
- }
- }
|