Skip to content
Open
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
33 changes: 33 additions & 0 deletions module11/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
HELP.md
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/

### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache

### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr

### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/

### VS Code ###
.vscode/
12 changes: 12 additions & 0 deletions module11/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# Module 11. ORM. Spring Data

### Требования:
Реализовать Spring Boot Rest приложение или обычное приложение со страницами где есть возможность:
Показывать список пользователей из бд, добавить пользователя, удалить, изменить

## Критерии приемки:

1. Использовать паттерн проектирования MVC (Model-View-Controller)
2. Написать unit tests для слоя Controller.
3. Написать unit tests для слоя Service и Repository. (задание со звездочкой, разберем на практике)
4. В качестве бд использовать h2 (предпочтение) или любую другую бд.
75 changes: 75 additions & 0 deletions module11/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>module11</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>module11</name>
<description>module11</description>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-ui</artifactId>
<version>1.6.14</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</dependency>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-model</artifactId>
<version>3.0</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>6.1.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
13 changes: 13 additions & 0 deletions module11/src/main/java/com/example/module11/Application.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.example.module11;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.example.module11.config;

import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.info.License;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class OpenApiConfig {
@Bean
public OpenAPI customOpenAPI(@Value("${service.description}") String appDescription, @Value("${service.version}") String appVersion) {
return new OpenAPI()
.info(new Info()
.title("User service API")
.version(appVersion)
.description(appDescription)
.termsOfService("http://swagger.io/terms/")
.license(new License().name("Apache 2.0").url("http://springdoc.org")));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
package com.example.module11.controller;

import com.example.module11.entity.User;
import com.example.module11.service.UserService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping(value = "/api/v1/users", produces = MediaType.APPLICATION_JSON_VALUE)
@RequiredArgsConstructor
@Tag(name = "User", description = "User API")

public class UserController {
private static final Logger logger = LoggerFactory.getLogger(UserController.class);

private final UserService service;

@GetMapping
@Operation(summary = "Get all users")
public ResponseEntity<List<User>> getAllUsers() {
List<User> users = service.findAll();
logger.info("getting user list: {}", users);
return new ResponseEntity<>(users, HttpStatus.OK);
}

/**
* @param userId
* @return
*/
@GetMapping("/{id}")
@Operation(summary = "User car details")
public User getUserById(@PathVariable("id") long userId) {

return service.findById(userId);
}

/**
* @param user
* @return
*/
@PostMapping
@Operation(summary = "Create user")
public ResponseEntity<User> createUser(@RequestBody User user) {
service.save(user);
HttpHeaders headers = new HttpHeaders();
headers.add("Location", "/api/v1/users/" + user.getId());
return new ResponseEntity<>(null, headers, HttpStatus.CREATED);
}

/**
* @param user
* @return
*/
@PutMapping
@Operation(summary = "Update a user")
public ResponseEntity<User> updateUser(@RequestBody User user) {
service.update(user);
return ResponseEntity.ok().build();
}

/**
* @param userId
* @return
*/
@DeleteMapping("/{userId}")
@Operation(summary = "Delete a user by id")
public ResponseEntity<User> deleteUser(@PathVariable long userId) {
service.deleteById(userId);
return ResponseEntity.ok().build();
}

}
26 changes: 26 additions & 0 deletions module11/src/main/java/com/example/module11/entity/User.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.example.module11.entity;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Entity
@Table(name = "users")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {

@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;

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

@Column(name = "age")
private Integer age;

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.example.module11.repository;

import com.example.module11.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

public interface UserRepository extends JpaRepository<User, Long> {
User findUserByName(String name);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package com.example.module11.service;

import com.example.module11.entity.User;
import com.example.module11.repository.UserRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.List;

@Service
@RequiredArgsConstructor
public class UserService {

private final UserRepository repository;

public List<User> findAll() {
return repository.findAll();
}

public User findById(Long id) {
return repository.findById(id).orElseThrow(() -> new RuntimeException("Юзер с id = " + id + " не найден!"));
}

public User save(User user) {
return repository.save(user);
}

public User update(User user) {
findById(user.getId());
return repository.save(user);
}

public void deleteById(Long id) {
findById(id);
repository.deleteById(id);
}
}
9 changes: 9 additions & 0 deletions module11/src/main/resources/application-2h.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
spring:
datasource:
driver-class-name: org.h2.Driver
url: jdbc:h2:file:./app.db;AUTO_SERVER=TRUE
username: admin
password: admin
h2:
console:
enabled: true
30 changes: 30 additions & 0 deletions module11/src/main/resources/application.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
spring:
profiles:
active: h2
jpa:
hibernate:
ddl-auto: create-drop
defer-datasource-initialization: true
show-sql: true
properties:
hibernate:
format_sql: true
sql:
init:
mode: always

server:
port: 8080


logging:
level:
com.example.module11: info
file:
path: userService.log

service:
description: User service
version: 1.0 BETA

# SPRING_PROFILES_ACTIVE=devFILES_ACTIVE=dev
5 changes: 5 additions & 0 deletions module11/src/main/resources/data.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
insert into users(id, name, age)
values (1,'Nik', 29),
(2,'Vasya', 2),
(3,'Elizaveta', 24),
(4,'Anna', 1);
Loading