diff --git a/src/main/java/com/displaynone/acss/components/acs/ACSComponent.java b/src/main/java/com/displaynone/acss/components/acs/ACSComponent.java index fa01761..084c29c 100644 --- a/src/main/java/com/displaynone/acss/components/acs/ACSComponent.java +++ b/src/main/java/com/displaynone/acss/components/acs/ACSComponent.java @@ -1,10 +1,11 @@ package com.displaynone.acss.components.acs; -import com.displaynone.acss.components.acs.gate.GateModel; -import com.displaynone.acss.components.acs.gate.service.GateService; -import com.displaynone.acss.components.acs.visit.VisitModel; -import com.displaynone.acss.components.acs.visit.service.VisitService; +import com.displaynone.acss.components.acs.models.gate.GateModel; +import com.displaynone.acss.components.acs.models.gate.service.GateService; +import com.displaynone.acss.components.acs.models.visit.VisitModel; +import com.displaynone.acss.components.acs.models.visit.service.VisitService; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Component; @@ -12,6 +13,7 @@ import org.springframework.stereotype.Component; import java.util.List; import java.util.Optional; +@Slf4j @Component @RequiredArgsConstructor public class ACSComponent { @@ -57,4 +59,19 @@ public class ACSComponent { public Page getVisitsByUserIdPaginated(Long userId, Pageable pageable) { return visitService.getVisitsByUserIdPaginated(userId, pageable); } + + public void updateGate(Long gateId, GateModel gate) { + gateService.updateGate(gateId, gate); + } + + public void createVisit(VisitModel visit) { + visitService.createVisit(visit); + } + + public void createVisit(Long userId, Long gateId) { + VisitModel visit = new VisitModel(); + visit.setUserId(userId); + visit.setGateId(gateId); + createVisit(visit); + } } diff --git a/src/main/java/com/displaynone/acss/components/acs/gate/GateDTO.java b/src/main/java/com/displaynone/acss/components/acs/gate/GateDTO.java deleted file mode 100644 index 45506e6..0000000 --- a/src/main/java/com/displaynone/acss/components/acs/gate/GateDTO.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.displaynone.acss.components.acs.gate; - -import lombok.Data; - - -@Data -public class GateDTO { - private Long id; - private Long code; -} diff --git a/src/main/java/com/displaynone/acss/components/acs/models/gate/GateDTO.java b/src/main/java/com/displaynone/acss/components/acs/models/gate/GateDTO.java new file mode 100644 index 0000000..ee062d3 --- /dev/null +++ b/src/main/java/com/displaynone/acss/components/acs/models/gate/GateDTO.java @@ -0,0 +1,12 @@ +package com.displaynone.acss.components.acs.models.gate; + +import lombok.Data; + + +@Data +public class GateDTO { + private Long id; + private Long code; + private boolean isACSBlocked; + private boolean isActive; +} diff --git a/src/main/java/com/displaynone/acss/components/acs/gate/GateMapper.java b/src/main/java/com/displaynone/acss/components/acs/models/gate/GateMapper.java similarity index 78% rename from src/main/java/com/displaynone/acss/components/acs/gate/GateMapper.java rename to src/main/java/com/displaynone/acss/components/acs/models/gate/GateMapper.java index 12b6096..20cfbd0 100644 --- a/src/main/java/com/displaynone/acss/components/acs/gate/GateMapper.java +++ b/src/main/java/com/displaynone/acss/components/acs/models/gate/GateMapper.java @@ -1,4 +1,4 @@ -package com.displaynone.acss.components.acs.gate; +package com.displaynone.acss.components.acs.models.gate; import com.displaynone.acss.utils.GlobalUtils; import lombok.experimental.UtilityClass; @@ -13,6 +13,8 @@ public class GateMapper { dto.setId(model.getId()); dto.setCode(model.getCode()); + dto.setACSBlocked(model.isACSBlocked()); + dto.setActive(model.isActive()); return dto; } diff --git a/src/main/java/com/displaynone/acss/components/acs/gate/GateModel.java b/src/main/java/com/displaynone/acss/components/acs/models/gate/GateModel.java similarity index 52% rename from src/main/java/com/displaynone/acss/components/acs/gate/GateModel.java rename to src/main/java/com/displaynone/acss/components/acs/models/gate/GateModel.java index f794971..4affd6b 100644 --- a/src/main/java/com/displaynone/acss/components/acs/gate/GateModel.java +++ b/src/main/java/com/displaynone/acss/components/acs/models/gate/GateModel.java @@ -1,10 +1,11 @@ -package com.displaynone.acss.components.acs.gate; +package com.displaynone.acss.components.acs.models.gate; import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import org.hibernate.annotations.ColumnDefault; @Entity @Data @@ -15,8 +16,14 @@ import lombok.NoArgsConstructor; public class GateModel { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - private long id; + private Long id; @Column(nullable = false) - private long code; + private Long code; + + @Column(nullable = false) // For soft deletion + private boolean isActive; + + @Column(nullable = false) // For blocking in ACS + private boolean isACSBlocked; } \ No newline at end of file diff --git a/src/main/java/com/displaynone/acss/components/acs/gate/GateRepository.java b/src/main/java/com/displaynone/acss/components/acs/models/gate/GateRepository.java similarity index 78% rename from src/main/java/com/displaynone/acss/components/acs/gate/GateRepository.java rename to src/main/java/com/displaynone/acss/components/acs/models/gate/GateRepository.java index d39959c..c5724d4 100644 --- a/src/main/java/com/displaynone/acss/components/acs/gate/GateRepository.java +++ b/src/main/java/com/displaynone/acss/components/acs/models/gate/GateRepository.java @@ -1,4 +1,4 @@ -package com.displaynone.acss.components.acs.gate; +package com.displaynone.acss.components.acs.models.gate; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/src/main/java/com/displaynone/acss/components/acs/gate/service/GateService.java b/src/main/java/com/displaynone/acss/components/acs/models/gate/service/GateService.java similarity index 65% rename from src/main/java/com/displaynone/acss/components/acs/gate/service/GateService.java rename to src/main/java/com/displaynone/acss/components/acs/models/gate/service/GateService.java index 72b9e08..a14b77e 100644 --- a/src/main/java/com/displaynone/acss/components/acs/gate/service/GateService.java +++ b/src/main/java/com/displaynone/acss/components/acs/models/gate/service/GateService.java @@ -1,6 +1,6 @@ -package com.displaynone.acss.components.acs.gate.service; +package com.displaynone.acss.components.acs.models.gate.service; -import com.displaynone.acss.components.acs.gate.GateModel; +import com.displaynone.acss.components.acs.models.gate.GateModel; import java.util.Optional; @@ -16,4 +16,6 @@ public interface GateService { boolean isGateExists(Long gateId); boolean isGateCodeValid(Long code); + + void updateGate(Long gateId, GateModel gate); } diff --git a/src/main/java/com/displaynone/acss/components/acs/gate/service/GateServiceImpl.java b/src/main/java/com/displaynone/acss/components/acs/models/gate/service/GateServiceImpl.java similarity index 63% rename from src/main/java/com/displaynone/acss/components/acs/gate/service/GateServiceImpl.java rename to src/main/java/com/displaynone/acss/components/acs/models/gate/service/GateServiceImpl.java index 8045f1b..bc45101 100644 --- a/src/main/java/com/displaynone/acss/components/acs/gate/service/GateServiceImpl.java +++ b/src/main/java/com/displaynone/acss/components/acs/models/gate/service/GateServiceImpl.java @@ -1,8 +1,9 @@ -package com.displaynone.acss.components.acs.gate.service; +package com.displaynone.acss.components.acs.models.gate.service; -import com.displaynone.acss.components.acs.gate.GateModel; -import com.displaynone.acss.components.acs.gate.GateRepository; +import com.displaynone.acss.components.acs.models.gate.GateModel; +import com.displaynone.acss.components.acs.models.gate.GateRepository; import com.displaynone.acss.exception.generics.NotFoundHTTPException; +import com.displaynone.acss.utils.GlobalUtils; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; @@ -14,6 +15,10 @@ import java.util.Optional; public class GateServiceImpl implements GateService { private final GateRepository gateRepository; + private void saveGate(GateModel gate) { + gateRepository.save(gate); + } + @Override public Optional getGateById(Long gateId) { return gateRepository.findById(gateId); @@ -47,4 +52,14 @@ public class GateServiceImpl implements GateService { public boolean isGateCodeValid(Long code) { return getGateByCode(code).isPresent(); } + + public void updateGate(Long gateId, GateModel gateUpdate) { + GateModel existingGate = getGateByIdStrict(gateId); + + GlobalUtils.updateIfNotNull(gateUpdate.getCode(), existingGate::setCode); + GlobalUtils.updateIfNotNull(gateUpdate.isActive(), existingGate::setActive); + GlobalUtils.updateIfNotNull(gateUpdate.isACSBlocked(), existingGate::setACSBlocked); + + saveGate(existingGate); + } } diff --git a/src/main/java/com/displaynone/acss/components/acs/visit/VisitDTO.java b/src/main/java/com/displaynone/acss/components/acs/models/visit/VisitDTO.java similarity index 77% rename from src/main/java/com/displaynone/acss/components/acs/visit/VisitDTO.java rename to src/main/java/com/displaynone/acss/components/acs/models/visit/VisitDTO.java index 1ae7ff2..6931efc 100644 --- a/src/main/java/com/displaynone/acss/components/acs/visit/VisitDTO.java +++ b/src/main/java/com/displaynone/acss/components/acs/models/visit/VisitDTO.java @@ -1,4 +1,4 @@ -package com.displaynone.acss.components.acs.visit; +package com.displaynone.acss.components.acs.models.visit; import lombok.Data; diff --git a/src/main/java/com/displaynone/acss/components/acs/visit/VisitMapper.java b/src/main/java/com/displaynone/acss/components/acs/models/visit/VisitMapper.java similarity index 91% rename from src/main/java/com/displaynone/acss/components/acs/visit/VisitMapper.java rename to src/main/java/com/displaynone/acss/components/acs/models/visit/VisitMapper.java index 49d74d0..c6ed8ad 100644 --- a/src/main/java/com/displaynone/acss/components/acs/visit/VisitMapper.java +++ b/src/main/java/com/displaynone/acss/components/acs/models/visit/VisitMapper.java @@ -1,4 +1,4 @@ -package com.displaynone.acss.components.acs.visit; +package com.displaynone.acss.components.acs.models.visit; import com.displaynone.acss.utils.GlobalUtils; import lombok.experimental.UtilityClass; diff --git a/src/main/java/com/displaynone/acss/components/acs/visit/VisitModel.java b/src/main/java/com/displaynone/acss/components/acs/models/visit/VisitModel.java similarity index 80% rename from src/main/java/com/displaynone/acss/components/acs/visit/VisitModel.java rename to src/main/java/com/displaynone/acss/components/acs/models/visit/VisitModel.java index 02c28af..39cdcdf 100644 --- a/src/main/java/com/displaynone/acss/components/acs/visit/VisitModel.java +++ b/src/main/java/com/displaynone/acss/components/acs/models/visit/VisitModel.java @@ -1,10 +1,11 @@ -package com.displaynone.acss.components.acs.visit; +package com.displaynone.acss.components.acs.models.visit; import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import org.hibernate.annotations.CreationTimestamp; import java.time.LocalDateTime; @@ -25,6 +26,7 @@ public class VisitModel { @Column(nullable = false) private Long gateId; + @CreationTimestamp @Column(nullable = false) private LocalDateTime createdAt; } diff --git a/src/main/java/com/displaynone/acss/components/acs/visit/VisitRepository.java b/src/main/java/com/displaynone/acss/components/acs/models/visit/VisitRepository.java similarity index 89% rename from src/main/java/com/displaynone/acss/components/acs/visit/VisitRepository.java rename to src/main/java/com/displaynone/acss/components/acs/models/visit/VisitRepository.java index 19327d5..954681a 100644 --- a/src/main/java/com/displaynone/acss/components/acs/visit/VisitRepository.java +++ b/src/main/java/com/displaynone/acss/components/acs/models/visit/VisitRepository.java @@ -1,4 +1,4 @@ -package com.displaynone.acss.components.acs.visit; +package com.displaynone.acss.components.acs.models.visit; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; diff --git a/src/main/java/com/displaynone/acss/components/acs/visit/service/VisitService.java b/src/main/java/com/displaynone/acss/components/acs/models/visit/service/VisitService.java similarity index 70% rename from src/main/java/com/displaynone/acss/components/acs/visit/service/VisitService.java rename to src/main/java/com/displaynone/acss/components/acs/models/visit/service/VisitService.java index cc3669e..a12533f 100644 --- a/src/main/java/com/displaynone/acss/components/acs/visit/service/VisitService.java +++ b/src/main/java/com/displaynone/acss/components/acs/models/visit/service/VisitService.java @@ -1,6 +1,6 @@ -package com.displaynone.acss.components.acs.visit.service; +package com.displaynone.acss.components.acs.models.visit.service; -import com.displaynone.acss.components.acs.visit.VisitModel; +import com.displaynone.acss.components.acs.models.visit.VisitModel; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -14,4 +14,6 @@ public interface VisitService { Page getVisitsByGateIdPaginated(Long gateId, Pageable pageable); Page getVisitsByUserIdPaginated(Long userId, Pageable pageable); + + void createVisit(VisitModel visit); } diff --git a/src/main/java/com/displaynone/acss/components/acs/visit/service/VisitServiceImpl.java b/src/main/java/com/displaynone/acss/components/acs/models/visit/service/VisitServiceImpl.java similarity index 71% rename from src/main/java/com/displaynone/acss/components/acs/visit/service/VisitServiceImpl.java rename to src/main/java/com/displaynone/acss/components/acs/models/visit/service/VisitServiceImpl.java index 5ae2d71..27fdfca 100644 --- a/src/main/java/com/displaynone/acss/components/acs/visit/service/VisitServiceImpl.java +++ b/src/main/java/com/displaynone/acss/components/acs/models/visit/service/VisitServiceImpl.java @@ -1,7 +1,7 @@ -package com.displaynone.acss.components.acs.visit.service; +package com.displaynone.acss.components.acs.models.visit.service; -import com.displaynone.acss.components.acs.visit.VisitModel; -import com.displaynone.acss.components.acs.visit.VisitRepository; +import com.displaynone.acss.components.acs.models.visit.VisitModel; +import com.displaynone.acss.components.acs.models.visit.VisitRepository; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -14,6 +14,10 @@ import java.util.List; public class VisitServiceImpl implements VisitService { private final VisitRepository visitRepository; + private void saveVisit(VisitModel visit) { + visitRepository.save(visit); + } + @Override public List getByGateId(Long gateId) { return visitRepository.findByGateId(gateId); @@ -33,4 +37,9 @@ public class VisitServiceImpl implements VisitService { public Page getVisitsByUserIdPaginated(Long userId, Pageable pageable) { return visitRepository.findByUserId(userId, pageable); } + + @Override + public void createVisit(VisitModel visit) { + saveVisit(visit); + } } diff --git a/src/main/java/com/displaynone/acss/components/auth/AuthComponent.java b/src/main/java/com/displaynone/acss/components/auth/AuthComponent.java index 2574947..fc25e91 100644 --- a/src/main/java/com/displaynone/acss/components/auth/AuthComponent.java +++ b/src/main/java/com/displaynone/acss/components/auth/AuthComponent.java @@ -78,4 +78,8 @@ public class AuthComponent implements UserDetailsService { public UserDetails loadUserByUsername(@NonNull String username) throws UsernameNotFoundException { return getUserByLoginStrict(username); } + + public void updateUserByLogin(String login, UserModel userUpdated) { + userService.updateUserByLogin(login, userUpdated); + } } diff --git a/src/main/java/com/displaynone/acss/components/auth/models/user/UserDTO.java b/src/main/java/com/displaynone/acss/components/auth/models/user/UserDTO.java index 7879efd..7a05402 100644 --- a/src/main/java/com/displaynone/acss/components/auth/models/user/UserDTO.java +++ b/src/main/java/com/displaynone/acss/components/auth/models/user/UserDTO.java @@ -15,4 +15,6 @@ public class UserDTO { private String position; private LocalDateTime lastVisit; private Set roles; + private boolean isActive; + private boolean isACSBlocked; } diff --git a/src/main/java/com/displaynone/acss/components/auth/models/user/UserMapper.java b/src/main/java/com/displaynone/acss/components/auth/models/user/UserMapper.java index d8ab992..5d8393d 100644 --- a/src/main/java/com/displaynone/acss/components/auth/models/user/UserMapper.java +++ b/src/main/java/com/displaynone/acss/components/auth/models/user/UserMapper.java @@ -17,6 +17,8 @@ public class UserMapper { dto.setPhoto(model.getPhoto()); dto.setPosition(model.getPosition()); dto.setRoles(model.getRoles()); + dto.setActive(model.isActive()); + dto.setACSBlocked(model.isACSBlocked()); return dto; } diff --git a/src/main/java/com/displaynone/acss/components/auth/models/user/UserModel.java b/src/main/java/com/displaynone/acss/components/auth/models/user/UserModel.java index 42491b4..8e06e5c 100644 --- a/src/main/java/com/displaynone/acss/components/auth/models/user/UserModel.java +++ b/src/main/java/com/displaynone/acss/components/auth/models/user/UserModel.java @@ -3,6 +3,7 @@ package com.displaynone.acss.components.auth.models.user; import com.displaynone.acss.components.auth.models.role.RoleModel; import jakarta.persistence.*; import lombok.*; +import org.hibernate.annotations.ColumnDefault; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.userdetails.UserDetails; @@ -37,6 +38,12 @@ public class UserModel implements UserDetails { @Column(nullable = false) private String position; + @Column(nullable = false) // For soft deletion + private boolean isActive; + + @Column(nullable = false) // For blocking in ACS + private boolean isACSBlocked; + @EqualsAndHashCode.Exclude @ManyToMany(fetch = FetchType.EAGER) @JoinTable( @@ -75,6 +82,6 @@ public class UserModel implements UserDetails { @Override public boolean isEnabled() { - return true; + return isActive; } } diff --git a/src/main/java/com/displaynone/acss/components/auth/models/user/service/UserService.java b/src/main/java/com/displaynone/acss/components/auth/models/user/service/UserService.java index 5763d2a..c353c4b 100644 --- a/src/main/java/com/displaynone/acss/components/auth/models/user/service/UserService.java +++ b/src/main/java/com/displaynone/acss/components/auth/models/user/service/UserService.java @@ -10,4 +10,5 @@ public interface UserService { Optional findByLogin(String login); UserModel findByLoginStrict(String login); + void updateUserByLogin(String login, UserModel userUpdated); } diff --git a/src/main/java/com/displaynone/acss/components/auth/models/user/service/UserServiceImpl.java b/src/main/java/com/displaynone/acss/components/auth/models/user/service/UserServiceImpl.java index b9df9bd..fc5ba58 100644 --- a/src/main/java/com/displaynone/acss/components/auth/models/user/service/UserServiceImpl.java +++ b/src/main/java/com/displaynone/acss/components/auth/models/user/service/UserServiceImpl.java @@ -3,8 +3,8 @@ package com.displaynone.acss.components.auth.models.user.service; import com.displaynone.acss.components.auth.models.user.UserModel; import com.displaynone.acss.components.auth.models.user.UserRepository; import com.displaynone.acss.exception.generics.NotFoundHTTPException; +import com.displaynone.acss.utils.GlobalUtils; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.Optional; @@ -14,6 +14,10 @@ import java.util.Optional; public class UserServiceImpl implements UserService { private final UserRepository userRepository; + private void saveUser(UserModel userUpdated) { + userRepository.save(userUpdated); + } + @Override public Optional findByLogin(String login) { return userRepository.findByLogin(login); @@ -25,4 +29,18 @@ public class UserServiceImpl implements UserService { if (user.isEmpty()) throw new NotFoundHTTPException("User not found"); return user.get(); } + + @Override + public void updateUserByLogin(String login, UserModel userUpdated) { + UserModel existingUser = findByLoginStrict(login); + + GlobalUtils.updateIfNotNull(userUpdated.getName(), existingUser::setName); + GlobalUtils.updateIfNotNull(userUpdated.getPhoto(), existingUser::setPhoto); + GlobalUtils.updateIfNotNull(userUpdated.getPosition(), existingUser::setPosition); + GlobalUtils.updateIfNotNull(userUpdated.getPassword(), existingUser::setPassword); + GlobalUtils.updateIfNotNull(userUpdated.isActive(), existingUser::setActive); + GlobalUtils.updateIfNotNull(userUpdated.isACSBlocked(), existingUser::setACSBlocked); + + saveUser(existingUser); + } } diff --git a/src/main/java/com/displaynone/acss/controllers/acs/ACSController.java b/src/main/java/com/displaynone/acss/controllers/acs/ACSController.java index 96a2533..9fce4c8 100644 --- a/src/main/java/com/displaynone/acss/controllers/acs/ACSController.java +++ b/src/main/java/com/displaynone/acss/controllers/acs/ACSController.java @@ -1,12 +1,16 @@ package com.displaynone.acss.controllers.acs; import com.displaynone.acss.components.acs.ACSComponent; -import com.displaynone.acss.components.acs.visit.VisitDTO; -import com.displaynone.acss.components.acs.visit.VisitMapper; +import com.displaynone.acss.components.acs.models.gate.GateDTO; +import com.displaynone.acss.components.acs.models.gate.GateMapper; +import com.displaynone.acss.components.acs.models.gate.GateModel; +import com.displaynone.acss.components.acs.models.visit.VisitDTO; +import com.displaynone.acss.components.acs.models.visit.VisitMapper; import com.displaynone.acss.components.auth.AuthComponent; import com.displaynone.acss.components.auth.models.user.UserModel; import com.displaynone.acss.exception.generics.ForbiddenHTTPException; import com.displaynone.acss.exception.generics.NotFoundHTTPException; +import com.displaynone.acss.utils.GlobalUtils; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; @@ -26,7 +30,14 @@ public class ACSController { @PostMapping("/open") public ResponseEntity open(@RequestBody OpenRQB body) { Long code = body.getCode(); - if (!acsComponent.isGateCodeValid(code)) throw new ForbiddenHTTPException("Invalid gate code"); + GateModel gate = acsComponent.getGateByCodeStrict(code); + if (gate.isACSBlocked()) throw new ForbiddenHTTPException("Specified gate is blocked"); + + UserModel user = (UserModel) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); + if (user.isACSBlocked()) throw new ForbiddenHTTPException("User is blocked"); + + acsComponent.createVisit(user.getId(), gate.getId()); + return ResponseEntity.ok(null); } @@ -52,13 +63,30 @@ public class ACSController { } @GetMapping("visits/gate/{gateId}") - public ResponseEntity> getGateVisitsPaginated( + public ResponseEntity> getUserVisitsPaginated( @RequestParam(defaultValue = "0") int page, @RequestParam(defaultValue = "10") int size, @PathVariable Long gateId ) { Pageable pageable = PageRequest.of(page, size); - if (!acsComponent.isGateExists(gateId)) throw new NotFoundHTTPException("Invalid gate id"); + if (!acsComponent.isGateExists(gateId)) throw new NotFoundHTTPException("Gate not found"); return ResponseEntity.ok(acsComponent.getVisitsByGateIdPaginated(gateId, pageable).map(VisitMapper::convertToDTO)); } + + @GetMapping("gates/gate/{gateId}") + public ResponseEntity getGateById(@PathVariable Long gateId) { + return ResponseEntity.ok(GateMapper.convertToDTO(acsComponent.getGateByIdStrict(gateId))); + } + + @PatchMapping("gates/gate/{gateId}") + public ResponseEntity updateGateById(@PathVariable Long gateId, @RequestBody GateUpdateRQB body) { + GateModel gateUpdate = new GateModel(); + + GlobalUtils.updateIfNotNull(body.getCode(), gateUpdate::setCode); + GlobalUtils.updateIfNotNull(body.getActive(), gateUpdate::setActive); + GlobalUtils.updateIfNotNull(body.getBlocked(), gateUpdate::setACSBlocked); + acsComponent.updateGate(gateId, gateUpdate); + + return ResponseEntity.ok(null); + } } diff --git a/src/main/java/com/displaynone/acss/controllers/acs/GateUpdateRQB.java b/src/main/java/com/displaynone/acss/controllers/acs/GateUpdateRQB.java new file mode 100644 index 0000000..9a38f9e --- /dev/null +++ b/src/main/java/com/displaynone/acss/controllers/acs/GateUpdateRQB.java @@ -0,0 +1,10 @@ +package com.displaynone.acss.controllers.acs; + +import lombok.Data; + +@Data +public class GateUpdateRQB { + private Long code; + private Boolean active; + private Boolean blocked; +} diff --git a/src/main/java/com/displaynone/acss/controllers/user/UserController.java b/src/main/java/com/displaynone/acss/controllers/user/UserController.java index 571641d..7dc2f42 100644 --- a/src/main/java/com/displaynone/acss/controllers/user/UserController.java +++ b/src/main/java/com/displaynone/acss/controllers/user/UserController.java @@ -4,13 +4,11 @@ import com.displaynone.acss.components.auth.AuthComponent; import com.displaynone.acss.components.auth.models.user.UserDTO; import com.displaynone.acss.components.auth.models.user.UserMapper; import com.displaynone.acss.components.auth.models.user.UserModel; +import com.displaynone.acss.utils.GlobalUtils; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.security.core.context.SecurityContextHolder; -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 org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/api/users") @@ -29,4 +27,19 @@ public class UserController { UserModel user = authComponent.getUserByLoginStrict(login); return ResponseEntity.ok(UserMapper.convertToDTO(user)); } + + @PatchMapping("/login/{login}") + public ResponseEntity updateUserByLogin(@PathVariable String login, @RequestBody UserUpdateRQB body) { + UserModel userUpdated = new UserModel(); + + GlobalUtils.updateIfNotNull(body.getName(), userUpdated::setName); + GlobalUtils.updateIfNotNull(body.getPhoto(), userUpdated::setPhoto); + GlobalUtils.updateIfNotNull(body.getPosition(), userUpdated::setPosition); + GlobalUtils.updateIfNotNull(body.getPassword(), userUpdated::setPassword); + GlobalUtils.updateIfNotNull(body.getIsActive(), userUpdated::setActive); + GlobalUtils.updateIfNotNull(body.getIsACSBlocked(), userUpdated::setACSBlocked); + + authComponent.updateUserByLogin(login, userUpdated); + return ResponseEntity.ok(null); + } } diff --git a/src/main/java/com/displaynone/acss/controllers/user/UserUpdateRQB.java b/src/main/java/com/displaynone/acss/controllers/user/UserUpdateRQB.java new file mode 100644 index 0000000..e125e5e --- /dev/null +++ b/src/main/java/com/displaynone/acss/controllers/user/UserUpdateRQB.java @@ -0,0 +1,14 @@ +package com.displaynone.acss.controllers.user; + +import lombok.Data; + + +@Data +public class UserUpdateRQB { + private String password; + private String name; + private String photo; + private String position; + private Boolean isActive = true; + private Boolean isACSBlocked = false; +} diff --git a/src/main/java/com/displaynone/acss/security/WebSecurityConfig.java b/src/main/java/com/displaynone/acss/security/WebSecurityConfig.java index e8facae..88392e5 100644 --- a/src/main/java/com/displaynone/acss/security/WebSecurityConfig.java +++ b/src/main/java/com/displaynone/acss/security/WebSecurityConfig.java @@ -47,6 +47,9 @@ public class WebSecurityConfig { authorizeRequests .requestMatchers("/api/auth/**").permitAll() .requestMatchers("/api/users/login/**").hasAuthority("ROLE_ADMIN") + .requestMatchers("/api/acs/visits/login/**").hasAuthority("ROLE_ADMIN") + .requestMatchers("/api/acs/visits/gate/**").hasAuthority("ROLE_ADMIN") + .requestMatchers("/api/acs/gates/**").hasAuthority("ROLE_ADMIN") .anyRequest().authenticated() ) .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) diff --git a/src/main/resources/db/changelog/01/0001-users.xml b/src/main/resources/db/changelog/01/0001-users.xml index fb3f414..bbae2fc 100644 --- a/src/main/resources/db/changelog/01/0001-users.xml +++ b/src/main/resources/db/changelog/01/0001-users.xml @@ -18,6 +18,8 @@ + + diff --git a/src/main/resources/db/changelog/01/0004-gates.xml b/src/main/resources/db/changelog/01/0004-gates.xml index 78947af..1971b97 100644 --- a/src/main/resources/db/changelog/01/0004-gates.xml +++ b/src/main/resources/db/changelog/01/0004-gates.xml @@ -12,6 +12,8 @@ + + diff --git a/src/main/resources/db/changelog/01/0005-visits.xml b/src/main/resources/db/changelog/01/0005-visits.xml index 0357802..db32b1c 100644 --- a/src/main/resources/db/changelog/01/0005-visits.xml +++ b/src/main/resources/db/changelog/01/0005-visits.xml @@ -15,7 +15,9 @@ - + + + + + + +