From 20db8878bc150d923b434e06e99ce6035e485414 Mon Sep 17 00:00:00 2001 From: Denis Oleynik Date: Wed, 19 Feb 2025 19:00:13 +0300 Subject: [PATCH] Add table `Visits` --- src/main/java/com/example/nto/App.java | 13 ++++++ .../nto/controller/AdminController.java | 43 +++++++++++++++++-- .../nto/controller/EmployeeController.java | 24 +++-------- .../com/example/nto/entity/VisitType.java | 5 +++ .../java/com/example/nto/entity/Visits.java | 33 ++++++++++++++ .../nto/repository/CodeRepository.java | 3 ++ .../nto/repository/EmployeeRepository.java | 2 + .../nto/repository/VisitsRepository.java | 12 ++++++ .../com/example/nto/service/CodeService.java | 9 ++++ .../example/nto/service/EmployeeService.java | 7 +++ .../example/nto/service/VisitsService.java | 7 +++ .../nto/service/impl/CodeServiceImpl.java | 17 ++++++++ .../nto/service/impl/EmployeeServiceImpl.java | 15 +++++++ .../nto/service/impl/VisitsServiceImpl.java | 11 +++++ 14 files changed, 181 insertions(+), 20 deletions(-) create mode 100644 src/main/java/com/example/nto/entity/VisitType.java create mode 100644 src/main/java/com/example/nto/entity/Visits.java create mode 100644 src/main/java/com/example/nto/repository/VisitsRepository.java create mode 100644 src/main/java/com/example/nto/service/CodeService.java create mode 100644 src/main/java/com/example/nto/service/VisitsService.java create mode 100644 src/main/java/com/example/nto/service/impl/CodeServiceImpl.java create mode 100644 src/main/java/com/example/nto/service/impl/VisitsServiceImpl.java diff --git a/src/main/java/com/example/nto/App.java b/src/main/java/com/example/nto/App.java index d4add94..b594cb7 100644 --- a/src/main/java/com/example/nto/App.java +++ b/src/main/java/com/example/nto/App.java @@ -1,9 +1,22 @@ package com.example.nto; +import com.example.nto.repository.CodeRepository; +import com.example.nto.repository.EmployeeRepository; +import com.example.nto.repository.VisitsRepository; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; + +import java.util.List; + +import static org.springframework.boot.context.properties.bind.Bindable.listOf; @SpringBootApplication +@EnableJpaRepositories(basePackages = "com.example.nto.repository") +@ComponentScan(basePackages = "com.example.nto.*") +@EntityScan("com.example.nto.*") public class App { public static void main(String[] args) { SpringApplication.run(App.class, args); diff --git a/src/main/java/com/example/nto/controller/AdminController.java b/src/main/java/com/example/nto/controller/AdminController.java index 45a6dca..7ab6353 100644 --- a/src/main/java/com/example/nto/controller/AdminController.java +++ b/src/main/java/com/example/nto/controller/AdminController.java @@ -1,13 +1,17 @@ package com.example.nto.controller; +import com.example.nto.Utils; import com.example.nto.entity.Employee; +import com.example.nto.entity.ResponseData; +import com.example.nto.entity.Visits; import com.example.nto.service.EmployeeService; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; import java.util.List; +import java.util.Optional; @RestController @RequestMapping("/api/admin") @@ -15,8 +19,41 @@ public class AdminController { @Autowired private EmployeeService employeeService; + private Utils utils = new Utils(); + @GetMapping("/employees") public List getEmployees() { return employeeService.getAllEmployees(); } + + @GetMapping("/{username}/info") + public ResponseEntity getEmployeeInfo(@PathVariable("username") String username) { + Optional employee = employeeService.findByLogin(username); + if (employee.isEmpty()) { + return utils.NotFound(); + } + + return new ResponseEntity<>(employee.get(), HttpStatus.OK); + } + + @GetMapping("/{username}/lastVisit") + public ResponseEntity getEmployeeLastVisit(@PathVariable("username") String username) { + Optional employee = employeeService.findByLogin(username); + if (employee.isEmpty()) { + return utils.NotFound(); + } + + return new ResponseEntity<>(employee.get(), HttpStatus.OK); + } + + @GetMapping("/{username}/visits") + public ResponseEntity getEmployeeVisits(@PathVariable("username") String username) { + if (!employeeService.existsByLogin(username)) { + return utils.NotFound(); + } + + Optional> visits = Optional.ofNullable(employeeService.getEmployeeVisits(username)); + + return new ResponseEntity<>(visits.get(), HttpStatus.OK); + } } diff --git a/src/main/java/com/example/nto/controller/EmployeeController.java b/src/main/java/com/example/nto/controller/EmployeeController.java index 42872a3..2937686 100644 --- a/src/main/java/com/example/nto/controller/EmployeeController.java +++ b/src/main/java/com/example/nto/controller/EmployeeController.java @@ -5,6 +5,7 @@ import com.example.nto.entity.Code; import com.example.nto.entity.CodeBody; import com.example.nto.entity.Employee; import com.example.nto.entity.ResponseData; +import com.example.nto.service.CodeService; import com.example.nto.service.EmployeeService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.media.Content; @@ -27,6 +28,8 @@ import java.util.Optional; public class EmployeeController { @Autowired private EmployeeService employeeService; + @Autowired + private CodeService codeService; private Utils utils = new Utils(); @@ -87,26 +90,13 @@ public class EmployeeController { return utils.NotFound(); } - Optional code = employeeService.findCodeById(employee.get().getId()); - if (code.isEmpty()) { + if (!codeService.exists(body.getValue())) { return utils.BadRequest(); } - long codeFromDB = 0; - try { - codeFromDB = code.get().getValue(); - } catch (Exception e) { - employeeService.setCodeEmployee(employee.get().getId(), body.getValue()); - - employeeService.setLastVisitEmployee(employee.get().getId(), LocalDateTime.now()); - return utils.Ok("Door opened success"); - } - - if (codeFromDB != body.getValue()) { - return utils.BadRequest(); - } - - employeeService.setLastVisitEmployee(employee.get().getId(), LocalDateTime.now()); + LocalDateTime time = LocalDateTime.now(); + employeeService.setLastVisitEmployee(employee.get().getId(), time); + employeeService.addVisit(employee.get().getLogin(), time); return utils.Ok("Door opened success"); } catch (Exception e) { System.out.println("Exception: " + e.getMessage()); diff --git a/src/main/java/com/example/nto/entity/VisitType.java b/src/main/java/com/example/nto/entity/VisitType.java new file mode 100644 index 0000000..85788d4 --- /dev/null +++ b/src/main/java/com/example/nto/entity/VisitType.java @@ -0,0 +1,5 @@ +package com.example.nto.entity; + +public enum VisitType { + SCANNER, NFC +} diff --git a/src/main/java/com/example/nto/entity/Visits.java b/src/main/java/com/example/nto/entity/Visits.java new file mode 100644 index 0000000..7c48974 --- /dev/null +++ b/src/main/java/com/example/nto/entity/Visits.java @@ -0,0 +1,33 @@ +package com.example.nto.entity; + +import lombok.*; + +import javax.persistence.*; +import java.time.LocalDateTime; + +@Entity +@Setter +@Getter +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Table(name = "visits") +public class Visits { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id", unique = true, nullable = false) + private long id; + + @Column(name = "username", nullable = false) + private String username; + + @Column(name = "time", nullable = false) + private LocalDateTime time; + + @Column(name = "type", nullable = false) + private VisitType type; + + @Column(name = "reader_id", nullable = false) + private String readerId; +} diff --git a/src/main/java/com/example/nto/repository/CodeRepository.java b/src/main/java/com/example/nto/repository/CodeRepository.java index 4ca3152..9fe0a48 100644 --- a/src/main/java/com/example/nto/repository/CodeRepository.java +++ b/src/main/java/com/example/nto/repository/CodeRepository.java @@ -2,6 +2,9 @@ package com.example.nto.repository; import com.example.nto.entity.Code; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; +@Repository public interface CodeRepository extends JpaRepository { + boolean existsByValue(long value); } diff --git a/src/main/java/com/example/nto/repository/EmployeeRepository.java b/src/main/java/com/example/nto/repository/EmployeeRepository.java index 42a2a2d..d274628 100644 --- a/src/main/java/com/example/nto/repository/EmployeeRepository.java +++ b/src/main/java/com/example/nto/repository/EmployeeRepository.java @@ -2,9 +2,11 @@ package com.example.nto.repository; import com.example.nto.entity.Employee; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; import java.util.Optional; +@Repository public interface EmployeeRepository extends JpaRepository { Optional findByLogin(String login); diff --git a/src/main/java/com/example/nto/repository/VisitsRepository.java b/src/main/java/com/example/nto/repository/VisitsRepository.java new file mode 100644 index 0000000..311d795 --- /dev/null +++ b/src/main/java/com/example/nto/repository/VisitsRepository.java @@ -0,0 +1,12 @@ +package com.example.nto.repository; + +import com.example.nto.entity.Visits; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface VisitsRepository extends JpaRepository { + List findAllByUsername(String username); +} diff --git a/src/main/java/com/example/nto/service/CodeService.java b/src/main/java/com/example/nto/service/CodeService.java new file mode 100644 index 0000000..06f94b0 --- /dev/null +++ b/src/main/java/com/example/nto/service/CodeService.java @@ -0,0 +1,9 @@ +package com.example.nto.service; + +import org.springframework.stereotype.Component; + +@Component +public interface CodeService { + + boolean exists(long code); +} diff --git a/src/main/java/com/example/nto/service/EmployeeService.java b/src/main/java/com/example/nto/service/EmployeeService.java index 5650560..8a2b4e7 100644 --- a/src/main/java/com/example/nto/service/EmployeeService.java +++ b/src/main/java/com/example/nto/service/EmployeeService.java @@ -2,16 +2,23 @@ package com.example.nto.service; import com.example.nto.entity.Code; import com.example.nto.entity.Employee; +import com.example.nto.entity.Visits; +import org.springframework.stereotype.Component; import java.time.LocalDateTime; import java.util.List; import java.util.Optional; +@Component public interface EmployeeService { boolean existsByLogin(String login); + List getEmployeeVisits(String username); + void setLastVisitEmployee(long Id, LocalDateTime lastVisit); + void addVisit(String username, LocalDateTime time); + void setCodeEmployee(long Id, long code); Optional findByLogin(String login); diff --git a/src/main/java/com/example/nto/service/VisitsService.java b/src/main/java/com/example/nto/service/VisitsService.java new file mode 100644 index 0000000..348a858 --- /dev/null +++ b/src/main/java/com/example/nto/service/VisitsService.java @@ -0,0 +1,7 @@ +package com.example.nto.service; + +import org.springframework.stereotype.Component; + +@Component +public interface VisitsService { +} diff --git a/src/main/java/com/example/nto/service/impl/CodeServiceImpl.java b/src/main/java/com/example/nto/service/impl/CodeServiceImpl.java new file mode 100644 index 0000000..06f8828 --- /dev/null +++ b/src/main/java/com/example/nto/service/impl/CodeServiceImpl.java @@ -0,0 +1,17 @@ +package com.example.nto.service.impl; + +import com.example.nto.repository.CodeRepository; +import com.example.nto.service.CodeService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class CodeServiceImpl implements CodeService { + @Autowired + private CodeRepository codeRepository; + + @Override + public boolean exists(long code) { + return codeRepository.existsByValue(code); + } +} 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 1352f94..c67cb99 100644 --- a/src/main/java/com/example/nto/service/impl/EmployeeServiceImpl.java +++ b/src/main/java/com/example/nto/service/impl/EmployeeServiceImpl.java @@ -2,7 +2,10 @@ package com.example.nto.service.impl; import com.example.nto.entity.Code; import com.example.nto.entity.Employee; +import com.example.nto.entity.Visits; import com.example.nto.repository.CodeRepository; +import com.example.nto.repository.EmployeeRepository; +import com.example.nto.repository.VisitsRepository; import com.example.nto.service.EmployeeService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -17,6 +20,8 @@ public class EmployeeServiceImpl implements EmployeeService { private com.example.nto.repository.EmployeeRepository EmployeeRepository; @Autowired private CodeRepository codeRepository; + @Autowired + private VisitsRepository visitRepository; @Override public Optional findByLogin(String login) { @@ -35,11 +40,21 @@ public class EmployeeServiceImpl implements EmployeeService { EmployeeRepository.save(employee); } + @Override + public void addVisit(String username, LocalDateTime time) { + visitRepository.save(new Visits()); + } + @Override public boolean existsByLogin(String login) { return EmployeeRepository.existsByLogin(login); } + @Override + public List getEmployeeVisits(String username) { + return visitRepository.findAllByUsername(username); + } + @Override public void setCodeEmployee(long Id, long code) { Code newCode = new Code(Id, code); diff --git a/src/main/java/com/example/nto/service/impl/VisitsServiceImpl.java b/src/main/java/com/example/nto/service/impl/VisitsServiceImpl.java new file mode 100644 index 0000000..9bbf824 --- /dev/null +++ b/src/main/java/com/example/nto/service/impl/VisitsServiceImpl.java @@ -0,0 +1,11 @@ +package com.example.nto.service.impl; + +import com.example.nto.repository.CodeRepository; +import com.example.nto.service.CodeService; +import com.example.nto.service.VisitsService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class VisitsServiceImpl implements VisitsService { +}