diff --git a/.DS_Store b/.DS_Store
new file mode 100644
index 0000000000000000000000000000000000000000..d3648d95df599d219c29e289112a6e4c5aa102b8
Binary files /dev/null and b/.DS_Store differ
diff --git a/src/.DS_Store b/src/.DS_Store
new file mode 100644
index 0000000000000000000000000000000000000000..762544dcee765c6eb61d0b4f482a5ac9e8dd1409
Binary files /dev/null and b/src/.DS_Store differ
diff --git a/src/main/.DS_Store b/src/main/.DS_Store
new file mode 100644
index 0000000000000000000000000000000000000000..7d2cf189b634358d6bdc3ace1bfaa3d97aa8c709
Binary files /dev/null and b/src/main/.DS_Store differ
diff --git a/src/main/java/com/nisum/ascend/inventory/controller/ProductController.java b/src/main/java/com/nisum/ascend/inventory/controller/ProductController.java
index 003a4b726bd7faef7e327aac900013cd3230c9ba..feff271214967eb56830047025b937714d83a56d 100644
--- a/src/main/java/com/nisum/ascend/inventory/controller/ProductController.java
+++ b/src/main/java/com/nisum/ascend/inventory/controller/ProductController.java
@@ -1,11 +1,22 @@
 package com.nisum.ascend.inventory.controller;
 
+import com.nisum.ascend.inventory.dto.ProductDto;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 import com.nisum.ascend.inventory.service.ProductService;
+import reactor.core.publisher.Flux;
 
 @RestController
+@RequestMapping("/api/products")
 public class ProductController {
     @Autowired
     ProductService productService;
+
+    @GetMapping()
+    public ResponseEntity<Flux<ProductDto>> getAllProducts() {
+        return ResponseEntity.ok(productService.findAllProducts());
+    }
 }
diff --git a/src/main/java/com/nisum/ascend/inventory/dto/ProductDto.java b/src/main/java/com/nisum/ascend/inventory/dto/ProductDto.java
index 24c4727a37ac47f23c8b6fe0ce8c617027975679..3bba3e3c30df3437ba903356b5116ff383d17be1 100644
--- a/src/main/java/com/nisum/ascend/inventory/dto/ProductDto.java
+++ b/src/main/java/com/nisum/ascend/inventory/dto/ProductDto.java
@@ -4,6 +4,9 @@ import lombok.AllArgsConstructor;
 import lombok.Getter;
 import com.nisum.ascend.inventory.model.Product;
 
+import java.util.ArrayList;
+import java.util.List;
+
 @Getter
 @AllArgsConstructor
 public class ProductDto {
@@ -16,14 +19,14 @@ public class ProductDto {
     private String brand;
     private String category;
     private int stock;
-    private PromotionDto promotion;
+    private List<PromotionDto> promotions;
 
 
     public static ProductDto generateDtoFromProduct(Product product) {
         // TODO: Fetch the product's promotion from the Promotions com.nisum.ascend.inventory.service
-        PromotionDto promotion = new PromotionDto();
+        List<PromotionDto> promotions = new ArrayList<>();
 
-        return new ProductDto(product.getSku(), product.getUpc(), product.getProductName(), product.getProductDescription(), product.getPrice(), product.getProductImageUrl(), product.getBrand(), product.getCategory(), product.getAvailableStock(), promotion);
+        return new ProductDto(product.getSku(), product.getUpc(), product.getProductName(), product.getProductDescription(), product.getPrice(), product.getProductImageUrl(), product.getBrand(), product.getCategory(), product.getAvailableStock(), promotions);
 
     }
 }
diff --git a/src/main/java/com/nisum/ascend/inventory/model/Product.java b/src/main/java/com/nisum/ascend/inventory/model/Product.java
index 21aff2fc0d441c6a1f28c4f14fcd5f7aa39057e7..aab05b9bcedd1c4b848fe3d7b6b288dce58fe723 100644
--- a/src/main/java/com/nisum/ascend/inventory/model/Product.java
+++ b/src/main/java/com/nisum/ascend/inventory/model/Product.java
@@ -8,7 +8,7 @@ import org.springframework.data.mongodb.core.mapping.Document;
 
 @Getter
 @Setter
-@Document
+@Document(collection = "products")
 public class Product {
     @Id
     private String id;
diff --git a/src/main/java/com/nisum/ascend/inventory/service/ProductService.java b/src/main/java/com/nisum/ascend/inventory/service/ProductService.java
index eb8517f3f0fb07922f90ded28ed3e36a6867ca76..c8a1fd058b81f680e57dbd9c4e9c167be97c6b66 100644
--- a/src/main/java/com/nisum/ascend/inventory/service/ProductService.java
+++ b/src/main/java/com/nisum/ascend/inventory/service/ProductService.java
@@ -1,6 +1,7 @@
 package com.nisum.ascend.inventory.service;
 
 import com.nisum.ascend.inventory.dto.ProductDto;
+import com.nisum.ascend.inventory.model.Product;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import reactor.core.publisher.Flux;
@@ -11,4 +12,10 @@ public class ProductService {
     @Autowired
     ProductRepository productRepository;
 
+    public Flux<ProductDto> findAllProducts() {
+        return productRepository.findAll()
+                .map(ProductDto::generateDtoFromProduct);
+    }
+
+
 }
diff --git a/src/test/java/com/nisum/ascend/inventory/controller/ProductControllerTest.java b/src/test/java/com/nisum/ascend/inventory/controller/ProductControllerTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..d33338c612598f734afe486984ba5f6e95fa1b8c
--- /dev/null
+++ b/src/test/java/com/nisum/ascend/inventory/controller/ProductControllerTest.java
@@ -0,0 +1,63 @@
+package com.nisum.ascend.inventory.controller;
+
+import com.nisum.ascend.inventory.controller.ProductController;
+import com.nisum.ascend.inventory.model.Product;
+import com.nisum.ascend.inventory.repository.ProductRepository;
+import lombok.extern.slf4j.Slf4j;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Mock;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.web.reactive.AutoConfigureWebTestClient;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+import org.springframework.test.web.reactive.server.WebTestClient;
+import org.springframework.web.reactive.function.client.WebClient;
+
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+@ExtendWith(SpringExtension.class)
+@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+@DirtiesContext
+@AutoConfigureWebTestClient
+@ActiveProfiles("test")
+@Slf4j
+class ProductControllerTest {
+
+    @Autowired
+    private WebTestClient webTestClient;
+
+    @BeforeEach
+    void setUp() {
+    }
+
+    @Test
+    void testFindAllProducts(){
+        webTestClient.get()
+                .uri("/api/products")
+                .exchange()
+                .expectStatus().isOk()
+                .expectHeader().contentType(MediaType.APPLICATION_JSON_VALUE)
+                .expectBodyList(Product.class)
+                .consumeWith(product ->{
+                    List<Product> products = product.getResponseBody();
+                    products.forEach( p ->{
+                        assertNotNull(p.getSku());
+                        assertNotNull(p.getUpc());
+                        System.out.println("Product SKU: " + p.getSku());
+                        System.out.println("Product UPC: " + p.getUpc());
+                    });
+                });
+    }
+
+
+}
\ No newline at end of file