Jelajahi Sumber

Add stock api

Daniel Bohry 1 tahun lalu
induk
melakukan
483a064eee

+ 80 - 0
src/main/java/com/danielbohry/stocks/controller/StockController.java

@@ -0,0 +1,80 @@
+package com.danielbohry.stocks.controller;
+
+import com.danielbohry.stocks.domain.Quote;
+import com.danielbohry.stocks.service.StockService;
+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.nio.charset.StandardCharsets;
+import java.util.List;
+import java.util.Objects;
+
+import static java.time.LocalDateTime.now;
+
+@Slf4j
+@RestController
+@RequestMapping("api/stocks")
+@AllArgsConstructor
+@CrossOrigin
+public class StockController {
+
+    private final StockService service;
+
+    @GetMapping
+    public ResponseEntity<List<Quote>> getAll() {
+        List<Quote> response = service.get();
+        return ResponseEntity.ok(response);
+    }
+
+    @GetMapping("{code}")
+    public ResponseEntity<Quote> getByCode(@PathVariable String code) {
+        Quote response = service.get(code.toUpperCase());
+        return ResponseEntity.ok(response);
+    }
+
+    @PostMapping("/upload-csv")
+    public ResponseEntity<List<Quote>> uploadCsvFile(@RequestParam("file") MultipartFile file) {
+        if (file.isEmpty()) {
+            return ResponseEntity.badRequest().build();
+        }
+
+        try (BufferedReader reader = new BufferedReader(new InputStreamReader(file.getInputStream(), StandardCharsets.UTF_8))) {
+            List<Quote> quotes = reader.lines()
+                    .map(this::convert)
+                    .filter(Objects::nonNull)
+                    .toList();
+
+            List<Quote> response = service.update(quotes);
+
+            return ResponseEntity.ok(response);
+        } catch (Exception e) {
+            log.error("Failed to import csv", e);
+            return ResponseEntity.status(400).build();
+        }
+    }
+
+    private Quote convert(String input) {
+        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], price, now())
+                    : null;
+        } else if (value[0] != null && Objects.equals(value[3], "#N/A")) {
+            return null;
+        } else {
+            return null;
+        }
+
+    }
+
+}

+ 14 - 0
src/main/java/com/danielbohry/stocks/repository/StockRepository.java

@@ -2,6 +2,7 @@ package com.danielbohry.stocks.repository;
 
 import com.danielbohry.stocks.client.StockClient;
 import com.danielbohry.stocks.domain.Quote;
+import com.danielbohry.stocks.exception.NotFoundException;
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import feign.FeignException;
@@ -13,6 +14,7 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Repository;
 
 import java.math.BigDecimal;
+import java.util.List;
 
 import static java.time.LocalDateTime.now;
 
@@ -30,6 +32,18 @@ public class StockRepository {
         this.key = key;
     }
 
+    public List<Quote> findAll() {
+        return repository.findAll();
+    }
+
+    public Quote findByCode(String code) {
+        return repository.findByCode(code).orElseThrow(() -> new NotFoundException("Couldn't find any stock with: " + code));
+    }
+
+    public List<Quote> update(List<Quote> quote) {
+        return repository.saveAll(quote);
+    }
+
     public boolean isValid(String code) {
         Quote quote = repository.findByCode(code).orElse(null);
 

+ 14 - 0
src/main/java/com/danielbohry/stocks/service/StockService.java

@@ -6,6 +6,8 @@ import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+
 @Slf4j
 @Service
 @AllArgsConstructor
@@ -13,6 +15,18 @@ public class StockService {
 
     private StockRepository repository;
 
+    public List<Quote> get() {
+        return repository.findAll();
+    }
+
+    public Quote get(String code) {
+        return repository.findByCode(code);
+    }
+
+    public List<Quote> update(List<Quote> quotes) {
+        return repository.update(quotes);
+    }
+
     public boolean isValid(String code) {
         return repository.isValid(code);
     }