Skip to content
Open

Hw11 #14

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions dev/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ services:
environment:
- SERVICE_ADDRESS=0.0.0.0
- MONGO_DB_URI=mongodb://mongo:27017/handyman
- LANDSCAPE_REST_URL=http://landscape-service:8081/
- LANDSCAPE_REST_URL=http://landscape-service:8081
- PG_DB_URL=jdbc:postgresql://postgres:5432/postgres?currentSchema=public&stringtype=unspecified
- PG_DB_USERNAME=postgres
- PG_DB_PASSWORD=123
Expand Down Expand Up @@ -52,7 +52,7 @@ services:
environment:
- SERVICE_ADDRESS=0.0.0.0
- MONGO_DB_URI=mongodb://mongo:27017/rancher
- LANDSCAPE_REST_URL=http://landscape-service:8081/
- LANDSCAPE_REST_URL=http://landscape-service:8081
- PG_DB_URL=jdbc:postgresql://postgres:5432/postgres?currentSchema=public&stringtype=unspecified
- PG_DB_USERNAME=postgres
- PG_DB_PASSWORD=123
Expand Down
4 changes: 4 additions & 0 deletions docs/homeworks-logs/hw11.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
## Сделал:
- [X] перенос сервисов handyman и rancher на Mongo
- [X] ручка для отчетов
- [ ] 100к документов в Монгу
9 changes: 0 additions & 9 deletions handyman-service/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ plugins {
id 'io.spring.dependency-management' version '1.0.15.RELEASE'
id 'java-library'
id 'com.google.protobuf' version "${protobufPluginVersion}"
id 'org.liquibase.gradle' version '2.2.0'
}

group = 'dev.archie'
Expand Down Expand Up @@ -67,17 +66,9 @@ ext {
dependencies {
implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'

implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
runtimeOnly 'org.postgresql:postgresql'
implementation 'org.springframework.boot:spring-boot-starter-data-mongodb'
testImplementation "org.testcontainers:mongodb:1.18.0"
liquibaseRuntime 'org.mongodb:bson:4.9.0'
liquibaseRuntime 'org.mongodb:mongodb-driver-core:4.9.0'
liquibaseRuntime 'org.mongodb:mongodb-driver-sync:4.9.0'
liquibaseRuntime 'org.liquibase.ext:liquibase-mongodb:4.20.0'
implementation 'org.liquibase:liquibase-core:4.20.0'
liquibaseRuntime 'info.picocli:picocli:4.6.1'
implementation 'org.yaml:snakeyaml:2.0'

implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'io.micrometer:micrometer-registry-prometheus'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,74 +2,37 @@

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import dev.archie.handymanservice.account.bank.Bank;
import dev.archie.handymanservice.user.HandymanUser;
import dev.archie.handymanservice.handyman.Handyman;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.hibernate.Hibernate;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import java.util.Objects;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.DocumentReference;

@Builder(toBuilder = true)
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@Entity
@Table(name = "account")
@AllArgsConstructor
@NoArgsConstructor
@Document(collection = "accounts")
public class Account {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false)
private Long id;
private String id;

private Long innerId;

@JsonIgnoreProperties("accounts")
@ManyToOne
@JoinColumn(name = "handyman_user_id")
private HandymanUser handymanUser;
@DocumentReference
private Handyman handyman;

@Column(name = "card_number")
private String cardNumber;

@Enumerated(EnumType.STRING)
@Column(name = "payment_system")
private PaymentSystem paymentSystem;

@ManyToOne
@JoinColumn(name = "bank_id")
@DocumentReference
private Bank bank;

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || Hibernate.getClass(this) != Hibernate.getClass(o)) return false;
Account account = (Account) o;
return getId() != null && Objects.equals(getId(), account.getId());
}

@Override
public int hashCode() {
return getClass().hashCode();
}

@Override
public String toString() {
return getClass().getSimpleName() + "(" +
"id = " + id + ", " +
"handymanUser = " + handymanUser + ", " +
"cardNumber = " + cardNumber + ", " +
"paymentSystem = " + paymentSystem + ")";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,22 +24,22 @@ public class AccountController {
private final BankService bankService;

@PostMapping("/{handymanUserId}")
public Account create(@RequestBody CreatingAccountDto accountDto, @PathVariable Long handymanUserId) {
public Account create(@RequestBody CreatingAccountDto accountDto, @PathVariable String handymanUserId) {
return accountService.create(accountDto, handymanUserId);
}

@GetMapping("/{id}")
public Account getById(Long id) {
public Account getById(@PathVariable String id) {
return accountService.getById(id);
}

@PutMapping("/{id}")
public Account update(@RequestBody CreatingAccountDto accountDto, @PathVariable Long id) {
public Account update(@RequestBody CreatingAccountDto accountDto, @PathVariable String id) {
return accountService.update(accountDto, id);
}

@DeleteMapping("/{id}")
public void delete(@PathVariable Long id) {
public void delete(@PathVariable String id) {
accountService.delete(id);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package dev.archie.handymanservice.account;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.mongodb.repository.MongoRepository;

public interface AccountRepository extends JpaRepository<Account, Long> {
public interface AccountRepository extends MongoRepository<Account, String> {
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@
import dev.archie.handymanservice.account.bank.BankService;
import dev.archie.handymanservice.account.dto.CreatingAccountDto;
import dev.archie.handymanservice.account.exception.NoSuchAccountException;
import dev.archie.handymanservice.handyman.Handyman;
import dev.archie.handymanservice.handyman.HandymanRepository;
import dev.archie.handymanservice.handyman.exception.NoSuchHandymanUserException;
import dev.archie.handymanservice.user.HandymanUser;
import dev.archie.handymanservice.user.HandymanUserRepository;
import dev.archie.handymanservice.landscape.AccountClient;
import dev.archie.handymanservice.landscape.dto.AccountDto;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

Expand All @@ -14,41 +16,55 @@
public class AccountService {

private final AccountRepository accountRepository;
private final HandymanUserRepository handymanUserRepository;
private final AccountClient accountClient;
private final HandymanRepository handymanRepository;
private final BankService bankService;

public Account create(CreatingAccountDto accountDto, Long handymanUserId) {
HandymanUser user = getHandymanUserById(handymanUserId);
public Account create(CreatingAccountDto accountDto, String handymanUserId) {
Handyman user = getHandymanUserById(handymanUserId);
AccountDto registeredAccount = accountClient.create(accountDto, user.getInnerId());
Account account = mapCreatingAccountDtoToAccount(accountDto, user);
account.setInnerId(registeredAccount.getId());
account.setHandyman(user);
account.setBank(bankService.getBankByName(accountDto.getBankName()));
return accountRepository.save(account);

account = accountRepository.save(account);
user.getAccounts().add(account);
handymanRepository.save(user);
return account;
}

public Account getById(Long id) {
public Account getById(String id) {
return accountRepository.findById(id)
.orElseThrow(() -> new NoSuchAccountException(id));
}

public Account update(CreatingAccountDto accountDto, Long id) {
public Account update(CreatingAccountDto accountDto, String id) {
Account account = getById(id);
Account updatedAccount = mapCreatingAccountDtoToAccount(accountDto, account.getHandymanUser());
account.setBank(bankService.getBankByName(accountDto.getBankName()));
updatedAccount.setId(id);
accountClient.update(accountDto, account.getInnerId());
Account updatedAccount = mapCreatingAccountDtoToAccount(accountDto, account.getHandyman());
updatedAccount.setId(account.getId());
updatedAccount.setInnerId(account.getInnerId());
updatedAccount.setBank(bankService.getBankByName(accountDto.getBankName()));
updatedAccount.setHandyman(account.getHandyman());
return accountRepository.save(updatedAccount);
}

public void delete(Long id) {
accountRepository.delete(getById(id));
public void delete(String id) {
Account account = getById(id);
accountClient.delete(account.getInnerId());
accountRepository.delete(account);
}

private HandymanUser getHandymanUserById(Long handymanUserId) {
return handymanUserRepository.findById(handymanUserId)
private Handyman getHandymanUserById(String handymanUserId) {
return handymanRepository.findById(handymanUserId)
.orElseThrow(() -> new NoSuchHandymanUserException(handymanUserId));
}

private Account mapCreatingAccountDtoToAccount(CreatingAccountDto accountDto, HandymanUser user) {
private Account mapCreatingAccountDtoToAccount(CreatingAccountDto accountDto,
Handyman user) {
return Account.builder()
.handymanUser(user)
.handyman(user)
.cardNumber(accountDto.getCardNumber())
.paymentSystem(accountDto.getPaymentSystem())
.build();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,26 +1,23 @@
package dev.archie.handymanservice.account.bank;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

@Getter
@Setter
@Entity
@Table(name = "banks")
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Document(collection = "banks")
public class Bank {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false)
private Long id;
private String id;

@Column(name = "name", nullable = false)
private String name;

}
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package dev.archie.handymanservice.account.bank;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.mongodb.repository.MongoRepository;

import java.util.Optional;

public interface BankRepository extends JpaRepository<Bank, Long> {
public interface BankRepository extends MongoRepository<Bank, Long> {
Optional<Bank> findByName(String name);
}
Original file line number Diff line number Diff line change
@@ -1,16 +1,35 @@
package dev.archie.handymanservice.account.bank;

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.Arrays;
import java.util.List;

@Service
@RequiredArgsConstructor
public class BankService {

private static final Bank[] BANKS = new Bank[]{
Bank.builder().name("InterGalactic Banking Clan").build(),
Bank.builder().name("Gringotts").build(),
Bank.builder().name("ScaminaBank").build(),
Bank.builder().name("Trinance").build(),
Bank.builder().name("StonksBank").build(),
Bank.builder().name("DogeBank").build(),
Bank.builder().name("PepegaBank").build(),
Bank.builder().name("ToTheMoonBank").build(),
Bank.builder().name("RickRollBank").build(),
Bank.builder().name("YetAnotherBank").build()
};

private final BankRepository bankRepository;

public BankService(BankRepository bankRepository) {
this.bankRepository = bankRepository;
Arrays.stream(BANKS)
.forEach(bank -> bankRepository.findByName(bank.getName())
.orElseGet(() -> bankRepository.save(bank)));
}

public List<Bank> getAll() {
return bankRepository.findAll();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,11 @@
import dev.archie.handymanservice.account.PaymentSystem;
import lombok.Data;

import javax.persistence.EnumType;
import javax.persistence.Enumerated;

@Data
public class CreatingAccountDto {

private String cardNumber;

@Enumerated(EnumType.STRING)
private PaymentSystem paymentSystem;

private String bankName;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

public class NoSuchAccountException extends ResponseStatusException {

public NoSuchAccountException(Long id) {
public NoSuchAccountException(String id) {
super(HttpStatus.NOT_FOUND, "No such account with id: " + id);
}
}
Loading