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
9 changes: 9 additions & 0 deletions department-service.http
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
###– возвращает список сотрудников по департаменту
GET http://localhost:8080/department/employees
### – возвращает сумму зарплат по департаменту
GET http://localhost:8080/department/2/salary/sum

### – возвращает максимальную зарплату по департаменту
GET http://localhost:8080/department/2/salary/max
### – возвращает минимальную зарплату по департаменту
GET http://localhost:8080/department/2/salary/min
6 changes: 6 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,12 @@
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>org.jetbrains</groupId>
<artifactId>annotations</artifactId>
<version>RELEASE</version>
<scope>test</scope>
</dependency>
</dependencies>

<build>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package ru.skypro.weblibrary.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import ru.skypro.weblibrary.entity.Employee;
import ru.skypro.weblibrary.service.DepartmentService;

import java.util.Collection;
import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("department")
public class DepartmentController {
private final DepartmentService departmentService;

public DepartmentController(DepartmentService departmentService) {
this.departmentService = departmentService;
}

@GetMapping("/employees")
public Map<Integer, List<Employee>> getEmployees(){
return departmentService.getEmployees();
}

@GetMapping("/{id}/salary/sum")
public Integer getSalarySum(@PathVariable Integer id){
return departmentService.getSalarySum(id);
}
@GetMapping("/{id}/salary/min")
public Integer getSalaryMin(@PathVariable Integer id){
return departmentService.getSalaryMin(id);
}
@GetMapping("/{id}/salary/max")
public Integer getSalaryMax(@PathVariable Integer id){
return departmentService.getSalaryMax(id);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,15 +29,15 @@ public Employee addEmployee(@RequestBody EmployeeRequest employee){

@GetMapping("employee/salary/sum")
public Integer getSumAlary(){
return employeeService.getSumAlary();
return employeeService.getSumSalary();
}
@GetMapping("employee/salary/min")
public Employee getMinAlary(){
return employeeService.getMinAlary();
return employeeService.getMinSalary();
}
@GetMapping("employee/salary/max")
public Employee getMaxAlary(){
return employeeService.getMaxAlary();
return employeeService.getMaxSalary();
}
@GetMapping("employee/high-salary")
public List<Employee> getHighSalary(@RequestParam Integer salary){
Expand Down
14 changes: 14 additions & 0 deletions src/main/java/ru/skypro/weblibrary/entity/Employee.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package ru.skypro.weblibrary.entity;

import java.util.Objects;

public class Employee {
private static int counter;
private final Integer id;
Expand Down Expand Up @@ -41,4 +43,16 @@ public Integer getDepartment() {
public Integer getSalary() {
return salary;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Employee employee)) return false;
return getId().equals(employee.getId()) && getFirstName().equals(employee.getFirstName()) && getLastName().equals(employee.getLastName()) && getSecondName().equals(employee.getSecondName()) && getDepartment().equals(employee.getDepartment()) && getSalary().equals(employee.getSalary());
}

@Override
public int hashCode() {
return Objects.hash(getId(), getFirstName(), getLastName(), getSecondName(), getDepartment(), getSalary());
}
}
17 changes: 17 additions & 0 deletions src/main/java/ru/skypro/weblibrary/service/DepartmentService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package ru.skypro.weblibrary.service;

import ru.skypro.weblibrary.entity.Employee;

import java.util.Collection;
import java.util.List;
import java.util.Map;

public interface DepartmentService {
Map<Integer, List<Employee>> getEmployees();

Integer getSalarySum(Integer id);

Integer getSalaryMin(Integer id);

Integer getSalaryMax(Integer id);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package ru.skypro.weblibrary.service;

import org.springframework.stereotype.Service;
import ru.skypro.weblibrary.entity.Employee;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Service
public class DepartmentServiceImpl implements DepartmentService {

final EmployeeService employeeService;

public DepartmentServiceImpl(EmployeeService employeeService) {
this.employeeService = employeeService;
}

@Override
public Map<Integer, List<Employee>> getEmployees() {
return employeeService.getListEmployee().stream().collect(Collectors.groupingBy(Employee::getDepartment));
}

@Override
public Integer getSalarySum(Integer id) {
return employeeService.getListEmployee().stream()
.filter(e-> e.getDepartment().equals(id))
.mapToInt(Employee::getSalary)
.sum();
}

@Override
public Integer getSalaryMin(Integer id) {
return employeeService.getListEmployee().stream()
.filter(e-> e.getDepartment().equals(id))
.mapToInt(Employee::getSalary)
.min().orElseThrow();
}

@Override
public Integer getSalaryMax(Integer id) {
return employeeService.getListEmployee().stream()
.filter(e-> e.getDepartment().equals(id))
.mapToInt(Employee::getSalary)
.max().orElseThrow();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,11 @@ public interface EmployeeService {

Employee addEmployee(EmployeeRequest employeeRequest);

Integer getSumAlary();
Integer getSumSalary();

Employee getMinAlary();
Employee getMinSalary();

Employee getMaxAlary();
Employee getMaxSalary();

List<Employee> getHighSalary(Integer salary);
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@ public Employee addEmployee(EmployeeRequest employeeRequest) {
if (employeeRequest.getFirstName() == null || employeeRequest.getLastName() == null) {
throw new IllegalArgumentException("Employee name should be set");
}
if (employeeRequest.getSalary() == null || employeeRequest.getDepartment() == null){
throw new IllegalArgumentException("Department or Salary is not defined");
}
if (!StringUtils.isAlpha(employeeRequest.getFirstName())
|| !StringUtils.isAlpha(employeeRequest.getLastName())
|| !StringUtils.isAlpha(employeeRequest.getSecondName())
Expand All @@ -40,17 +43,17 @@ public Employee addEmployee(EmployeeRequest employeeRequest) {
}

@Override
public Integer getSumAlary() {
public Integer getSumSalary() {
return employees.values().stream().mapToInt(Employee::getSalary).sum();
}

@Override
public Employee getMinAlary() {
public Employee getMinSalary() {
return employees.values().stream().reduce((e1, e2) -> e1.getSalary() < e2.getSalary() ? e1 : e2).orElseThrow();
}

@Override
public Employee getMaxAlary() {
public Employee getMaxSalary() {
return employees.values().stream().reduce((e1, e2) -> e1.getSalary() > e2.getSalary() ? e1 : e2).orElseThrow();
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
package ru.skypro.weblibrary.service;

import org.jetbrains.annotations.NotNull;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.ValueSource;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.jupiter.MockitoExtension;
import ru.skypro.weblibrary.dto.EmployeeRequest;
import ru.skypro.weblibrary.entity.Employee;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import static org.junit.jupiter.api.Assertions.*;

@ExtendWith(MockitoExtension.class)
class DepartmentServiceTest {
static List<Employee> ret = new ArrayList<Employee>();
@Mock
EmployeeService employeeService;
@InjectMocks
DepartmentServiceImpl departmentService;

@BeforeAll
static void init(){
Employee employee;
var letArr = new String[]{"A", "B", "C", "D","E"};
var i = 0;
for (String let:letArr
) {
i++;
employee = new Employee(
"FirstName"+let,
"LastName"+let,
"SecondName"+let,
i%2+1,
(i%3+1)*1000
);
ret.add(employee);
}
}

@Test
void getEmployees() {
Mockito.when(employeeService.getListEmployee()).thenReturn(ret);
var expected = ret.stream().collect(Collectors.groupingBy(Employee::getDepartment));
var actual = departmentService.getEmployees();
assertEquals(expected,actual);
}

@ParameterizedTest
@ValueSource(ints = {1, 2})
void getSalarySum(Integer id) {
Mockito.when(employeeService.getListEmployee()).thenReturn(ret);
var expected = ret.stream().filter(e-> e.getDepartment().equals(id))
.mapToInt(Employee::getSalary)
.sum();
var actual = departmentService.getSalarySum(id);
assertEquals(expected,actual);
}

@ParameterizedTest
@ValueSource(ints = {1, 2})
void getSalaryMin(Integer id) {
Mockito.when(employeeService.getListEmployee()).thenReturn(ret);
var expected = ret.stream().filter(e-> e.getDepartment().equals(id))
.mapToInt(Employee::getSalary)
.min().orElseThrow();
var actual = departmentService.getSalaryMin(id);
assertEquals(expected,actual);
}

@ParameterizedTest
@ValueSource(ints = {1, 2})
void getSalaryMax(Integer id) {
Mockito.when(employeeService.getListEmployee()).thenReturn(ret);
var expected = ret.stream().filter(e-> e.getDepartment().equals(id))
.mapToInt(Employee::getSalary)
.max().orElseThrow();
var actual = departmentService.getSalaryMax(id);
assertEquals(expected,actual);
}
}
Loading