E-Ticaret Platformu Oluşturmak. Bölüm 4 : Rich Domain Modele Göre Microservicelerdeki Sınıfların Kodlarını oluşturmak


#ecommerce #applicaition #backend #ddd #microservice #kafka #hazelcast #richdomainmodel #spring #java #hibernate
E-Ticaret Platformu Oluşturmak. Bölüm 1 : İhtiyaçları Çıkarmak : https://www.turkninja.com/2023/08/e-ticaret-platformu-olusturmak-bolum-1.html

E-Ticaret Platformu Oluşturmak. Bölüm 2 : Domain Stroytelling : Katılımcılar, İş Akışları, Kullanıcı Hikayeleri, İlgili Terimler ve Konseptler (Domain), Geliştirme İçin Önceliklendirme, İlgili Dokümantasyonlar : https://www.turkninja.com/2023/08/e-ticaret-platformu-olusturmak-bolum-2.html

E-Ticaret Platformu Oluşturmak. Bölüm 3 : DDD (Domain-Driven Design): İlgili alt sistemleri ve sınırlı bağlamları tanımları, microservicler, paketler, classlar, class kodları : https://www.turkninja.com/2023/08/e-ticaret-platformu-olusturmak-bolum-3.html

E-Ticaret Platformu Oluşturmak. Bölüm 4 : Rich Domain Modele Göre Microservicelerdeki Sınıfların Kodlarını oluşturmak : https://www.turkninja.com/2023/08/e-ticaret-platformu-olusturmak-bolum-4.html

E-Ticaret Platformu Oluşturmak. Bölüm 5 : Apache Kafka ve Hazelcast Cache Entegrasyonu : https://www.turkninja.com/2023/08/e-ticaret-platformu-olusturmak-bolum-5.html

E-Ticaret Platformu Oluşturmak. Bölüm 6 : Uygulamayı Dockerize etme ve Docker Compose ile localde ayağa kaldırma : https://www.turkninja.com/2023/08/e-ticaret-platformu-olusturmak-bolum-5_17.html

E-Ticaret Platformu Oluşturmak. Bölüm 7 : Jenkins ile uygulamayı CI/CD Pipeline'ına sokarak Dockerize etme, Test Etme ve Kubernetes'e deploy etme : https://www.turkninja.com/2023/08/e-ticaret-platformu-olusturmak-bolum-7.html

Elbette! Aşağıda verilen her bir mikroservis için Rich Domain Model yaklaşımına uygun kod örnekleri sunacağım. Bu uzun bir süreç olabilir, bu yüzden aşağıdaki mikroservislerin her birini adım adım işleyeceğiz. İlk olarak "Kullanıcı Yönetimi Mikroservisi"ni ele alacağım.


1. Kullanıcı Yönetimi Microservisi

user Paketi

User Sınıfı

java

Copy code

@Entity

public class User {

    @Id

    private Long id;

    private String username;

    private String password;

    @Enumerated(EnumType.STRING)

    private Role role;


    // Diğer özellikler...


    public void changePassword(String oldPassword, String newPassword) {

        if (!this.password.equals(oldPassword)) {

            throw new IllegalArgumentException("Eski şifre yanlış.");

        }

        this.password = newPassword;

    }


    // Diğer metodlar...

}

Profile Sınıfı

java

Copy code

@Entity

public class Profile {

    @Id

    private Long id;

    private String fullName;

    private String email;


    @OneToOne

    private User user;


    public void updateProfile(String fullName, String email) {

        this.fullName = fullName;

        this.email = email;

    }


    // Diğer metodlar...

}

Role Enum

java

Copy code

public enum Role {

    ADMIN,

    CUSTOMER,

    SELLER;

}

password Paketi

PasswordResetToken Sınıfı

java

Copy code

@Entity

public class PasswordResetToken {

    @Id

    private Long id;

    private String token;

    @OneToOne

    private User user;


    public void validateToken(String token) {

        if (!this.token.equals(token)) {

            throw new IllegalArgumentException("Token geçersiz.");

        }

    }


    // Diğer metodlar...

}

Burada, User sınıfı içinde şifre değiştirme işlemini ve Profile sınıfı içinde profil güncelleme işlemini ele alarak Rich Domain Model yaklaşımını uyguladım.

Elbette, devam ediyoruz. Şimdi "Ürün Yönetimi Microservisi" üzerinde çalışacağız.


2. Ürün Yönetimi Microservisi

product Paketi

Product Sınıfı

java

Copy code

@Entity

public class Product {

    @Id

    private Long id;

    private String name;

    private double price;

    

    @ManyToOne

    private Category category;

    @OneToOne

    private Stock stock;


    public void updatePrice(double newPrice) {

        if (newPrice < 0) {

            throw new IllegalArgumentException("Fiyat negatif olamaz.");

        }

        this.price = newPrice;

    }


    // Diğer metodlar...

}

Category Sınıfı

java

Copy code

@Entity

public class Category {

    @Id

    private Long id;

    private String name;

    

    @OneToMany(mappedBy = "category")

    private List<SubCategory> subCategories;


    public void addSubCategory(SubCategory subCategory) {

        subCategories.add(subCategory);

        subCategory.setCategory(this);

    }


    // Diğer metodlar...

}

SubCategory Sınıfı

java

Copy code

@Entity

public class SubCategory {

    @Id

    private Long id;

    private String name;

    

    @ManyToOne

    private Category category;


    // Getter ve Setterlar...

}

Stock Sınıfı

java

Copy code

@Entity

public class Stock {

    @Id

    private Long id;

    private int quantity;


    public void reduceStock(int amount) {

        if (amount > quantity) {

            throw new IllegalArgumentException("Stok yetersiz.");

        }

        this.quantity -= amount;

    }


    // Diğer metodlar...

}

Bu mikroserviste, Product sınıfında ürün fiyatını güncelleme, Category sınıfında alt kategori ekleme ve Stock sınıfında stok miktarını azaltma gibi işlevler tanımladım.


Bu kodların içinde iş kurallarını ele alarak zengin model yaklaşımı (Rich Domain Model) uyguladım. İleriye dönük olarak, bu modelin daha karmaşık iş kurallarını ele almasına olanak tanır.


Elbette! İşte "Sepet ve Sipariş Yönetimi Microservisi" sınıflarının tam kodları.


cart Package

Cart Class

java

Copy code

@Entity

public class Cart {

    @Id

    private Long id;


    @OneToMany(mappedBy = "cart")

    private List<CartItem> items;


    public Cart() {

        this.items = new ArrayList<>();

    }


    public void addItem(Product product, int quantity) {

        CartItem item = new CartItem(product, quantity);

        items.add(item);

    }


    public void removeItem(CartItem item) {

        items.remove(item);

    }


    public double getTotal() {

        return items.stream()

                .mapToDouble(item -> item.getProduct().getPrice() * item.getQuantity())

                .sum();

    }


    // Getters and Setters...

}

CartItem Class

java

Copy code

@Entity

public class CartItem {

    @Id

    private Long id;

    private int quantity;


    @ManyToOne

    private Product product;


    public CartItem(Product product, int quantity) {

        this.product = product;

        this.quantity = quantity;

    }


    // Getters and Setters...

}

order Package

Order Class

java

Copy code

@Entity

public class Order {

    @Id

    private Long id;

    private LocalDateTime orderDate;


    @OneToMany(mappedBy = "order")

    private List<OrderItem> items;


    public Order() {

        this.orderDate = LocalDateTime.now();

        this.items = new ArrayList<>();

    }


    public void addItem(Product product, int quantity) {

        OrderItem item = new OrderItem(product, quantity);

        items.add(item);

    }


    public double getTotal() {

        return items.stream()

                .mapToDouble(item -> item.getProduct().getPrice() * item.getQuantity())

                .sum();

    }


    // Getters and Setters...

}

OrderItem Class

java

Copy code

@Entity

public class OrderItem {

    @Id

    private Long id;

    private int quantity;


    @ManyToOne

    private Product product;


    public OrderItem(Product product, int quantity) {

        this.product = product;

        this.quantity = quantity;

    }


    // Getters and Setters...

}

Bu mikroservisde, "Sepet" ve "Sipariş" için ilgili işlevler tanımlandı. getTotal gibi yardımcı metotlarla toplam fiyatı hesaplamak gibi işlevler de ekledim.


Elbette, devam ediyorum. Şimdi "Arama ve Öneri Microservisi" sınıflarının kodlarını sunuyorum.


Search and Recommendation Microservice

search Package

SearchEngine Class

java

Copy code

public class SearchEngine {

    @Autowired

    private ProductRepository productRepository;


    public List<Product> searchByKeyword(String keyword) {

        // Logic to search products by keyword

        return productRepository.findByKeyword(keyword);

    }


    public List<Product> searchByCategory(Category category) {

        // Logic to search products by category

        return productRepository.findByCategory(category);

    }


    // Other search methods...

}

recommendation Package

RecommendationAlgorithm Class

java

Copy code

public class RecommendationAlgorithm {

    @Autowired

    private UserRepository userRepository;

    @Autowired

    private ProductService productService;


    public List<Product> recommendProducts(User user) {

        // Logic to recommend products based on user behavior

        List<Product> recommendedProducts = new ArrayList<>();

        // Recommendation logic here

        return recommendedProducts;

    }


    public List<Product> recommendSimilarProducts(Product product) {

        // Logic to recommend similar products to a given product

        List<Product> similarProducts = new ArrayList<>();

        // Similarity logic here

        return similarProducts;

    }


    // Other recommendation methods...

}

Bu mikroservisde, "Arama Motoru" ve "Öneri Algoritması" için ilgili işlevler tanımlandı. searchByKeyword gibi arama metotları ve recommendProducts gibi öneri metotları bulunmaktadır.


Elbette! Şimdi "Kargo ve Lojistik Microservisi"ni ele alıyorum.


Shipping and Logistics Microservice

shipping Package

ShippingCompany Class

java

Copy code

public class ShippingCompany {

    private Long id;

    private String name;

    private List<Delivery> deliveries;


    public ShippingCompany(String name) {

        this.name = name;

    }


    // Getters and setters...


    public void addDelivery(Delivery delivery) {

        if (deliveries == null) {

            deliveries = new ArrayList<>();

        }

        deliveries.add(delivery);

    }

}

Delivery Class

java

Copy code

public class Delivery {

    private Long id;

    private ShippingCompany shippingCompany;

    private Order order;

    private TrackingStatus trackingStatus;


    public Delivery(ShippingCompany shippingCompany, Order order) {

        this.shippingCompany = shippingCompany;

        this.order = order;

        this.trackingStatus = TrackingStatus.PENDING;

    }


    // Getters and setters...


    public void updateStatus(TrackingStatus status) {

        this.trackingStatus = status;

    }

}

TrackingStatus Enum

java

Copy code

public enum TrackingStatus {

    PENDING,

    IN_TRANSIT,

    DELIVERED

}

ShippingService Class

java

Copy code

@Service

public class ShippingService {

    @Autowired

    private ShippingCompanyRepository shippingCompanyRepository;

    @Autowired

    private DeliveryRepository deliveryRepository;


    public void createShippingCompany(ShippingCompany shippingCompany) {

        // Logic to create a shipping company

        shippingCompanyRepository.save(shippingCompany);

    }


    public void addDeliveryToCompany(Long companyId, Delivery delivery) {

        // Logic to add a delivery to a shipping company

        ShippingCompany company = shippingCompanyRepository.findById(companyId).orElseThrow();

        company.addDelivery(delivery);

        shippingCompanyRepository.save(company);

    }


    public void updateDeliveryStatus(Long deliveryId, TrackingStatus status) {

        // Logic to update delivery status

        Delivery delivery = deliveryRepository.findById(deliveryId).orElseThrow();

        delivery.updateStatus(status);

        deliveryRepository.save(delivery);

    }


    // Other methods related to shipping and logistics...

}

Bu mikroservis, kargo ve lojistikle ilgili işlemleri ele almaktadır. Kargo firmaları, teslimatlar ve takip durumları gibi sınıfları ve işlevleri içerir.



Şimdi, "Özel Günler ve Etkinlikler Microservisi"ni ele alalım.


Special Days and Events Microservice

specialdays Package

Event Class

java

Copy code

public class Event {

    private Long id;

    private String name;

    private LocalDate startDate;

    private LocalDate endDate;

    private List<Promotion> promotions;


    public Event(String name, LocalDate startDate, LocalDate endDate) {

        this.name = name;

        this.startDate = startDate;

        this.endDate = endDate;

    }


    // Getters and setters...


    public void addPromotion(Promotion promotion) {

        if (promotions == null) {

            promotions = new ArrayList<>();

        }

        promotions.add(promotion);

    }

}

Promotion Class

java

Copy code

public class Promotion {

    private Long id;

    private Product product;

    private BigDecimal discountPercentage;


    public Promotion(Product product, BigDecimal discountPercentage) {

        this.product = product;

        this.discountPercentage = discountPercentage;

    }


    // Getters and setters...


    public BigDecimal applyDiscount() {

        return product.getPrice().subtract(product.getPrice().multiply(discountPercentage.divide(BigDecimal.valueOf(100))));

    }

}

SpecialDaysService Class

java

Copy code

@Service

public class SpecialDaysService {

    @Autowired

    private EventRepository eventRepository;

    @Autowired

    private PromotionRepository promotionRepository;


    public void createEvent(Event event) {

        // Logic to create a special event

        eventRepository.save(event);

    }


    public void addPromotionToEvent(Long eventId, Promotion promotion) {

        // Logic to add a promotion to a special event

        Event event = eventRepository.findById(eventId).orElseThrow();

        event.addPromotion(promotion);

        eventRepository.save(event);

    }


    public List<Promotion> getActivePromotions() {

        // Logic to retrieve active promotions

        // ...

    }


    // Other methods related to special days and events...

}

Bu mikroservis, e-ticaret platformunun özel günler ve etkinliklerle ilgili işlemlerini yönetir. Efsane Cuma, Yılbaşı İndirimleri gibi spesifik etkinlikler ve bunlarla ilişkili promosyonlar bu bağlamda ele alınır.

Please Select Embedded Mode To Show The Comment System.*

Daha yeni Daha eski

نموذج الاتصال