Skip to content

Commit

Permalink
feature: Submit building subscription
Browse files Browse the repository at this point in the history
  • Loading branch information
Tran Gia Bao committed Feb 25, 2025
1 parent 4ddb062 commit c899364
Show file tree
Hide file tree
Showing 19 changed files with 401 additions and 1 deletion.
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package enterprise.dtos;

import enterprise.entities.CreditConvertType;

import java.util.UUID;

public record CreditConvertRatioDTO(UUID id, int version, double ratio, CreditConvertType convertType) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package enterprise.dtos;

import enterprise.entities.TransactionType;
import jakarta.validation.constraints.Min;

import java.util.UUID;

public record SubscribeRequestDTO(
UUID buildingId,
@Min(1) int months,
@Min(100) int numberOfDevices,
double monthRatio,
double deviceRatio,
TransactionType type) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package enterprise.entities;

import commons.springfw.impl.entities.AbstractAuditableEntity;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.Table;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Entity
@Table(name = "credit_convert_ratio")
@Getter
@Setter
@NoArgsConstructor
public class CreditConvertRatioEntity extends AbstractAuditableEntity {

@Column(name = "ratio")
private double ratio;

@Enumerated(EnumType.STRING)
@Column(name = "convert_type", unique = true)
private CreditConvertType convertType;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package enterprise.entities;

public enum CreditConvertType {
MONTH,
DEVICE
}
Original file line number Diff line number Diff line change
@@ -1,16 +1,23 @@
package enterprise.entities;

import commons.springfw.impl.entities.AbstractAuditableEntity;
import jakarta.persistence.CascadeType;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.OneToMany;
import jakarta.persistence.Table;
import jakarta.validation.constraints.NotNull;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;

@Entity
@Table(name = "subscriptions")
@Getter
Expand All @@ -23,4 +30,27 @@ public class SubscriptionEntity extends AbstractAuditableEntity {
@JoinColumn(name = "building_id", nullable = false)
private BuildingEntity building;

@Column(name = "start_date")
private LocalDate startDate;

@Column(name = "end_date")
private LocalDate endDate;

@Column(name = "max_number_of_devices")
private int maxNumberOfDevices;

@OneToMany(fetch = FetchType.LAZY,
cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH, CascadeType.DETACH},
mappedBy = "subscription")
private List<TransactionEntity> transaction = new ArrayList<>();

public boolean isValid() {
LocalDate now = LocalDate.now();
return !now.isBefore(startDate)
&& !now.isAfter(endDate);
}

public void addTransaction(TransactionEntity transaction) {
this.transaction.add(transaction);
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
package enterprise.entities;

import commons.springfw.impl.entities.AbstractAuditableEntity;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.FetchType;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
Expand All @@ -28,4 +31,21 @@ public class TransactionEntity extends AbstractAuditableEntity {
@JoinColumn(name = "building_id", nullable = false)
private BuildingEntity building;

@Enumerated(value = EnumType.STRING)
@Column(name = "transaction_type")
private TransactionType transactionType;

@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "subscription_id", nullable = false)
private SubscriptionEntity subscription;

@Column(name = "amount")
private double amount;

@Column(name = "months")
private int months;

@Column(name = "number_of_devices")
private int numberOfDevices;

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package enterprise.entities;

public enum TransactionType {
NEW_PURCHASE,
UPGRADE
}
Original file line number Diff line number Diff line change
Expand Up @@ -37,4 +37,11 @@ public void deposit(long amount) {
balance += amount;
}

public void withdraw(long amount) {
if (amount > balance) {
throw new IllegalArgumentException("Insufficient balance");
}
balance -= amount;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package enterprise.mappers;

import enterprise.dtos.CreditConvertRatioDTO;
import enterprise.entities.CreditConvertRatioEntity;
import org.mapstruct.Mapper;
import org.mapstruct.MappingConstants;

@Mapper(componentModel = MappingConstants.ComponentModel.SPRING)
public interface CreditConvertRatioMapper {

CreditConvertRatioDTO toDTO(CreditConvertRatioEntity entity);

CreditConvertRatioEntity toEntity(CreditConvertRatioDTO dto);

}
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,13 @@
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import java.util.List;
import java.util.UUID;

public interface BuildingRepository extends AbstractBaseRepository<BuildingEntity> {

Page<BuildingEntity> findByEnterpriseId(UUID enterpriseId, Pageable pageable);

List<BuildingEntity> findAllByEnterpriseId(UUID enterpriseId);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package enterprise.repositories;

import enterprise.entities.CreditConvertRatioEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import java.util.UUID;

@Repository
public interface CreditConvertRatioRepository extends JpaRepository<CreditConvertRatioEntity, UUID> {
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,20 @@
package enterprise.repositories;

import commons.springfw.impl.repositories.AbstractBaseRepository;
import enterprise.entities.BuildingEntity;
import enterprise.entities.SubscriptionEntity;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import java.time.LocalDate;
import java.util.List;

public interface SubscriptionRepository extends AbstractBaseRepository<SubscriptionEntity> {

@Query(value = """
select s from SubscriptionEntity s
where s.startDate <= :now
and s.endDate >= :now
""")
List<SubscriptionEntity> findAllValidSubscriptions(@Param("now") LocalDate now);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package enterprise.rest;


import enterprise.dtos.CreditConvertRatioDTO;
import enterprise.dtos.SubscribeRequestDTO;
import enterprise.mappers.CreditConvertRatioMapper;
import enterprise.services.SubscriptionService;
import green_buildings.commons.api.security.UserRole;
import jakarta.annotation.security.RolesAllowed;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequestMapping("/api/subscription")
@RequiredArgsConstructor
public class SubscriptionController {

private final SubscriptionService subscriptionService;
private final CreditConvertRatioMapper creditConvertRatioMapper;


@GetMapping("/convert-ratio")
public ResponseEntity<List<CreditConvertRatioDTO>> getCreditConvertRatio() {
List<CreditConvertRatioDTO> list = subscriptionService.getCreditConvertRatios().stream().map(creditConvertRatioMapper::toDTO).toList();
return ResponseEntity.ok(list);
}

@PostMapping
@RolesAllowed(value = {UserRole.RoleNameConstant.ENTERPRISE_OWNER})
public ResponseEntity<Void> subscribe(@RequestBody @Valid SubscribeRequestDTO request) {
subscriptionService.subscribe(request);
return ResponseEntity.status(HttpStatus.CREATED).build();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package enterprise.services;

import enterprise.dtos.SubscribeRequestDTO;
import enterprise.entities.CreditConvertRatioEntity;
import jakarta.validation.Valid;

import java.util.List;

public interface SubscriptionService {
List<CreditConvertRatioEntity> getCreditConvertRatios();

void subscribe(@Valid SubscribeRequestDTO request);
}
Loading

0 comments on commit c899364

Please sign in to comment.