diff --git a/server/.mvn/google_checks.xml b/server/.mvn/google_checks.xml new file mode 100644 index 0000000..0151c92 --- /dev/null +++ b/server/.mvn/google_checks.xml @@ -0,0 +1,371 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/server/pom.xml b/server/pom.xml index 2aaa4b9..b5165b8 100644 --- a/server/pom.xml +++ b/server/pom.xml @@ -183,12 +183,6 @@ 0.12.6 - - - org.ocpsoft.prettytime - prettytime - 5.0.9.Final - diff --git a/server/src/main/java/br/com/tasknoteapp/server/config/CloudNativeConfig.java b/server/src/main/java/br/com/tasknoteapp/server/config/CloudNativeConfig.java index d903086..7ddff8a 100644 --- a/server/src/main/java/br/com/tasknoteapp/server/config/CloudNativeConfig.java +++ b/server/src/main/java/br/com/tasknoteapp/server/config/CloudNativeConfig.java @@ -19,6 +19,7 @@ import org.springframework.aot.hint.annotation.RegisterReflectionForBinding; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.ImportRuntimeHints; +/** This class contains configurations for the GraalVM Cloud Native image. */ @Configuration @RegisterReflectionForBinding({ LoginRequest.class, @@ -48,9 +49,6 @@ import org.springframework.context.annotation.ImportRuntimeHints; io.jsonwebtoken.impl.io.StandardCompressionAlgorithms.class, io.jsonwebtoken.impl.DefaultClaimsBuilder.class, io.jsonwebtoken.impl.DefaultJwtParserBuilder.class, - org.ocpsoft.prettytime.PrettyTime.class, - org.ocpsoft.prettytime.i18n.Resources.class, - org.ocpsoft.prettytime.i18n.Resources_en.class, }) @ImportRuntimeHints(value = {HttpServletRequestRuntimeHint.class}) public class CloudNativeConfig {} diff --git a/server/src/main/java/br/com/tasknoteapp/server/config/SecurityConfig.java b/server/src/main/java/br/com/tasknoteapp/server/config/SecurityConfig.java index a5a62a9..e24ea80 100644 --- a/server/src/main/java/br/com/tasknoteapp/server/config/SecurityConfig.java +++ b/server/src/main/java/br/com/tasknoteapp/server/config/SecurityConfig.java @@ -65,6 +65,11 @@ public class SecurityConfig { return new BCryptPasswordEncoder(); } + /** + * Provides an AuthenticationProvider with user and password. + * + * @return AuthenticationProvider instance + */ @Bean public AuthenticationProvider authenticationProvider() { DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider(); @@ -73,6 +78,13 @@ public class SecurityConfig { return authProvider; } + /** + * Provides an AuthenticationManager to manage authentication. + * + * @param config AuthenticationConfiguration instance + * @return AuthenticationManager instance + * @throws Exception if issues occur. + */ @Bean public AuthenticationManager authenticationManager(AuthenticationConfiguration config) throws Exception { diff --git a/server/src/main/java/br/com/tasknoteapp/server/controller/AuthenticationController.java b/server/src/main/java/br/com/tasknoteapp/server/controller/AuthenticationController.java index 604501f..6b734fa 100644 --- a/server/src/main/java/br/com/tasknoteapp/server/controller/AuthenticationController.java +++ b/server/src/main/java/br/com/tasknoteapp/server/controller/AuthenticationController.java @@ -36,7 +36,7 @@ public class AuthenticationController { * * @param loginRequest User data with email and password. * @return JwtAuthenticationResponse containing user token - * @throws UserAlreadyExistsException + * @throws UserAlreadyExistsException when user already exists. */ @PutMapping(path = "/sign-up", consumes = "application/json", produces = "application/json") @Operation( diff --git a/server/src/main/java/br/com/tasknoteapp/server/controller/HomeController.java b/server/src/main/java/br/com/tasknoteapp/server/controller/HomeController.java index 5d83f23..a862c95 100644 --- a/server/src/main/java/br/com/tasknoteapp/server/controller/HomeController.java +++ b/server/src/main/java/br/com/tasknoteapp/server/controller/HomeController.java @@ -16,6 +16,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +/** This class provides resources to handle home requests by the client. */ @RestController @RequestMapping("/rest/home") @AllArgsConstructor @@ -51,7 +52,7 @@ public class HomeController { } /** - * Search for tasks and notes + * Search for tasks and notes. * * @returns List of SearchResponse with found records. */ diff --git a/server/src/main/java/br/com/tasknoteapp/server/controller/NoteController.java b/server/src/main/java/br/com/tasknoteapp/server/controller/NoteController.java index 16067e0..9161e3f 100644 --- a/server/src/main/java/br/com/tasknoteapp/server/controller/NoteController.java +++ b/server/src/main/java/br/com/tasknoteapp/server/controller/NoteController.java @@ -26,6 +26,7 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +/** This class provides resources to handle notes requests by the client. */ @RestController @RequestMapping("/rest/notes") @AllArgsConstructor diff --git a/server/src/main/java/br/com/tasknoteapp/server/controller/RestExceptionController.java b/server/src/main/java/br/com/tasknoteapp/server/controller/RestExceptionController.java index db0e12a..bf3437c 100644 --- a/server/src/main/java/br/com/tasknoteapp/server/controller/RestExceptionController.java +++ b/server/src/main/java/br/com/tasknoteapp/server/controller/RestExceptionController.java @@ -6,6 +6,7 @@ import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; +/** This class provides exceptions handling for requests. */ @RestControllerAdvice public class RestExceptionController { diff --git a/server/src/main/java/br/com/tasknoteapp/server/controller/TaskController.java b/server/src/main/java/br/com/tasknoteapp/server/controller/TaskController.java index e2755ac..edac400 100644 --- a/server/src/main/java/br/com/tasknoteapp/server/controller/TaskController.java +++ b/server/src/main/java/br/com/tasknoteapp/server/controller/TaskController.java @@ -145,8 +145,7 @@ public class TaskController { @Valid TaskRequest taskRequest) { TaskEntity createdTask = taskService.createTask(taskRequest); - return ResponseEntity.status(HttpStatus.CREATED) - .body(TaskResponse.fromEntity(createdTask, null)); + return ResponseEntity.status(HttpStatus.CREATED).body(TaskResponse.fromEntity(createdTask)); } /** diff --git a/server/src/main/java/br/com/tasknoteapp/server/controller/UserSessionController.java b/server/src/main/java/br/com/tasknoteapp/server/controller/UserSessionController.java index 03a8871..d528a69 100644 --- a/server/src/main/java/br/com/tasknoteapp/server/controller/UserSessionController.java +++ b/server/src/main/java/br/com/tasknoteapp/server/controller/UserSessionController.java @@ -10,7 +10,6 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; - import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; diff --git a/server/src/main/java/br/com/tasknoteapp/server/entity/NoteEntity.java b/server/src/main/java/br/com/tasknoteapp/server/entity/NoteEntity.java index e21f2c1..cdc78ef 100644 --- a/server/src/main/java/br/com/tasknoteapp/server/entity/NoteEntity.java +++ b/server/src/main/java/br/com/tasknoteapp/server/entity/NoteEntity.java @@ -9,18 +9,19 @@ import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; import jakarta.persistence.OneToMany; import jakarta.persistence.Table; +import java.util.List; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; -import java.util.List; +/** This class represents a note in the database. */ @Data @Entity @Table(name = "notes") @ToString @EqualsAndHashCode public class NoteEntity { - + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; diff --git a/server/src/main/java/br/com/tasknoteapp/server/entity/NoteUrlEntity.java b/server/src/main/java/br/com/tasknoteapp/server/entity/NoteUrlEntity.java index a96258e..3c14cd5 100644 --- a/server/src/main/java/br/com/tasknoteapp/server/entity/NoteUrlEntity.java +++ b/server/src/main/java/br/com/tasknoteapp/server/entity/NoteUrlEntity.java @@ -12,6 +12,7 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; +/** This class represents a note url in the database. */ @Data @Entity @ToString diff --git a/server/src/main/java/br/com/tasknoteapp/server/entity/TaskEntity.java b/server/src/main/java/br/com/tasknoteapp/server/entity/TaskEntity.java index dcc7cbe..3dc8fa3 100644 --- a/server/src/main/java/br/com/tasknoteapp/server/entity/TaskEntity.java +++ b/server/src/main/java/br/com/tasknoteapp/server/entity/TaskEntity.java @@ -10,13 +10,13 @@ import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; import jakarta.persistence.OneToMany; import jakarta.persistence.Table; - import java.time.LocalDateTime; import java.util.List; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; +/** This class represents a task in the database. */ @Data @Entity @Table(name = "tasks") diff --git a/server/src/main/java/br/com/tasknoteapp/server/entity/TaskUrlEntity.java b/server/src/main/java/br/com/tasknoteapp/server/entity/TaskUrlEntity.java index 580e583..c6c0e75 100644 --- a/server/src/main/java/br/com/tasknoteapp/server/entity/TaskUrlEntity.java +++ b/server/src/main/java/br/com/tasknoteapp/server/entity/TaskUrlEntity.java @@ -12,6 +12,7 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; +/** This class represents a task url in the database. */ @Data @Entity @ToString diff --git a/server/src/main/java/br/com/tasknoteapp/server/exception/BadPasswordException.java b/server/src/main/java/br/com/tasknoteapp/server/exception/BadPasswordException.java index 78e8222..c49139d 100644 --- a/server/src/main/java/br/com/tasknoteapp/server/exception/BadPasswordException.java +++ b/server/src/main/java/br/com/tasknoteapp/server/exception/BadPasswordException.java @@ -4,6 +4,7 @@ import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.server.ResponseStatusException; +/** This class represents a Bad Password exception. */ @ResponseStatus(HttpStatus.BAD_REQUEST) public class BadPasswordException extends ResponseStatusException { diff --git a/server/src/main/java/br/com/tasknoteapp/server/filter/JwtAuthenticationFilter.java b/server/src/main/java/br/com/tasknoteapp/server/filter/JwtAuthenticationFilter.java index 0ac3f03..2274e55 100644 --- a/server/src/main/java/br/com/tasknoteapp/server/filter/JwtAuthenticationFilter.java +++ b/server/src/main/java/br/com/tasknoteapp/server/filter/JwtAuthenticationFilter.java @@ -19,6 +19,7 @@ import org.springframework.security.web.authentication.WebAuthenticationDetailsS import org.springframework.stereotype.Component; import org.springframework.web.filter.OncePerRequestFilter; +/** This class represents an authentication filter do authenticate requests. */ @Slf4j @Component public class JwtAuthenticationFilter extends OncePerRequestFilter { diff --git a/server/src/main/java/br/com/tasknoteapp/server/repository/NoteRepository.java b/server/src/main/java/br/com/tasknoteapp/server/repository/NoteRepository.java index 0b7313c..360b215 100644 --- a/server/src/main/java/br/com/tasknoteapp/server/repository/NoteRepository.java +++ b/server/src/main/java/br/com/tasknoteapp/server/repository/NoteRepository.java @@ -5,6 +5,7 @@ import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; +/** This interface represents a note repository, for database access. */ public interface NoteRepository extends JpaRepository { List findAllByUser_id(Long userId); diff --git a/server/src/main/java/br/com/tasknoteapp/server/repository/NoteUrlRepository.java b/server/src/main/java/br/com/tasknoteapp/server/repository/NoteUrlRepository.java index cf630f4..846de16 100644 --- a/server/src/main/java/br/com/tasknoteapp/server/repository/NoteUrlRepository.java +++ b/server/src/main/java/br/com/tasknoteapp/server/repository/NoteUrlRepository.java @@ -4,6 +4,7 @@ import br.com.tasknoteapp.server.entity.NoteUrlEntity; import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; +/** This interface represents a note url repository, for database access. */ public interface NoteUrlRepository extends JpaRepository { void deleteAllByIdIn(List ids); diff --git a/server/src/main/java/br/com/tasknoteapp/server/repository/TaskRepository.java b/server/src/main/java/br/com/tasknoteapp/server/repository/TaskRepository.java index 758f10d..e2dfcd8 100644 --- a/server/src/main/java/br/com/tasknoteapp/server/repository/TaskRepository.java +++ b/server/src/main/java/br/com/tasknoteapp/server/repository/TaskRepository.java @@ -1,12 +1,11 @@ package br.com.tasknoteapp.server.repository; import br.com.tasknoteapp.server.entity.TaskEntity; - import java.util.List; - import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; +/** This interface represents a task repository, for database access. */ public interface TaskRepository extends JpaRepository { List findAllByUser_id(Long userId); diff --git a/server/src/main/java/br/com/tasknoteapp/server/repository/TaskUrlRepository.java b/server/src/main/java/br/com/tasknoteapp/server/repository/TaskUrlRepository.java index 655bb83..85e82c2 100644 --- a/server/src/main/java/br/com/tasknoteapp/server/repository/TaskUrlRepository.java +++ b/server/src/main/java/br/com/tasknoteapp/server/repository/TaskUrlRepository.java @@ -4,6 +4,7 @@ import br.com.tasknoteapp.server.entity.TaskUrlEntity; import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; +/** This interface represents a task url repository, for database access. */ public interface TaskUrlRepository extends JpaRepository { void deleteAllByIdIn(List ids); diff --git a/server/src/main/java/br/com/tasknoteapp/server/request/NoteUrlPatchRequest.java b/server/src/main/java/br/com/tasknoteapp/server/request/NoteUrlPatchRequest.java index f550450..2a3a416 100644 --- a/server/src/main/java/br/com/tasknoteapp/server/request/NoteUrlPatchRequest.java +++ b/server/src/main/java/br/com/tasknoteapp/server/request/NoteUrlPatchRequest.java @@ -1,3 +1,9 @@ package br.com.tasknoteapp.server.request; -public record NoteUrlPatchRequest(Long id, String url) {} +import io.swagger.v3.oas.annotations.media.Schema; + +/** This record represents a Note Url payload to be patched. */ +@Schema(description = "Represents a Note Url payload to be patched.") +public record NoteUrlPatchRequest( + @Schema(description = "The identification of the note url in the database") Long id, + @Schema(description = "The note URL address, if any.") String url) {} diff --git a/server/src/main/java/br/com/tasknoteapp/server/request/TaskUrlPatchRequest.java b/server/src/main/java/br/com/tasknoteapp/server/request/TaskUrlPatchRequest.java index de4891f..2539642 100644 --- a/server/src/main/java/br/com/tasknoteapp/server/request/TaskUrlPatchRequest.java +++ b/server/src/main/java/br/com/tasknoteapp/server/request/TaskUrlPatchRequest.java @@ -1,3 +1,9 @@ package br.com.tasknoteapp.server.request; -public record TaskUrlPatchRequest(Long id, String url) {} +import io.swagger.v3.oas.annotations.media.Schema; + +/** This record represents a Task Url payload to be patched. */ +@Schema(description = "Represents a Task Url payload to be patched.") +public record TaskUrlPatchRequest( + @Schema(description = "The identification of the task url in the database") Long id, + @Schema(description = "The task URL address, if any.") String url) {} diff --git a/server/src/main/java/br/com/tasknoteapp/server/response/JwtAuthenticationResponse.java b/server/src/main/java/br/com/tasknoteapp/server/response/JwtAuthenticationResponse.java index c487895..530ff01 100644 --- a/server/src/main/java/br/com/tasknoteapp/server/response/JwtAuthenticationResponse.java +++ b/server/src/main/java/br/com/tasknoteapp/server/response/JwtAuthenticationResponse.java @@ -1,3 +1,7 @@ package br.com.tasknoteapp.server.response; -public record JwtAuthenticationResponse(String token) {} +import io.swagger.v3.oas.annotations.media.Schema; + +/** This record represents a JWT Token response to be returned to the client. */ +@Schema(description = "Represents a JWT Token response to be returned to the client.") +public record JwtAuthenticationResponse(@Schema(description = "The JWT token") String token) {} diff --git a/server/src/main/java/br/com/tasknoteapp/server/response/SearchResponse.java b/server/src/main/java/br/com/tasknoteapp/server/response/SearchResponse.java index 3eb92a7..d1af43c 100644 --- a/server/src/main/java/br/com/tasknoteapp/server/response/SearchResponse.java +++ b/server/src/main/java/br/com/tasknoteapp/server/response/SearchResponse.java @@ -1,5 +1,10 @@ package br.com.tasknoteapp.server.response; +import io.swagger.v3.oas.annotations.media.Schema; import java.util.List; -public record SearchResponse(List tasks, List notes) {} +/** This record represents a Search response with found results. */ +@Schema(description = "Represents a Search response with found results") +public record SearchResponse( + @Schema(description = "List of found tasks.") List tasks, + @Schema(description = "List of found notes.") List notes) {} diff --git a/server/src/main/java/br/com/tasknoteapp/server/response/SummaryResponse.java b/server/src/main/java/br/com/tasknoteapp/server/response/SummaryResponse.java index c94b453..1ae451b 100644 --- a/server/src/main/java/br/com/tasknoteapp/server/response/SummaryResponse.java +++ b/server/src/main/java/br/com/tasknoteapp/server/response/SummaryResponse.java @@ -1,4 +1,10 @@ package br.com.tasknoteapp.server.response; +import io.swagger.v3.oas.annotations.media.Schema; + +/** This record represents a summary response payload object. */ +@Schema(description = "Represents a summary response payload object.") public record SummaryResponse( - Integer pendingTaskCount, Integer doneTaskCount, Integer notesCount) {} + @Schema(description = "The amount of pending tasks") Integer pendingTaskCount, + @Schema(description = "The amount of done tasks") Integer doneTaskCount, + @Schema(description = "The amount of notes") Integer notesCount) {} diff --git a/server/src/main/java/br/com/tasknoteapp/server/response/TaskResponse.java b/server/src/main/java/br/com/tasknoteapp/server/response/TaskResponse.java index 881dc7b..5c881ef 100644 --- a/server/src/main/java/br/com/tasknoteapp/server/response/TaskResponse.java +++ b/server/src/main/java/br/com/tasknoteapp/server/response/TaskResponse.java @@ -2,13 +2,12 @@ package br.com.tasknoteapp.server.response; import br.com.tasknoteapp.server.entity.TaskEntity; import br.com.tasknoteapp.server.entity.TaskUrlEntity; +import br.com.tasknoteapp.server.util.TimeAgoUtil; import io.swagger.v3.oas.annotations.media.Schema; import java.util.ArrayList; import java.util.List; import java.util.Objects; -import org.ocpsoft.prettytime.PrettyTime; - /** This record represents a task and its urls object to be returned. */ @Schema(description = "This record represents a task and its urls object to be returned.") public record TaskResponse( @@ -25,7 +24,7 @@ public record TaskResponse( * @param entity The TaskEntity source data. * @return TaskResponse instance with all task data and urls, if any. */ - public static TaskResponse fromEntity(TaskEntity entity, PrettyTime prettyTime) { + public static TaskResponse fromEntity(TaskEntity entity) { List urls = entity.getUrls(); List urlsResponse = new ArrayList<>(); if (Objects.isNull(urls)) { @@ -37,11 +36,7 @@ public record TaskResponse( } } - if (Objects.isNull(prettyTime)) { - prettyTime = new PrettyTime(); - } - - String timeAgoFmt = prettyTime.format(entity.getLastUpdate()); + String timeAgoFmt = TimeAgoUtil.format(entity.getLastUpdate()); return new TaskResponse( entity.getId(), diff --git a/server/src/main/java/br/com/tasknoteapp/server/response/ValidationExceptionResponse.java b/server/src/main/java/br/com/tasknoteapp/server/response/ValidationExceptionResponse.java index 2510962..a79d710 100644 --- a/server/src/main/java/br/com/tasknoteapp/server/response/ValidationExceptionResponse.java +++ b/server/src/main/java/br/com/tasknoteapp/server/response/ValidationExceptionResponse.java @@ -1,16 +1,15 @@ package br.com.tasknoteapp.server.response; +import io.swagger.v3.oas.annotations.media.Schema; import java.util.List; - +import lombok.Getter; import org.springframework.validation.FieldError; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Getter; - +/** This class represents a validation error exception to be returned in the JSON format. */ @Getter @Schema(description = "An object containing the error message and the invalid fields") public class ValidationExceptionResponse { - + private static final String MESSAGE_TEMPLATE = "%d field(s) with validation problems!"; @Schema(description = "The error message") diff --git a/server/src/main/java/br/com/tasknoteapp/server/service/NoteService.java b/server/src/main/java/br/com/tasknoteapp/server/service/NoteService.java index f507897..459020b 100644 --- a/server/src/main/java/br/com/tasknoteapp/server/service/NoteService.java +++ b/server/src/main/java/br/com/tasknoteapp/server/service/NoteService.java @@ -6,6 +6,7 @@ import br.com.tasknoteapp.server.request.NoteRequest; import br.com.tasknoteapp.server.response.NoteResponse; import java.util.List; +/** This interface contains methods to handle notes. */ public interface NoteService { public List getAllNotes(); diff --git a/server/src/main/java/br/com/tasknoteapp/server/service/impl/AuthServiceImpl.java b/server/src/main/java/br/com/tasknoteapp/server/service/impl/AuthServiceImpl.java index 8eb5474..139c29d 100644 --- a/server/src/main/java/br/com/tasknoteapp/server/service/impl/AuthServiceImpl.java +++ b/server/src/main/java/br/com/tasknoteapp/server/service/impl/AuthServiceImpl.java @@ -126,7 +126,7 @@ class AuthServiceImpl implements AuthService { * Get all registered users. * * @return List of UserEntity. - * @throws UserForbiddenException + * @throws UserForbiddenException when the user has no permission. */ @Override public List getAllUsers() { @@ -136,7 +136,7 @@ class AuthServiceImpl implements AuthService { log.info("Getting all users to user {}", currentUser.getId()); - if (!currentUser.getAdmin()) { + if (!currentUser.getAdmin() || !currentUser.getEmail().equals("ricardompcampos@gmail.com")) { log.info("User not allowed!"); throw new UserForbiddenException(); } diff --git a/server/src/main/java/br/com/tasknoteapp/server/service/impl/JwtServiceImpl.java b/server/src/main/java/br/com/tasknoteapp/server/service/impl/JwtServiceImpl.java index ee077d5..1461914 100644 --- a/server/src/main/java/br/com/tasknoteapp/server/service/impl/JwtServiceImpl.java +++ b/server/src/main/java/br/com/tasknoteapp/server/service/impl/JwtServiceImpl.java @@ -19,10 +19,10 @@ import org.springframework.stereotype.Service; @Service class JwtServiceImpl implements JwtService { - private final long SECOND = 1000; - private final long MINUTE = SECOND * 60; - private final long EXPIRATION_TIME = MINUTE * 30; - private final SecretKey KEY = Jwts.SIG.HS256.key().build(); + private static final long SECOND = 1000; + private static final long MINUTE = SECOND * 60; + private static final long EXPIRATION_TIME = MINUTE * 30; + private static final SecretKey KEY = Jwts.SIG.HS256.key().build(); @Override public String getEmailFromToken(String token) { diff --git a/server/src/main/java/br/com/tasknoteapp/server/service/impl/NoteServiceImpl.java b/server/src/main/java/br/com/tasknoteapp/server/service/impl/NoteServiceImpl.java index 280ff3a..5b29570 100644 --- a/server/src/main/java/br/com/tasknoteapp/server/service/impl/NoteServiceImpl.java +++ b/server/src/main/java/br/com/tasknoteapp/server/service/impl/NoteServiceImpl.java @@ -22,6 +22,7 @@ import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +/** This class implements the NoteService interface methods. */ @Slf4j @Service @AllArgsConstructor diff --git a/server/src/main/java/br/com/tasknoteapp/server/service/impl/TaskServiceImpl.java b/server/src/main/java/br/com/tasknoteapp/server/service/impl/TaskServiceImpl.java index f239a8d..29e4378 100644 --- a/server/src/main/java/br/com/tasknoteapp/server/service/impl/TaskServiceImpl.java +++ b/server/src/main/java/br/com/tasknoteapp/server/service/impl/TaskServiceImpl.java @@ -17,13 +17,10 @@ import jakarta.transaction.Transactional; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; -import java.util.Locale; -import java.util.MissingResourceException; import java.util.Objects; import java.util.Optional; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.ocpsoft.prettytime.PrettyTime; import org.springframework.stereotype.Service; /** This class contains the implementation for the Task Service class. */ @@ -49,30 +46,7 @@ class TaskServiceImpl implements TaskService { List tasks = taskRepository.findAllByUser_id(user.getId()); log.info("{} tasks found!", tasks.size()); - try { - log.info("Trying PrettyTime with 'en-US'"); - new PrettyTime(Locale.forLanguageTag("en-US")); - } catch (MissingResourceException e) { - log.error("Not found PrettyTime with 'en-US'"); - } - - try { - log.info("Trying PrettyTime with 'en_US'"); - new PrettyTime(Locale.forLanguageTag("en_US")); - } catch (MissingResourceException e) { - log.error("Not found PrettyTime with 'en_US'"); - } - - try { - log.info("Trying PrettyTime with 'en'"); - new PrettyTime(Locale.forLanguageTag("en")); - } catch (MissingResourceException e) { - log.error("Not found PrettyTime with 'en'"); - } - - Locale localeForLangEnUs = Locale.forLanguageTag("en"); - PrettyTime time = new PrettyTime(localeForLangEnUs); - return tasks.stream().map((TaskEntity tr) -> TaskResponse.fromEntity(tr, time)).toList(); + return tasks.stream().map((TaskEntity tr) -> TaskResponse.fromEntity(tr)).toList(); } @Override @@ -140,7 +114,7 @@ class TaskServiceImpl implements TaskService { log.info("Task patched! Id {}", patchedTask.getId()); - return TaskResponse.fromEntity(patchedTask, null); + return TaskResponse.fromEntity(patchedTask); } @Override @@ -178,8 +152,7 @@ class TaskServiceImpl implements TaskService { taskRepository.findAllBySearchTerm(searchTerm.toUpperCase(), user.getId()); log.info("{} tasks found!", tasks.size()); - PrettyTime time = new PrettyTime(); - return tasks.stream().map((TaskEntity tr) -> TaskResponse.fromEntity(tr, time)).toList(); + return tasks.stream().map((TaskEntity tr) -> TaskResponse.fromEntity(tr)).toList(); } private UserEntity getCurrentUser() { diff --git a/server/src/main/java/br/com/tasknoteapp/server/util/TimeAgoUtil.java b/server/src/main/java/br/com/tasknoteapp/server/util/TimeAgoUtil.java new file mode 100644 index 0000000..99cd16e --- /dev/null +++ b/server/src/main/java/br/com/tasknoteapp/server/util/TimeAgoUtil.java @@ -0,0 +1,46 @@ +package br.com.tasknoteapp.server.util; + +import java.time.Duration; +import java.time.LocalDateTime; +import java.time.Period; + +/** This class contains util methods to format local date time. */ +public class TimeAgoUtil { + + /** + * Format a time in the time ago format. + * + * @param pastTime The past time to be formatted. + * @return String with formatted time. + */ + public static String format(LocalDateTime pastTime) { + LocalDateTime now = LocalDateTime.now(); + Period period = Period.between(pastTime.toLocalDate(), now.toLocalDate()); + Duration duration = Duration.between(pastTime, now); + if (period.getYears() > 1) { + return String.format("%d years ago", period.getYears()); + } else if (period.getYears() > 0) { + return String.format("%d year ago", period.getYears()); + } else if (period.getMonths() > 1) { + return String.format("%d months ago", period.getMonths()); + } else if (period.getMonths() > 0) { + return String.format("%d month ago", period.getMonths()); + } else if (period.getDays() > 1) { + return String.format("%d days ago", period.getDays()); + } else if (period.getDays() > 0) { + return String.format("%d day ago", period.getDays()); + } else if (duration.toHours() > 1L) { + return String.format("%d hours ago", duration.toHours()); + } else if (duration.toHours() > 0L) { + return String.format("%d hour ago", duration.toHours()); + } else if (duration.toMinutes() > 1L) { + return String.format("%d minutes ago", duration.toMinutes()); + } else if (duration.toMinutes() > 0L) { + return String.format("%d minute ago", duration.toMinutes()); + } else if (duration.toSeconds() > 1L) { + return String.format("%d seconds ago", duration.toSeconds()); + } else { + return "moments ago"; + } + } +} diff --git a/server/src/main/resources/META-INF/native-image/config.ini b/server/src/main/resources/META-INF/native-image/config.ini deleted file mode 100644 index d8a380c..0000000 --- a/server/src/main/resources/META-INF/native-image/config.ini +++ /dev/null @@ -1 +0,0 @@ -resources = org.ocpsoft.prettytime.i18n.* diff --git a/server/src/test/java/br/com/tasknoteapp/server/JavaApiApplicationTests.java b/server/src/test/java/br/com/tasknoteapp/server/JavaApiApplicationTests.java index 58b3716..a608f54 100644 --- a/server/src/test/java/br/com/tasknoteapp/server/JavaApiApplicationTests.java +++ b/server/src/test/java/br/com/tasknoteapp/server/JavaApiApplicationTests.java @@ -6,8 +6,6 @@ import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest class JavaApiApplicationTests { - @Test - void contextLoads() { - } - + @Test + void contextLoads() {} }