Skip to content

Commit 7a05c1b

Browse files
committed
✨ classes and packages have been updated
1 parent eeb829a commit 7a05c1b

File tree

3 files changed

+216
-33
lines changed

3 files changed

+216
-33
lines changed

src/main/java/uz/pdp/springsecurityatm/controller/ATMController.java

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,11 @@
22

33
import org.springframework.beans.factory.annotation.Autowired;
44
import org.springframework.http.ResponseEntity;
5+
import org.springframework.security.access.annotation.Secured;
6+
import org.springframework.security.access.prepost.PreAuthorize;
57
import org.springframework.web.bind.annotation.*;
6-
import uz.pdp.springsecurityatm.payload.ATMDTO;
8+
import uz.pdp.springsecurityatm.payload.AtmDTO;
9+
import uz.pdp.springsecurityatm.payload.TakeOutDto;
710
import uz.pdp.springsecurityatm.service.AtmService;
811

912
import javax.validation.Valid;
@@ -18,31 +21,43 @@ public ATMController(AtmService atmService) {
1821
this.atmService = atmService;
1922
}
2023

24+
@PreAuthorize("isAuthenticated()")
2125
@GetMapping
2226
public ResponseEntity<?> getAll() {
2327
return atmService.getAllATMs();
2428
}
2529

30+
@Secured("ROLE_MANAGER")
2631
@GetMapping("/{atmId}")
2732
public ResponseEntity<?> getOne(@PathVariable(name = "atmId") Long id) {
2833
return atmService.getOneAtm(id);
2934
}
3035

36+
@Secured("ROLE_MANAGER")
3137
@GetMapping("/summa")
3238
public ResponseEntity<?> getSums(@RequestParam(name = "type", defaultValue = "uzs") String type) {
3339
return atmService.getSumma(type);
3440
}
3541

42+
@Secured({"ROLE_MANAGER", "ROLE_DIRECTOR"})
3643
@PostMapping
37-
public ResponseEntity<?> saveAtm(@RequestBody @Valid ATMDTO atmDTO) {
44+
public ResponseEntity<?> saveAtm(@RequestBody @Valid AtmDTO atmDTO) {
3845
return atmService.saveATM(atmDTO);
3946
}
4047

48+
@PostMapping("/{atmId}/withdraw")
49+
@PreAuthorize("isAuthenticated()")
50+
public ResponseEntity<?> takeOut(@PathVariable(name = "atmId") Long atmId, @RequestBody @Valid TakeOutDto dto) {
51+
return atmService.takeOut(atmId, dto);
52+
}
53+
54+
@Secured("ROLE_MANAGER")
4155
@PutMapping("/{atmId}")
42-
public ResponseEntity<?> editAtm(@PathVariable(name = "atmId") Long id, @RequestBody @Valid ATMDTO atmDTO) {
56+
public ResponseEntity<?> editAtm(@PathVariable(name = "atmId") Long id, @RequestBody @Valid AtmDTO atmDTO) {
4357
return atmService.editAtm(id, atmDTO);
4458
}
4559

60+
@Secured("ROLE_MANAGER")
4661
@DeleteMapping("/{atmId}")
4762
public ResponseEntity<?> deleteItem(@PathVariable(name = "atmId") Long id) {
4863
return atmService.deleteAtm(id);
Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
11
package uz.pdp.springsecurityatm.entity;
22

3-
import lombok.*;
4-
import org.hibernate.Hibernate;
3+
import lombok.AllArgsConstructor;
4+
import lombok.Data;
5+
import lombok.NoArgsConstructor;
6+
import lombok.ToString;
57

68
import javax.persistence.*;
7-
import java.util.Objects;
89
import java.util.Set;
910

1011
@AllArgsConstructor
1112
@NoArgsConstructor
12-
@Getter
13-
@Setter
14-
@ToString
13+
@Data
1514
@Entity
1615
public class ATM {
1716
@Id
@@ -30,28 +29,29 @@ public class ATM {
3029
private Address address;
3130

3231
@ManyToMany
32+
@ToString.Exclude
3333
private Set<Summa> summas;
3434

3535
@ManyToMany
36+
@ToString.Exclude
3637
private Set<Dollar> dollars;
3738

3839
@ManyToOne
3940
private User user; // Masul hodim
40-
4141
private Double balance = 0D;
4242
private Double commission = 0D;
4343
private Double maxWithdraw;
4444

45-
@Override
46-
public boolean equals(Object o) {
47-
if (this == o) return true;
48-
if (o == null || Hibernate.getClass(this) != Hibernate.getClass(o)) return false;
49-
ATM atm = (ATM) o;
50-
return id != null && Objects.equals(id, atm.id);
45+
public ATM(Set<CardType> cardType, Bank bank, Address address, Set<Summa> summas, Set<Dollar> dollars, User user, Double balance, Double commission, Double maxWithdraw) {
46+
this.cardType = cardType;
47+
this.bank = bank;
48+
this.address = address;
49+
this.summas = summas;
50+
this.dollars = dollars;
51+
this.user = user;
52+
this.balance = balance;
53+
this.commission = commission;
54+
this.maxWithdraw = maxWithdraw;
5155
}
5256

53-
@Override
54-
public int hashCode() {
55-
return getClass().hashCode();
56-
}
5757
}
Lines changed: 181 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,48 @@
11
package uz.pdp.springsecurityatm.service;
22

33
import org.springframework.beans.factory.annotation.Autowired;
4-
import org.springframework.http.HttpStatus;
54
import org.springframework.http.ResponseEntity;
5+
import org.springframework.security.core.context.SecurityContextHolder;
66
import org.springframework.stereotype.Service;
7-
import uz.pdp.springsecurityatm.entity.Bank;
7+
import uz.pdp.springsecurityatm.entity.*;
8+
import uz.pdp.springsecurityatm.entity.enums.CardName;
89
import uz.pdp.springsecurityatm.entity.enums.USD;
910
import uz.pdp.springsecurityatm.entity.enums.UZS;
10-
import uz.pdp.springsecurityatm.payload.ATMDTO;
11-
import uz.pdp.springsecurityatm.repository.ATMRepository;
12-
import uz.pdp.springsecurityatm.repository.BankRepository;
11+
import uz.pdp.springsecurityatm.payload.AtmDTO;
12+
import uz.pdp.springsecurityatm.payload.TakeOutDto;
13+
import uz.pdp.springsecurityatm.repository.*;
1314

15+
import java.util.HashSet;
16+
import java.util.List;
1417
import java.util.Optional;
18+
import java.util.Set;
1519

16-
import static org.springframework.http.HttpStatus.NOT_FOUND;
20+
import static org.springframework.http.HttpStatus.*;
1721
import static org.springframework.http.ResponseEntity.*;
1822

1923
@Service
2024
public class AtmService {
2125

2226
private final ATMRepository repository;
2327
private final BankRepository bankRepository;
28+
private final CardTypeRepository cardTypeRepository;
29+
private final UserRepository userRepository;
30+
private final AddressRepository addressRepository;
31+
private final SummaRepository summaRepository;
32+
private final DollarRepository dollarRepository;
2433

2534
@Autowired
2635
public AtmService(ATMRepository repository,
27-
BankRepository bankRepository) {
36+
BankRepository bankRepository,
37+
CardTypeRepository cardTypeRepository,
38+
UserRepository userRepository, AddressRepository addressRepository, SummaRepository summaRepository, DollarRepository dollarRepository) {
2839
this.repository = repository;
2940
this.bankRepository = bankRepository;
41+
this.cardTypeRepository = cardTypeRepository;
42+
this.userRepository = userRepository;
43+
this.addressRepository = addressRepository;
44+
this.summaRepository = summaRepository;
45+
this.dollarRepository = dollarRepository;
3046
}
3147

3248
public ResponseEntity<?> getAllATMs() {
@@ -43,18 +59,170 @@ public ResponseEntity<?> getSumma(String type) {
4359
else return badRequest().body("Wrong type");
4460
}
4561

46-
public ResponseEntity<?> saveATM(ATMDTO dto) {
62+
public ResponseEntity<?> saveATM(AtmDTO dto) {
4763
Optional<Bank> optionalBank = bankRepository.findById(dto.getBankId());
48-
if (optionalBank.isPresent()) return status(NOT_FOUND).body("Bank not found");
49-
System.out.println(dto);
64+
if (optionalBank.isEmpty()) return status(NOT_FOUND).body("Bank not found");
65+
Optional<User> optionalUser = userRepository.findById(dto.getUserId());
66+
if (optionalUser.isEmpty()) return status(NOT_FOUND).body("User not found");
67+
Address address = addressRepository.save(new Address(null, dto.getCity(), dto.getStreet(), dto.getDistrict()));
68+
try {
69+
List<Summa> summas = summaRepository.saveAll(dto.getSums());
70+
List<Dollar> dollars = dollarRepository.saveAll(dto.getDollars());
71+
ATM atm = new ATM(
72+
checkCardType(dto.getCardTypes()),
73+
optionalBank.get(),
74+
address,
75+
new HashSet<>(summas),
76+
new HashSet<>(dollars),
77+
optionalUser.get(),
78+
getBalance(dto.getSums()),
79+
dto.getCommission(),
80+
dto.getTakeOut()
81+
);
82+
repository.save(atm);
83+
} catch (Exception e) {
84+
System.out.println(e.getLocalizedMessage());
85+
addressRepository.delete(address);
86+
return badRequest().body("ATM not saved");
87+
}
5088
return ok("atm successfully saved");
5189
}
5290

5391
public ResponseEntity<?> deleteAtm(Long id) {
54-
return null;
92+
return repository.findById(id)
93+
.map(atm -> {
94+
try {
95+
addressRepository.delete(atm.getAddress());
96+
repository.delete(atm);
97+
return status(NO_CONTENT).body("atm successfully deleted");
98+
} catch (Exception e) {
99+
return badRequest().body("ATM not deleted");
100+
}
101+
}).orElseGet(() -> status(NOT_FOUND).body("ATM not found"));
55102
}
56103

57-
public ResponseEntity<?> editAtm(Long id, ATMDTO atmDTO) {
58-
return null;
104+
public ResponseEntity<?> editAtm(Long id, AtmDTO atmDTO) {
105+
Optional<ATM> optionalATM = repository.findById(id);
106+
if (optionalATM.isEmpty()) return status(NOT_FOUND).body("ATM not found");
107+
Optional<Bank> optionalBank = bankRepository.findById(atmDTO.getBankId());
108+
if (optionalBank.isEmpty()) return status(NOT_FOUND).body("Bank not found");
109+
ATM atm = optionalATM.get();
110+
Address address = atm.getAddress();
111+
address.setCity(atmDTO.getCity());
112+
address.setDistrict(atmDTO.getDistrict());
113+
address.setStreet(atmDTO.getStreet());
114+
try {
115+
addressRepository.save(address);
116+
} catch (Exception e) {
117+
return status(BAD_REQUEST).body("Address not saved");
118+
}
119+
atm.setDollars(atmDTO.getDollars());
120+
Optional<User> optionalUser = userRepository.findById(atmDTO.getUserId());
121+
optionalUser.ifPresent(atm::setUser);
122+
atm.setCardType(checkCardType(atmDTO.getCardTypes()));
123+
atm.setCommission(atm.getCommission());
124+
atm.setMaxWithdraw(atmDTO.getTakeOut());
125+
atm.setSummas(atmDTO.getSums());
126+
atm.setBalance(getBalance(atmDTO.getSums()));
127+
try {
128+
repository.save(atm);
129+
return status(CREATED).body("ATM successfully edited");
130+
} catch (Exception e) {
131+
return status(BAD_REQUEST).body("ATM failed to saved");
132+
}
59133
}
134+
135+
// Actions
136+
public Set<CardType> checkCardType(Set<Integer> cardTypes) {
137+
return new HashSet<>(cardTypeRepository.findAllById(cardTypes));
138+
}
139+
140+
public Double getBalance(Set<Summa> summas) {
141+
double balance = 0D;
142+
for (Summa summa : summas) {
143+
balance += Double.parseDouble(summa.getUzs().name().substring(1)) * summa.getCount();
144+
}
145+
return balance;
146+
}
147+
148+
public ResponseEntity<?> takeOut(Long id, TakeOutDto dto) {
149+
if (dto.getMoneyType().equalsIgnoreCase("uzs") || dto.getMoneyType().equalsIgnoreCase("usd")) {
150+
Optional<ATM> optionalATM = repository.findById(id);
151+
if (optionalATM.isEmpty()) return status(NOT_FOUND).body("ATM not found");
152+
ATM atm = optionalATM.get();
153+
Card card = (Card) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
154+
if (dto.getMoneyType().equals("uzs") && (card.getType().getType().equals(CardName.HUMO) || card.getType().getType().equals(CardName.VISA))) {
155+
if (card.getBalance() >= dto.getMoney() + (dto.getMoney() * atm.getCommission() / 100)) {
156+
return withdrawMoneyForSum(dto.getMoney(), atm, card);
157+
}
158+
return badRequest().body("Not enough money");
159+
} else if (dto.getMoneyType().equals("usd") && (card.getType().getType().equals(CardName.VISA))) {
160+
//
161+
}
162+
return null;
163+
}
164+
return status(BAD_REQUEST).body("Wrong money type");
165+
}
166+
167+
public ResponseEntity<?> withdrawMoneyForSum(Double money, ATM atm, Card card) {
168+
int _hundred = 0, _fifty = 0, _five = 0, _ten = 0, _one = 0;
169+
Set<Summa> summas = atm.getSummas();
170+
for (Summa summa : summas) {
171+
if (money >= 100_000 && summa.getUzs().equals(UZS._100000) && ((int) (money / 100_000)) >= summa.getCount()) {
172+
_hundred = (int) (money / 100_000);
173+
money = money - _hundred * 100_000;
174+
}
175+
if (money >= 50_000 && summa.getUzs().equals(UZS._50000) && ((int) (money / 50_000)) >= summa.getCount()) {
176+
_fifty = (int) (money / 50_000);
177+
money = money - _fifty * 50_000;
178+
}
179+
if (money >= 10_000 && summa.getUzs().equals(UZS._10000) && ((int) (money / 10_000)) >= summa.getCount()) {
180+
_ten = (int) (money / 10_000);
181+
money = money - _ten * 10_000;
182+
}
183+
if (money >= 5_000 && summa.getUzs().equals(UZS._5000) && ((int) (money / 5_000)) >= summa.getCount()) {
184+
_five = (int) (money / 5_000);
185+
money = money - _five * 5_000;
186+
}
187+
if (money >= 1_000 && summa.getUzs().equals(UZS._1000) && ((int) (money / 1_000)) >= summa.getCount()) {
188+
_five = (int) (money / 1_000);
189+
money = money - _five * 1_000;
190+
}
191+
}
192+
System.out.println(money);
193+
return ok(money);
194+
}
195+
196+
197+
// public static void main(String[] args) {
198+
// Scanner scanner = new Scanner(System.in);
199+
// System.out.print("Enter amount: ");
200+
// double money = scanner.nextDouble();
201+
// int _hundred = 0, _fifty = 0, _five = 0, _ten = 0, _one = 0;
202+
// if (money >= 100_000) {
203+
// _hundred = (int) money / 100_000;
204+
// money = money - _hundred * 100_000;
205+
// }
206+
// if (money >= 50_000) {
207+
// _fifty = (int) money / 50_000;
208+
// money = money - _fifty * 50_000;
209+
// }
210+
// if (money >= 10_000) {
211+
// _ten = (int) money / 10_000;
212+
// money = money - _ten * 10_000;
213+
// }
214+
// if (money >= 5_000) {
215+
// _five = (int) money / 5_000;
216+
// money = money - _five * 5_000;
217+
// }
218+
// if (money >= 1_000) {
219+
// _five = (int) money / 1_000;
220+
// money = money - _five * 1_000;
221+
// }
222+
// System.out.println("yuz ming so'm donasi: " + _hundred);
223+
// System.out.println("ellik ming so'm donasi: " + _fifty);
224+
// System.out.println("o'n ming so'm donasi: " + _ten);
225+
// System.out.println("besh ming so'm donasi: " + _five);
226+
// System.out.println("ming so'm donasi: " + _one);
227+
// }
60228
}

0 commit comments

Comments
 (0)