#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.