From a8480602c948babbd0b12351b115d5702952dc0b Mon Sep 17 00:00:00 2001 From: Konstantin Date: Thu, 20 Feb 2025 15:26:07 +0300 Subject: [PATCH] add entry db (history) --- .../nto/controller/EmployeeController.java | 13 ++++++- .../java/com/example/nto/model/EntryType.java | 6 +++ .../com/example/nto/model/entity/Entry.java | 31 +++++++++++++++ .../nto/repository/EntryRepository.java | 15 +++++++ .../example/nto/service/EmployeeService.java | 12 +++++- .../nto/service/impl/EmployeeServiceImpl.java | 39 ++++++++++++++----- src/main/resources/data.sql | 6 ++- 7 files changed, 108 insertions(+), 14 deletions(-) create mode 100644 src/main/java/com/example/nto/model/EntryType.java create mode 100644 src/main/java/com/example/nto/model/entity/Entry.java create mode 100644 src/main/java/com/example/nto/repository/EntryRepository.java diff --git a/src/main/java/com/example/nto/controller/EmployeeController.java b/src/main/java/com/example/nto/controller/EmployeeController.java index 2f189fd..36f5d4d 100644 --- a/src/main/java/com/example/nto/controller/EmployeeController.java +++ b/src/main/java/com/example/nto/controller/EmployeeController.java @@ -3,6 +3,7 @@ package com.example.nto.controller; import com.example.nto.model.dto.EmployeeDTO; import com.example.nto.model.entity.Code; import com.example.nto.model.entity.Employee; +import com.example.nto.model.entity.Entry; import com.example.nto.service.EmployeeService; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; @@ -13,6 +14,7 @@ import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; +import java.util.List; @RestController @RequestMapping("/api") @@ -26,6 +28,13 @@ public class EmployeeController { return new ResponseEntity<>(null, HttpStatus.OK); } + @GetMapping("/entries") + public List getAllEntriesByLogin(@RequestParam String login) { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + String recipientLogin = authentication.getName(); + return employeeService.getAllEntriesByLogin(login, recipientLogin); + } + @GetMapping("/info") public EmployeeDTO info(@RequestParam final String login) { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); @@ -34,8 +43,8 @@ public class EmployeeController { } @PatchMapping("/open") - public void open(@RequestParam final String login, @RequestBody final Code code) { - employeeService.updateVisit(login, code.getValue()); + public void open(@RequestBody final Entry entry) { + employeeService.updateVisit(entry); } @PreAuthorize("hasAuthority('ROLE_ADMIN')") diff --git a/src/main/java/com/example/nto/model/EntryType.java b/src/main/java/com/example/nto/model/EntryType.java new file mode 100644 index 0000000..d63d0b0 --- /dev/null +++ b/src/main/java/com/example/nto/model/EntryType.java @@ -0,0 +1,6 @@ +package com.example.nto.model; + +public enum EntryType { + PHONE, + CARD +} diff --git a/src/main/java/com/example/nto/model/entity/Entry.java b/src/main/java/com/example/nto/model/entity/Entry.java new file mode 100644 index 0000000..4a35ca6 --- /dev/null +++ b/src/main/java/com/example/nto/model/entity/Entry.java @@ -0,0 +1,31 @@ +package com.example.nto.model.entity; + +import com.example.nto.model.EntryType; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.*; +import java.time.LocalDateTime; + +@Entity(name = "entry") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class Entry { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private long id; + + private long value; + + @Enumerated(EnumType.STRING) + private EntryType type; + + private LocalDateTime dateTime; + + private String login; +} diff --git a/src/main/java/com/example/nto/repository/EntryRepository.java b/src/main/java/com/example/nto/repository/EntryRepository.java new file mode 100644 index 0000000..79b124f --- /dev/null +++ b/src/main/java/com/example/nto/repository/EntryRepository.java @@ -0,0 +1,15 @@ +package com.example.nto.repository; + +import com.example.nto.model.entity.Employee; +import com.example.nto.model.entity.Entry; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface EntryRepository extends JpaRepository { + + List findAllEntryByLogin(final String login); + +} diff --git a/src/main/java/com/example/nto/service/EmployeeService.java b/src/main/java/com/example/nto/service/EmployeeService.java index 243b623..d009185 100644 --- a/src/main/java/com/example/nto/service/EmployeeService.java +++ b/src/main/java/com/example/nto/service/EmployeeService.java @@ -2,17 +2,25 @@ package com.example.nto.service; import com.example.nto.model.dto.EmployeeDTO; import com.example.nto.model.entity.Employee; +import com.example.nto.model.entity.Entry; import org.springframework.security.core.userdetails.UserDetails; +import java.util.List; + public interface EmployeeService { - EmployeeDTO getEmployeeDTO(String login, final String recipientLogin); + EmployeeDTO getEmployeeDTO(String login, String recipientLogin); - void updateVisit(String login, long value); + void updateVisit(Entry entry); void addEmployee(Employee employee); void banEmployee(String login); void unbanEmployee(String login); + + void addEntry(Entry entry); + + List getAllEntriesByLogin(String login, final String recipientLogin); + } diff --git a/src/main/java/com/example/nto/service/impl/EmployeeServiceImpl.java b/src/main/java/com/example/nto/service/impl/EmployeeServiceImpl.java index bd385d7..1a1cd9c 100644 --- a/src/main/java/com/example/nto/service/impl/EmployeeServiceImpl.java +++ b/src/main/java/com/example/nto/service/impl/EmployeeServiceImpl.java @@ -4,8 +4,10 @@ import com.example.nto.mapper.EmployeeDTOMapper; import com.example.nto.model.EmployeeRoleType; import com.example.nto.model.dto.EmployeeDTO; import com.example.nto.model.entity.Employee; +import com.example.nto.model.entity.Entry; import com.example.nto.repository.CodeRepository; import com.example.nto.repository.EmployeeRepository; +import com.example.nto.repository.EntryRepository; import com.example.nto.service.EmployeeService; import com.example.nto.service.exception.CodeNotFoundException; import com.example.nto.service.exception.EmployeeBannedException; @@ -15,7 +17,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; -import java.time.LocalDateTime; +import java.util.List; import java.util.Objects; @Service @@ -30,6 +32,8 @@ public class EmployeeServiceImpl implements EmployeeService { private final EmployeeDTOMapper employeeDTOMapper; + private final EntryRepository entryRepository; + private void employeeExists(final String login) { if (!employeeRepository.existsByLogin(login)) { throw new EmployeeNotFoundException(); @@ -39,14 +43,13 @@ public class EmployeeServiceImpl implements EmployeeService { @Override public EmployeeDTO getEmployeeDTO(final String login, final String recipientLogin) { employeeExists(login); - var e = employeeRepository.findEmployeeByLogin(login); - if (!Objects.equals(e.getLogin(), recipientLogin)) { + if (!Objects.equals(login, recipientLogin)) { var recipient = getEmployee(recipientLogin); if (recipient.getRole() != EmployeeRoleType.ADMIN) { throw new NotAnAdminException(); } } - return employeeDTOMapper.map(e); + return employeeDTOMapper.map(employeeRepository.findEmployeeByLogin(login)); } private Employee getEmployee(final String login) { @@ -55,17 +58,18 @@ public class EmployeeServiceImpl implements EmployeeService { } @Override - public void updateVisit(final String login, final long value) { - employeeExists(login); - if (!codeRepository.existsByValue(value)) { + public void updateVisit(Entry entry) { + employeeExists(entry.getLogin()); + if (!codeRepository.existsByValue(entry.getValue())) { throw new CodeNotFoundException(); } - final Employee employee = getEmployee(login); + final Employee employee = getEmployee(entry.getLogin()); if (employee.getIsBanned()) { throw new EmployeeBannedException(); } - employee.setLastVisit(LocalDateTime.now()); + employee.setLastVisit(entry.getDateTime()); employeeRepository.save(employee); + addEntry(entry); } @Override @@ -89,4 +93,21 @@ public class EmployeeServiceImpl implements EmployeeService { employee.setIsBanned(false); employeeRepository.save(employee); } + + @Override + public void addEntry(Entry entry) { + entryRepository.save(entry); + } + + @Override + public List getAllEntriesByLogin(String login, String recipientLogin) { + employeeExists(login); + if (!Objects.equals(login, recipientLogin)) { + var recipient = getEmployee(recipientLogin); + if (recipient.getRole() != EmployeeRoleType.ADMIN) { + throw new NotAnAdminException(); + } + } + return entryRepository.findAllEntryByLogin(login); + } } diff --git a/src/main/resources/data.sql b/src/main/resources/data.sql index 228a2d6..6e26d68 100644 --- a/src/main/resources/data.sql +++ b/src/main/resources/data.sql @@ -11,4 +11,8 @@ VALUES (9223372036854775807), (1122334455667788990), (998877665544332211), -(5566778899001122334); \ No newline at end of file +(5566778899001122334); + +INSERT INTO entry (value, login, type, date_time) +VALUES +(1234567890123456789, 'pivanov', 'PHONE', '2024-02-13T08:35');