Index: backend/src/main/java/com/tradingmk/backend/controller/PortfolioController.java
===================================================================
--- backend/src/main/java/com/tradingmk/backend/controller/PortfolioController.java	(revision 26ff3f4fa91935941d258a18cc70a63da4f45c12)
+++ backend/src/main/java/com/tradingmk/backend/controller/PortfolioController.java	(revision 71f83ac555e5618316e5a44ad70df950db1bce85)
@@ -2,4 +2,9 @@
 
 
+import com.tradingmk.backend.dto.PortfolioDTO;
+import com.tradingmk.backend.dto.PortfolioHoldingDTO;
+import com.tradingmk.backend.dto.PortfolioResponse;
+import com.tradingmk.backend.model.PortfolioHolding;
+import com.tradingmk.backend.repository.PortfolioHoldingRepository;
 import com.tradingmk.backend.repository.PortfolioRepository;
 import com.tradingmk.backend.repository.UserRepository;
@@ -11,4 +16,7 @@
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.List;
+import java.util.stream.Collectors;
+
 @RestController
 @RequestMapping("/api/portfolio")
@@ -17,8 +25,10 @@
     private final PortfolioRepository portfolioRepository;
     private final UserRepository userRepository;
+    private final PortfolioHoldingRepository portfolioHoldingRepository;
 
-    public PortfolioController(PortfolioRepository portfolioRepository, UserRepository userRepository) {
+    public PortfolioController(PortfolioRepository portfolioRepository, UserRepository userRepository, PortfolioHoldingRepository portfolioHoldingRepository) {
         this.portfolioRepository = portfolioRepository;
         this.userRepository = userRepository;
+        this.portfolioHoldingRepository = portfolioHoldingRepository;
     }
 
@@ -31,4 +41,16 @@
                 .orElseThrow(() -> new RuntimeException("portfolio not found"));
 
+
+        List<PortfolioHoldingDTO> holdings = portfolioHoldingRepository.findByPortfolioId(portfolio.getId())
+                .stream()
+                .map(holding -> new PortfolioHoldingDTO(
+                        holding.getStockSymbol(),
+                        holding.getQuantity(),
+                        holding.getAvgPrice()
+                ))
+                .collect(Collectors.toList());
+
+        PortfolioDTO portfolioDTO = new PortfolioDTO(portfolio.getBalance(), holdings);
+
         return ResponseEntity.ok(portfolio);
     }
Index: backend/src/main/java/com/tradingmk/backend/dto/PortfolioDTO.java
===================================================================
--- backend/src/main/java/com/tradingmk/backend/dto/PortfolioDTO.java	(revision 71f83ac555e5618316e5a44ad70df950db1bce85)
+++ backend/src/main/java/com/tradingmk/backend/dto/PortfolioDTO.java	(revision 71f83ac555e5618316e5a44ad70df950db1bce85)
@@ -0,0 +1,22 @@
+package com.tradingmk.backend.dto;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+public class PortfolioDTO {
+    private BigDecimal balance;
+    private List<PortfolioHoldingDTO> holdings;
+
+    public PortfolioDTO(BigDecimal balance, List<PortfolioHoldingDTO> holdings) {
+        this.balance = balance;
+        this.holdings = holdings;
+    }
+
+    public BigDecimal getBalance() {
+        return balance;
+    }
+
+    public List<PortfolioHoldingDTO> getHoldings() {
+        return holdings;
+    }
+}
Index: backend/src/main/java/com/tradingmk/backend/dto/PortfolioHoldingDTO.java
===================================================================
--- backend/src/main/java/com/tradingmk/backend/dto/PortfolioHoldingDTO.java	(revision 71f83ac555e5618316e5a44ad70df950db1bce85)
+++ backend/src/main/java/com/tradingmk/backend/dto/PortfolioHoldingDTO.java	(revision 71f83ac555e5618316e5a44ad70df950db1bce85)
@@ -0,0 +1,27 @@
+package com.tradingmk.backend.dto;
+
+import java.math.BigDecimal;
+
+public class PortfolioHoldingDTO {
+    private String stockSymbol;
+    private int quantity;
+    private BigDecimal avgPrice;
+
+    public PortfolioHoldingDTO(String stockSymbol, int quantity, BigDecimal avgPrice) {
+        this.stockSymbol = stockSymbol;
+        this.quantity = quantity;
+        this.avgPrice = avgPrice;
+    }
+
+    public String getStockSymbol() {
+        return stockSymbol;
+    }
+
+    public int getQuantity() {
+        return quantity;
+    }
+
+    public BigDecimal getAvgPrice() {
+        return avgPrice;
+    }
+}
Index: backend/src/main/java/com/tradingmk/backend/dto/PortfolioResponse.java
===================================================================
--- backend/src/main/java/com/tradingmk/backend/dto/PortfolioResponse.java	(revision 71f83ac555e5618316e5a44ad70df950db1bce85)
+++ backend/src/main/java/com/tradingmk/backend/dto/PortfolioResponse.java	(revision 71f83ac555e5618316e5a44ad70df950db1bce85)
@@ -0,0 +1,12 @@
+package com.tradingmk.backend.dto;
+
+import com.tradingmk.backend.model.PortfolioHolding;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+public record PortfolioResponse(
+        Long portfolioId,
+        BigDecimal balance,
+        List<PortfolioHolding> holdings
+) {}
Index: backend/src/main/java/com/tradingmk/backend/model/PortfolioHolding.java
===================================================================
--- backend/src/main/java/com/tradingmk/backend/model/PortfolioHolding.java	(revision 71f83ac555e5618316e5a44ad70df950db1bce85)
+++ backend/src/main/java/com/tradingmk/backend/model/PortfolioHolding.java	(revision 71f83ac555e5618316e5a44ad70df950db1bce85)
@@ -0,0 +1,37 @@
+package com.tradingmk.backend.model;
+
+
+import com.tradingmk.backend.repository.PortfolioRepository;
+import jakarta.persistence.*;
+import lombok.*;
+
+import javax.sound.sampled.Port;
+import java.math.BigDecimal;
+
+@Entity
+@Table(name = "portfolio_holdings")
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class PortfolioHolding  {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Long id;
+
+
+    @ManyToOne(optional = false)
+    @JoinColumn(name = "portfolio_id", nullable = false)
+    private Portfolio portfolio;
+
+    @Column(nullable = false)
+    private String stockSymbol;
+
+    @Column(nullable = false)
+    private Integer quantity;
+
+    @Column(nullable = false)
+    private BigDecimal avgPrice;
+}
Index: backend/src/main/java/com/tradingmk/backend/repository/PortfolioHoldingRepository.java
===================================================================
--- backend/src/main/java/com/tradingmk/backend/repository/PortfolioHoldingRepository.java	(revision 71f83ac555e5618316e5a44ad70df950db1bce85)
+++ backend/src/main/java/com/tradingmk/backend/repository/PortfolioHoldingRepository.java	(revision 71f83ac555e5618316e5a44ad70df950db1bce85)
@@ -0,0 +1,12 @@
+package com.tradingmk.backend.repository;
+
+import com.tradingmk.backend.model.PortfolioHolding;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.List;
+import java.util.Optional;
+
+public interface PortfolioHoldingRepository extends JpaRepository<PortfolioHolding,Long> {
+    List<PortfolioHolding> findByPortfolioId(Long portfolioId);
+    Optional<PortfolioHolding> findByPortfolioIdAndStockSymbol(Long portfolioId, String stockSymbol);
+}
Index: backend/src/main/java/com/tradingmk/backend/service/PortfolioService.java
===================================================================
--- backend/src/main/java/com/tradingmk/backend/service/PortfolioService.java	(revision 71f83ac555e5618316e5a44ad70df950db1bce85)
+++ backend/src/main/java/com/tradingmk/backend/service/PortfolioService.java	(revision 71f83ac555e5618316e5a44ad70df950db1bce85)
@@ -0,0 +1,96 @@
+package com.tradingmk.backend.service;
+
+import com.tradingmk.backend.model.Portfolio;
+import com.tradingmk.backend.model.PortfolioHolding;
+import com.tradingmk.backend.repository.PortfolioHoldingRepository;
+import com.tradingmk.backend.repository.PortfolioRepository;
+import jakarta.transaction.Transactional;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Service
+@RequiredArgsConstructor
+public class PortfolioService {
+
+    private final PortfolioRepository portfolioRepository;
+    private final PortfolioHoldingRepository holdingRepository;
+
+    public Portfolio getPortfolioByUserId(Long userId) {
+        return portfolioRepository.findByUserId(userId)
+                .orElseThrow(() -> new RuntimeException("pportfolio not found for user-id " + userId));
+    }
+
+    public List<PortfolioHolding> getHoldings(Long portfolioId) {
+        return holdingRepository.findByPortfolioId(portfolioId);
+    }
+
+
+    //need logic for buying a stock
+    @Transactional
+    public void buyStock(Long portfolioId, String stockSymbol, int quantity, BigDecimal pricePerUnit) {
+        Portfolio portfolio = portfolioRepository.findById(portfolioId)
+                .orElseThrow(() -> new RuntimeException("Portfolio not found"));
+
+
+        //multiply for how much stocks are bught
+        BigDecimal totalCost = pricePerUnit.multiply(BigDecimal.valueOf(quantity));
+
+        if (portfolio.getBalance().compareTo(totalCost) < 0) {
+            throw new RuntimeException("not enough balance to buy stock");
+        }
+
+        portfolio.setBalance(portfolio.getBalance().subtract(totalCost));
+
+        PortfolioHolding holding = holdingRepository
+                .findByPortfolioIdAndStockSymbol(portfolioId, stockSymbol)
+                .orElse(PortfolioHolding.builder()
+                        .portfolio(portfolio)
+                        .stockSymbol(stockSymbol)
+                        .quantity(0)
+                        .avgPrice(BigDecimal.ZERO)
+                        .build());
+
+        // avg price bought
+        // alkaloid 2 x 22.000 + alkaloid 3x 28.000 average od ova
+        BigDecimal currentTotalValue = holding.getAvgPrice().multiply(BigDecimal.valueOf(holding.getQuantity()));
+        BigDecimal newTotalValue = currentTotalValue.add(totalCost);
+        int newQuantity = holding.getQuantity() + quantity;
+        BigDecimal newAvgPrice = newTotalValue.divide(BigDecimal.valueOf(newQuantity), BigDecimal.ROUND_HALF_UP);
+
+        holding.setQuantity(newQuantity);
+        holding.setAvgPrice(newAvgPrice);
+
+        holdingRepository.save(holding);
+        portfolioRepository.save(portfolio);
+    }
+
+    //sell
+    @Transactional
+    public void sellStock(Long portfolioId, String stockSymbol, int quantity, BigDecimal pricePerUnit) {
+        Portfolio portfolio = portfolioRepository.findById(portfolioId)
+                .orElseThrow(() -> new RuntimeException("portfolio not found"));
+
+        PortfolioHolding holding = holdingRepository
+                .findByPortfolioIdAndStockSymbol(portfolioId, stockSymbol)
+                .orElseThrow(() -> new RuntimeException("stock not found in portfolio"));
+
+        if (holding.getQuantity() < quantity) {
+            throw new RuntimeException("not enough shares to sell");
+        }
+
+        BigDecimal totalGain = pricePerUnit.multiply(BigDecimal.valueOf(quantity));
+        holding.setQuantity(holding.getQuantity() - quantity);
+
+        if (holding.getQuantity() == 0) {
+            holdingRepository.delete(holding);
+        } else {
+            holdingRepository.save(holding);
+        }
+
+        portfolio.setBalance(portfolio.getBalance().add(totalGain));
+        portfolioRepository.save(portfolio);
+    }
+}
