diff --git a/server/pom.xml b/server/pom.xml index 6d15de3..6515a86 100644 --- a/server/pom.xml +++ b/server/pom.xml @@ -5,7 +5,7 @@ org.springframework.boot spring-boot-starter-parent - 3.5.7 + 3.5.9 @@ -30,7 +30,7 @@ - 17 + 21 UTF-8 UTF-8 true @@ -132,11 +132,6 @@ org.springframework.boot spring-boot-starter-actuator - - org.projectlombok - lombok - true - @@ -219,18 +214,6 @@ - - org.springframework.boot - spring-boot-maven-plugin - - - - org.projectlombok - lombok - - - - org.apache.maven.plugins maven-failsafe-plugin diff --git a/server/src/main/java/br/com/tasknoteapp/server/config/CorsConfig.java b/server/src/main/java/br/com/tasknoteapp/server/config/CorsConfig.java index f5e3f79..4c8c257 100644 --- a/server/src/main/java/br/com/tasknoteapp/server/config/CorsConfig.java +++ b/server/src/main/java/br/com/tasknoteapp/server/config/CorsConfig.java @@ -1,7 +1,7 @@ package br.com.tasknoteapp.server.config; import java.util.Arrays; -import lombok.extern.slf4j.Slf4j; +import java.util.logging.Logger; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; import org.springframework.lang.NonNull; @@ -9,10 +9,11 @@ import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; /** This class contains configurations for CORS management. */ -@Slf4j @Configuration public class CorsConfig implements WebMvcConfigurer { + private static final Logger logger = Logger.getLogger(CorsConfig.class.getName()); + @Value("${cors.allowed-origins}") private String[] allowedOrigins; @@ -23,8 +24,8 @@ public class CorsConfig implements WebMvcConfigurer { */ public void addCorsMappings(@NonNull CorsRegistry registry) { if (allowedOrigins != null && allowedOrigins.length > 0) { - log.info("CORS policy allowed origins: {}", Arrays.asList(allowedOrigins)); - log.debug("CORS policy allowed origins in debug mode: {}", Arrays.asList(allowedOrigins)); + logger.info("CORS policy allowed origins: " + Arrays.asList(allowedOrigins)); + logger.fine("CORS policy allowed origins in debug mode: " + Arrays.asList(allowedOrigins)); registry .addMapping("/**") 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 b169866..d67d9b3 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 @@ -3,7 +3,6 @@ package br.com.tasknoteapp.server.config; import br.com.tasknoteapp.server.filter.JwtAuthenticationFilter; import br.com.tasknoteapp.server.service.UserService; import jakarta.servlet.http.HttpServletResponse; -import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpMethod; @@ -23,13 +22,17 @@ import org.springframework.security.web.authentication.UsernamePasswordAuthentic /** This class contains security configurations. */ @Configuration @EnableWebSecurity -@RequiredArgsConstructor public class SecurityConfig { private final UserService userService; private final JwtAuthenticationFilter jwtAuthenticationFilter; + public SecurityConfig(UserService userService, JwtAuthenticationFilter jwtAuthenticationFilter) { + this.userService = userService; + this.jwtAuthenticationFilter = jwtAuthenticationFilter; + } + /** * Filters a request to add security checks and configurations. * 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 7ecffe4..03a9c7d 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 @@ -16,7 +16,6 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import java.util.Objects; -import lombok.AllArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; @@ -30,11 +29,14 @@ import org.springframework.web.bind.annotation.RestController; @Tag( name = "Authentication", description = "Authentication resources to handle user authentication.") -@AllArgsConstructor public class AuthenticationController { private final AuthService authService; + public AuthenticationController(AuthService authService) { + this.authService = authService; + } + /** * Signup a new user. * 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 b126cdf..3eb25ec 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 @@ -7,7 +7,6 @@ import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.tags.Tag; import java.util.List; -import lombok.AllArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -15,12 +14,15 @@ import org.springframework.web.bind.annotation.RestController; /** This class provides resources to handle home requests by the client. */ @RestController @RequestMapping("/rest/home") -@AllArgsConstructor @Tag(name = "Home", description = "Home resources to handle home page.") public class HomeController { private final HomeService homeService; + public HomeController(HomeService homeService) { + this.homeService = homeService; + } + /** * Get the top 5 tags. * 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 1c52fcb..d19fc4c 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 @@ -15,7 +15,6 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import java.util.List; -import lombok.AllArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.DeleteMapping; @@ -30,12 +29,15 @@ import org.springframework.web.bind.annotation.RestController; /** This class provides resources to handle notes requests by the client. */ @RestController @RequestMapping("/rest/notes") -@AllArgsConstructor @Tag(name = "Notes", description = "Notes resources to handle stored notes.") public class NoteController { private final NoteService noteService; + public NoteController(NoteService noteService) { + this.noteService = noteService; + } + /** * Get all notes. * 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 b7ead8f..5e49e15 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 @@ -14,7 +14,6 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import java.util.List; -import lombok.AllArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.DeleteMapping; @@ -30,11 +29,14 @@ import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/rest/tasks") @Tag(name = "Tasks", description = "Tasks resources to handle user tasks and urls.") -@AllArgsConstructor public class TaskController { private final TaskService taskService; + public TaskController(TaskService taskService) { + this.taskService = taskService; + } + /** * Get all tasks. * diff --git a/server/src/main/java/br/com/tasknoteapp/server/controller/UserController.java b/server/src/main/java/br/com/tasknoteapp/server/controller/UserController.java index 671b515..8f54c3a 100644 --- a/server/src/main/java/br/com/tasknoteapp/server/controller/UserController.java +++ b/server/src/main/java/br/com/tasknoteapp/server/controller/UserController.java @@ -10,7 +10,6 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import java.util.List; -import lombok.AllArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PatchMapping; @@ -21,12 +20,15 @@ import org.springframework.web.bind.annotation.RestController; /** This class contains resources for handling users admin requests. */ @RestController @RequestMapping("/rest/users") -@AllArgsConstructor @Tag(name = "Users", description = "Users resources to handle stored users.") public class UserController { private final AuthService authService; + public UserController(AuthService authService) { + this.authService = authService; + } + /** * Get all users. * 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 7d1ab3a..71f846b 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 @@ -9,8 +9,6 @@ import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.Schema; 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.http.ResponseEntity; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; @@ -18,15 +16,17 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** This class contains resources for handling user sessions. */ -@Slf4j @RestController @RequestMapping("/rest/user-sessions") -@AllArgsConstructor @Tag(name = "User Sessions", description = "Resources to handle user sessions.") public class UserSessionController { private final UserSessionService userSessionService; + public UserSessionController(UserSessionService userSessionService) { + this.userSessionService = userSessionService; + } + /** * Refresh an existing user session, generating a new token. * 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 772ed07..b5ad6e8 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 @@ -11,16 +11,10 @@ import jakarta.persistence.ManyToOne; import jakarta.persistence.OneToOne; import jakarta.persistence.Table; import java.time.LocalDateTime; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; /** This class represents a note in the database. */ -@Data @Entity @Table(name = "notes") -@ToString -@EqualsAndHashCode public class NoteEntity { @Id @@ -44,4 +38,96 @@ public class NoteEntity { @Column(name = "last_update") private LocalDateTime lastUpdate; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public UserEntity getUser() { + return user; + } + + public void setUser(UserEntity user) { + this.user = user; + } + + public NoteUrlEntity getNoteUrl() { + return noteUrl; + } + + public void setNoteUrl(NoteUrlEntity noteUrl) { + this.noteUrl = noteUrl; + } + + public String getTag() { + return tag; + } + + public void setTag(String tag) { + this.tag = tag; + } + + public LocalDateTime getLastUpdate() { + return lastUpdate; + } + + public void setLastUpdate(LocalDateTime lastUpdate) { + this.lastUpdate = lastUpdate; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + NoteEntity that = (NoteEntity) o; + return id != null && id.equals(that.id); + } + + @Override + public int hashCode() { + return getClass().hashCode(); + } + + @Override + public String toString() { + return "NoteEntity{" + + "id=" + + id + + ", title='" + + title + + '\'' + + ", description='" + + description + + '\'' + + ", tag='" + + tag + + '\'' + + ", lastUpdate=" + + lastUpdate + + '}'; + } } 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 e225613..c32edef 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 @@ -8,16 +8,10 @@ import jakarta.persistence.Id; import jakarta.persistence.JoinColumn; import jakarta.persistence.OneToOne; import jakarta.persistence.Table; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; /** This class represents a note url in the database. */ -@Data @Entity -@ToString @Table(name = "note_urls") -@EqualsAndHashCode public class NoteUrlEntity { @Id @@ -29,4 +23,50 @@ public class NoteUrlEntity { @JoinColumn(name = "note_id", referencedColumnName = "id", nullable = false, updatable = false) @OneToOne(fetch = FetchType.LAZY) private NoteEntity note; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public NoteEntity getNote() { + return note; + } + + public void setNote(NoteEntity note) { + this.note = note; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + NoteUrlEntity that = (NoteUrlEntity) o; + return id != null && id.equals(that.id); + } + + @Override + public int hashCode() { + return getClass().hashCode(); + } + + @Override + public String toString() { + return "NoteUrlEntity{" + "id=" + id + ", url='" + url + '\'' + '}'; + } } 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 9462fab..4c972ae 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 @@ -11,16 +11,10 @@ import jakarta.persistence.ManyToOne; import jakarta.persistence.Table; import java.time.LocalDate; import java.time.LocalDateTime; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; /** This class represents a task in the database. */ -@Data @Entity @Table(name = "tasks") -@ToString -@EqualsAndHashCode public class TaskEntity { @Id @@ -47,4 +41,107 @@ public class TaskEntity { @Column(name = "tag", nullable = true, length = 30) private String tag; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public Boolean getDone() { + return done; + } + + public void setDone(Boolean done) { + this.done = done; + } + + public UserEntity getUser() { + return user; + } + + public void setUser(UserEntity user) { + this.user = user; + } + + public LocalDateTime getLastUpdate() { + return lastUpdate; + } + + public void setLastUpdate(LocalDateTime lastUpdate) { + this.lastUpdate = lastUpdate; + } + + public LocalDate getDueDate() { + return dueDate; + } + + public void setDueDate(LocalDate dueDate) { + this.dueDate = dueDate; + } + + public Boolean getHighPriority() { + return highPriority; + } + + public void setHighPriority(Boolean highPriority) { + this.highPriority = highPriority; + } + + public String getTag() { + return tag; + } + + public void setTag(String tag) { + this.tag = tag; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + TaskEntity that = (TaskEntity) o; + return id != null && id.equals(that.id); + } + + @Override + public int hashCode() { + return getClass().hashCode(); + } + + @Override + public String toString() { + return "TaskEntity{" + + "id=" + + id + + ", description='" + + description + + '\'' + + ", done=" + + done + + ", lastUpdate=" + + lastUpdate + + ", dueDate=" + + dueDate + + ", highPriority=" + + highPriority + + ", tag='" + + tag + + '\'' + + '}'; + } } 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 59fecee..93dba23 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 @@ -3,17 +3,41 @@ package br.com.tasknoteapp.server.entity; import jakarta.persistence.EmbeddedId; import jakarta.persistence.Entity; import jakarta.persistence.Table; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; /** This class represents a task url in the database. */ -@Data @Entity -@ToString @Table(name = "task_url") -@EqualsAndHashCode public class TaskUrlEntity { @EmbeddedId private TaskUrlEntityPk id; + + public TaskUrlEntityPk getId() { + return id; + } + + public void setId(TaskUrlEntityPk id) { + this.id = id; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + TaskUrlEntity that = (TaskUrlEntity) o; + return id != null && id.equals(that.id); + } + + @Override + public int hashCode() { + return getClass().hashCode(); + } + + @Override + public String toString() { + return "TaskUrlEntity{" + "id=" + id + '}'; + } } diff --git a/server/src/main/java/br/com/tasknoteapp/server/entity/TaskUrlEntityPk.java b/server/src/main/java/br/com/tasknoteapp/server/entity/TaskUrlEntityPk.java index 07d2dab..01ca3d8 100644 --- a/server/src/main/java/br/com/tasknoteapp/server/entity/TaskUrlEntityPk.java +++ b/server/src/main/java/br/com/tasknoteapp/server/entity/TaskUrlEntityPk.java @@ -1,20 +1,60 @@ package br.com.tasknoteapp.server.entity; import jakarta.persistence.Embeddable; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; /** This class represents a UrlTaskEntity primary key. */ -@AllArgsConstructor -@NoArgsConstructor -@Getter -@Setter @Embeddable public class TaskUrlEntityPk { private Long taskId; private String url; + + public TaskUrlEntityPk() {} + + public TaskUrlEntityPk(Long taskId, String url) { + this.taskId = taskId; + this.url = url; + } + + public Long getTaskId() { + return taskId; + } + + public void setTaskId(Long taskId) { + this.taskId = taskId; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + // Equals using both fields + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + TaskUrlEntityPk that = (TaskUrlEntityPk) o; + return url.equals(that.url) && taskId.equals(that.taskId); + } + + @Override + public int hashCode() { + int result = taskId != null ? taskId.hashCode() : 0; + result = 31 * result + (url != null ? url.hashCode() : 0); + return result; + } + + @Override + public String toString() { + return "TaskUrlEntityPk{" + "taskId=" + taskId + ", url='" + url + '\'' + '}'; + } } diff --git a/server/src/main/java/br/com/tasknoteapp/server/entity/UserEntity.java b/server/src/main/java/br/com/tasknoteapp/server/entity/UserEntity.java index 91938aa..14da2bd 100644 --- a/server/src/main/java/br/com/tasknoteapp/server/entity/UserEntity.java +++ b/server/src/main/java/br/com/tasknoteapp/server/entity/UserEntity.java @@ -11,12 +11,10 @@ import java.time.LocalDateTime; import java.util.Collection; import java.util.List; import java.util.UUID; -import lombok.Data; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.userdetails.UserDetails; /** This class represents a User in the database. */ -@Data @Entity @Table(name = "users") public class UserEntity implements UserDetails { @@ -91,4 +89,110 @@ public class UserEntity implements UserDetails { public boolean isEnabled() { return true; } + + // TODO: generate all Getters and Setters + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + @Override + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public Boolean getAdmin() { + return admin; + } + + public void setAdmin(Boolean admin) { + this.admin = admin; + } + + public LocalDateTime getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(LocalDateTime createdAt) { + this.createdAt = createdAt; + } + + public LocalDateTime getInactivatedAt() { + return inactivatedAt; + } + + public void setInactivatedAt(LocalDateTime inactivatedAt) { + this.inactivatedAt = inactivatedAt; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public List getTasks() { + return tasks; + } + + public void setTasks(List tasks) { + this.tasks = tasks; + } + + public LocalDateTime getEmailConfirmedAt() { + return emailConfirmedAt; + } + + public void setEmailConfirmedAt(LocalDateTime emailConfirmedAt) { + this.emailConfirmedAt = emailConfirmedAt; + } + + public UUID getEmailUuid() { + return emailUuid; + } + + public void setEmailUuid(UUID emailUuid) { + this.emailUuid = emailUuid; + } + + public LocalDateTime getResetPasswordExpiration() { + return resetPasswordExpiration; + } + + public void setResetPasswordExpiration(LocalDateTime resetPasswordExpiration) { + this.resetPasswordExpiration = resetPasswordExpiration; + } + + public String getResetToken() { + return resetToken; + } + + public void setResetToken(String resetToken) { + this.resetToken = resetToken; + } + + public String getLang() { + return lang; + } + + public void setLang(String lang) { + this.lang = lang; + } } diff --git a/server/src/main/java/br/com/tasknoteapp/server/entity/UserPwdLimitEntity.java b/server/src/main/java/br/com/tasknoteapp/server/entity/UserPwdLimitEntity.java index f2ce080..7244b49 100644 --- a/server/src/main/java/br/com/tasknoteapp/server/entity/UserPwdLimitEntity.java +++ b/server/src/main/java/br/com/tasknoteapp/server/entity/UserPwdLimitEntity.java @@ -10,16 +10,10 @@ import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; import jakarta.persistence.Table; import java.time.LocalDateTime; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; /** This class represents a User Password Limit in the database. */ -@Data @Entity @Table(name = "user_pwd_limits") -@ToString -@EqualsAndHashCode public class UserPwdLimitEntity { @Id @@ -32,4 +26,57 @@ public class UserPwdLimitEntity { @JoinColumn(name = "user_id", referencedColumnName = "id", nullable = false, updatable = false) @ManyToOne(fetch = FetchType.LAZY) private UserEntity user; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public LocalDateTime getWhenHappened() { + return whenHappened; + } + + public void setWhenHappened(LocalDateTime whenHappened) { + this.whenHappened = whenHappened; + } + + public UserEntity getUser() { + return user; + } + + public void setUser(UserEntity user) { + this.user = user; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + UserPwdLimitEntity that = (UserPwdLimitEntity) o; + return id != null && id.equals(that.id); + } + + @Override + public int hashCode() { + return getClass().hashCode(); + } + + @Override + public String toString() { + return "UserPwdLimitEntity{" + + "id=" + + id + + ", whenHappened=" + + whenHappened + + ", user=" + + (user != null ? user.getId() : null) + + '}'; + } } 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 d0a1b20..5fa6ae6 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 @@ -8,7 +8,6 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.Objects; -import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.lang.NonNull; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; @@ -20,7 +19,6 @@ 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/request/LoginRequest.java b/server/src/main/java/br/com/tasknoteapp/server/request/LoginRequest.java index 72af29d..bd33865 100644 --- a/server/src/main/java/br/com/tasknoteapp/server/request/LoginRequest.java +++ b/server/src/main/java/br/com/tasknoteapp/server/request/LoginRequest.java @@ -3,47 +3,109 @@ package br.com.tasknoteapp.server.request; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.Email; import jakarta.validation.constraints.NotNull; -import lombok.AllArgsConstructor; -import lombok.EqualsAndHashCode; -import lombok.Setter; -import lombok.ToString; /** This class represents a login request with user email and password. */ @Schema(description = "Login request with user email and password.") -@Setter @NotNull -@EqualsAndHashCode -@ToString -@AllArgsConstructor public class LoginRequest { @Schema(description = "User email.") @Email @NotNull - String email; + private String email; @Schema(description = "User password.") @NotNull - String password; + private String password; @Schema(description = "User password again.") - String passwordAgain; + private String passwordAgain; @Schema(description = "User language. (Optional, default English)") - String lang; + private String lang; + + public LoginRequest() {} + + /** + * Constructs a LoginRequest with the specified email and password. + * + * @param email the user email + * @param password the user password + * @param passwordAgain the user password again + * @param lang the user language + */ + public LoginRequest(String email, String password, String passwordAgain, String lang) { + this.email = email; + this.password = password; + this.passwordAgain = passwordAgain; + this.lang = lang; + } public String email() { return email.trim().toLowerCase(); } + public void setEmail(String email) { + this.email = email; + } + public String password() { return password; } + public void setPassword(String password) { + this.password = password; + } + public String passwordAgain() { return passwordAgain; } + public void setPasswordAgain(String passwordAgain) { + this.passwordAgain = passwordAgain; + } + public String lang() { return lang; } + + public void setLang(String lang) { + this.lang = lang; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + LoginRequest that = (LoginRequest) o; + return email().equals(that.email()) && password().equals(that.password()); + } + + @Override + public int hashCode() { + int result = email().hashCode(); + result = 31 * result + password().hashCode(); + return result; + } + + @Override + public String toString() { + return "LoginRequest{" + + "email='" + + email + + '\'' + + ", password='" + + password + + '\'' + + ", passwordAgain='" + + passwordAgain + + '\'' + + ", lang='" + + lang + + '\'' + + '}'; + } } diff --git a/server/src/main/java/br/com/tasknoteapp/server/request/ResendConfirmationRequest.java b/server/src/main/java/br/com/tasknoteapp/server/request/ResendConfirmationRequest.java index c339181..7cac0e1 100644 --- a/server/src/main/java/br/com/tasknoteapp/server/request/ResendConfirmationRequest.java +++ b/server/src/main/java/br/com/tasknoteapp/server/request/ResendConfirmationRequest.java @@ -3,25 +3,49 @@ package br.com.tasknoteapp.server.request; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.Email; import jakarta.validation.constraints.NotNull; -import lombok.AllArgsConstructor; -import lombok.EqualsAndHashCode; -import lombok.Setter; -import lombok.ToString; /** This class represents a login request with user email and password. */ @Schema(description = "Resend confirmation request with user email and password.") -@Setter @NotNull -@EqualsAndHashCode -@ToString -@AllArgsConstructor public class ResendConfirmationRequest { @Schema(description = "User email.") @Email @NotNull - String email; + private String email; + + public ResendConfirmationRequest() {} + + public ResendConfirmationRequest(String email) { + this.email = email; + } public String email() { return email.trim().toLowerCase(); } + + public void setEmail(String email) { + this.email = email; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + ResendConfirmationRequest that = (ResendConfirmationRequest) o; + return email().equals(that.email()); + } + + @Override + public int hashCode() { + return email().hashCode(); + } + + @Override + public String toString() { + return "ResendConfirmationRequest{" + "email='" + email + '\'' + '}'; + } } 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 a79d710..84ec5dc 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 @@ -2,11 +2,9 @@ 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; /** 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 { @@ -30,4 +28,12 @@ public class ValidationExceptionResponse { .toList(); this.errorMessage = String.format(MESSAGE_TEMPLATE, fields.size()); } + + public String getErrorMessage() { + return errorMessage; + } + + public List getFields() { + return fields; + } } diff --git a/server/src/main/java/br/com/tasknoteapp/server/service/AuthService.java b/server/src/main/java/br/com/tasknoteapp/server/service/AuthService.java index 1e02356..f60b952 100644 --- a/server/src/main/java/br/com/tasknoteapp/server/service/AuthService.java +++ b/server/src/main/java/br/com/tasknoteapp/server/service/AuthService.java @@ -33,8 +33,7 @@ import java.util.List; import java.util.Objects; import java.util.Optional; import java.util.UUID; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; +import java.util.logging.Logger; import org.springframework.core.env.Environment; import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort.Direction; @@ -46,11 +45,11 @@ import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; /** This class contains the implementation for the Auth Service class. */ -@Slf4j @Service -@AllArgsConstructor public class AuthService { + private static final Logger logger = Logger.getLogger(AuthService.class.getName()); + private final UserRepository userRepository; private final PasswordEncoder passwordEncoder; @@ -67,6 +66,37 @@ public class AuthService { private final Environment environment; + /** + * Constructor for AuthService. + * + * @param userRepository UserRepository instance. + * @param passwordEncoder PasswordEncoder instance. + * @param jwtService JwtService instance. + * @param authenticationManager AuthenticationManager instance. + * @param authUtil AuthUtil instance. + * @param userPwdLimitRepository UserPwdLimitRepository instance. + * @param mailgunEmailService MailgunEmailService instance. + * @param environment Environment instance. + */ + public AuthService( + UserRepository userRepository, + PasswordEncoder passwordEncoder, + JwtService jwtService, + AuthenticationManager authenticationManager, + AuthUtil authUtil, + UserPwdLimitRepository userPwdLimitRepository, + MailgunEmailService mailgunEmailService, + Environment environment) { + this.userRepository = userRepository; + this.passwordEncoder = passwordEncoder; + this.jwtService = jwtService; + this.authenticationManager = authenticationManager; + this.authUtil = authUtil; + this.userPwdLimitRepository = userPwdLimitRepository; + this.mailgunEmailService = mailgunEmailService; + this.environment = environment; + } + /** * Create a new user in the app. * @@ -75,7 +105,7 @@ public class AuthService { */ @Transactional public UserResponseWithToken signUpNewUser(LoginRequest newUser) { - log.info("Signing up new user! {}", newUser.email()); + logger.info("Signing up new user: " + newUser.email()); if (findByEmail(newUser.email()).isPresent()) { throw new EmailAlreadyExistsException(); @@ -111,7 +141,7 @@ public class AuthService { mailgunEmailService.sendNewUser(user); } - log.info("User created! ID {}", user.getId()); + logger.info("User created! ID " + user.getId()); return UserResponseWithToken.fromEntity(user, null, getGravatarImageUrl(newUser.email())); } @@ -148,7 +178,7 @@ public class AuthService { */ @Transactional public UserResponseWithToken signInUser(LoginRequest login) { - log.info("Signing in user! {}", login.email()); + logger.info("Signing in user: " + login.email()); Optional userOptional = findByEmail(login.email()); if (userOptional.isEmpty()) { @@ -167,14 +197,14 @@ public class AuthService { String token = jwtService.generateToken(user); - log.info("User authenticated! Token {}", token); + logger.info("User authenticated! Token " + token); userPwdLimitRepository.deleteAllForUser(user.getId()); userRepository.save(user); return UserResponseWithToken.fromEntity(user, token, getGravatarImageUrl(login.email())); } catch (BadCredentialsException e) { - log.error("BadCredentialsException when logging in user {}: {}", user.getId(), - e.getMessage()); + logger.severe( + "BadCredentialsException when logging in user " + user.getId() + ": " + e.getMessage()); // store attempt UserPwdLimitEntity pwdLimit = new UserPwdLimitEntity(); @@ -195,29 +225,28 @@ public class AuthService { public List getAllUsers() { Optional currentUserEmail = authUtil.getCurrentUserEmail(); if (currentUserEmail.isEmpty()) { - log.error("Unable to get current user from the request"); + logger.severe("Unable to get current user from the request"); throw new UserNotFoundException(); } Optional currentUserOpt = findByEmail(currentUserEmail.get()); if (currentUserOpt.isEmpty()) { - log.error("Unable to find user by email with value: {}", currentUserEmail.get()); + logger.severe("Unable to find user by email with value: " + currentUserEmail.get()); throw new UserNotFoundException(); } UserEntity currentUser = currentUserOpt.get(); if (!currentUser.getAdmin()) { - log.warn("User {} not allowed to list users.", currentUser.getId()); + logger.warning("User " + currentUser.getId() + " not allowed to list users."); throw new UserForbiddenException(); } - log.info("Getting all users to user {}", currentUser.getId()); - + logger.info("Getting all users to user " + currentUser.getId()); List users = userRepository.findAll(); List usersResponse = new ArrayList<>(users.size()); users.forEach( u -> usersResponse.add(UserResponse.fromEntity(u, getGravatarImageUrl(u.getEmail())))); - log.info("{} user(s) found!", usersResponse.size()); + logger.info(usersResponse.size() + " user(s) found!"); return usersResponse; } @@ -232,11 +261,11 @@ public class AuthService { String email = currentUserEmail.orElseThrow(); UserEntity currentUser = findByEmail(email).orElseThrow(); - log.info("Refreshing current session to user {}", currentUser.getId()); + logger.info("Refreshing current session to user " + currentUser.getId()); String token = jwtService.generateToken(currentUser); - log.info("User refreshed! Token {}", token); + logger.info("User refreshed! Token " + token); return token; } @@ -250,7 +279,7 @@ public class AuthService { String email = currentUserEmail.orElseThrow(); UserEntity currentUser = findByEmail(email).orElseThrow(); - log.info("Deleting account for user {}", currentUser.getId()); + logger.info("Deleting account for user " + currentUser.getId()); currentUser.setInactivatedAt(LocalDateTime.now()); userPwdLimitRepository.deleteAllForUser(currentUser.getId()); @@ -313,7 +342,7 @@ public class AuthService { if (emailChanged && hasValidMailgunApiKey()) { // send email to older and new account - log.info("Email changed from {} to {}", email, patchRequest.email()); + logger.info("Email changed from " + email + " to " + patchRequest.email()); mailgunEmailService.sendEmailChangedNotification(currentUser, email); } @@ -343,7 +372,7 @@ public class AuthService { */ @Transactional public void confirmUserAccount(String identification) { - log.info("Confirming user email account"); + logger.info("Confirming user email account"); UUID uuid = null; try { @@ -361,7 +390,7 @@ public class AuthService { user.setEmailConfirmedAt(LocalDateTime.now()); userRepository.save(user); - log.info("User email address confirmed: {}", identification); + logger.info("User email address confirmed: " + identification); } /** @@ -370,7 +399,7 @@ public class AuthService { * @param email The email to re-send. */ public void resendEmailConfirmation(String email) { - log.info("Re-sending the confirmation email"); + logger.info("Re-sending the confirmation email"); Optional userOptional = userRepository.findByEmail(email); if (userOptional.isEmpty()) { @@ -383,7 +412,7 @@ public class AuthService { mailgunEmailService.sendNewUser(user); } - log.info("Confirmation email re-sent!"); + logger.info("Confirmation email re-sent!"); } /** @@ -393,11 +422,11 @@ public class AuthService { */ @Transactional public void resetPasswordForUser(String email) { - log.info("Requesting password reset for email {}", email); + logger.info("Requesting password reset for email " + email); Optional userOptional = userRepository.findByEmail(email); if (userOptional.isEmpty()) { - log.info("No user found with this email {}", email); + logger.info("No user found with this email " + email); return; } @@ -412,7 +441,7 @@ public class AuthService { mailgunEmailService.sendResetPassword(user); } - log.info("Password reset request succeeded"); + logger.info("Password reset request succeeded"); } /** @@ -422,7 +451,7 @@ public class AuthService { */ @Transactional public void confirmResetPasswordForUser(PasswordResetRequest request) { - log.info("Saving new password for token {}", request.token()); + logger.info("Saving new password for token " + request.token()); Optional userOptional = userRepository.findByResetToken(request.token()); if (userOptional.isEmpty()) { @@ -455,12 +484,12 @@ public class AuthService { mailgunEmailService.sendPasswordResetConfirmation(user); } - log.info("New password set for token {}", request.token()); + logger.info("New password set for token " + request.token()); } private Optional getGravatarImageUrl(String email) { email = email.toLowerCase().trim(); - log.info("Current user email: {}", email); + logger.info("Current user email: " + email); try { MessageDigest digest = MessageDigest.getInstance("SHA-256"); @@ -474,10 +503,10 @@ public class AuthService { } hexString.append(hex); } - log.debug("Email hashed: {}", hexString); + logger.fine("Email hashed: " + hexString); return Optional.of(hexString.toString()); } catch (NoSuchAlgorithmException | NullPointerException e) { - log.error("NoSuchAlgorithmException or NullPointerException", e.getMessage()); + logger.severe("NoSuchAlgorithmException or NullPointerException: " + e.getMessage()); } return Optional.empty(); } @@ -486,15 +515,15 @@ public class AuthService { Sort sort = Sort.by(Direction.DESC, "whenHappened"); List userPwdList = userPwdLimitRepository.findAllByUser_id(userId, sort); - log.warn("Login count attempt for user {}: {}", userId, userPwdList.size()); + logger.warning("login count attempt for user " + userId + ": " + userPwdList.size()); // if it's more than 3 times in the last 10 minutes, raise timer of 3 hours. if (userPwdList.size() >= 3) { UserPwdLimitEntity mostRecent = userPwdList.get(0); - log.warn("Oldest: {}", mostRecent.getWhenHappened()); + logger.warning("Oldest: " + mostRecent.getWhenHappened()); Duration duration = Duration.between(mostRecent.getWhenHappened(), LocalDateTime.now()); if (duration.toMinutes() <= 3L) { - log.warn("Wait more {}", (3L - duration.toMinutes())); + logger.warning("Wait more " + (3L - duration.toMinutes())); throw new MaxLoginLimitAttemptException(); } } diff --git a/server/src/main/java/br/com/tasknoteapp/server/service/HomeService.java b/server/src/main/java/br/com/tasknoteapp/server/service/HomeService.java index c9e592b..b68268a 100644 --- a/server/src/main/java/br/com/tasknoteapp/server/service/HomeService.java +++ b/server/src/main/java/br/com/tasknoteapp/server/service/HomeService.java @@ -5,20 +5,23 @@ import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.logging.Logger; import java.util.stream.Collectors; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; /** This class contains the implementation for the Home Service class. */ -@Slf4j @Service -@AllArgsConstructor public class HomeService { + private static final Logger logger = Logger.getLogger(HomeService.class.getName()); + private final TaskService taskService; - private static final String N_TASKS_FOUND = "{} tasks found!"; + private static final String N_TASKS_FOUND = "%d tasks found!"; + + public HomeService(TaskService taskService) { + this.taskService = taskService; + } /** * Get up to 5 most used tags. @@ -26,10 +29,10 @@ public class HomeService { * @return List of String with the tags. */ public List getTopTasksTag() { - log.info("Getting top tags for the tasks"); + logger.info("Getting top tags for the tasks"); List tasks = taskService.getTasksByFilter("all"); - log.info(N_TASKS_FOUND, tasks.size()); + logger.info(String.format(N_TASKS_FOUND, tasks.size())); Map tagsCount = new HashMap<>(); for (TaskResponse task : tasks) { diff --git a/server/src/main/java/br/com/tasknoteapp/server/service/MailgunEmailService.java b/server/src/main/java/br/com/tasknoteapp/server/service/MailgunEmailService.java index 1421d61..28a23dc 100644 --- a/server/src/main/java/br/com/tasknoteapp/server/service/MailgunEmailService.java +++ b/server/src/main/java/br/com/tasknoteapp/server/service/MailgunEmailService.java @@ -10,7 +10,7 @@ import br.com.tasknoteapp.server.templates.MailgunTemplateSignUp; import java.nio.charset.StandardCharsets; import java.util.Base64; import java.util.Objects; -import lombok.extern.slf4j.Slf4j; +import java.util.logging.Logger; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.http.HttpEntity; @@ -24,10 +24,10 @@ import org.springframework.web.client.HttpClientErrorException; import org.springframework.web.client.RestTemplate; /** This service handles email messages for Mailgun. */ -@Slf4j @Service public class MailgunEmailService { + private static final Logger logger = Logger.getLogger(MailgunEmailService.class.getName()); private final RestTemplate restTemplate; private final String targetEnv; private String domain; @@ -61,7 +61,7 @@ public class MailgunEmailService { * @param user The user that should be addressed the message. */ public void sendNewUser(UserEntity user) { - log.info("Sending message confirming user email address."); + logger.info("Sending message confirming user email address."); String to = user.getEmail(); String subject = "TaskNote App confirmation email"; @@ -79,7 +79,7 @@ public class MailgunEmailService { * @param user The user that should be addressed the message. */ public void sendResetPassword(UserEntity user) { - log.info("Sending message with password reset link"); + logger.info("Sending message with password reset link"); String to = user.getEmail(); String subject = "TaskNote App password reset"; @@ -97,7 +97,7 @@ public class MailgunEmailService { * @param user The user that should be addressed the message. */ public void sendPasswordResetConfirmation(UserEntity user) { - log.info("Sending message with password reset confirmation"); + logger.info("Sending message with password reset confirmation"); String to = user.getEmail(); String subject = "TaskNote App password confirmation"; @@ -114,7 +114,7 @@ public class MailgunEmailService { * @param oldEmail The user previous email */ public void sendEmailChangedNotification(UserEntity user, String oldEmail) { - log.info("Sending message with changed email notification"); + logger.info("Sending message with changed email notification"); MailgunTemplateEmailChanged emailChanged = new MailgunTemplateEmailChanged(); emailChanged.setEmailFrom(oldEmail); @@ -151,7 +151,7 @@ public class MailgunEmailService { mailData.add("template", template.getName()); if (!template.getVariables().isEmpty()) { mailData.add("h:X-Mailgun-Variables", template.getVariableValuesJson()); - log.info("JSON template variables: {}", template.getVariableValuesJson()); + logger.info("JSON template variables: " + template.getVariableValuesJson()); } HttpEntity> request = new HttpEntity<>(mailData, headers); @@ -163,9 +163,9 @@ public class MailgunEmailService { throw new MailServiceException("Failed to send email: " + response.getStatusCode()); } - log.info("Email message send successfully."); + logger.info("Email message send successfully."); } catch (HttpClientErrorException ex) { - log.error("Unable to send email: {} - {}", ex.getMessage(), ex.getCause()); + logger.severe("Unable to send email: " + ex.getMessage() + " - " + ex.getCause()); } } 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 2608c9d..ed897c2 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 @@ -16,16 +16,15 @@ import java.time.LocalDateTime; import java.util.List; import java.util.Objects; import java.util.Optional; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; +import java.util.logging.Logger; import org.springframework.stereotype.Service; /** This class implements the NoteService interface methods. */ -@Slf4j @Service -@AllArgsConstructor public class NoteService { + private static final Logger logger = Logger.getLogger(NoteService.class.getName()); + private final NoteRepository noteRepository; private final AuthService authService; @@ -34,6 +33,25 @@ public class NoteService { private final NoteUrlRepository noteUrlRepository; + /** + * Constructor for the NoteService class. + * + * @param noteRepository The repository for note entities. + * @param authService The service for authentication. + * @param authUtil Utility class for authentication-related operations. + * @param noteUrlRepository The repository for note URL entities. + */ + public NoteService( + NoteRepository noteRepository, + AuthService authService, + AuthUtil authUtil, + NoteUrlRepository noteUrlRepository) { + this.noteRepository = noteRepository; + this.authService = authService; + this.authUtil = authUtil; + this.noteUrlRepository = noteUrlRepository; + } + /** * Get all notes for the current user. * @@ -42,10 +60,10 @@ public class NoteService { public List getAllNotes() { UserEntity user = getCurrentUser(); - log.info("Get all notes to user {}", user.getId()); + logger.info("Get all notes to user " + user.getId()); List notes = noteRepository.findAllByUser_id(user.getId()); - log.info("{} notes found!", notes.size()); + logger.info(notes.size() + " notes found!"); return notes.stream().map(NoteResponse::fromEntity).toList(); } @@ -58,14 +76,14 @@ public class NoteService { */ public NoteResponse getNoteById(Long noteId) { UserEntity user = getCurrentUser(); - log.info("Get note {} to user {}", noteId, user.getId()); + logger.info("Get note " + noteId + " to user " + user.getId()); Optional task = noteRepository.findById(noteId); if (task.isEmpty()) { throw new NoteNotFoundException(); } - log.info("Note found! Id {}", noteId); + logger.info("Note found! Id " + noteId); return NoteResponse.fromEntity(task.get()); } @@ -78,7 +96,7 @@ public class NoteService { public NoteEntity createNote(NoteRequest noteRequest) { UserEntity user = getCurrentUser(); - log.info("Creating note to user {}", user.getId()); + logger.info("Creating note to user " + user.getId()); NoteEntity note = new NoteEntity(); note.setTitle(noteRequest.title()); @@ -88,14 +106,14 @@ public class NoteService { note.setUser(user); NoteEntity created = noteRepository.save(note); - log.info("Note created! Id {}", created.getId()); + logger.info("Note created! Id " + created.getId()); if (!Objects.isNull(noteRequest.url()) && !noteRequest.url().isEmpty()) { NoteUrlEntity urlEntity = saveUrl(note, noteRequest.url()); note.setNoteUrl(urlEntity); } - log.info("Finished note creation!"); + logger.info("Finished note creation!"); return created; } @@ -110,7 +128,7 @@ public class NoteService { public NoteResponse patchNote(Long noteId, NotePatchRequest patch) { UserEntity user = getCurrentUser(); - log.info("Patching task {} to user {}", noteId, user.getId()); + logger.info("Patching task " + noteId + " to user " + user.getId()); Optional note = noteRepository.findById(noteId); if (note.isEmpty()) { @@ -131,19 +149,19 @@ public class NoteService { noteUrlRepository.deleteByNote_id(noteId); noteUrlRepository.flush(); - log.info("URL deleted from task {}", noteId); + logger.info("URL deleted from task " + noteId); if (!Objects.isNull(patch.url()) && !patch.url().isBlank()) { NoteUrlEntity urlEntity = saveUrl(noteEntity, patch.url()); noteEntity.setNoteUrl(urlEntity); } else { - log.info("No urls to patch for task {}", noteId); + logger.info("No urls to patch for task " + noteId); } NoteEntity patchedNote = noteRepository.save(noteEntity); noteRepository.flush(); - log.info("Note patched! Id {}", patchedNote.getId()); + logger.info("Note patched! Id " + patchedNote.getId()); return NoteResponse.fromEntity(patchedNote); } @@ -157,7 +175,7 @@ public class NoteService { public void deleteNote(Long noteId) { UserEntity user = getCurrentUser(); - log.info("Deleting note {} to user {}", noteId, user.getId()); + logger.info("Deleting note " + noteId + " to user " + user.getId()); Optional note = noteRepository.findById(noteId); if (note.isEmpty()) { @@ -167,14 +185,14 @@ public class NoteService { NoteUrlEntity noteUrl = note.get().getNoteUrl(); if (!Objects.isNull(noteUrl)) { noteUrlRepository.delete(noteUrl); - log.info("URL Deleted from task {}", noteId); + logger.info("URL Deleted from task " + noteId); } else { - log.info("No urls to delete for task {}", noteId); + logger.info("No urls to delete for task " + noteId); } noteRepository.delete(note.get()); - log.info("Note deleted! Id {}", noteId); + logger.info("Note deleted! Id " + noteId); } /** @@ -186,12 +204,11 @@ public class NoteService { public List searchNotes(String searchTerm) { UserEntity user = getCurrentUser(); - log.info("Searching notes to user {}", user.getId()); + logger.info("Searching notes to user " + user.getId()); List notes = noteRepository.findAllBySearchTerm(searchTerm.toUpperCase(), user.getId()); - log.info("{} tasks found!", notes.size()); - + logger.info(notes.size() + " tasks found!"); return notes.stream().map(NoteResponse::fromEntity).toList(); } @@ -207,7 +224,7 @@ public class NoteService { noteUrl.setNote(noteEntity); NoteUrlEntity savedUrl = noteUrlRepository.save(noteUrl); - log.info("URL saved to note {}", noteEntity.getId()); + logger.info("URL saved to note " + noteEntity.getId()); return savedUrl; } diff --git a/server/src/main/java/br/com/tasknoteapp/server/service/TaskService.java b/server/src/main/java/br/com/tasknoteapp/server/service/TaskService.java index 3ffd6c3..6a1f1bb 100644 --- a/server/src/main/java/br/com/tasknoteapp/server/service/TaskService.java +++ b/server/src/main/java/br/com/tasknoteapp/server/service/TaskService.java @@ -19,16 +19,15 @@ import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.Optional; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; +import java.util.logging.Logger; import org.springframework.stereotype.Service; /** This class contains the implementation for the Task Service class. */ -@Slf4j @Service -@AllArgsConstructor public class TaskService { + private static final Logger logger = Logger.getLogger(TaskService.class.getName()); + private final TaskRepository taskRepository; private final AuthService authService; @@ -37,6 +36,25 @@ public class TaskService { private final TaskUrlRepository taskUrlRepository; + /** + * Constructor for the TaskService class. + * + * @param taskRepository The repository for task entities. + * @param authService The service for authentication. + * @param authUtil Utility class for authentication-related operations. + * @param taskUrlRepository The repository for task URL entities. + */ + public TaskService( + TaskRepository taskRepository, + AuthService authService, + AuthUtil authUtil, + TaskUrlRepository taskUrlRepository) { + this.taskRepository = taskRepository; + this.authService = authService; + this.authUtil = authUtil; + this.taskUrlRepository = taskUrlRepository; + } + /** * Get all tasks for the current user. * @@ -44,10 +62,10 @@ public class TaskService { */ public List getAllTasks() { UserEntity user = getCurrentUser(); - log.info("Get all tasks to user {}", user.getId()); + logger.info("Get all tasks to user " + user.getId()); List tasks = taskRepository.findAllByUser_id(user.getId()); - log.info("{} tasks found!", tasks.size()); + logger.info(tasks.size() + " tasks found!"); return tasks.stream() .map((TaskEntity tr) -> TaskResponse.fromEntity(tr, getAllTasksUrls(tr.getId()))) @@ -62,14 +80,14 @@ public class TaskService { */ public TaskResponse getTaskById(Long taskId) { UserEntity user = getCurrentUser(); - log.info("Get task {} to user {}", taskId, user.getId()); + logger.info("Get task " + taskId + " to user " + user.getId()); Optional task = taskRepository.findById(taskId); if (task.isEmpty()) { throw new TaskNotFoundException(); } - log.info("Task found! Id {}", taskId); + logger.info("Task found! Id " + taskId); return TaskResponse.fromEntity(task.get(), getAllTasksUrls(taskId)); } @@ -81,7 +99,7 @@ public class TaskService { public TaskResponse createTask(TaskRequest taskRequest) { UserEntity user = getCurrentUser(); - log.info("Creating task to user {}", user.getId()); + logger.info("Creating task to user " + user.getId()); TaskEntity task = new TaskEntity(); task.setDescription(taskRequest.description()); @@ -99,7 +117,7 @@ public class TaskService { saveUrls(task, taskRequest.urls()); } - log.info("Task created! Id {}", created.getId()); + logger.info("Task created! Id " + created.getId()); return TaskResponse.fromEntity(created, getAllTasksUrls(created.getId())); } @@ -114,7 +132,7 @@ public class TaskService { public TaskResponse patchTask(Long taskId, TaskPatchRequest patch) { UserEntity user = getCurrentUser(); - log.info("Patching task {} to user {}", taskId, user.getId()); + logger.info("Patching task " + taskId + " to user " + user.getId()); Optional task = taskRepository.findById(taskId); if (task.isEmpty()) { @@ -146,9 +164,7 @@ public class TaskService { TaskEntity patchedTask = taskRepository.save(taskEntity); - log.info("Task patched! Id {}", patchedTask.getId()); - - + logger.info("Task patched! Id " + patchedTask.getId()); return TaskResponse.fromEntity(patchedTask, getAllTasksUrls(taskId)); } @@ -162,7 +178,7 @@ public class TaskService { public void deleteTask(Long taskId) { UserEntity user = getCurrentUser(); - log.info("Deleting task {} to user {}", taskId, user.getId()); + logger.info("Deleting task " + taskId + " to user " + user.getId()); Optional task = taskRepository.findById(taskId); if (task.isEmpty()) { @@ -172,14 +188,14 @@ public class TaskService { List urlsToDelete = taskUrlRepository.findAllById_taskId(taskId); if (!urlsToDelete.isEmpty()) { taskUrlRepository.deleteAllById_taskId(taskId); - log.info("Deleted {} urls from task {}", urlsToDelete.size(), taskId); + logger.info("Deleted " + urlsToDelete.size() + " urls from task " + taskId); } else { - log.info("No urls to delete for task {}", taskId); + logger.info("No urls to delete for task " + taskId); } taskRepository.delete(task.get()); - log.info("Task deleted! Id {}", taskId); + logger.info("Task deleted! Id " + taskId); } /** @@ -191,7 +207,7 @@ public class TaskService { public List searchTasks(String searchTerm) { UserEntity user = getCurrentUser(); - log.info("Searching tasks to user {}", user.getId()); + logger.info("Searching tasks to user " + user.getId()); if (Objects.isNull(searchTerm) || searchTerm.isBlank()) { return List.of(); @@ -199,7 +215,7 @@ public class TaskService { List tasks = taskRepository.findAllBySearchTerm(searchTerm.toUpperCase(), user.getId()); - log.info("{} tasks found!", tasks.size()); + logger.info(tasks.size() + " tasks found!"); return tasks.stream() .map((TaskEntity tr) -> TaskResponse.fromEntity(tr, getAllTasksUrls(tr.getId()))) @@ -270,7 +286,7 @@ public class TaskService { } taskUrlRepository.saveAll(tasksUrl); - log.info("Added {} urls from task {}", tasksUrl.size(), taskEntity.getId()); + logger.info("Added " + tasksUrl.size() + " urls from task " + taskEntity.getId()); } private void patchDueDate(TaskEntity taskEntity, TaskPatchRequest patch) { @@ -279,7 +295,8 @@ public class TaskService { try { taskEntity.setDueDate(LocalDate.parse(patch.dueDate())); } catch (DateTimeParseException e) { - log.error("Unable to parse the provided date: {}: {}", patch.dueDate(), e.getMessage(), e); + logger.severe( + "Unable to parse the provided date: " + patch.dueDate() + ": " + e.getMessage()); } } } @@ -289,9 +306,9 @@ public class TaskService { List urlsToDelete = taskUrlRepository.findAllById_taskId(taskId); if (!urlsToDelete.isEmpty()) { taskUrlRepository.deleteAllById_taskId(taskId); - log.info("Deleted {} urls from task {}", urlsToDelete.size(), taskId); + logger.info("Deleted " + urlsToDelete.size() + " urls from task " + taskId); } else { - log.info("No urls to delete for task {}", taskId); + logger.info("No urls to delete for task " + taskId); } if (!Objects.isNull(patch.urls())) { @@ -299,7 +316,7 @@ public class TaskService { patch.urls().stream().filter(u -> !u.isBlank()).map(String::trim).toList(); saveUrls(taskEntity, urlListToAdd); } else { - log.info("No urls to add for task {}", taskId); + logger.info("No urls to add for task " + taskId); } } } diff --git a/server/src/main/java/br/com/tasknoteapp/server/service/UserSessionService.java b/server/src/main/java/br/com/tasknoteapp/server/service/UserSessionService.java index 03c46df..7c48a63 100644 --- a/server/src/main/java/br/com/tasknoteapp/server/service/UserSessionService.java +++ b/server/src/main/java/br/com/tasknoteapp/server/service/UserSessionService.java @@ -9,12 +9,10 @@ import br.com.tasknoteapp.server.response.UserResponse; import jakarta.transaction.Transactional; import java.util.List; import java.util.Optional; -import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; /** This class contains methods to handle user session and account deletion. */ @Service -@AllArgsConstructor public class UserSessionService { private final AuthService authService; @@ -23,6 +21,20 @@ public class UserSessionService { private final NoteService noteService; + /** + * Constructor for UserSessionService. + * + * @param authService the authentication service + * @param taskService the task service + * @param noteService the note service + */ + public UserSessionService( + AuthService authService, TaskService taskService, NoteService noteService) { + this.authService = authService; + this.taskService = taskService; + this.noteService = noteService; + } + /** * Refresh the current user session with a new JWT token. * diff --git a/server/src/main/java/br/com/tasknoteapp/server/service/impl/UserServiceImpl.java b/server/src/main/java/br/com/tasknoteapp/server/service/impl/UserServiceImpl.java index 8d44267..d2833b9 100644 --- a/server/src/main/java/br/com/tasknoteapp/server/service/impl/UserServiceImpl.java +++ b/server/src/main/java/br/com/tasknoteapp/server/service/impl/UserServiceImpl.java @@ -4,18 +4,20 @@ import br.com.tasknoteapp.server.entity.UserEntity; import br.com.tasknoteapp.server.repository.UserRepository; import br.com.tasknoteapp.server.service.UserService; import java.util.Optional; -import lombok.RequiredArgsConstructor; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.stereotype.Service; /** This class contains the implementation for the User Service class. */ @Service -@RequiredArgsConstructor class UserServiceImpl implements UserService { private final UserRepository userRepository; + public UserServiceImpl(UserRepository userRepository) { + this.userRepository = userRepository; + } + @Override public UserDetailsService userDetailsService() { return new UserDetailsService() { diff --git a/server/src/main/java/br/com/tasknoteapp/server/util/AuthUtil.java b/server/src/main/java/br/com/tasknoteapp/server/util/AuthUtil.java index f90e9e7..9ad7474 100644 --- a/server/src/main/java/br/com/tasknoteapp/server/util/AuthUtil.java +++ b/server/src/main/java/br/com/tasknoteapp/server/util/AuthUtil.java @@ -4,13 +4,11 @@ import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.Optional; -import lombok.extern.slf4j.Slf4j; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Component; /** This class contains utils methods to handle authentication. */ -@Slf4j @Component public class AuthUtil {