Сохранение перед добавлением фронта
This commit is contained in:
parent
b56c295266
commit
2a876f5516
26
Front/.gitignore
vendored
Normal file
26
Front/.gitignore
vendored
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
# Logs
|
||||||
|
logs
|
||||||
|
*.log
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
pnpm-debug.log*
|
||||||
|
lerna-debug.log*
|
||||||
|
|
||||||
|
node_modules
|
||||||
|
dist
|
||||||
|
dist-ssr
|
||||||
|
*.local
|
||||||
|
|
||||||
|
# Editor directories and files
|
||||||
|
.vscode/*
|
||||||
|
!.vscode/extensions.json
|
||||||
|
.idea
|
||||||
|
.DS_Store
|
||||||
|
*.suo
|
||||||
|
*.ntvs*
|
||||||
|
*.njsproj
|
||||||
|
*.sln
|
||||||
|
*.sw?
|
||||||
|
|
||||||
|
.parcel-cache
|
58
Front/build.gradle
Normal file
58
Front/build.gradle
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
import com.github.gradle.node.util.PlatformHelper
|
||||||
|
import groovy.text.SimpleTemplateEngine
|
||||||
|
|
||||||
|
plugins {
|
||||||
|
id 'java'
|
||||||
|
id 'com.github.node-gradle.node' version '3.5.1'
|
||||||
|
id "de.undercouch.download" version '5.3.1'
|
||||||
|
}
|
||||||
|
|
||||||
|
node {
|
||||||
|
version = '18.15.0'
|
||||||
|
download = true
|
||||||
|
}
|
||||||
|
|
||||||
|
jar.dependsOn 'npmBuild'
|
||||||
|
|
||||||
|
clean.dependsOn 'npmClean'
|
||||||
|
|
||||||
|
nodeSetup.dependsOn 'downloadNode'
|
||||||
|
|
||||||
|
jar {
|
||||||
|
from 'dist'
|
||||||
|
into 'static'
|
||||||
|
final devHost = 'http://localhost:8080'
|
||||||
|
final prodHost = ''
|
||||||
|
filesMatching('index.html') {
|
||||||
|
filter { line -> line.replaceAll(devHost, prodHost) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
task downloadNode(type: Download) {
|
||||||
|
final helper = new PlatformHelper()
|
||||||
|
final templateData = [
|
||||||
|
"url" : node.distBaseUrl.get(),
|
||||||
|
"version": node.version.get(),
|
||||||
|
"os" : helper.osName,
|
||||||
|
"arch" : helper.osArch,
|
||||||
|
"ext" : helper.windows ? 'zip' : 'tar.gz'
|
||||||
|
]
|
||||||
|
final urlTemplate = '${url}/v${version}/node-v${version}-${os}-${arch}.${ext}'
|
||||||
|
final engine = new SimpleTemplateEngine()
|
||||||
|
final url = engine.createTemplate(urlTemplate).make(templateData).toString()
|
||||||
|
final String destDir = '.gradle/'
|
||||||
|
file(destDir).mkdirs()
|
||||||
|
src url
|
||||||
|
dest destDir
|
||||||
|
overwrite false
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks.register('npmBuild', NpmTask) {
|
||||||
|
dependsOn npmInstall
|
||||||
|
args = ['run-script', 'build']
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks.register('npmClean', NpmTask) {
|
||||||
|
dependsOn npmInstall
|
||||||
|
args = ['run-script', 'clean']
|
||||||
|
}
|
@ -1,40 +0,0 @@
|
|||||||
<!doctype html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8">
|
|
||||||
<meta name="viewport"
|
|
||||||
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
|
|
||||||
<meta http-equiv="X-UA-Compatible" content="ie=edge">
|
|
||||||
<script src="node_modules/bootstrap/dist/js/bootstrap.min.js"></script>
|
|
||||||
<link href="node_modules/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet"/>
|
|
||||||
<link href="node_modules/@fortawesome/fontawesome-free/css/all.min.css" rel="stylesheet"/>
|
|
||||||
<title>Document</title>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<form id="frm-items" class="row g-3">
|
|
||||||
<div class="d-flex flex-column w-25 my-5 mx-3">
|
|
||||||
Введите первое число
|
|
||||||
<input id="first"></input>
|
|
||||||
Введите второе число
|
|
||||||
<input id="second" ></input>
|
|
||||||
Выберите операцию
|
|
||||||
<div>
|
|
||||||
<button type="button" class="btn btn-primary" id="buttonPlus">+</button>
|
|
||||||
<button type="button" class="btn btn-primary" id="buttonMinus">-</button>
|
|
||||||
<button type="button" class="btn btn-primary" id="buttonMulti">*</button>
|
|
||||||
<button type="button" class="btn btn-primary" id="buttonDiv">/</button>
|
|
||||||
</div>
|
|
||||||
Выберите тип данных
|
|
||||||
<div>
|
|
||||||
<select id="type" class="form-select" >
|
|
||||||
<option value="int">Число</option>
|
|
||||||
<option value="string">Строка</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
Результат
|
|
||||||
<input id="res" type="text"></input>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
<script src="/script.js"></script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
4835
Front/package-lock.json
generated
4835
Front/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@ -1,16 +1,17 @@
|
|||||||
{
|
{
|
||||||
"name": "int-prog",
|
"name": "int-prog",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"main": "index.html",
|
"main": "src/index.html",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "http-server -p 3000 ./",
|
"start": "parcel --port 3000",
|
||||||
"test": "echo \"Error: no test specified\" && exit 1"
|
"build": "npm run clean && parcel build",
|
||||||
|
"clean": "rimraf dist"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"bootstrap": "5.2.1",
|
"bootstrap": "5.2.1"
|
||||||
"@fortawesome/fontawesome-free": "6.2.0"
|
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"http-server": "14.1.1"
|
"parcel": "2.8.3",
|
||||||
|
"rimraf": "4.4.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
152
Front/src/index.html
Normal file
152
Front/src/index.html
Normal file
@ -0,0 +1,152 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport"
|
||||||
|
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="ie=edge">
|
||||||
|
<script src="../node_modules/bootstrap/dist/js/bootstrap.min.js"></script>
|
||||||
|
<link href="../node_modules/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet"/>
|
||||||
|
<link href="../node_modules/@fortawesome/fontawesome-free/css/all.min.css" rel="stylesheet"/>
|
||||||
|
<title>Rest CLient</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<nav class="navbar navbar-expand-lg navbar-light bg-light">
|
||||||
|
<a class="navbar-brand" href="#">Navbar</a>
|
||||||
|
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
|
||||||
|
<span class="navbar-toggler-icon"></span>
|
||||||
|
</button>
|
||||||
|
<div class="collapse navbar-collapse" id="navbarNav">
|
||||||
|
<ul class="navbar-nav">
|
||||||
|
<li class="nav-item active">
|
||||||
|
<a class="nav-link" href="#">Home <span class="sr-only">(current)</span></a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" href="#">Features</a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" href="#">Pricing</a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link disabled" href="#">Disabled</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
<div class="container">
|
||||||
|
<form id="formComponent">
|
||||||
|
<div class="row mt-3">
|
||||||
|
<div class="col-sm-6">
|
||||||
|
<label for="lastName" class="form-label">Last name</label>
|
||||||
|
<input type="text" class="form-control" id="lastName" required>
|
||||||
|
</div>
|
||||||
|
<div class="col-sm-6">
|
||||||
|
<label for="firstName" class="form-label">First name</label>
|
||||||
|
<input type="text" class="form-control" id="firstName" required>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mt-3">
|
||||||
|
<div class="d-grid col-sm-4 mx-auto">
|
||||||
|
<button type="submit" class="btn btn-success">Add</button>
|
||||||
|
</div>
|
||||||
|
<div class="d-grid col-sm-4 mx-auto mt-3 mt-sm-0">
|
||||||
|
<button id="testError" type="button" class="btn btn-danger">Test</button>
|
||||||
|
</div>
|
||||||
|
<div class="d-grid col-sm-4 mx-auto mt-3 mt-sm-0">
|
||||||
|
<button id="testNormal" type="button" class="btn btn-secondary">Test</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
<div class="row table-responsive">
|
||||||
|
<table class="table mt-3">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th scope="col">#</th>
|
||||||
|
<th scope="col">First name</th>
|
||||||
|
<th scope="col">Last name</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody id="tbody">
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="container">
|
||||||
|
<form id="form">
|
||||||
|
<div class="row mt-3">
|
||||||
|
<div class="col-sm-6">
|
||||||
|
<label for="lastName" class="form-label">Last name</label>
|
||||||
|
<input type="text" class="form-control" id="lastName" required>
|
||||||
|
</div>
|
||||||
|
<div class="col-sm-6">
|
||||||
|
<label for="firstName" class="form-label">First name</label>
|
||||||
|
<input type="text" class="form-control" id="firstName" required>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mt-3">
|
||||||
|
<div class="d-grid col-sm-4 mx-auto">
|
||||||
|
<button type="submit" class="btn btn-success">Add</button>
|
||||||
|
</div>
|
||||||
|
<div class="d-grid col-sm-4 mx-auto mt-3 mt-sm-0">
|
||||||
|
<button id="testError" type="button" class="btn btn-danger">Test</button>
|
||||||
|
</div>
|
||||||
|
<div class="d-grid col-sm-4 mx-auto mt-3 mt-sm-0">
|
||||||
|
<button id="testNormal" type="button" class="btn btn-secondary">Test</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
<div class="row table-responsive">
|
||||||
|
<table class="table mt-3">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th scope="col">#</th>
|
||||||
|
<th scope="col">First name</th>
|
||||||
|
<th scope="col">Last name</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody id="tbody">
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="container">
|
||||||
|
<form id="form">
|
||||||
|
<div class="row mt-3">
|
||||||
|
<div class="col-sm-6">
|
||||||
|
<label for="lastName" class="form-label">Last name</label>
|
||||||
|
<input type="text" class="form-control" id="lastName" required>
|
||||||
|
</div>
|
||||||
|
<div class="col-sm-6">
|
||||||
|
<label for="firstName" class="form-label">First name</label>
|
||||||
|
<input type="text" class="form-control" id="firstName" required>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mt-3">
|
||||||
|
<div class="d-grid col-sm-4 mx-auto">
|
||||||
|
<button type="submit" class="btn btn-success">Add</button>
|
||||||
|
</div>
|
||||||
|
<div class="d-grid col-sm-4 mx-auto mt-3 mt-sm-0">
|
||||||
|
<button id="testError" type="button" class="btn btn-danger">Test</button>
|
||||||
|
</div>
|
||||||
|
<div class="d-grid col-sm-4 mx-auto mt-3 mt-sm-0">
|
||||||
|
<button id="testNormal" type="button" class="btn btn-secondary">Test</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
<div class="row table-responsive">
|
||||||
|
<table class="table mt-3">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th scope="col">#</th>
|
||||||
|
<th scope="col">First name</th>
|
||||||
|
<th scope="col">Last name</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody id="tbody">
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script src="/script.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
@ -12,11 +12,19 @@ repositories {
|
|||||||
mavenCentral()
|
mavenCentral()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
jar {
|
||||||
|
enabled = false
|
||||||
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
implementation(project(':Front'))
|
||||||
implementation 'org.springframework.boot:spring-boot-starter-web'
|
implementation 'org.springframework.boot:spring-boot-starter-web'
|
||||||
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
|
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
|
||||||
implementation 'com.h2database:h2:2.1.210'
|
implementation 'com.h2database:h2:2.1.210'
|
||||||
implementation group: 'org.springdoc', name: 'springdoc-openapi-ui', version: '1.6.5'
|
implementation group: 'org.springdoc', name: 'springdoc-openapi-ui', version: '1.6.5'
|
||||||
|
implementation 'org.hibernate.validator:hibernate-validator'
|
||||||
|
|
||||||
|
implementation 'org.springdoc:springdoc-openapi-ui:1.6.5'
|
||||||
testImplementation 'org.springframework.boot:spring-boot-starter-test'
|
testImplementation 'org.springframework.boot:spring-boot-starter-test'
|
||||||
implementation 'org.springframework.boot:spring-boot-starter-validation'
|
implementation 'org.springframework.boot:spring-boot-starter-validation'
|
||||||
}
|
}
|
||||||
|
@ -1 +1,2 @@
|
|||||||
rootProject.name = 'labwork'
|
rootProject.name = 'labwork'
|
||||||
|
include 'Front'
|
@ -1,11 +1,7 @@
|
|||||||
package ip.labwork.shop.controller;
|
package ip.labwork.shop.controller;
|
||||||
|
|
||||||
import ip.labwork.shop.model.Component;
|
|
||||||
import ip.labwork.shop.service.ComponentService;
|
import ip.labwork.shop.service.ComponentService;
|
||||||
import org.springframework.web.bind.annotation.GetMapping;
|
import org.springframework.web.bind.annotation.*;
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
|
||||||
import org.springframework.web.bind.annotation.RequestParam;
|
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@ -19,36 +15,38 @@ public class ComponentController {
|
|||||||
this.componentService = componentService;
|
this.componentService = componentService;
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/add")
|
@PostMapping
|
||||||
public Component create(@RequestParam("name") String name,
|
public ComponentDTO createComponent(@RequestParam("name") String name,
|
||||||
@RequestParam("price") Integer price) {
|
@RequestParam("price") Integer price) {
|
||||||
return componentService.addComponent(name, price);
|
return new ComponentDTO(componentService.addComponent(name, price));
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/update")
|
@PutMapping("/{id}")
|
||||||
public Component update(@RequestParam("id") Long id,
|
public ComponentDTO updateComponent(@PathVariable Long id,
|
||||||
@RequestParam("name") String name,
|
@RequestParam("name") String name,
|
||||||
@RequestParam("price") Integer price) {
|
@RequestParam("price") Integer price) {
|
||||||
return componentService.updateComponent(id, name, price);
|
return new ComponentDTO(componentService.updateComponent(id, name, price));
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/remove")
|
@DeleteMapping("/{id}")
|
||||||
public Component remove(@RequestParam("id") Long id) {
|
public ComponentDTO removeComponent(@PathVariable Long id) {
|
||||||
return componentService.deleteComponent(id);
|
return new ComponentDTO(componentService.deleteComponent(id));
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/removeAll")
|
@DeleteMapping
|
||||||
public void remove() {
|
public void removeAllComponent() {
|
||||||
componentService.deleteAllComponent();
|
componentService.deleteAllComponent();
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/find")
|
@GetMapping("/{id}")
|
||||||
public Component find(@RequestParam("id") Long id) {
|
public ComponentDTO findComponent(@PathVariable Long id) {
|
||||||
return componentService.findComponent(id);
|
return new ComponentDTO(componentService.findComponent(id));
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/findAll")
|
@GetMapping
|
||||||
public List<Component> findAll() {
|
public List<ComponentDTO> findAllComponent() {
|
||||||
return componentService.findAllComponent();
|
return componentService.findAllComponent().stream()
|
||||||
|
.map(ComponentDTO::new)
|
||||||
|
.toList();
|
||||||
}
|
}
|
||||||
}
|
}
|
27
src/main/java/ip/labwork/shop/controller/ComponentDTO.java
Normal file
27
src/main/java/ip/labwork/shop/controller/ComponentDTO.java
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
package ip.labwork.shop.controller;
|
||||||
|
|
||||||
|
import ip.labwork.shop.model.Component;
|
||||||
|
|
||||||
|
public class ComponentDTO {
|
||||||
|
private final long id;
|
||||||
|
private final String componentName;
|
||||||
|
private final int price;
|
||||||
|
|
||||||
|
public ComponentDTO(Component component) {
|
||||||
|
this.id = component.getId();
|
||||||
|
this.componentName = component.getComponentName();
|
||||||
|
this.price = component.getPrice();
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getComponentName() {
|
||||||
|
return componentName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getPrice() {
|
||||||
|
return price;
|
||||||
|
}
|
||||||
|
}
|
@ -3,10 +3,7 @@ package ip.labwork.shop.controller;
|
|||||||
import ip.labwork.shop.service.ProductService;
|
import ip.labwork.shop.service.ProductService;
|
||||||
import ip.labwork.shop.model.Order;
|
import ip.labwork.shop.model.Order;
|
||||||
import ip.labwork.shop.service.OrderService;
|
import ip.labwork.shop.service.OrderService;
|
||||||
import org.springframework.web.bind.annotation.GetMapping;
|
import org.springframework.web.bind.annotation.*;
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
|
||||||
import org.springframework.web.bind.annotation.RequestParam;
|
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@ -20,35 +17,37 @@ public class OrderController {
|
|||||||
this.productService = productService;
|
this.productService = productService;
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/add")
|
@PostMapping
|
||||||
public Order create(@RequestParam("date") String date,
|
public OrderDTO createOrder(@RequestParam("date") String date,
|
||||||
@RequestParam("price") Integer price,
|
@RequestParam("price") Integer price,
|
||||||
@RequestParam("count") Integer[] count,
|
@RequestParam("count") Integer[] count,
|
||||||
@RequestParam("prod") Long[] prod){
|
@RequestParam("prod") Long[] prod){
|
||||||
return orderService.addOrder(date, price, count, productService.findFiltredProducts(prod));
|
return new OrderDTO(orderService.addOrder(date, price, count, productService.findFiltredProducts(prod)));
|
||||||
}
|
}
|
||||||
@GetMapping("/update")
|
@PutMapping("/{id}")
|
||||||
public Order update(@RequestParam("id") Long id,
|
public OrderDTO updateOrder(@PathVariable Long id,
|
||||||
@RequestParam("date") String date,
|
@RequestParam("date") String date,
|
||||||
@RequestParam("price") Integer price,
|
@RequestParam("price") Integer price,
|
||||||
@RequestParam("count") Integer[] count,
|
@RequestParam("count") Integer[] count,
|
||||||
@RequestParam("prod") Long[] prod){
|
@RequestParam("prod") Long[] prod){
|
||||||
return orderService.updateOrder(id, date, price, count, productService.findFiltredProducts(prod));
|
return new OrderDTO(orderService.updateOrder(id, date, price, count, productService.findFiltredProducts(prod)));
|
||||||
}
|
}
|
||||||
@GetMapping("/remove")
|
@DeleteMapping("/{id}")
|
||||||
public Order remove(@RequestParam("id") Long id){
|
public OrderDTO removeOrder(@PathVariable Long id){
|
||||||
return orderService.deleteOrder(id);
|
return new OrderDTO(orderService.deleteOrder(id));
|
||||||
}
|
}
|
||||||
@GetMapping("/removeAll")
|
@DeleteMapping
|
||||||
public void remove(){
|
public void removeAllOrder(){
|
||||||
orderService.deleteAllOrder();
|
orderService.deleteAllOrder();
|
||||||
}
|
}
|
||||||
@GetMapping("/find")
|
@GetMapping("/{id}")
|
||||||
public Order find(@RequestParam("id") Long id){
|
public OrderDTO findOrder(@PathVariable Long id){
|
||||||
return orderService.findOrder(id);
|
return new OrderDTO(orderService.findOrder(id));
|
||||||
}
|
}
|
||||||
@GetMapping("/findAll")
|
@GetMapping
|
||||||
public List<Order> findAll(){
|
public List<OrderDTO> findAllOrder(){
|
||||||
return orderService.findAllOrder();
|
return orderService.findAllOrder().stream()
|
||||||
|
.map(OrderDTO::new)
|
||||||
|
.toList();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
36
src/main/java/ip/labwork/shop/controller/OrderDTO.java
Normal file
36
src/main/java/ip/labwork/shop/controller/OrderDTO.java
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
package ip.labwork.shop.controller;
|
||||||
|
|
||||||
|
import ip.labwork.shop.model.Order;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
public class OrderDTO {
|
||||||
|
private final long id;
|
||||||
|
private final Date date;
|
||||||
|
private final int price;
|
||||||
|
private final List<ProductDTO> productDTOList;
|
||||||
|
public OrderDTO(Order order) {
|
||||||
|
this.id = order.getId();
|
||||||
|
this.date = order.getDate();
|
||||||
|
this.price = order.getPrice();
|
||||||
|
this.productDTOList = order.getProducts().stream().filter(x -> Objects.equals(x.getId().getOrderId(), order.getId())).map(x -> new ProductDTO(x.getProduct())).toList();
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Date getDate() {
|
||||||
|
return date;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getPrice() {
|
||||||
|
return price;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<ProductDTO> getProductDTOList() {
|
||||||
|
return productDTOList;
|
||||||
|
}
|
||||||
|
}
|
@ -3,10 +3,7 @@ package ip.labwork.shop.controller;
|
|||||||
import ip.labwork.shop.service.ProductService;
|
import ip.labwork.shop.service.ProductService;
|
||||||
import ip.labwork.shop.model.Product;
|
import ip.labwork.shop.model.Product;
|
||||||
import ip.labwork.shop.service.ComponentService;
|
import ip.labwork.shop.service.ComponentService;
|
||||||
import org.springframework.web.bind.annotation.GetMapping;
|
import org.springframework.web.bind.annotation.*;
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
|
||||||
import org.springframework.web.bind.annotation.RequestParam;
|
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@ -21,35 +18,37 @@ public class ProductController {
|
|||||||
this.componentService = componentService;
|
this.componentService = componentService;
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/add")
|
@PostMapping
|
||||||
public Product create(@RequestParam("name") String name,
|
public ProductDTO createProduct(@RequestParam("name") String name,
|
||||||
@RequestParam("price") Integer price,
|
@RequestParam("price") Integer price,
|
||||||
@RequestParam("count") Integer[] count,
|
@RequestParam("count") Integer[] count,
|
||||||
@RequestParam("comp") Long[] comp){
|
@RequestParam("comp") Long[] comp){
|
||||||
return productService.addProduct(name, price, count, componentService.findFiltredComponents(comp));
|
return new ProductDTO(productService.addProduct(name, price, count, componentService.findFiltredComponents(comp)));
|
||||||
}
|
}
|
||||||
@GetMapping("/update")
|
@PutMapping("/{id}")
|
||||||
public Product update(@RequestParam("id") Long id,
|
public ProductDTO updateProduct(@PathVariable Long id,
|
||||||
@RequestParam("name") String name,
|
@RequestParam("name") String name,
|
||||||
@RequestParam("price") Integer price,
|
@RequestParam("price") Integer price,
|
||||||
@RequestParam("count") Integer[] count,
|
@RequestParam("count") Integer[] count,
|
||||||
@RequestParam("comp") Long[] comp){
|
@RequestParam("comp") Long[] comp){
|
||||||
return productService.updateProduct(id, name, price, count, componentService.findFiltredComponents(comp));
|
return new ProductDTO(productService.updateProduct(id, name, price, count, componentService.findFiltredComponents(comp)));
|
||||||
}
|
}
|
||||||
@GetMapping("/remove")
|
@DeleteMapping("/{id}")
|
||||||
public Product remove(@RequestParam("id") Long id){
|
public ProductDTO removeProduct(@PathVariable Long id){
|
||||||
return productService.deleteProduct(id);
|
return new ProductDTO(productService.deleteProduct(id));
|
||||||
}
|
}
|
||||||
@GetMapping("/removeAll")
|
@DeleteMapping
|
||||||
public void remove(){
|
public void removeAllProduct(){
|
||||||
productService.deleteAllProduct();
|
productService.deleteAllProduct();
|
||||||
}
|
}
|
||||||
@GetMapping("/find")
|
@GetMapping("/{id}")
|
||||||
public Product find(@RequestParam("id") Long id){
|
public ProductDTO findProduct(@PathVariable Long id){
|
||||||
return productService.findProduct(id);
|
return new ProductDTO(productService.findProduct(id));
|
||||||
}
|
}
|
||||||
@GetMapping("/findAll")
|
@GetMapping
|
||||||
public List<Product> findAll(){
|
public List<ProductDTO> findAllProduct(){
|
||||||
return productService.findAllProduct();
|
return productService.findAllProduct().stream()
|
||||||
|
.map(ProductDTO::new)
|
||||||
|
.toList();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
41
src/main/java/ip/labwork/shop/controller/ProductDTO.java
Normal file
41
src/main/java/ip/labwork/shop/controller/ProductDTO.java
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
package ip.labwork.shop.controller;
|
||||||
|
|
||||||
|
import ip.labwork.shop.model.Product;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
public class ProductDTO {
|
||||||
|
private final long id;
|
||||||
|
private final String productName;
|
||||||
|
private final int price;
|
||||||
|
private final List<ComponentDTO> componentDTOList;
|
||||||
|
private final List<OrderDTO> orderDTOList;
|
||||||
|
public ProductDTO(Product product) {
|
||||||
|
this.id = product.getId();
|
||||||
|
this.productName = product.getProductName();
|
||||||
|
this.price = product.getPrice();
|
||||||
|
this.componentDTOList = product.getComponents().stream().filter(x -> Objects.equals(x.getId().getProductId(), product.getId())).map(x -> new ComponentDTO(x.getComponent())).toList();
|
||||||
|
this.orderDTOList = product.getOrders().stream().filter(x -> Objects.equals(x.getId().getProductId(), product.getId())).map(x -> new OrderDTO(x.getOrder())).toList();
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getProductName() {
|
||||||
|
return productName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getPrice() {
|
||||||
|
return price;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<ComponentDTO> getComponentDTOList() {
|
||||||
|
return componentDTOList;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<OrderDTO> getOrderDTOList() {
|
||||||
|
return orderDTOList;
|
||||||
|
}
|
||||||
|
}
|
@ -2,6 +2,7 @@ package ip.labwork.shop.model;
|
|||||||
|
|
||||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||||
import jakarta.persistence.*;
|
import jakarta.persistence.*;
|
||||||
|
import jakarta.validation.constraints.NotBlank;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -13,8 +14,10 @@ public class Component {
|
|||||||
@Id
|
@Id
|
||||||
@GeneratedValue(strategy = GenerationType.AUTO)
|
@GeneratedValue(strategy = GenerationType.AUTO)
|
||||||
private Long id;
|
private Long id;
|
||||||
|
@NotBlank(message = "ComponentName can't be null or empty")
|
||||||
@Column(name = "name")
|
@Column(name = "name")
|
||||||
private String componentName;
|
private String componentName;
|
||||||
|
@NotBlank(message = "Price can't be null or empty")
|
||||||
@Column(name = "price")
|
@Column(name = "price")
|
||||||
private Integer price;
|
private Integer price;
|
||||||
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package ip.labwork.shop.model;
|
package ip.labwork.shop.model;
|
||||||
|
|
||||||
import jakarta.persistence.*;
|
import jakarta.persistence.*;
|
||||||
|
import jakarta.validation.constraints.NotBlank;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
@ -13,8 +14,10 @@ public class Order {
|
|||||||
@Id
|
@Id
|
||||||
@GeneratedValue(strategy = GenerationType.AUTO)
|
@GeneratedValue(strategy = GenerationType.AUTO)
|
||||||
private Long id;
|
private Long id;
|
||||||
|
@NotBlank(message = "Date can't be null or empty")
|
||||||
@Column(name = "date")
|
@Column(name = "date")
|
||||||
private Date date;
|
private Date date;
|
||||||
|
@NotBlank(message = "Price can't be null or empty")
|
||||||
@Column(name = "price")
|
@Column(name = "price")
|
||||||
private Integer price;
|
private Integer price;
|
||||||
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
|
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
|
||||||
|
@ -2,6 +2,7 @@ package ip.labwork.shop.model;
|
|||||||
|
|
||||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||||
import jakarta.persistence.*;
|
import jakarta.persistence.*;
|
||||||
|
import jakarta.validation.constraints.NotBlank;
|
||||||
|
|
||||||
@Entity
|
@Entity
|
||||||
@Table(name = "order_product")
|
@Table(name = "order_product")
|
||||||
@ -17,6 +18,7 @@ public class OrderProducts {
|
|||||||
@JoinColumn(name = "order_id")
|
@JoinColumn(name = "order_id")
|
||||||
@JsonIgnore
|
@JsonIgnore
|
||||||
private Order order;
|
private Order order;
|
||||||
|
@NotBlank(message = "Count can't be null or empty")
|
||||||
@Column(name = "count")
|
@Column(name = "count")
|
||||||
private Integer count;
|
private Integer count;
|
||||||
|
|
||||||
|
@ -2,6 +2,7 @@ package ip.labwork.shop.model;
|
|||||||
|
|
||||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||||
import jakarta.persistence.*;
|
import jakarta.persistence.*;
|
||||||
|
import jakarta.validation.constraints.NotBlank;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -13,8 +14,10 @@ public class Product {
|
|||||||
@Id
|
@Id
|
||||||
@GeneratedValue(strategy = GenerationType.AUTO)
|
@GeneratedValue(strategy = GenerationType.AUTO)
|
||||||
private Long id;
|
private Long id;
|
||||||
|
@NotBlank(message = "ProductName can't be null or empty")
|
||||||
@Column(name = "name")
|
@Column(name = "name")
|
||||||
private String productName;
|
private String productName;
|
||||||
|
@NotBlank(message = "Price can't be null or empty")
|
||||||
@Column(name = "price")
|
@Column(name = "price")
|
||||||
private Integer price;
|
private Integer price;
|
||||||
|
|
||||||
|
@ -2,6 +2,7 @@ package ip.labwork.shop.model;
|
|||||||
|
|
||||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||||
import jakarta.persistence.*;
|
import jakarta.persistence.*;
|
||||||
|
import jakarta.validation.constraints.NotBlank;
|
||||||
|
|
||||||
@Entity
|
@Entity
|
||||||
@Table(name = "product_component")
|
@Table(name = "product_component")
|
||||||
@ -17,6 +18,7 @@ public class ProductComponents {
|
|||||||
@JoinColumn(name = "product_id")
|
@JoinColumn(name = "product_id")
|
||||||
@JsonIgnore
|
@JsonIgnore
|
||||||
private Product product;
|
private Product product;
|
||||||
|
@NotBlank(message = "Count can't be null or empty")
|
||||||
@Column(name = "count")
|
@Column(name = "count")
|
||||||
private Integer count;
|
private Integer count;
|
||||||
|
|
||||||
|
@ -0,0 +1,7 @@
|
|||||||
|
package ip.labwork.shop.repository;
|
||||||
|
|
||||||
|
import ip.labwork.shop.model.Component;
|
||||||
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
|
||||||
|
public interface ComponentRepository extends JpaRepository<Component, Long> {
|
||||||
|
}
|
@ -0,0 +1,12 @@
|
|||||||
|
package ip.labwork.shop.repository;
|
||||||
|
|
||||||
|
import ip.labwork.shop.model.OrderProducts;
|
||||||
|
import ip.labwork.shop.model.OrderProductsKey;
|
||||||
|
import ip.labwork.shop.model.ProductComponents;
|
||||||
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public interface OrderProductRepository extends JpaRepository<OrderProducts, OrderProductsKey> {
|
||||||
|
List<OrderProducts> getOrderProductsByOrderId(Long order_id);
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
package ip.labwork.shop.repository;
|
||||||
|
|
||||||
|
import ip.labwork.shop.model.Order;
|
||||||
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
|
||||||
|
public interface OrderRepository extends JpaRepository<Order, Long> {
|
||||||
|
}
|
@ -0,0 +1,11 @@
|
|||||||
|
package ip.labwork.shop.repository;
|
||||||
|
|
||||||
|
import ip.labwork.shop.model.ProductComponents;
|
||||||
|
import ip.labwork.shop.model.ProductComponentsKey;
|
||||||
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public interface ProductComponentRepository extends JpaRepository<ProductComponents, ProductComponentsKey> {
|
||||||
|
List<ProductComponents> getProductComponentsByProductId(Long product_id);
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
package ip.labwork.shop.repository;
|
||||||
|
|
||||||
|
import ip.labwork.shop.model.Product;
|
||||||
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
|
||||||
|
public interface ProductRepository extends JpaRepository<Product, Long> {
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
package ip.labwork.shop.service;
|
||||||
|
|
||||||
|
public class ComponentNotFoundException extends RuntimeException {
|
||||||
|
public ComponentNotFoundException(Long id) {
|
||||||
|
super(String.format("Component with id [%s] is not found", id));
|
||||||
|
}
|
||||||
|
}
|
@ -1,70 +1,61 @@
|
|||||||
package ip.labwork.shop.service;
|
package ip.labwork.shop.service;
|
||||||
|
|
||||||
import ip.labwork.shop.model.Component;
|
import ip.labwork.shop.model.Component;
|
||||||
import ip.labwork.shop.model.OrderProducts;
|
|
||||||
import ip.labwork.shop.model.Product;
|
|
||||||
import ip.labwork.shop.model.ProductComponents;
|
import ip.labwork.shop.model.ProductComponents;
|
||||||
import jakarta.persistence.EntityManager;
|
import ip.labwork.shop.repository.ComponentRepository;
|
||||||
import jakarta.persistence.EntityNotFoundException;
|
import ip.labwork.shop.repository.ProductComponentRepository;
|
||||||
import jakarta.persistence.PersistenceContext;
|
import ip.labwork.util.validation.ValidatorUtil;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
import org.springframework.util.StringUtils;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
public class ComponentService {
|
public class ComponentService {
|
||||||
@PersistenceContext
|
|
||||||
private EntityManager em;
|
private final ComponentRepository componentRepository;
|
||||||
|
private final ProductComponentRepository productComponentRepository;
|
||||||
|
private final ValidatorUtil validatorUtil;
|
||||||
|
|
||||||
|
public ComponentService(ComponentRepository componentRepository,
|
||||||
|
ValidatorUtil validatorUtil, ProductComponentRepository productComponentRepository) {
|
||||||
|
this.componentRepository = componentRepository;
|
||||||
|
this.validatorUtil = validatorUtil;
|
||||||
|
this.productComponentRepository = productComponentRepository;
|
||||||
|
}
|
||||||
|
|
||||||
@Transactional
|
@Transactional
|
||||||
public Component addComponent(String componentName, Integer price) {
|
public Component addComponent(String componentName, Integer price) {
|
||||||
if (!StringUtils.hasText(componentName) || price == 0) {
|
|
||||||
throw new IllegalArgumentException("Component is null or empty");
|
|
||||||
}
|
|
||||||
final Component component = new Component(componentName, price);
|
final Component component = new Component(componentName, price);
|
||||||
em.persist(component);
|
validatorUtil.validate(component);
|
||||||
return component;
|
return componentRepository.save(component);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Transactional(readOnly = true)
|
@Transactional(readOnly = true)
|
||||||
public Component findComponent(Long id) {
|
public Component findComponent(Long id) {
|
||||||
final Component component = em.find(Component.class, id);
|
final Optional<Component> student = componentRepository.findById(id);
|
||||||
if (component == null) {
|
return student.orElseThrow(() -> new ComponentNotFoundException(id));
|
||||||
throw new EntityNotFoundException(String.format("Component with id [%s] is not found", id));
|
|
||||||
}
|
|
||||||
return component;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Transactional(readOnly = true)
|
@Transactional(readOnly = true)
|
||||||
public List<Component> findAllComponent() {
|
public List<Component> findAllComponent() {
|
||||||
return em.createQuery("select c from Component c", Component.class)
|
return componentRepository.findAll();
|
||||||
.getResultList();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Transactional(readOnly = true)
|
@Transactional(readOnly = true)
|
||||||
public List<Component> findFiltredComponents(Long[] arr) {
|
public List<Component> findFiltredComponents(Long[] arr) {
|
||||||
if (arr.length == 0) {
|
return componentRepository.findAllById(Arrays.stream(arr).toList());
|
||||||
throw new IllegalArgumentException("Array id is empty");
|
|
||||||
}
|
|
||||||
List<Component> componentList = new ArrayList<>();
|
|
||||||
for (int i = 0; i < arr.length; i++) {
|
|
||||||
componentList.add(em.find(Component.class, arr[i]));
|
|
||||||
}
|
|
||||||
return componentList;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Transactional
|
@Transactional
|
||||||
public Component updateComponent(Long id, String componentName, Integer price) {
|
public Component updateComponent(Long id, String componentName, Integer price) {
|
||||||
if (!StringUtils.hasText(componentName) || price == 0) {
|
|
||||||
throw new IllegalArgumentException("Component is null or empty");
|
|
||||||
}
|
|
||||||
final Component currentComponent = findComponent(id);
|
final Component currentComponent = findComponent(id);
|
||||||
currentComponent.setComponentName(componentName);
|
currentComponent.setComponentName(componentName);
|
||||||
currentComponent.setPrice(price);
|
currentComponent.setPrice(price);
|
||||||
return em.merge(currentComponent);
|
validatorUtil.validate(currentComponent);
|
||||||
|
return componentRepository.save(currentComponent);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Transactional
|
@Transactional
|
||||||
@ -75,14 +66,14 @@ public class ComponentService {
|
|||||||
ProductComponents temp = currentComponent.getProducts().get(0);
|
ProductComponents temp = currentComponent.getProducts().get(0);
|
||||||
temp.getComponent().removeProduct(temp);
|
temp.getComponent().removeProduct(temp);
|
||||||
temp.getProduct().removeComponent(temp);
|
temp.getProduct().removeComponent(temp);
|
||||||
em.remove(temp);
|
productComponentRepository.delete(temp);
|
||||||
}
|
}
|
||||||
em.remove(currentComponent);
|
componentRepository.delete(currentComponent);
|
||||||
return currentComponent;
|
return currentComponent;
|
||||||
}
|
}
|
||||||
@Transactional
|
@Transactional
|
||||||
public void deleteAllComponent() {
|
public void deleteAllComponent() {
|
||||||
em.createQuery("delete from ProductComponents").executeUpdate();
|
productComponentRepository.deleteAll();
|
||||||
em.createQuery("delete from Component").executeUpdate();
|
componentRepository.deleteAll();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,7 @@
|
|||||||
|
package ip.labwork.shop.service;
|
||||||
|
|
||||||
|
public class OrderNotFoundException extends RuntimeException {
|
||||||
|
public OrderNotFoundException(Long id) {
|
||||||
|
super(String.format("Order with id [%s] is not found", id));
|
||||||
|
}
|
||||||
|
}
|
@ -1,36 +1,38 @@
|
|||||||
package ip.labwork.shop.service;
|
package ip.labwork.shop.service;
|
||||||
|
|
||||||
import ip.labwork.shop.model.Order;
|
import ip.labwork.shop.model.*;
|
||||||
import ip.labwork.shop.model.OrderProducts;
|
import ip.labwork.shop.repository.OrderProductRepository;
|
||||||
import ip.labwork.shop.model.Product;
|
import ip.labwork.shop.repository.OrderRepository;
|
||||||
import jakarta.persistence.EntityManager;
|
import ip.labwork.util.validation.ValidatorUtil;
|
||||||
import jakarta.persistence.EntityNotFoundException;
|
|
||||||
import jakarta.persistence.PersistenceContext;
|
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
import org.springframework.util.StringUtils;
|
|
||||||
|
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
public class OrderService {
|
public class OrderService {
|
||||||
@PersistenceContext
|
private final OrderRepository orderRepository;
|
||||||
private EntityManager em;
|
private final OrderProductRepository orderProductRepository;
|
||||||
|
private final ValidatorUtil validatorUtil;
|
||||||
|
|
||||||
|
public OrderService(OrderRepository orderRepository,
|
||||||
|
ValidatorUtil validatorUtil, OrderProductRepository orderProductRepository) {
|
||||||
|
this.orderRepository = orderRepository;
|
||||||
|
this.validatorUtil = validatorUtil;
|
||||||
|
this.orderProductRepository = orderProductRepository;
|
||||||
|
}
|
||||||
@Transactional
|
@Transactional
|
||||||
public Order addOrder(String date, Integer price, Integer[] count, List<Product> products) {
|
public Order addOrder(String date, Integer price, Integer[] count, List<Product> products) {
|
||||||
if (!StringUtils.hasText(date) || price == 0 || count.length == 0 || Arrays.stream(count).filter(c -> c == 0).toList().size() != 0 || products.size() == 0 || products.stream().filter(Objects::isNull).toList().size() != 0 || count.length != products.size()) {
|
|
||||||
throw new IllegalArgumentException("Order is null or empty");
|
|
||||||
}
|
|
||||||
Date correctDate = getDate(date);
|
Date correctDate = getDate(date);
|
||||||
final Order order = new Order(correctDate, price);
|
final Order order = new Order(correctDate, price);
|
||||||
em.persist(order);
|
validatorUtil.validate(order);
|
||||||
|
orderRepository.save(order);
|
||||||
for (int i = 0; i < products.size(); i++) {
|
for (int i = 0; i < products.size(); i++) {
|
||||||
final OrderProducts orderProducts = new OrderProducts(order, products.get(i), count[i]);
|
final OrderProducts orderProducts = new OrderProducts(order, products.get(i), count[i]);
|
||||||
order.addProduct(orderProducts);
|
order.addProduct(orderProducts);
|
||||||
products.get(i).addOrder(orderProducts);
|
products.get(i).addOrder(orderProducts);
|
||||||
em.persist(orderProducts);
|
orderProductRepository.save(orderProducts);
|
||||||
}
|
}
|
||||||
return order;
|
return order;
|
||||||
}
|
}
|
||||||
@ -49,30 +51,23 @@ public class OrderService {
|
|||||||
|
|
||||||
@Transactional(readOnly = true)
|
@Transactional(readOnly = true)
|
||||||
public Order findOrder(Long id) {
|
public Order findOrder(Long id) {
|
||||||
final Order order = em.find(Order.class, id);
|
final Optional<Order> order = orderRepository.findById(id);
|
||||||
if (order == null) {
|
return order.orElseThrow(() -> new OrderNotFoundException(id));
|
||||||
throw new EntityNotFoundException(String.format("Order with id [%s] is not found", id));
|
|
||||||
}
|
|
||||||
return order;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Transactional(readOnly = true)
|
@Transactional(readOnly = true)
|
||||||
public List<Order> findAllOrder() {
|
public List<Order> findAllOrder() {
|
||||||
return em.createQuery("select o from Order o", Order.class)
|
return orderRepository.findAll();
|
||||||
.getResultList();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Transactional
|
@Transactional
|
||||||
public Order updateOrder(Long id, String date, Integer price, Integer[] count, List<Product> products) {
|
public Order updateOrder(Long id, String date, Integer price, Integer[] count, List<Product> products) {
|
||||||
if (!StringUtils.hasText(date) || price == 0 || count.length == 0 || Arrays.stream(count).filter(c -> c == 0).toList().size() != 0 || products.size() == 0 || products.stream().filter(Objects::isNull).toList().size() != 0 || count.length != products.size()) {
|
|
||||||
throw new IllegalArgumentException("Order is null or empty");
|
|
||||||
}
|
|
||||||
final Order currentOrder = findOrder(id);
|
final Order currentOrder = findOrder(id);
|
||||||
currentOrder.setDate(getDate(date));
|
currentOrder.setDate(getDate(date));
|
||||||
currentOrder.setPrice(price);
|
currentOrder.setPrice(price);
|
||||||
em.merge(currentOrder);
|
validatorUtil.validate(currentOrder);
|
||||||
List<OrderProducts> orderProductsList = em.createQuery("select o from OrderProducts o where o.id.orderId = " + id, OrderProducts.class)
|
orderRepository.save(currentOrder);
|
||||||
.getResultList();
|
List<OrderProducts> orderProductsList = orderProductRepository.getOrderProductsByOrderId(id);
|
||||||
List<Long> product_id = new ArrayList<>(orderProductsList.stream().map(p -> p.getId().getProductId()).toList());
|
List<Long> product_id = new ArrayList<>(orderProductsList.stream().map(p -> p.getId().getProductId()).toList());
|
||||||
for (int i = 0; i < products.size(); i++) {
|
for (int i = 0; i < products.size(); i++) {
|
||||||
final Long currentId = products.get(i).getId();
|
final Long currentId = products.get(i).getId();
|
||||||
@ -81,18 +76,18 @@ public class OrderService {
|
|||||||
orderProductsList.remove(orderProducts);
|
orderProductsList.remove(orderProducts);
|
||||||
product_id.remove(products.get(i).getId());
|
product_id.remove(products.get(i).getId());
|
||||||
orderProducts.setCount(count[i]);
|
orderProducts.setCount(count[i]);
|
||||||
em.merge(orderProducts);
|
orderProductRepository.save(orderProducts);
|
||||||
} else {
|
} else {
|
||||||
final OrderProducts orderProducts = new OrderProducts(currentOrder, products.get(i), count[i]);
|
final OrderProducts orderProducts = new OrderProducts(currentOrder, products.get(i), count[i]);
|
||||||
currentOrder.addProduct(orderProducts);
|
currentOrder.addProduct(orderProducts);
|
||||||
products.get(i).addOrder(orderProducts);
|
products.get(i).addOrder(orderProducts);
|
||||||
em.persist(orderProducts);
|
orderProductRepository.save(orderProducts);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (int i = 0; i < orderProductsList.size(); i++) {
|
for (int i = 0; i < orderProductsList.size(); i++) {
|
||||||
orderProductsList.get(i).getProduct().removeOrder(orderProductsList.get(i));
|
orderProductsList.get(i).getProduct().removeOrder(orderProductsList.get(i));
|
||||||
orderProductsList.get(i).getOrder().removeProducts(orderProductsList.get(i));
|
orderProductsList.get(i).getOrder().removeProducts(orderProductsList.get(i));
|
||||||
em.remove(orderProductsList.get(i));
|
orderProductRepository.delete(orderProductsList.get(i));
|
||||||
}
|
}
|
||||||
return currentOrder;
|
return currentOrder;
|
||||||
}
|
}
|
||||||
@ -105,14 +100,14 @@ public class OrderService {
|
|||||||
OrderProducts temp = currentOrder.getProducts().get(0);
|
OrderProducts temp = currentOrder.getProducts().get(0);
|
||||||
temp.getProduct().removeOrder(temp);
|
temp.getProduct().removeOrder(temp);
|
||||||
temp.getOrder().removeProducts(temp);
|
temp.getOrder().removeProducts(temp);
|
||||||
em.remove(temp);
|
orderProductRepository.delete(temp);
|
||||||
}
|
}
|
||||||
em.remove(currentOrder);
|
orderRepository.delete(currentOrder);
|
||||||
return currentOrder;
|
return currentOrder;
|
||||||
}
|
}
|
||||||
@Transactional
|
@Transactional
|
||||||
public void deleteAllOrder() {
|
public void deleteAllOrder() {
|
||||||
em.createQuery("delete from OrderProducts").executeUpdate();
|
orderProductRepository.deleteAll();
|
||||||
em.createQuery("delete from Order").executeUpdate();
|
orderRepository.deleteAll();
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
package ip.labwork.shop.service;
|
||||||
|
|
||||||
|
public class ProductNotFoundException extends RuntimeException {
|
||||||
|
public ProductNotFoundException(Long id) {
|
||||||
|
super(String.format("Product with id [%s] is not found", id));
|
||||||
|
}
|
||||||
|
}
|
@ -4,6 +4,11 @@ import ip.labwork.shop.model.Component;
|
|||||||
import ip.labwork.shop.model.OrderProducts;
|
import ip.labwork.shop.model.OrderProducts;
|
||||||
import ip.labwork.shop.model.Product;
|
import ip.labwork.shop.model.Product;
|
||||||
import ip.labwork.shop.model.ProductComponents;
|
import ip.labwork.shop.model.ProductComponents;
|
||||||
|
import ip.labwork.shop.repository.ComponentRepository;
|
||||||
|
import ip.labwork.shop.repository.OrderProductRepository;
|
||||||
|
import ip.labwork.shop.repository.ProductComponentRepository;
|
||||||
|
import ip.labwork.shop.repository.ProductRepository;
|
||||||
|
import ip.labwork.util.validation.ValidatorUtil;
|
||||||
import jakarta.persistence.EntityManager;
|
import jakarta.persistence.EntityManager;
|
||||||
import jakarta.persistence.EntityNotFoundException;
|
import jakarta.persistence.EntityNotFoundException;
|
||||||
import jakarta.persistence.PersistenceContext;
|
import jakarta.persistence.PersistenceContext;
|
||||||
@ -11,58 +16,55 @@ import org.springframework.stereotype.Service;
|
|||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
import org.springframework.util.StringUtils;
|
import org.springframework.util.StringUtils;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
public class ProductService {
|
public class ProductService {
|
||||||
@PersistenceContext
|
private final ProductRepository productRepository;
|
||||||
private EntityManager em;
|
private final ProductComponentRepository productComponentRepository;
|
||||||
|
private final OrderProductRepository orderProductRepository;
|
||||||
|
private final ValidatorUtil validatorUtil;
|
||||||
|
|
||||||
|
public ProductService(ProductRepository productRepository,
|
||||||
|
ValidatorUtil validatorUtil, ProductComponentRepository productComponentRepository, OrderProductRepository orderProductRepository) {
|
||||||
|
this.productRepository = productRepository;
|
||||||
|
this.validatorUtil = validatorUtil;
|
||||||
|
this.productComponentRepository = productComponentRepository;
|
||||||
|
this.orderProductRepository = orderProductRepository;
|
||||||
|
}
|
||||||
@Transactional
|
@Transactional
|
||||||
public Product addProduct(String productName, Integer price, Integer[] count, List<Component> components) {
|
public Product addProduct(String productName, Integer price, Integer[] count, List<Component> components) {
|
||||||
if (!StringUtils.hasText(productName) || price == 0 || count.length == 0 || Arrays.stream(count).filter(c -> c == 0).toList().size() != 0 || components.size() == 0 || components.stream().filter(Objects::isNull).toList().size() != 0 || count.length != components.size()) {
|
|
||||||
throw new IllegalArgumentException("Product name is null or empty");
|
|
||||||
}
|
|
||||||
final Product product = new Product(productName, price);
|
final Product product = new Product(productName, price);
|
||||||
em.persist(product);
|
validatorUtil.validate(product);
|
||||||
|
productRepository.save(product);
|
||||||
for (int i = 0; i < components.size(); i++) {
|
for (int i = 0; i < components.size(); i++) {
|
||||||
final ProductComponents productComponents = new ProductComponents(components.get(i), product, count[i]);
|
final ProductComponents productComponents = new ProductComponents(components.get(i), product, count[i]);
|
||||||
product.addComponent(productComponents);
|
product.addComponent(productComponents);
|
||||||
components.get(i).addProduct(productComponents);
|
components.get(i).addProduct(productComponents);
|
||||||
em.persist(productComponents);
|
productComponentRepository.save(productComponents);
|
||||||
}
|
}
|
||||||
return product;
|
return product;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Transactional(readOnly = true)
|
@Transactional(readOnly = true)
|
||||||
public Product findProduct(Long id) {
|
public Product findProduct(Long id) {
|
||||||
final Product product = em.find(Product.class, id);
|
final Optional<Product> product = productRepository.findById(id);
|
||||||
if (product == null) {
|
return product.orElseThrow(() -> new ProductNotFoundException(id));
|
||||||
throw new EntityNotFoundException(String.format("Product with id [%s] is not found", id));
|
|
||||||
}
|
|
||||||
return product;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Transactional(readOnly = true)
|
@Transactional(readOnly = true)
|
||||||
public List<Product> findAllProduct() {
|
public List<Product> findAllProduct() {
|
||||||
return em.createQuery("select p from Product p", Product.class)
|
return productRepository.findAll();
|
||||||
.getResultList();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Transactional
|
@Transactional
|
||||||
public Product updateProduct(Long id, String productName, Integer price, Integer[] count, List<Component> components) {
|
public Product updateProduct(Long id, String productName, Integer price, Integer[] count, List<Component> components) {
|
||||||
if (!StringUtils.hasText(productName) || price == 0 || count.length == 0 || Arrays.stream(count).filter(c -> c == 0).toList().size() != 0 || components.size() == 0 || components.stream().filter(Objects::isNull).toList().size() != 0 || count.length != components.size()) {
|
|
||||||
throw new IllegalArgumentException("Product name is null or empty");
|
|
||||||
}
|
|
||||||
final Product currentProduct = findProduct(id);
|
final Product currentProduct = findProduct(id);
|
||||||
currentProduct.setProductName(productName);
|
currentProduct.setProductName(productName);
|
||||||
currentProduct.setPrice(price);
|
currentProduct.setPrice(price);
|
||||||
em.merge(currentProduct);
|
validatorUtil.validate(currentProduct);
|
||||||
List<ProductComponents> productComponentsList = em.createQuery("select p from ProductComponents p where p.id.productId = " + id, ProductComponents.class)
|
productRepository.save(currentProduct);
|
||||||
.getResultList();
|
List<ProductComponents> productComponentsList = productComponentRepository.getProductComponentsByProductId(id);
|
||||||
List<Long> component_id = new ArrayList<>(productComponentsList.stream().map(p -> p.getId().getComponentId()).toList());
|
List<Long> component_id = new ArrayList<>(productComponentsList.stream().map(p -> p.getId().getComponentId()).toList());
|
||||||
for (int i = 0; i < components.size(); i++) {
|
for (int i = 0; i < components.size(); i++) {
|
||||||
final Long currentId = components.get(i).getId();
|
final Long currentId = components.get(i).getId();
|
||||||
@ -71,18 +73,18 @@ public class ProductService {
|
|||||||
productComponentsList.remove(productComponents);
|
productComponentsList.remove(productComponents);
|
||||||
component_id.remove(components.get(i).getId());
|
component_id.remove(components.get(i).getId());
|
||||||
productComponents.setCount(count[i]);
|
productComponents.setCount(count[i]);
|
||||||
em.merge(productComponents);
|
productComponentRepository.save(productComponents);
|
||||||
} else {
|
} else {
|
||||||
final ProductComponents productComponents = new ProductComponents(components.get(i), currentProduct, count[i]);
|
final ProductComponents productComponents = new ProductComponents(components.get(i), currentProduct, count[i]);
|
||||||
currentProduct.addComponent(productComponents);
|
currentProduct.addComponent(productComponents);
|
||||||
components.get(i).addProduct(productComponents);
|
components.get(i).addProduct(productComponents);
|
||||||
em.persist(productComponents);
|
productComponentRepository.save(productComponents);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (int i = 0; i < productComponentsList.size(); i++) {
|
for (int i = 0; i < productComponentsList.size(); i++) {
|
||||||
productComponentsList.get(i).getComponent().removeProduct(productComponentsList.get(i));
|
productComponentsList.get(i).getComponent().removeProduct(productComponentsList.get(i));
|
||||||
productComponentsList.get(i).getProduct().removeComponent(productComponentsList.get(i));
|
productComponentsList.get(i).getProduct().removeComponent(productComponentsList.get(i));
|
||||||
em.remove(productComponentsList.get(i));
|
productComponentRepository.delete(productComponentsList.get(i));
|
||||||
}
|
}
|
||||||
return currentProduct;
|
return currentProduct;
|
||||||
}
|
}
|
||||||
@ -95,35 +97,28 @@ public class ProductService {
|
|||||||
ProductComponents temp = currentProduct.getComponents().get(0);
|
ProductComponents temp = currentProduct.getComponents().get(0);
|
||||||
temp.getComponent().removeProduct(temp);
|
temp.getComponent().removeProduct(temp);
|
||||||
temp.getProduct().removeComponent(temp);
|
temp.getProduct().removeComponent(temp);
|
||||||
em.remove(temp);
|
productComponentRepository.delete(temp);
|
||||||
}
|
}
|
||||||
int ordSize = currentProduct.getOrders().size();
|
int ordSize = currentProduct.getOrders().size();
|
||||||
for (int i = 0; i < ordSize; i++){
|
for (int i = 0; i < ordSize; i++){
|
||||||
OrderProducts temp = currentProduct.getOrders().get(0);
|
OrderProducts temp = currentProduct.getOrders().get(0);
|
||||||
temp.getProduct().removeOrder(temp);
|
temp.getProduct().removeOrder(temp);
|
||||||
temp.getOrder().removeProducts(temp);
|
temp.getOrder().removeProducts(temp);
|
||||||
em.remove(temp);
|
orderProductRepository.delete(temp);
|
||||||
}
|
}
|
||||||
em.remove(currentProduct);
|
productRepository.delete(currentProduct);
|
||||||
return currentProduct;
|
return currentProduct;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Transactional
|
@Transactional
|
||||||
public void deleteAllProduct() {
|
public void deleteAllProduct() {
|
||||||
em.createQuery("delete from ProductComponents").executeUpdate();
|
productComponentRepository.deleteAll();
|
||||||
em.createQuery("delete from OrderProducts ").executeUpdate();
|
orderProductRepository.deleteAll();
|
||||||
em.createQuery("delete from Product").executeUpdate();
|
productRepository.deleteAll();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Transactional
|
@Transactional
|
||||||
public List<Product> findFiltredProducts(Long[] arr) {
|
public List<Product> findFiltredProducts(Long[] arr) {
|
||||||
if (arr.length == 0) {
|
return productRepository.findAllById(Arrays.stream(arr).toList());
|
||||||
throw new IllegalArgumentException("Array id is empty");
|
|
||||||
}
|
|
||||||
List<Product> productList = new ArrayList<>();
|
|
||||||
for (int i = 0; i < arr.length; i++) {
|
|
||||||
productList.add(em.find(Product.class, arr[i]));
|
|
||||||
}
|
|
||||||
return productList;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
17
src/main/java/ip/labwork/test/controller/TestController.java
Normal file
17
src/main/java/ip/labwork/test/controller/TestController.java
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
package ip.labwork.test.controller;
|
||||||
|
|
||||||
|
import ip.labwork.test.model.TestDto;
|
||||||
|
import jakarta.validation.Valid;
|
||||||
|
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;
|
||||||
|
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/test")
|
||||||
|
public class TestController {
|
||||||
|
@PostMapping
|
||||||
|
public TestDto testValidation(@RequestBody @Valid TestDto testDto) {
|
||||||
|
return testDto;
|
||||||
|
}
|
||||||
|
}
|
31
src/main/java/ip/labwork/test/model/TestDto.java
Normal file
31
src/main/java/ip/labwork/test/model/TestDto.java
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
package ip.labwork.test.model;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
|
import jakarta.validation.constraints.NotBlank;
|
||||||
|
import jakarta.validation.constraints.NotNull;
|
||||||
|
|
||||||
|
public class TestDto {
|
||||||
|
@NotNull(message = "Id can't be null")
|
||||||
|
private Long id;
|
||||||
|
@NotBlank(message = "Name can't be null or empty")
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
public Long getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
@JsonProperty(access = JsonProperty.Access.READ_ONLY)
|
||||||
|
public String getData() {
|
||||||
|
return String.format("%s %s", id, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
@JsonIgnore
|
||||||
|
public String getAnotherData() {
|
||||||
|
return "Test";
|
||||||
|
}
|
||||||
|
}
|
42
src/main/java/ip/labwork/util/error/AdviceController.java
Normal file
42
src/main/java/ip/labwork/util/error/AdviceController.java
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
package ip.labwork.util.error;
|
||||||
|
|
||||||
|
import ip.labwork.shop.service.ComponentNotFoundException;
|
||||||
|
import ip.labwork.shop.service.OrderNotFoundException;
|
||||||
|
import ip.labwork.shop.service.ProductNotFoundException;
|
||||||
|
import ip.labwork.util.validation.ValidationException;
|
||||||
|
import org.springframework.http.HttpStatus;
|
||||||
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.context.support.DefaultMessageSourceResolvable;
|
||||||
|
import org.springframework.web.bind.MethodArgumentNotValidException;
|
||||||
|
import org.springframework.web.bind.annotation.ControllerAdvice;
|
||||||
|
import org.springframework.web.bind.annotation.ExceptionHandler;
|
||||||
|
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
@ControllerAdvice
|
||||||
|
public class AdviceController {
|
||||||
|
@ExceptionHandler({
|
||||||
|
ComponentNotFoundException.class,
|
||||||
|
ProductNotFoundException.class,
|
||||||
|
OrderNotFoundException.class,
|
||||||
|
ValidationException.class
|
||||||
|
})
|
||||||
|
public ResponseEntity<Object> handleException(Throwable e) {
|
||||||
|
return new ResponseEntity<>(e.getMessage(), HttpStatus.BAD_REQUEST);
|
||||||
|
}
|
||||||
|
|
||||||
|
@ExceptionHandler(MethodArgumentNotValidException.class)
|
||||||
|
public ResponseEntity<Object> handleBindException(MethodArgumentNotValidException e) {
|
||||||
|
final ValidationException validationException = new ValidationException(
|
||||||
|
e.getBindingResult().getAllErrors().stream()
|
||||||
|
.map(DefaultMessageSourceResolvable::getDefaultMessage)
|
||||||
|
.collect(Collectors.toSet()));
|
||||||
|
return handleException(validationException);
|
||||||
|
}
|
||||||
|
|
||||||
|
@ExceptionHandler(Exception.class)
|
||||||
|
public ResponseEntity<Object> handleUnknownException(Throwable e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return new ResponseEntity<>(e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,9 @@
|
|||||||
|
package ip.labwork.util.validation;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
public class ValidationException extends RuntimeException {
|
||||||
|
public ValidationException(Set<String> errors) {
|
||||||
|
super(String.join("\n", errors));
|
||||||
|
}
|
||||||
|
}
|
33
src/main/java/ip/labwork/util/validation/ValidatorUtil.java
Normal file
33
src/main/java/ip/labwork/util/validation/ValidatorUtil.java
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
package ip.labwork.util.validation;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
import jakarta.validation.ConstraintViolation;
|
||||||
|
import jakarta.validation.Validation;
|
||||||
|
import jakarta.validation.Validator;
|
||||||
|
import jakarta.validation.ValidatorFactory;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class ValidatorUtil {
|
||||||
|
private final Validator validator;
|
||||||
|
|
||||||
|
public ValidatorUtil() {
|
||||||
|
try (ValidatorFactory factory = Validation.buildDefaultValidatorFactory()) {
|
||||||
|
this.validator = factory.getValidator();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public <T> void validate(T object) {
|
||||||
|
final Set<ConstraintViolation<T>> errors = validator.validate(object);
|
||||||
|
if (!errors.isEmpty()) {
|
||||||
|
throw new ValidationException(errors.stream()
|
||||||
|
.map(ConstraintViolation::getMessage)
|
||||||
|
.collect(Collectors.toSet()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,5 +1,5 @@
|
|||||||
spring.main.banner-mode=off
|
spring.main.banner-mode=off
|
||||||
#server.port=8080
|
server.port=8080
|
||||||
spring.datasource.url=jdbc:h2:file:./data
|
spring.datasource.url=jdbc:h2:file:./data
|
||||||
spring.datasource.driverClassName=org.h2.Driver
|
spring.datasource.driverClassName=org.h2.Driver
|
||||||
spring.datasource.username=sa
|
spring.datasource.username=sa
|
||||||
|
Loading…
Reference in New Issue
Block a user