diff --git a/backend/build.gradle.kts b/backend/build.gradle.kts index 8a51c2b..06eba5e 100644 --- a/backend/build.gradle.kts +++ b/backend/build.gradle.kts @@ -6,7 +6,7 @@ plugins { kotlin("plugin.jpa") version "2.1.21" } -group = "io.github.devcavin" +group = "io.github.devcavin.gatelog" version = "0.0.1-SNAPSHOT" description = "backend" diff --git a/backend/src/main/kotlin/io/github/devcavin/backend/common/exception/DomainExceptions.kt b/backend/src/main/kotlin/io/github/devcavin/backend/common/exception/DomainExceptions.kt deleted file mode 100644 index ef91836..0000000 --- a/backend/src/main/kotlin/io/github/devcavin/backend/common/exception/DomainExceptions.kt +++ /dev/null @@ -1,27 +0,0 @@ -package io.github.devcavin.backend.common.exception - -import org.springframework.security.authentication.BadCredentialsException - -// base type -sealed class DomainException(message: String) : RuntimeException(message) - -// 401 — bad credentials or invalid/expired tokens -sealed class UnauthorizedException(message: String): DomainException(message) - -class InvalidCredentialsException : BadCredentialsException("Invalid username or password") - -class InvalidRefreshTokenException : BadCredentialsException("Invalid or expired refresh token") - -// 403 - authenticated but !permitted -class AccountDisabledException : DomainException("Account is disabled") - -// 404 - resource !found -class ResourceNotFoundException(resource: String, id: Any) : DomainException("Resource $resource not found: $id") - -// 409 - conflicts with existing state/resources, etc... -class ConflictException(message: String) : DomainException(message) - -// 422 - semantically invalid request (e.g. checking out already checked out visitor) -class InvalidStateException(message: String) : DomainException(message) - -class AccessDeniedException(message: String) : RuntimeException(message) \ No newline at end of file diff --git a/backend/src/main/kotlin/io/github/devcavin/backend/web/dto/visitor/VisitorDTOs.kt b/backend/src/main/kotlin/io/github/devcavin/backend/web/dto/visitor/VisitorDTOs.kt deleted file mode 100644 index de4907a..0000000 --- a/backend/src/main/kotlin/io/github/devcavin/backend/web/dto/visitor/VisitorDTOs.kt +++ /dev/null @@ -1,96 +0,0 @@ -package io.github.devcavin.backend.web.dto.visitor - -import io.github.devcavin.backend.domain.model.Visitor -import jakarta.validation.constraints.NotBlank -import jakarta.validation.constraints.Pattern -import jakarta.validation.constraints.Size -import java.time.OffsetDateTime -import java.util.* - -data class RegisterVisitorRequest( - @field:NotBlank - @field:Size(max = 100) - val name: String, - - @field:NotBlank - @field:Pattern(regexp = """^\+?[0-9\s\-]{7,25}$""", message = "Invalid phone number format") - val phone: String, - - @field:NotBlank - val visitorType: String, - - val purpose: String = "General visit", - - val zoneId: UUID -) - -data class VisitorResponse( - val id: UUID, - val name: String, - val phone: String, - val visitorType: String, - val purpose: String, - val status: String, - val siteId: UUID, - val zoneId: UUID?, - val zoneName: String?, - val createdById: UUID, - val createdByName: String, - val checkInTime: OffsetDateTime, - val checkOutTime: OffsetDateTime? -) - -data class ReturningVisitorResponse( - val name: String, - val phone: String, - val visitorType: String, - val zoneId: UUID?, - val zoneName: String? -) - -data class VisitorSearchParams( - val name: String? = null, - val phone: String? = null, - val visitorType: String? = null, - val zoneId: UUID? = null, - val status: String? = null, - val from: OffsetDateTime? = null, - val to: OffsetDateTime? = null -) - -data class UpdateVisitorProfileRequest( - @field:NotBlank - @field:Size(max = 100) - val name: String, - - @field:NotBlank - @field:Pattern( - regexp = """^\+?[0-9\s\-]{7,25}$""", - message = "Invalid phone number format" - ) - val phoneNumber: String -) - -data class VisitorProfileResponse( - val id: UUID, - val name: String, - val phoneNumber: String, - val siteId: UUID, - val visitCount: Int -) - -fun Visitor.toResponse() = VisitorResponse( - id = id!!, - name = name, - phone = phone, - visitorType = visitorType, - purpose = purpose, - status = visitStatus.name, - siteId = site.id!!, - zoneId = zone?.id, - zoneName = zone?.name, - createdById = createdBy.id!!, - createdByName = createdBy.name, - checkInTime = checkInTime, - checkOutTime = checkOutTime -) diff --git a/backend/src/main/kotlin/io/github/devcavin/backend/web/dto/zone/ZoneDTOs.kt b/backend/src/main/kotlin/io/github/devcavin/backend/web/dto/zone/ZoneDTOs.kt deleted file mode 100644 index afc6d2a..0000000 --- a/backend/src/main/kotlin/io/github/devcavin/backend/web/dto/zone/ZoneDTOs.kt +++ /dev/null @@ -1,24 +0,0 @@ -package io.github.devcavin.backend.web.dto.zone - -import io.github.devcavin.backend.domain.model.Zone -import jakarta.validation.constraints.NotBlank -import jakarta.validation.constraints.Size -import java.util.* - -data class ZoneRequest( - @field:NotBlank - @field:Size(max = 100) - val name: String -) - -data class ZoneResponse( - val id: UUID, - val name: String, - val siteId: UUID -) - -fun Zone.toResponse() = ZoneResponse( - id = this.id!!, - name = this.name, - siteId = this.site.id!! -) \ No newline at end of file diff --git a/backend/src/main/kotlin/io/github/devcavin/backend/BackendApplication.kt b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/BackendApplication.kt similarity index 61% rename from backend/src/main/kotlin/io/github/devcavin/backend/BackendApplication.kt rename to backend/src/main/kotlin/io/github/devcavin/gatelog/backend/BackendApplication.kt index a2c290c..2086ecc 100644 --- a/backend/src/main/kotlin/io/github/devcavin/backend/BackendApplication.kt +++ b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/BackendApplication.kt @@ -1,11 +1,13 @@ -package io.github.devcavin.backend +package io.github.devcavin.gatelog.backend import org.springframework.boot.autoconfigure.SpringBootApplication import org.springframework.boot.context.properties.ConfigurationPropertiesScan import org.springframework.boot.runApplication +import org.springframework.data.web.config.EnableSpringDataWebSupport @SpringBootApplication @ConfigurationPropertiesScan +@EnableSpringDataWebSupport(pageSerializationMode = EnableSpringDataWebSupport.PageSerializationMode.VIA_DTO) class BackendApplication fun main(args: Array) { diff --git a/backend/src/main/kotlin/io/github/devcavin/backend/web/controller/AuthController.kt b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/auth/AuthController.kt similarity index 79% rename from backend/src/main/kotlin/io/github/devcavin/backend/web/controller/AuthController.kt rename to backend/src/main/kotlin/io/github/devcavin/gatelog/backend/auth/AuthController.kt index 93c5bec..3200844 100644 --- a/backend/src/main/kotlin/io/github/devcavin/backend/web/controller/AuthController.kt +++ b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/auth/AuthController.kt @@ -1,9 +1,8 @@ -package io.github.devcavin.backend.web.controller +package io.github.devcavin.gatelog.backend.auth -import io.github.devcavin.backend.service.AuthService -import io.github.devcavin.backend.web.dto.auth.AuthResponse -import io.github.devcavin.backend.web.dto.auth.LoginRequest -import io.github.devcavin.backend.web.dto.auth.RefreshTokenRequest +import io.github.devcavin.gatelog.backend.auth.dto.AuthResponse +import io.github.devcavin.gatelog.backend.auth.dto.LoginRequest +import io.github.devcavin.gatelog.backend.auth.dto.RefreshTokenRequest import jakarta.validation.Valid import org.springframework.http.ResponseEntity import org.springframework.web.bind.annotation.PostMapping diff --git a/backend/src/main/kotlin/io/github/devcavin/backend/service/AuthService.kt b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/auth/AuthService.kt similarity index 79% rename from backend/src/main/kotlin/io/github/devcavin/backend/service/AuthService.kt rename to backend/src/main/kotlin/io/github/devcavin/gatelog/backend/auth/AuthService.kt index 7b1876c..7ead96c 100644 --- a/backend/src/main/kotlin/io/github/devcavin/backend/service/AuthService.kt +++ b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/auth/AuthService.kt @@ -1,15 +1,11 @@ -package io.github.devcavin.backend.service - -import io.github.devcavin.backend.common.exception.AccountDisabledException -import io.github.devcavin.backend.common.exception.InvalidCredentialsException -import io.github.devcavin.backend.common.exception.InvalidRefreshTokenException -import io.github.devcavin.backend.domain.model.RefreshToken -import io.github.devcavin.backend.domain.repository.RefreshTokenRepository -import io.github.devcavin.backend.domain.repository.UserRepository -import io.github.devcavin.backend.security.JwtProperties -import io.github.devcavin.backend.security.JwtTokenProvider -import io.github.devcavin.backend.web.dto.auth.AuthResponse -import io.github.devcavin.backend.web.dto.auth.LoginRequest +package io.github.devcavin.gatelog.backend.auth + +import io.github.devcavin.gatelog.backend.auth.dto.AuthResponse +import io.github.devcavin.gatelog.backend.auth.dto.LoginRequest +import io.github.devcavin.gatelog.backend.common.exception.AccountDisabledException +import io.github.devcavin.gatelog.backend.common.exception.InvalidCredentialsException +import io.github.devcavin.gatelog.backend.common.exception.InvalidRefreshTokenException +import io.github.devcavin.gatelog.backend.users.UserRepository import org.springframework.security.crypto.password.PasswordEncoder import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional diff --git a/backend/src/main/kotlin/io/github/devcavin/backend/security/JwtAuthenticationFilter.kt b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/auth/JwtAuthenticationFilter.kt similarity index 94% rename from backend/src/main/kotlin/io/github/devcavin/backend/security/JwtAuthenticationFilter.kt rename to backend/src/main/kotlin/io/github/devcavin/gatelog/backend/auth/JwtAuthenticationFilter.kt index 399546e..e345478 100644 --- a/backend/src/main/kotlin/io/github/devcavin/backend/security/JwtAuthenticationFilter.kt +++ b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/auth/JwtAuthenticationFilter.kt @@ -1,6 +1,6 @@ -package io.github.devcavin.backend.security +package io.github.devcavin.gatelog.backend.auth -import io.github.devcavin.backend.domain.repository.UserRepository +import io.github.devcavin.gatelog.backend.users.UserRepository import jakarta.servlet.FilterChain import jakarta.servlet.http.HttpServletRequest import jakarta.servlet.http.HttpServletResponse diff --git a/backend/src/main/kotlin/io/github/devcavin/backend/security/JwtProperties.kt b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/auth/JwtProperties.kt similarity index 87% rename from backend/src/main/kotlin/io/github/devcavin/backend/security/JwtProperties.kt rename to backend/src/main/kotlin/io/github/devcavin/gatelog/backend/auth/JwtProperties.kt index 3ca61d5..b0a1fa5 100644 --- a/backend/src/main/kotlin/io/github/devcavin/backend/security/JwtProperties.kt +++ b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/auth/JwtProperties.kt @@ -1,4 +1,4 @@ -package io.github.devcavin.backend.security +package io.github.devcavin.gatelog.backend.auth import org.springframework.boot.context.properties.ConfigurationProperties import org.springframework.stereotype.Component diff --git a/backend/src/main/kotlin/io/github/devcavin/backend/security/JwtTokenProvider.kt b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/auth/JwtTokenProvider.kt similarity index 97% rename from backend/src/main/kotlin/io/github/devcavin/backend/security/JwtTokenProvider.kt rename to backend/src/main/kotlin/io/github/devcavin/gatelog/backend/auth/JwtTokenProvider.kt index d51d79f..8726e7d 100644 --- a/backend/src/main/kotlin/io/github/devcavin/backend/security/JwtTokenProvider.kt +++ b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/auth/JwtTokenProvider.kt @@ -1,4 +1,4 @@ -package io.github.devcavin.backend.security +package io.github.devcavin.gatelog.backend.auth import io.jsonwebtoken.Claims import io.jsonwebtoken.JwtException diff --git a/backend/src/main/kotlin/io/github/devcavin/backend/domain/model/RefreshToken.kt b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/auth/RefreshToken.kt similarity index 86% rename from backend/src/main/kotlin/io/github/devcavin/backend/domain/model/RefreshToken.kt rename to backend/src/main/kotlin/io/github/devcavin/gatelog/backend/auth/RefreshToken.kt index 879f4b8..9bde7e5 100644 --- a/backend/src/main/kotlin/io/github/devcavin/backend/domain/model/RefreshToken.kt +++ b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/auth/RefreshToken.kt @@ -1,5 +1,7 @@ -package io.github.devcavin.backend.domain.model +package io.github.devcavin.gatelog.backend.auth +import io.github.devcavin.gatelog.backend.common.persistence.BaseEntity +import io.github.devcavin.gatelog.backend.users.User import jakarta.persistence.Column import jakarta.persistence.Entity import jakarta.persistence.FetchType diff --git a/backend/src/main/kotlin/io/github/devcavin/backend/domain/repository/RefreshTokenRepository.kt b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/auth/RefreshTokenRepository.kt similarity index 86% rename from backend/src/main/kotlin/io/github/devcavin/backend/domain/repository/RefreshTokenRepository.kt rename to backend/src/main/kotlin/io/github/devcavin/gatelog/backend/auth/RefreshTokenRepository.kt index 823ccb0..1d62938 100644 --- a/backend/src/main/kotlin/io/github/devcavin/backend/domain/repository/RefreshTokenRepository.kt +++ b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/auth/RefreshTokenRepository.kt @@ -1,6 +1,5 @@ -package io.github.devcavin.backend.domain.repository +package io.github.devcavin.gatelog.backend.auth -import io.github.devcavin.backend.domain.model.RefreshToken import org.springframework.data.jpa.repository.JpaRepository import org.springframework.data.jpa.repository.Modifying import org.springframework.data.jpa.repository.Query diff --git a/backend/src/main/kotlin/io/github/devcavin/backend/security/UserDetailsServiceImpl.kt b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/auth/UserDetailsServiceImpl.kt similarity index 90% rename from backend/src/main/kotlin/io/github/devcavin/backend/security/UserDetailsServiceImpl.kt rename to backend/src/main/kotlin/io/github/devcavin/gatelog/backend/auth/UserDetailsServiceImpl.kt index ab4e9b4..b713a30 100644 --- a/backend/src/main/kotlin/io/github/devcavin/backend/security/UserDetailsServiceImpl.kt +++ b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/auth/UserDetailsServiceImpl.kt @@ -1,6 +1,6 @@ -package io.github.devcavin.backend.security +package io.github.devcavin.gatelog.backend.auth -import io.github.devcavin.backend.domain.repository.UserRepository +import io.github.devcavin.gatelog.backend.users.UserRepository import org.springframework.security.core.authority.SimpleGrantedAuthority import org.springframework.security.core.userdetails.User import org.springframework.security.core.userdetails.UserDetails diff --git a/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/auth/dto/AuthDtos.kt b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/auth/dto/AuthDtos.kt new file mode 100644 index 0000000..9e729ec --- /dev/null +++ b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/auth/dto/AuthDtos.kt @@ -0,0 +1,11 @@ +package io.github.devcavin.gatelog.backend.auth.dto + +import java.util.UUID + +data class AuthenticatedUser( + val id: UUID, + val name: String, + val email: String, + val role: String, + val siteId: UUID +) diff --git a/backend/src/main/kotlin/io/github/devcavin/backend/web/dto/auth/AuthDTOs.kt b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/auth/dto/AuthRequests.kt similarity index 50% rename from backend/src/main/kotlin/io/github/devcavin/backend/web/dto/auth/AuthDTOs.kt rename to backend/src/main/kotlin/io/github/devcavin/gatelog/backend/auth/dto/AuthRequests.kt index f347bf3..24d98aa 100644 --- a/backend/src/main/kotlin/io/github/devcavin/backend/web/dto/auth/AuthDTOs.kt +++ b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/auth/dto/AuthRequests.kt @@ -1,8 +1,7 @@ -package io.github.devcavin.backend.web.dto.auth +package io.github.devcavin.gatelog.backend.auth.dto import jakarta.validation.constraints.Email import jakarta.validation.constraints.NotBlank -import java.util.UUID data class LoginRequest( @field:Email @@ -16,17 +15,4 @@ data class LoginRequest( data class RefreshTokenRequest( @field:NotBlank val token: String -) - -data class AuthenticatedUser( - val id: UUID, - val name: String, - val email: String, - val role: String, - val siteId: UUID -) - -data class AuthResponse( - val accessToken: String, - val refreshToken: String -) +) \ No newline at end of file diff --git a/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/auth/dto/AuthResponses.kt b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/auth/dto/AuthResponses.kt new file mode 100644 index 0000000..db8160e --- /dev/null +++ b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/auth/dto/AuthResponses.kt @@ -0,0 +1,6 @@ +package io.github.devcavin.gatelog.backend.auth.dto + +data class AuthResponse( + val accessToken: String, + val refreshToken: String +) \ No newline at end of file diff --git a/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/common/exception/DomainExceptions.kt b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/common/exception/DomainExceptions.kt new file mode 100644 index 0000000..02ab01b --- /dev/null +++ b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/common/exception/DomainExceptions.kt @@ -0,0 +1,27 @@ +package io.github.devcavin.gatelog.backend.common.exception + +import org.springframework.security.authentication.BadCredentialsException + +// base type +sealed class DomainException(message: String) : RuntimeException(message) + +// 401 — bad credentials or invalid/expired tokens +sealed class UnauthorizedException(message: String): io.github.devcavin.gatelog.backend.common.exception.DomainException(message) + +class InvalidCredentialsException : BadCredentialsException("Invalid username or password") + +class InvalidRefreshTokenException : BadCredentialsException("Invalid or expired refresh token") + +// 403 - authenticated but !permitted +class AccountDisabledException : io.github.devcavin.gatelog.backend.common.exception.DomainException("Account is disabled") + +// 404 - resource !found +class ResourceNotFoundException(resource: String, id: Any) : io.github.devcavin.gatelog.backend.common.exception.DomainException("Resource $resource not found: $id") + +// 409 - conflicts with existing state/resources, etc... +class ConflictException(message: String) : io.github.devcavin.gatelog.backend.common.exception.DomainException(message) + +// 422 - semantically invalid request (e.g. checking out already checked out visitor) +class InvalidStateException(message: String) : io.github.devcavin.gatelog.backend.common.exception.DomainException(message) + +class AccessDeniedException(message: String) : RuntimeException(message) \ No newline at end of file diff --git a/backend/src/main/kotlin/io/github/devcavin/backend/web/error/ErrorResponse.kt b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/common/exception/ErrorResponse.kt similarity index 81% rename from backend/src/main/kotlin/io/github/devcavin/backend/web/error/ErrorResponse.kt rename to backend/src/main/kotlin/io/github/devcavin/gatelog/backend/common/exception/ErrorResponse.kt index 58e9664..eefd88c 100644 --- a/backend/src/main/kotlin/io/github/devcavin/backend/web/error/ErrorResponse.kt +++ b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/common/exception/ErrorResponse.kt @@ -1,4 +1,4 @@ -package io.github.devcavin.backend.web.error +package io.github.devcavin.gatelog.backend.common.exception import java.time.OffsetDateTime diff --git a/backend/src/main/kotlin/io/github/devcavin/backend/web/error/GlobalExceptionHandler.kt b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/common/exception/GlobalExceptionHandler.kt similarity index 90% rename from backend/src/main/kotlin/io/github/devcavin/backend/web/error/GlobalExceptionHandler.kt rename to backend/src/main/kotlin/io/github/devcavin/gatelog/backend/common/exception/GlobalExceptionHandler.kt index 400d16e..5bb5b61 100644 --- a/backend/src/main/kotlin/io/github/devcavin/backend/web/error/GlobalExceptionHandler.kt +++ b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/common/exception/GlobalExceptionHandler.kt @@ -1,6 +1,5 @@ -package io.github.devcavin.backend.web.error +package io.github.devcavin.gatelog.backend.common.exception -import io.github.devcavin.backend.common.exception.* import jakarta.servlet.http.HttpServletRequest import org.slf4j.LoggerFactory import org.springframework.http.HttpStatus @@ -49,13 +48,15 @@ class GlobalExceptionHandler { return ResponseEntity .status(HttpStatus.BAD_REQUEST) - .body(ErrorResponse( - status = HttpStatus.BAD_REQUEST.value(), - error = HttpStatus.BAD_REQUEST.reasonPhrase, - message = "Validation failed", - path = request.requestURI, - fieldErrors = fieldErrors - )) + .body( + ErrorResponse( + status = HttpStatus.BAD_REQUEST.value(), + error = HttpStatus.BAD_REQUEST.reasonPhrase, + message = "Validation failed", + path = request.requestURI, + fieldErrors = fieldErrors + ) + ) } @ExceptionHandler(BadCredentialsException::class) diff --git a/backend/src/main/kotlin/io/github/devcavin/backend/domain/model/BaseEntity.kt b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/common/persistence/BaseEntity.kt similarity index 88% rename from backend/src/main/kotlin/io/github/devcavin/backend/domain/model/BaseEntity.kt rename to backend/src/main/kotlin/io/github/devcavin/gatelog/backend/common/persistence/BaseEntity.kt index d6351ba..eca4cfb 100644 --- a/backend/src/main/kotlin/io/github/devcavin/backend/domain/model/BaseEntity.kt +++ b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/common/persistence/BaseEntity.kt @@ -1,4 +1,4 @@ -package io.github.devcavin.backend.domain.model +package io.github.devcavin.gatelog.backend.common.persistence import jakarta.persistence.MappedSuperclass import java.util.UUID diff --git a/backend/src/main/kotlin/io/github/devcavin/backend/security/SecurityConfig.kt b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/config/SecurityConfig.kt similarity index 96% rename from backend/src/main/kotlin/io/github/devcavin/backend/security/SecurityConfig.kt rename to backend/src/main/kotlin/io/github/devcavin/gatelog/backend/config/SecurityConfig.kt index a2f79e3..65b2ac2 100644 --- a/backend/src/main/kotlin/io/github/devcavin/backend/security/SecurityConfig.kt +++ b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/config/SecurityConfig.kt @@ -1,5 +1,6 @@ -package io.github.devcavin.backend.security +package io.github.devcavin.gatelog.backend.config +import io.github.devcavin.gatelog.backend.auth.JwtAuthenticationFilter import org.springframework.boot.context.properties.ConfigurationProperties import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration diff --git a/backend/src/main/kotlin/io/github/devcavin/backend/web/controller/DashboardController.kt b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/dashboard/DashboardController.kt similarity index 76% rename from backend/src/main/kotlin/io/github/devcavin/backend/web/controller/DashboardController.kt rename to backend/src/main/kotlin/io/github/devcavin/gatelog/backend/dashboard/DashboardController.kt index 3704e2f..3e737ba 100644 --- a/backend/src/main/kotlin/io/github/devcavin/backend/web/controller/DashboardController.kt +++ b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/dashboard/DashboardController.kt @@ -1,8 +1,7 @@ -package io.github.devcavin.backend.web.controller +package io.github.devcavin.gatelog.backend.dashboard -import io.github.devcavin.backend.domain.model.User -import io.github.devcavin.backend.service.DashboardService -import io.github.devcavin.backend.web.dto.dashboard.DashboardFeed +import io.github.devcavin.gatelog.backend.dashboard.dto.DashboardFeed +import io.github.devcavin.gatelog.backend.users.User import org.springframework.http.HttpStatus import org.springframework.http.ResponseEntity import org.springframework.security.core.annotation.AuthenticationPrincipal diff --git a/backend/src/main/kotlin/io/github/devcavin/backend/service/DashboardService.kt b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/dashboard/DashboardService.kt similarity index 87% rename from backend/src/main/kotlin/io/github/devcavin/backend/service/DashboardService.kt rename to backend/src/main/kotlin/io/github/devcavin/gatelog/backend/dashboard/DashboardService.kt index a1f091a..ae7018f 100644 --- a/backend/src/main/kotlin/io/github/devcavin/backend/service/DashboardService.kt +++ b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/dashboard/DashboardService.kt @@ -1,11 +1,11 @@ -package io.github.devcavin.backend.service +package io.github.devcavin.gatelog.backend.dashboard -import io.github.devcavin.backend.domain.model.User -import io.github.devcavin.backend.domain.repository.VisitStatusRepository -import io.github.devcavin.backend.domain.repository.VisitorRepository -import io.github.devcavin.backend.web.dto.dashboard.DashboardFeed -import io.github.devcavin.backend.web.dto.dashboard.DashboardSummary -import io.github.devcavin.backend.web.dto.visitor.toResponse +import io.github.devcavin.gatelog.backend.dashboard.dto.DashboardFeed +import io.github.devcavin.gatelog.backend.dashboard.dto.DashboardSummary +import io.github.devcavin.gatelog.backend.users.User +import io.github.devcavin.gatelog.backend.visitors.VisitStatusRepository +import io.github.devcavin.gatelog.backend.visitors.VisitorRepository +import io.github.devcavin.gatelog.backend.visitors.dto.toResponse import org.springframework.beans.factory.annotation.Value import org.springframework.data.domain.PageRequest import org.springframework.data.domain.Sort diff --git a/backend/src/main/kotlin/io/github/devcavin/backend/web/dto/dashboard/DashboardDTOs.kt b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/dashboard/dto/DashboardDtos.kt similarity index 77% rename from backend/src/main/kotlin/io/github/devcavin/backend/web/dto/dashboard/DashboardDTOs.kt rename to backend/src/main/kotlin/io/github/devcavin/gatelog/backend/dashboard/dto/DashboardDtos.kt index c666beb..e260803 100644 --- a/backend/src/main/kotlin/io/github/devcavin/backend/web/dto/dashboard/DashboardDTOs.kt +++ b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/dashboard/dto/DashboardDtos.kt @@ -1,6 +1,6 @@ -package io.github.devcavin.backend.web.dto.dashboard +package io.github.devcavin.gatelog.backend.dashboard.dto -import io.github.devcavin.backend.web.dto.visitor.VisitorResponse +import io.github.devcavin.gatelog.backend.visitors.dto.VisitorResponse import java.time.OffsetDateTime data class DashboardSummary( diff --git a/backend/src/main/kotlin/io/github/devcavin/backend/web/controller/ReportController.kt b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/reports/ReportController.kt similarity index 90% rename from backend/src/main/kotlin/io/github/devcavin/backend/web/controller/ReportController.kt rename to backend/src/main/kotlin/io/github/devcavin/gatelog/backend/reports/ReportController.kt index 92f0962..296b530 100644 --- a/backend/src/main/kotlin/io/github/devcavin/backend/web/controller/ReportController.kt +++ b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/reports/ReportController.kt @@ -1,8 +1,7 @@ -package io.github.devcavin.backend.web.controller +package io.github.devcavin.gatelog.backend.reports -import io.github.devcavin.backend.domain.model.User -import io.github.devcavin.backend.service.ReportService -import io.github.devcavin.backend.web.dto.visitor.VisitorSearchParams +import io.github.devcavin.gatelog.backend.users.User +import io.github.devcavin.gatelog.backend.visitors.dto.VisitorSearchParams import org.springframework.http.HttpHeaders import org.springframework.http.MediaType import org.springframework.http.ResponseEntity diff --git a/backend/src/main/kotlin/io/github/devcavin/backend/service/ReportService.kt b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/reports/ReportService.kt similarity index 85% rename from backend/src/main/kotlin/io/github/devcavin/backend/service/ReportService.kt rename to backend/src/main/kotlin/io/github/devcavin/gatelog/backend/reports/ReportService.kt index 778cae2..d1d58c9 100644 --- a/backend/src/main/kotlin/io/github/devcavin/backend/service/ReportService.kt +++ b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/reports/ReportService.kt @@ -1,10 +1,10 @@ -package io.github.devcavin.backend.service +package io.github.devcavin.gatelog.backend.reports -import io.github.devcavin.backend.domain.model.User -import io.github.devcavin.backend.domain.model.Visitor -import io.github.devcavin.backend.domain.repository.VisitorRepository -import io.github.devcavin.backend.domain.repository.VisitorSpecification -import io.github.devcavin.backend.web.dto.visitor.VisitorSearchParams +import io.github.devcavin.gatelog.backend.users.User +import io.github.devcavin.gatelog.backend.visitors.Visitor +import io.github.devcavin.gatelog.backend.visitors.VisitorRepository +import io.github.devcavin.gatelog.backend.visitors.VisitorSpecification +import io.github.devcavin.gatelog.backend.visitors.dto.VisitorSearchParams import org.apache.tomcat.util.http.fileupload.ByteArrayOutputStream import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional diff --git a/backend/src/main/kotlin/io/github/devcavin/backend/domain/model/Site.kt b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/sites/Site.kt similarity index 82% rename from backend/src/main/kotlin/io/github/devcavin/backend/domain/model/Site.kt rename to backend/src/main/kotlin/io/github/devcavin/gatelog/backend/sites/Site.kt index c0f3fb6..0eb25df 100644 --- a/backend/src/main/kotlin/io/github/devcavin/backend/domain/model/Site.kt +++ b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/sites/Site.kt @@ -1,5 +1,6 @@ -package io.github.devcavin.backend.domain.model +package io.github.devcavin.gatelog.backend.sites +import io.github.devcavin.gatelog.backend.common.persistence.BaseEntity import jakarta.persistence.Column import jakarta.persistence.Entity import jakarta.persistence.GeneratedValue diff --git a/backend/src/main/kotlin/io/github/devcavin/backend/web/controller/SiteController.kt b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/sites/SiteController.kt similarity index 87% rename from backend/src/main/kotlin/io/github/devcavin/backend/web/controller/SiteController.kt rename to backend/src/main/kotlin/io/github/devcavin/gatelog/backend/sites/SiteController.kt index 0a7d300..10de84b 100644 --- a/backend/src/main/kotlin/io/github/devcavin/backend/web/controller/SiteController.kt +++ b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/sites/SiteController.kt @@ -1,8 +1,7 @@ -package io.github.devcavin.backend.web.controller +package io.github.devcavin.gatelog.backend.sites -import io.github.devcavin.backend.service.SiteService -import io.github.devcavin.backend.web.dto.site.SiteRequest -import io.github.devcavin.backend.web.dto.site.SiteResponse +import io.github.devcavin.gatelog.backend.sites.dto.SiteRequest +import io.github.devcavin.gatelog.backend.sites.dto.SiteResponse import jakarta.validation.Valid import org.springframework.http.HttpStatus import org.springframework.http.ResponseEntity diff --git a/backend/src/main/kotlin/io/github/devcavin/backend/domain/repository/SiteRepository.kt b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/sites/SiteRepository.kt similarity index 72% rename from backend/src/main/kotlin/io/github/devcavin/backend/domain/repository/SiteRepository.kt rename to backend/src/main/kotlin/io/github/devcavin/gatelog/backend/sites/SiteRepository.kt index 4e98680..4ed6a5e 100644 --- a/backend/src/main/kotlin/io/github/devcavin/backend/domain/repository/SiteRepository.kt +++ b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/sites/SiteRepository.kt @@ -1,6 +1,5 @@ -package io.github.devcavin.backend.domain.repository +package io.github.devcavin.gatelog.backend.sites -import io.github.devcavin.backend.domain.model.Site import org.springframework.data.jpa.repository.JpaRepository import org.springframework.stereotype.Repository import java.util.UUID diff --git a/backend/src/main/kotlin/io/github/devcavin/backend/service/SiteService.kt b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/sites/SiteService.kt similarity index 74% rename from backend/src/main/kotlin/io/github/devcavin/backend/service/SiteService.kt rename to backend/src/main/kotlin/io/github/devcavin/gatelog/backend/sites/SiteService.kt index 41452da..a9cf222 100644 --- a/backend/src/main/kotlin/io/github/devcavin/backend/service/SiteService.kt +++ b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/sites/SiteService.kt @@ -1,12 +1,11 @@ -package io.github.devcavin.backend.service - -import io.github.devcavin.backend.common.exception.ConflictException -import io.github.devcavin.backend.common.exception.ResourceNotFoundException -import io.github.devcavin.backend.domain.repository.SiteRepository -import io.github.devcavin.backend.web.dto.site.SiteRequest -import io.github.devcavin.backend.web.dto.site.SiteResponse -import io.github.devcavin.backend.web.dto.site.toEntity -import io.github.devcavin.backend.web.dto.site.toResponse +package io.github.devcavin.gatelog.backend.sites + +import io.github.devcavin.gatelog.backend.common.exception.ConflictException +import io.github.devcavin.gatelog.backend.common.exception.ResourceNotFoundException +import io.github.devcavin.gatelog.backend.sites.dto.SiteRequest +import io.github.devcavin.gatelog.backend.sites.dto.SiteResponse +import io.github.devcavin.gatelog.backend.sites.dto.toEntity +import io.github.devcavin.gatelog.backend.sites.dto.toResponse import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional import java.util.UUID diff --git a/backend/src/main/kotlin/io/github/devcavin/backend/web/dto/site/SiteDTOs.kt b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/sites/dto/SiteRequests.kt similarity index 53% rename from backend/src/main/kotlin/io/github/devcavin/backend/web/dto/site/SiteDTOs.kt rename to backend/src/main/kotlin/io/github/devcavin/gatelog/backend/sites/dto/SiteRequests.kt index 0c534fb..798838a 100644 --- a/backend/src/main/kotlin/io/github/devcavin/backend/web/dto/site/SiteDTOs.kt +++ b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/sites/dto/SiteRequests.kt @@ -1,9 +1,8 @@ -package io.github.devcavin.backend.web.dto.site +package io.github.devcavin.gatelog.backend.sites.dto -import io.github.devcavin.backend.domain.model.Site +import io.github.devcavin.gatelog.backend.sites.Site import jakarta.validation.constraints.NotBlank import jakarta.validation.constraints.Size -import java.util.* data class SiteRequest( @field:NotBlank @@ -15,21 +14,9 @@ data class SiteRequest( val location: String ) -data class SiteResponse( - val id: UUID, - val name: String, - val location: String -) - fun SiteRequest.toEntity(): Site { return Site( name = name, location = location ) -} - -fun Site.toResponse() = SiteResponse( - id = this.id!!, - name = this.name, - location = this.location -) \ No newline at end of file +} \ No newline at end of file diff --git a/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/sites/dto/SiteResponses.kt b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/sites/dto/SiteResponses.kt new file mode 100644 index 0000000..bfc326f --- /dev/null +++ b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/sites/dto/SiteResponses.kt @@ -0,0 +1,16 @@ +package io.github.devcavin.gatelog.backend.sites.dto + +import io.github.devcavin.gatelog.backend.sites.Site +import java.util.* + +data class SiteResponse( + val id: UUID, + val name: String, + val location: String +) + +fun Site.toResponse() = SiteResponse( + id = this.id!!, + name = this.name, + location = this.location +) \ No newline at end of file diff --git a/backend/src/main/kotlin/io/github/devcavin/backend/domain/model/Role.kt b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/users/Role.kt similarity index 81% rename from backend/src/main/kotlin/io/github/devcavin/backend/domain/model/Role.kt rename to backend/src/main/kotlin/io/github/devcavin/gatelog/backend/users/Role.kt index 62380dc..66c8007 100644 --- a/backend/src/main/kotlin/io/github/devcavin/backend/domain/model/Role.kt +++ b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/users/Role.kt @@ -1,5 +1,6 @@ -package io.github.devcavin.backend.domain.model +package io.github.devcavin.gatelog.backend.users +import io.github.devcavin.gatelog.backend.common.persistence.BaseEntity import jakarta.persistence.Column import jakarta.persistence.Entity import jakarta.persistence.GeneratedValue diff --git a/backend/src/main/kotlin/io/github/devcavin/backend/domain/repository/RoleRepository.kt b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/users/RoleRepository.kt similarity index 69% rename from backend/src/main/kotlin/io/github/devcavin/backend/domain/repository/RoleRepository.kt rename to backend/src/main/kotlin/io/github/devcavin/gatelog/backend/users/RoleRepository.kt index e12153b..fa808f0 100644 --- a/backend/src/main/kotlin/io/github/devcavin/backend/domain/repository/RoleRepository.kt +++ b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/users/RoleRepository.kt @@ -1,6 +1,5 @@ -package io.github.devcavin.backend.domain.repository +package io.github.devcavin.gatelog.backend.users -import io.github.devcavin.backend.domain.model.Role import org.springframework.data.jpa.repository.JpaRepository import org.springframework.stereotype.Repository import java.util.UUID diff --git a/backend/src/main/kotlin/io/github/devcavin/backend/domain/model/User.kt b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/users/User.kt similarity index 84% rename from backend/src/main/kotlin/io/github/devcavin/backend/domain/model/User.kt rename to backend/src/main/kotlin/io/github/devcavin/gatelog/backend/users/User.kt index 574daf3..99d43d1 100644 --- a/backend/src/main/kotlin/io/github/devcavin/backend/domain/model/User.kt +++ b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/users/User.kt @@ -1,6 +1,8 @@ -package io.github.devcavin.backend.domain.model +package io.github.devcavin.gatelog.backend.users import com.fasterxml.jackson.annotation.JsonIgnore +import io.github.devcavin.gatelog.backend.common.persistence.BaseEntity +import io.github.devcavin.gatelog.backend.sites.Site import jakarta.persistence.* import jakarta.validation.constraints.Email import java.util.* diff --git a/backend/src/main/kotlin/io/github/devcavin/backend/web/controller/UserController.kt b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/users/UserController.kt similarity index 88% rename from backend/src/main/kotlin/io/github/devcavin/backend/web/controller/UserController.kt rename to backend/src/main/kotlin/io/github/devcavin/gatelog/backend/users/UserController.kt index 2305a28..e44d5b1 100644 --- a/backend/src/main/kotlin/io/github/devcavin/backend/web/controller/UserController.kt +++ b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/users/UserController.kt @@ -1,11 +1,9 @@ -package io.github.devcavin.backend.web.controller +package io.github.devcavin.gatelog.backend.users -import io.github.devcavin.backend.domain.model.User -import io.github.devcavin.backend.service.UserService -import io.github.devcavin.backend.web.dto.user.ChangePasswordRequest -import io.github.devcavin.backend.web.dto.user.CreateUserRequest -import io.github.devcavin.backend.web.dto.user.UpdateUserRequest -import io.github.devcavin.backend.web.dto.user.UserResponse +import io.github.devcavin.gatelog.backend.users.dto.ChangePasswordRequest +import io.github.devcavin.gatelog.backend.users.dto.CreateUserRequest +import io.github.devcavin.gatelog.backend.users.dto.UpdateUserRequest +import io.github.devcavin.gatelog.backend.users.dto.UserResponse import jakarta.validation.Valid import org.springframework.http.HttpStatus import org.springframework.http.ResponseEntity diff --git a/backend/src/main/kotlin/io/github/devcavin/backend/domain/repository/UserRepository.kt b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/users/UserRepository.kt similarity index 91% rename from backend/src/main/kotlin/io/github/devcavin/backend/domain/repository/UserRepository.kt rename to backend/src/main/kotlin/io/github/devcavin/gatelog/backend/users/UserRepository.kt index cf2b07e..91b8d17 100644 --- a/backend/src/main/kotlin/io/github/devcavin/backend/domain/repository/UserRepository.kt +++ b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/users/UserRepository.kt @@ -1,6 +1,5 @@ -package io.github.devcavin.backend.domain.repository +package io.github.devcavin.gatelog.backend.users -import io.github.devcavin.backend.domain.model.User import org.springframework.data.jpa.repository.JpaRepository import org.springframework.data.jpa.repository.Query import org.springframework.stereotype.Repository diff --git a/backend/src/main/kotlin/io/github/devcavin/backend/service/UserService.kt b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/users/UserService.kt similarity index 86% rename from backend/src/main/kotlin/io/github/devcavin/backend/service/UserService.kt rename to backend/src/main/kotlin/io/github/devcavin/gatelog/backend/users/UserService.kt index b7252c9..7eed3b8 100644 --- a/backend/src/main/kotlin/io/github/devcavin/backend/service/UserService.kt +++ b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/users/UserService.kt @@ -1,21 +1,18 @@ -package io.github.devcavin.backend.service - -import io.github.devcavin.backend.common.exception.ConflictException -import io.github.devcavin.backend.common.exception.InvalidCredentialsException -import io.github.devcavin.backend.common.exception.InvalidStateException -import io.github.devcavin.backend.common.exception.ResourceNotFoundException -import io.github.devcavin.backend.domain.model.User -import io.github.devcavin.backend.domain.repository.RoleRepository -import io.github.devcavin.backend.domain.repository.SiteRepository -import io.github.devcavin.backend.domain.repository.UserRepository -import io.github.devcavin.backend.web.dto.user.ChangePasswordRequest -import io.github.devcavin.backend.web.dto.user.CreateUserRequest -import io.github.devcavin.backend.web.dto.user.UpdateUserRequest -import io.github.devcavin.backend.web.dto.user.UserResponse -import io.github.devcavin.backend.web.dto.user.toResponse +package io.github.devcavin.gatelog.backend.users + +import io.github.devcavin.gatelog.backend.common.exception.ConflictException +import io.github.devcavin.gatelog.backend.common.exception.InvalidCredentialsException +import io.github.devcavin.gatelog.backend.common.exception.InvalidStateException +import io.github.devcavin.gatelog.backend.common.exception.ResourceNotFoundException +import io.github.devcavin.gatelog.backend.sites.SiteRepository import org.springframework.security.crypto.password.PasswordEncoder import org.springframework.stereotype.Service -import io.github.devcavin.backend.common.exception.AccessDeniedException +import io.github.devcavin.gatelog.backend.common.exception.AccessDeniedException +import io.github.devcavin.gatelog.backend.users.dto.ChangePasswordRequest +import io.github.devcavin.gatelog.backend.users.dto.CreateUserRequest +import io.github.devcavin.gatelog.backend.users.dto.UpdateUserRequest +import io.github.devcavin.gatelog.backend.users.dto.UserResponse +import io.github.devcavin.gatelog.backend.users.dto.toResponse import org.springframework.transaction.annotation.Transactional import java.util.* diff --git a/backend/src/main/kotlin/io/github/devcavin/backend/web/dto/user/UserDTOs.kt b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/users/dto/UserRequests.kt similarity index 66% rename from backend/src/main/kotlin/io/github/devcavin/backend/web/dto/user/UserDTOs.kt rename to backend/src/main/kotlin/io/github/devcavin/gatelog/backend/users/dto/UserRequests.kt index 509c1ad..d4fa9d7 100644 --- a/backend/src/main/kotlin/io/github/devcavin/backend/web/dto/user/UserDTOs.kt +++ b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/users/dto/UserRequests.kt @@ -1,10 +1,9 @@ -package io.github.devcavin.backend.web.dto.user +package io.github.devcavin.gatelog.backend.users.dto -import io.github.devcavin.backend.domain.model.User import jakarta.validation.constraints.Email import jakarta.validation.constraints.NotBlank import jakarta.validation.constraints.Size -import java.util.* +import java.util.UUID data class CreateUserRequest( @field:NotBlank @@ -44,22 +43,4 @@ data class ChangePasswordRequest( @field:NotBlank @field:Size(min = 8, message = "Password must be at least 8 characters") val newPassword: String -) - -data class UserResponse( - val id: UUID, - val name: String, - val email: String, - val roleName: String, - val siteId: UUID, - val isActive: Boolean -) - -fun User.toResponse() = UserResponse( - id = id!!, - name = name, - email = email, - roleName = role.name, - siteId = site.id!!, - isActive = isActive -) +) \ No newline at end of file diff --git a/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/users/dto/UserResponses.kt b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/users/dto/UserResponses.kt new file mode 100644 index 0000000..3c02680 --- /dev/null +++ b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/users/dto/UserResponses.kt @@ -0,0 +1,22 @@ +package io.github.devcavin.gatelog.backend.users.dto + +import io.github.devcavin.gatelog.backend.users.User +import java.util.UUID + +data class UserResponse( + val id: UUID, + val name: String, + val email: String, + val roleName: String, + val siteId: UUID, + val isActive: Boolean +) + +fun User.toResponse() = UserResponse( + id = id!!, + name = name, + email = email, + roleName = role.name, + siteId = site.id!!, + isActive = isActive +) \ No newline at end of file diff --git a/backend/src/main/kotlin/io/github/devcavin/backend/service/OverdueVisitorJob.kt b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/visitors/OverdueVisitorJob.kt similarity index 83% rename from backend/src/main/kotlin/io/github/devcavin/backend/service/OverdueVisitorJob.kt rename to backend/src/main/kotlin/io/github/devcavin/gatelog/backend/visitors/OverdueVisitorJob.kt index 5af8c22..c636e9c 100644 --- a/backend/src/main/kotlin/io/github/devcavin/backend/service/OverdueVisitorJob.kt +++ b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/visitors/OverdueVisitorJob.kt @@ -1,9 +1,7 @@ -package io.github.devcavin.backend.service +package io.github.devcavin.gatelog.backend.visitors -import io.github.devcavin.backend.common.exception.ResourceNotFoundException -import io.github.devcavin.backend.domain.repository.SiteRepository -import io.github.devcavin.backend.domain.repository.VisitStatusRepository -import io.github.devcavin.backend.domain.repository.VisitorRepository +import io.github.devcavin.gatelog.backend.common.exception.ResourceNotFoundException +import io.github.devcavin.gatelog.backend.sites.SiteRepository import org.slf4j.LoggerFactory import org.springframework.beans.factory.annotation.Value import org.springframework.scheduling.annotation.Scheduled diff --git a/backend/src/main/kotlin/io/github/devcavin/backend/domain/model/VisitStatus.kt b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/visitors/VisitStatus.kt similarity index 83% rename from backend/src/main/kotlin/io/github/devcavin/backend/domain/model/VisitStatus.kt rename to backend/src/main/kotlin/io/github/devcavin/gatelog/backend/visitors/VisitStatus.kt index 786466b..6ed93e2 100644 --- a/backend/src/main/kotlin/io/github/devcavin/backend/domain/model/VisitStatus.kt +++ b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/visitors/VisitStatus.kt @@ -1,5 +1,6 @@ -package io.github.devcavin.backend.domain.model +package io.github.devcavin.gatelog.backend.visitors +import io.github.devcavin.gatelog.backend.common.persistence.BaseEntity import jakarta.persistence.Column import jakarta.persistence.Entity import jakarta.persistence.GeneratedValue diff --git a/backend/src/main/kotlin/io/github/devcavin/backend/domain/repository/VisitStatusRepository.kt b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/visitors/VisitStatusRepository.kt similarity index 70% rename from backend/src/main/kotlin/io/github/devcavin/backend/domain/repository/VisitStatusRepository.kt rename to backend/src/main/kotlin/io/github/devcavin/gatelog/backend/visitors/VisitStatusRepository.kt index c61c7cb..3889589 100644 --- a/backend/src/main/kotlin/io/github/devcavin/backend/domain/repository/VisitStatusRepository.kt +++ b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/visitors/VisitStatusRepository.kt @@ -1,6 +1,5 @@ -package io.github.devcavin.backend.domain.repository +package io.github.devcavin.gatelog.backend.visitors -import io.github.devcavin.backend.domain.model.VisitStatus import org.springframework.data.jpa.repository.JpaRepository import org.springframework.stereotype.Repository import java.util.UUID diff --git a/backend/src/main/kotlin/io/github/devcavin/backend/domain/model/Visitor.kt b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/visitors/Visitor.kt similarity index 86% rename from backend/src/main/kotlin/io/github/devcavin/backend/domain/model/Visitor.kt rename to backend/src/main/kotlin/io/github/devcavin/gatelog/backend/visitors/Visitor.kt index b7d4214..f1cb956 100644 --- a/backend/src/main/kotlin/io/github/devcavin/backend/domain/model/Visitor.kt +++ b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/visitors/Visitor.kt @@ -1,5 +1,9 @@ -package io.github.devcavin.backend.domain.model +package io.github.devcavin.gatelog.backend.visitors +import io.github.devcavin.gatelog.backend.common.persistence.BaseEntity +import io.github.devcavin.gatelog.backend.sites.Site +import io.github.devcavin.gatelog.backend.zones.Zone +import io.github.devcavin.gatelog.backend.users.User import jakarta.persistence.Column import jakarta.persistence.Entity import jakarta.persistence.FetchType diff --git a/backend/src/main/kotlin/io/github/devcavin/backend/web/controller/VisitorController.kt b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/visitors/VisitorController.kt similarity index 86% rename from backend/src/main/kotlin/io/github/devcavin/backend/web/controller/VisitorController.kt rename to backend/src/main/kotlin/io/github/devcavin/gatelog/backend/visitors/VisitorController.kt index eb546ac..13ffd39 100644 --- a/backend/src/main/kotlin/io/github/devcavin/backend/web/controller/VisitorController.kt +++ b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/visitors/VisitorController.kt @@ -1,13 +1,12 @@ -package io.github.devcavin.backend.web.controller +package io.github.devcavin.gatelog.backend.visitors -import io.github.devcavin.backend.domain.model.User -import io.github.devcavin.backend.service.VisitorService -import io.github.devcavin.backend.web.dto.visitor.RegisterVisitorRequest -import io.github.devcavin.backend.web.dto.visitor.ReturningVisitorResponse -import io.github.devcavin.backend.web.dto.visitor.UpdateVisitorProfileRequest -import io.github.devcavin.backend.web.dto.visitor.VisitorProfileResponse -import io.github.devcavin.backend.web.dto.visitor.VisitorResponse -import io.github.devcavin.backend.web.dto.visitor.VisitorSearchParams +import io.github.devcavin.gatelog.backend.users.User +import io.github.devcavin.gatelog.backend.visitors.dto.RegisterVisitorRequest +import io.github.devcavin.gatelog.backend.visitors.dto.ReturningVisitorResponse +import io.github.devcavin.gatelog.backend.visitors.dto.UpdateVisitorProfileRequest +import io.github.devcavin.gatelog.backend.visitors.dto.VisitorProfileResponse +import io.github.devcavin.gatelog.backend.visitors.dto.VisitorResponse +import io.github.devcavin.gatelog.backend.visitors.dto.VisitorSearchParams import jakarta.validation.Valid import org.springframework.data.domain.Page import org.springframework.data.domain.Pageable diff --git a/backend/src/main/kotlin/io/github/devcavin/backend/domain/model/VisitorProfile.kt b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/visitors/VisitorProfile.kt similarity index 89% rename from backend/src/main/kotlin/io/github/devcavin/backend/domain/model/VisitorProfile.kt rename to backend/src/main/kotlin/io/github/devcavin/gatelog/backend/visitors/VisitorProfile.kt index 24b9853..671c16f 100644 --- a/backend/src/main/kotlin/io/github/devcavin/backend/domain/model/VisitorProfile.kt +++ b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/visitors/VisitorProfile.kt @@ -1,5 +1,7 @@ -package io.github.devcavin.backend.domain.model +package io.github.devcavin.gatelog.backend.visitors +import io.github.devcavin.gatelog.backend.common.persistence.BaseEntity +import io.github.devcavin.gatelog.backend.sites.Site import jakarta.persistence.Column import jakarta.persistence.Entity import jakarta.persistence.FetchType diff --git a/backend/src/main/kotlin/io/github/devcavin/backend/domain/repository/VisitorProfileRepository.kt b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/visitors/VisitorProfileRepository.kt similarity index 77% rename from backend/src/main/kotlin/io/github/devcavin/backend/domain/repository/VisitorProfileRepository.kt rename to backend/src/main/kotlin/io/github/devcavin/gatelog/backend/visitors/VisitorProfileRepository.kt index e04cb16..a58a881 100644 --- a/backend/src/main/kotlin/io/github/devcavin/backend/domain/repository/VisitorProfileRepository.kt +++ b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/visitors/VisitorProfileRepository.kt @@ -1,6 +1,5 @@ -package io.github.devcavin.backend.domain.repository +package io.github.devcavin.gatelog.backend.visitors -import io.github.devcavin.backend.domain.model.VisitorProfile import org.springframework.data.jpa.repository.JpaRepository import org.springframework.stereotype.Repository import java.util.UUID diff --git a/backend/src/main/kotlin/io/github/devcavin/backend/domain/repository/VisitorRepository.kt b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/visitors/VisitorRepository.kt similarity index 91% rename from backend/src/main/kotlin/io/github/devcavin/backend/domain/repository/VisitorRepository.kt rename to backend/src/main/kotlin/io/github/devcavin/gatelog/backend/visitors/VisitorRepository.kt index 24ad01e..cc07a1d 100644 --- a/backend/src/main/kotlin/io/github/devcavin/backend/domain/repository/VisitorRepository.kt +++ b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/visitors/VisitorRepository.kt @@ -1,10 +1,7 @@ -package io.github.devcavin.backend.domain.repository +package io.github.devcavin.gatelog.backend.visitors -import io.github.devcavin.backend.domain.model.VisitStatus -import io.github.devcavin.backend.domain.model.Visitor import org.springframework.data.domain.Page import org.springframework.data.domain.Pageable -import org.springframework.data.jpa.domain.Specification import org.springframework.data.jpa.repository.JpaRepository import org.springframework.data.jpa.repository.JpaSpecificationExecutor import org.springframework.data.jpa.repository.Modifying diff --git a/backend/src/main/kotlin/io/github/devcavin/backend/service/VisitorService.kt b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/visitors/VisitorService.kt similarity index 86% rename from backend/src/main/kotlin/io/github/devcavin/backend/service/VisitorService.kt rename to backend/src/main/kotlin/io/github/devcavin/gatelog/backend/visitors/VisitorService.kt index 10e821f..353b5df 100644 --- a/backend/src/main/kotlin/io/github/devcavin/backend/service/VisitorService.kt +++ b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/visitors/VisitorService.kt @@ -1,13 +1,17 @@ -package io.github.devcavin.backend.service - -import io.github.devcavin.backend.common.exception.ConflictException -import io.github.devcavin.backend.common.exception.InvalidStateException -import io.github.devcavin.backend.common.exception.ResourceNotFoundException -import io.github.devcavin.backend.domain.model.User -import io.github.devcavin.backend.domain.model.Visitor -import io.github.devcavin.backend.domain.model.VisitorProfile -import io.github.devcavin.backend.domain.repository.* -import io.github.devcavin.backend.web.dto.visitor.* +package io.github.devcavin.gatelog.backend.visitors + +import io.github.devcavin.gatelog.backend.common.exception.ConflictException +import io.github.devcavin.gatelog.backend.common.exception.InvalidStateException +import io.github.devcavin.gatelog.backend.common.exception.ResourceNotFoundException +import io.github.devcavin.gatelog.backend.users.User +import io.github.devcavin.gatelog.backend.visitors.dto.RegisterVisitorRequest +import io.github.devcavin.gatelog.backend.visitors.dto.ReturningVisitorResponse +import io.github.devcavin.gatelog.backend.visitors.dto.UpdateVisitorProfileRequest +import io.github.devcavin.gatelog.backend.visitors.dto.VisitorProfileResponse +import io.github.devcavin.gatelog.backend.visitors.dto.VisitorResponse +import io.github.devcavin.gatelog.backend.visitors.dto.VisitorSearchParams +import io.github.devcavin.gatelog.backend.visitors.dto.toResponse +import io.github.devcavin.gatelog.backend.zones.ZoneRepository import org.springframework.data.domain.Page import org.springframework.data.domain.Pageable import org.springframework.security.access.AccessDeniedException diff --git a/backend/src/main/kotlin/io/github/devcavin/backend/domain/repository/VisitorSpecification.kt b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/visitors/VisitorSpecification.kt similarity index 89% rename from backend/src/main/kotlin/io/github/devcavin/backend/domain/repository/VisitorSpecification.kt rename to backend/src/main/kotlin/io/github/devcavin/gatelog/backend/visitors/VisitorSpecification.kt index 71b2a9d..86f6564 100644 --- a/backend/src/main/kotlin/io/github/devcavin/backend/domain/repository/VisitorSpecification.kt +++ b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/visitors/VisitorSpecification.kt @@ -1,7 +1,6 @@ -package io.github.devcavin.backend.domain.repository +package io.github.devcavin.gatelog.backend.visitors -import io.github.devcavin.backend.domain.model.Visitor -import io.github.devcavin.backend.web.dto.visitor.VisitorSearchParams +import io.github.devcavin.gatelog.backend.visitors.dto.VisitorSearchParams import jakarta.persistence.criteria.Predicate import org.springframework.data.jpa.domain.Specification import java.util.UUID diff --git a/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/visitors/dto/VisitorRequests.kt b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/visitors/dto/VisitorRequests.kt new file mode 100644 index 0000000..7f18939 --- /dev/null +++ b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/visitors/dto/VisitorRequests.kt @@ -0,0 +1,47 @@ +package io.github.devcavin.gatelog.backend.visitors.dto + +import jakarta.validation.constraints.NotBlank +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import java.time.OffsetDateTime +import java.util.UUID + +data class RegisterVisitorRequest( + @field:NotBlank + @field:Size(max = 100) + val name: String, + + @field:NotBlank + @field:Pattern(regexp = """^\+?[0-9\s\-]{7,25}$""", message = "Invalid phone number format") + val phone: String, + + @field:NotBlank + val visitorType: String, + + val purpose: String = "General visit", + + val zoneId: UUID +) + +data class UpdateVisitorProfileRequest( + @field:NotBlank + @field:Size(max = 100) + val name: String, + + @field:NotBlank + @field:Pattern( + regexp = """^\+?[0-9\s\-]{7,25}$""", + message = "Invalid phone number format" + ) + val phoneNumber: String +) + +data class VisitorSearchParams( + val name: String? = null, + val phone: String? = null, + val visitorType: String? = null, + val zoneId: UUID? = null, + val status: String? = null, + val from: OffsetDateTime? = null, + val to: OffsetDateTime? = null +) \ No newline at end of file diff --git a/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/visitors/dto/VisitorResponses.kt b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/visitors/dto/VisitorResponses.kt new file mode 100644 index 0000000..04fc818 --- /dev/null +++ b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/visitors/dto/VisitorResponses.kt @@ -0,0 +1,53 @@ +package io.github.devcavin.gatelog.backend.visitors.dto + +import io.github.devcavin.gatelog.backend.visitors.Visitor +import java.time.OffsetDateTime +import java.util.UUID + +data class VisitorResponse( + val id: UUID, + val name: String, + val phone: String, + val visitorType: String, + val purpose: String, + val status: String, + val siteId: UUID, + val zoneId: UUID?, + val zoneName: String?, + val createdById: UUID, + val createdByName: String, + val checkInTime: OffsetDateTime, + val checkOutTime: OffsetDateTime? +) + +data class ReturningVisitorResponse( + val name: String, + val phone: String, + val visitorType: String, + val zoneId: UUID?, + val zoneName: String? +) + +data class VisitorProfileResponse( + val id: UUID, + val name: String, + val phoneNumber: String, + val siteId: UUID, + val visitCount: Int +) + +fun Visitor.toResponse() = VisitorResponse( + id = id!!, + name = name, + phone = phone, + visitorType = visitorType, + purpose = purpose, + status = visitStatus.name, + siteId = site.id!!, + zoneId = zone?.id, + zoneName = zone?.name, + createdById = createdBy.id!!, + createdByName = createdBy.name, + checkInTime = checkInTime, + checkOutTime = checkOutTime +) \ No newline at end of file diff --git a/backend/src/main/kotlin/io/github/devcavin/backend/domain/model/Zone.kt b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/zones/Zone.kt similarity index 83% rename from backend/src/main/kotlin/io/github/devcavin/backend/domain/model/Zone.kt rename to backend/src/main/kotlin/io/github/devcavin/gatelog/backend/zones/Zone.kt index e4e93a8..0e52128 100644 --- a/backend/src/main/kotlin/io/github/devcavin/backend/domain/model/Zone.kt +++ b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/zones/Zone.kt @@ -1,5 +1,7 @@ -package io.github.devcavin.backend.domain.model +package io.github.devcavin.gatelog.backend.zones +import io.github.devcavin.gatelog.backend.common.persistence.BaseEntity +import io.github.devcavin.gatelog.backend.sites.Site import jakarta.persistence.Column import jakarta.persistence.Entity import jakarta.persistence.FetchType diff --git a/backend/src/main/kotlin/io/github/devcavin/backend/web/controller/ZoneRepository.kt b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/zones/ZoneController.kt similarity index 90% rename from backend/src/main/kotlin/io/github/devcavin/backend/web/controller/ZoneRepository.kt rename to backend/src/main/kotlin/io/github/devcavin/gatelog/backend/zones/ZoneController.kt index 18470cb..ebe9924 100644 --- a/backend/src/main/kotlin/io/github/devcavin/backend/web/controller/ZoneRepository.kt +++ b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/zones/ZoneController.kt @@ -1,8 +1,7 @@ -package io.github.devcavin.backend.web.controller +package io.github.devcavin.gatelog.backend.zones -import io.github.devcavin.backend.service.ZoneService -import io.github.devcavin.backend.web.dto.zone.ZoneRequest -import io.github.devcavin.backend.web.dto.zone.ZoneResponse +import io.github.devcavin.gatelog.backend.zones.dto.ZoneRequest +import io.github.devcavin.gatelog.backend.zones.dto.ZoneResponse import jakarta.validation.Valid import org.springframework.http.HttpStatus import org.springframework.http.ResponseEntity diff --git a/backend/src/main/kotlin/io/github/devcavin/backend/domain/repository/ZoneRepository.kt b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/zones/ZoneRepository.kt similarity index 78% rename from backend/src/main/kotlin/io/github/devcavin/backend/domain/repository/ZoneRepository.kt rename to backend/src/main/kotlin/io/github/devcavin/gatelog/backend/zones/ZoneRepository.kt index 6472ba6..fd7d712 100644 --- a/backend/src/main/kotlin/io/github/devcavin/backend/domain/repository/ZoneRepository.kt +++ b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/zones/ZoneRepository.kt @@ -1,6 +1,5 @@ -package io.github.devcavin.backend.domain.repository +package io.github.devcavin.gatelog.backend.zones -import io.github.devcavin.backend.domain.model.Zone import org.springframework.data.jpa.repository.JpaRepository import org.springframework.stereotype.Repository import java.util.UUID diff --git a/backend/src/main/kotlin/io/github/devcavin/backend/service/ZoneService.kt b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/zones/ZoneService.kt similarity index 78% rename from backend/src/main/kotlin/io/github/devcavin/backend/service/ZoneService.kt rename to backend/src/main/kotlin/io/github/devcavin/gatelog/backend/zones/ZoneService.kt index 0e9da3b..043b7da 100644 --- a/backend/src/main/kotlin/io/github/devcavin/backend/service/ZoneService.kt +++ b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/zones/ZoneService.kt @@ -1,13 +1,11 @@ -package io.github.devcavin.backend.service +package io.github.devcavin.gatelog.backend.zones -import io.github.devcavin.backend.common.exception.ConflictException -import io.github.devcavin.backend.common.exception.ResourceNotFoundException -import io.github.devcavin.backend.domain.model.Zone -import io.github.devcavin.backend.domain.repository.SiteRepository -import io.github.devcavin.backend.domain.repository.ZoneRepository -import io.github.devcavin.backend.web.dto.zone.ZoneRequest -import io.github.devcavin.backend.web.dto.zone.ZoneResponse -import io.github.devcavin.backend.web.dto.zone.toResponse +import io.github.devcavin.gatelog.backend.common.exception.ConflictException +import io.github.devcavin.gatelog.backend.common.exception.ResourceNotFoundException +import io.github.devcavin.gatelog.backend.sites.SiteRepository +import io.github.devcavin.gatelog.backend.zones.dto.ZoneRequest +import io.github.devcavin.gatelog.backend.zones.dto.ZoneResponse +import io.github.devcavin.gatelog.backend.zones.dto.toResponse import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional import java.util.UUID diff --git a/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/zones/dto/ZoneRequests.kt b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/zones/dto/ZoneRequests.kt new file mode 100644 index 0000000..aa9827a --- /dev/null +++ b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/zones/dto/ZoneRequests.kt @@ -0,0 +1,10 @@ +package io.github.devcavin.gatelog.backend.zones.dto + +import jakarta.validation.constraints.NotBlank +import jakarta.validation.constraints.Size + +data class ZoneRequest( + @field:NotBlank + @field:Size(max = 100) + val name: String +) \ No newline at end of file diff --git a/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/zones/dto/ZoneResponses.kt b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/zones/dto/ZoneResponses.kt new file mode 100644 index 0000000..3f6c58f --- /dev/null +++ b/backend/src/main/kotlin/io/github/devcavin/gatelog/backend/zones/dto/ZoneResponses.kt @@ -0,0 +1,16 @@ +package io.github.devcavin.gatelog.backend.zones.dto + +import io.github.devcavin.gatelog.backend.zones.Zone +import java.util.* + +data class ZoneResponse( + val id: UUID, + val name: String, + val siteId: UUID +) + +fun Zone.toResponse() = ZoneResponse( + id = this.id!!, + name = this.name, + siteId = this.site.id!! +) \ No newline at end of file diff --git a/backend/src/test/kotlin/io/github/devcavin/backend/BackendApplicationTests.kt b/backend/src/test/kotlin/io/github/devcavin/gatelog/backend/BackendApplicationTests.kt similarity index 91% rename from backend/src/test/kotlin/io/github/devcavin/backend/BackendApplicationTests.kt rename to backend/src/test/kotlin/io/github/devcavin/gatelog/backend/BackendApplicationTests.kt index d36732d..86e5308 100644 --- a/backend/src/test/kotlin/io/github/devcavin/backend/BackendApplicationTests.kt +++ b/backend/src/test/kotlin/io/github/devcavin/gatelog/backend/BackendApplicationTests.kt @@ -1,4 +1,4 @@ -package io.github.devcavin.backend +package io.github.devcavin.gatelog.backend import org.junit.jupiter.api.Disabled import org.junit.jupiter.api.Test