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
19 changes: 19 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -21,3 +21,22 @@

# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*

HELP.md
.gradle
build/
!gradle/wrapper/gradle-wrapper.jar
!**/src/main/**/build/
!**/src/test/**/build/

### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
out/
!**/src/main/**/out/
!**/src/test/**/out/

logs/
*.lst
83 changes: 83 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,13 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://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>2.4.5</version>
<relativePath/>
</parent>

<groupId>com.mastery</groupId>
<artifactId>simplewebapp</artifactId>
<version>0.0.1-SNAPSHOT</version>
Expand All @@ -11,6 +18,82 @@
<name>demo</name>
<description>Practical task</description>

<properties>
<maven.compiler.target>1.9</maven.compiler.target>
<maven.compiler.source>1.9</maven.compiler.source>
<mapstruct.version>1.4.2.Final</mapstruct.version>
<lombok.version>1.18.16</lombok.version>
</properties>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.4.2.Final</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.2.0.Final</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.200</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.2.20</version>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.9</source>
<target>1.9</target>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build>
</project>
12 changes: 12 additions & 0 deletions src/main/java/com/mastery/java/task/Application.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.mastery.java.task;

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);
}
}

This file was deleted.

17 changes: 16 additions & 1 deletion src/main/java/com/mastery/java/task/dao/EmployeeDao.java
Original file line number Diff line number Diff line change
@@ -1,4 +1,19 @@
package com.mastery.java.task.dao;

public class EmployeeDao {
import com.mastery.java.task.model.Employee;

import java.util.List;
import java.util.Optional;

public interface EmployeeDao {

Employee create(Employee employee);

List<Employee> findAll();

Optional<Employee> findById(long id);

Employee update(long id, Employee employee);

void delete(long id);
}
79 changes: 79 additions & 0 deletions src/main/java/com/mastery/java/task/dao/impl/EmployeeDaoImpl.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
package com.mastery.java.task.dao.impl;

import com.mastery.java.task.dao.EmployeeDao;
import com.mastery.java.task.mapper.row_mapper.EmployeeRowMapper;
import com.mastery.java.task.model.Employee;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.simple.SimpleJdbcInsert;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Map;
import java.util.Optional;

@Repository
public class EmployeeDaoImpl implements EmployeeDao {

private final JdbcTemplate jdbcTemplate;
private SimpleJdbcInsert jdbcInsert;

@Autowired
public EmployeeDaoImpl(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
this.jdbcInsert = new SimpleJdbcInsert(jdbcTemplate)
.withSchemaName("employeedb.public")
.withTableName("\"‘employee’ \"")
.usingColumns("first_name", "last_name", "department_id",
"job_title", "gender_id", "date_of_birth")
.usingGeneratedKeyColumns("employee_id");
;
}

@Override
public Employee create(Employee employee) {
Number employeeId = jdbcInsert.executeAndReturnKey(
Map.of("first_name", employee.getFirstName(),
"last_name", employee.getLastName(),
"department_id", employee.getDepartmentId(),
"job_title", employee.getJobTitle(),
"gender_id", employee.getGender().getId(),
"date_of_birth", employee.getDateOfBirth())
);

return employee.setId(employeeId.longValue());
}

@Override
public List<Employee> findAll() {
return jdbcTemplate.query(
"select employee_id, first_name, last_name, department_id, job_title, gender_id, date_of_birth " +
"from public.\"‘employee’ \"",
new EmployeeRowMapper());
}

@Override
public Optional<Employee> findById(long id) {
return jdbcTemplate.query
("select employee_id, first_name, last_name, department_id, job_title, gender_id, date_of_birth " +
"from public.\"‘employee’ \" where employee_id = ?",
new Object[]{id}, new EmployeeRowMapper())
.stream().findAny();
}

@Override
public Employee update(long id, Employee employee) {
jdbcTemplate.update(
"update public.\"‘employee’ \" set first_name = ?, last_name = ?, department_id = ?, job_title = ?, gender_id = ?, date_of_birth = ? " +
"where employee_id = ?",
employee.getFirstName(), employee.getLastName(), employee.getDepartmentId(),
employee.getJobTitle(), employee.getGender().getId(), employee.getDateOfBirth(), id);

return employee.setId(id);
}

@Override
public void delete(long id) {
jdbcTemplate.update("delete from public.\"‘employee’ \" where employee_id = ?", id);
}
}
7 changes: 0 additions & 7 deletions src/main/java/com/mastery/java/task/dto/Employee.java

This file was deleted.

38 changes: 38 additions & 0 deletions src/main/java/com/mastery/java/task/dto/EmployeeDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package com.mastery.java.task.dto;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.validation.constraints.Min;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.time.LocalDateTime;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class EmployeeDto {

private Long employeeId;

@NotEmpty(message = "First name cannot be empty")
private String firstName;

@NotEmpty(message = "First name cannot be empty")
private String lastName;

@Min(value = 0, message = "Department id has to be greater than 0")
@NotNull(message= "Department id cannot be empty")
private Long departmentId;

@NotEmpty(message = "Job title cannot be empty")
private String jobTitle;

@NotEmpty(message = "Gender cannot be empty")
private String gender;

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss")
private LocalDateTime dateOfBirth;
}
6 changes: 0 additions & 6 deletions src/main/java/com/mastery/java/task/dto/Gender.java

This file was deleted.

27 changes: 27 additions & 0 deletions src/main/java/com/mastery/java/task/error_handler/ApiError.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.mastery.java.task.error_handler;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
import org.springframework.http.HttpStatus;

import java.util.Collections;
import java.util.List;

@Getter
@Setter
@AllArgsConstructor
public class ApiError {

private HttpStatus status;
private String error;
private List<String> errors;

public ApiError(HttpStatus status,
String error,
String errorAsList) {
this.status = status;
this.error = error;
this.errors = Collections.singletonList(errorAsList);
}
}
Loading