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.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 lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.http.ResponseEntity; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/api/acs") @RequiredArgsConstructor public class ACSController { private final ACSComponent acsComponent; private final AuthComponent authComponent; @PostMapping("/open") public ResponseEntity open(@RequestBody OpenRQB body) { Long code = body.getCode(); if (!acsComponent.isGateCodeValid(code)) throw new ForbiddenHTTPException("Invalid gate code"); return ResponseEntity.ok(null); } @GetMapping("visits/me") public ResponseEntity> getMyVisitsPaginated( @RequestParam(defaultValue = "0") int page, @RequestParam(defaultValue = "10") int size ) { Pageable pageable = PageRequest.of(page, size); UserModel user = (UserModel) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); return ResponseEntity.ok(acsComponent.getVisitsByUserIdPaginated(user.getId(), pageable).map(VisitMapper::convertToDTO)); } @GetMapping("visits/login/{login}") public ResponseEntity> getUserVisitsPaginated( @RequestParam(defaultValue = "0") int page, @RequestParam(defaultValue = "10") int size, @PathVariable String login ) { Pageable pageable = PageRequest.of(page, size); UserModel user = authComponent.getUserByLoginStrict(login); return ResponseEntity.ok(acsComponent.getVisitsByUserIdPaginated(user.getId(), pageable).map(VisitMapper::convertToDTO)); } @GetMapping("visits/gate/{gateId}") public ResponseEntity> getGateVisitsPaginated( @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"); return ResponseEntity.ok(acsComponent.getVisitsByGateIdPaginated(gateId, pageable).map(VisitMapper::convertToDTO)); } }