- Timestamp:
- 06/22/26 19:00:39 (2 weeks ago)
- Branches:
- master
- Children:
- c0086c0
- Parents:
- 194c016
- Location:
- backend
- Files:
-
- 1 added
- 9 edited
-
Dockerfile (added)
-
src/main/java/com/trekr/backend/config/SecurityConfig.java (modified) (1 diff)
-
src/main/java/com/trekr/backend/controller/CustomTrackingController.java (modified) (2 diffs)
-
src/main/java/com/trekr/backend/dto/discipline/CreateTaskRequest.java (modified) (2 diffs)
-
src/main/java/com/trekr/backend/dto/discipline/TaskDto.java (modified) (1 diff)
-
src/main/java/com/trekr/backend/dto/discipline/UpdateTaskRequest.java (modified) (2 diffs)
-
src/main/java/com/trekr/backend/entity/discipline/Task.java (modified) (4 diffs)
-
src/main/java/com/trekr/backend/repository/TaskRepository.java (modified) (3 diffs)
-
src/main/java/com/trekr/backend/service/CustomTrackingService.java (modified) (5 diffs)
-
src/main/java/com/trekr/backend/service/DisciplineService.java (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
-
backend/src/main/java/com/trekr/backend/config/SecurityConfig.java
r194c016 r545738f 49 49 config.setAllowedOrigins(List.of( 50 50 "http://localhost:5173", 51 "http://127.0.0.1:5173")); 51 "http://127.0.0.1:5173", 52 "http://localhost:3000", 53 "http://127.0.0.1:3000")); 52 54 config.setAllowedMethods(List.of("GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS")); 53 55 config.setAllowedHeaders(List.of("Authorization", "Content-Type", "Accept", "Origin", "X-Requested-With")); -
backend/src/main/java/com/trekr/backend/controller/CustomTrackingController.java
r194c016 r545738f 9 9 import com.trekr.backend.dto.discipline.UpdateTaskFinishedRequest; 10 10 import com.trekr.backend.dto.discipline.UpdateTaskRequest; 11 import com.trekr.backend.dto.discipline.UpdateTaskStatusRequest; 11 12 import com.trekr.backend.security.UserPrincipal; 12 13 import com.trekr.backend.service.CustomTrackingService; … … 79 80 } 80 81 82 @PatchMapping("/{customTrackingId}/tasks/{taskId}/status") 83 public TaskDto updateTaskStatus( 84 @PathVariable Long customTrackingId, 85 @PathVariable Long taskId, 86 @RequestBody UpdateTaskStatusRequest request, 87 Authentication authentication) { 88 UserPrincipal principal = (UserPrincipal) authentication.getPrincipal(); 89 return customTrackingService.updateCustomCategoryTaskStatus(principal.getUserId(), customTrackingId, taskId, request); 90 } 91 81 92 @DeleteMapping("/{customTrackingId}/tasks/{taskId}") 82 93 @ResponseStatus(HttpStatus.NO_CONTENT) -
backend/src/main/java/com/trekr/backend/dto/discipline/CreateTaskRequest.java
r194c016 r545738f 2 2 3 3 import jakarta.validation.constraints.NotBlank; 4 5 import java.time.LocalDate; 4 6 5 7 public class CreateTaskRequest { … … 8 10 private String name; 9 11 12 private String description; 13 private LocalDate dueDate; 14 private String priority; 15 10 16 public CreateTaskRequest() { 11 17 } 12 18 13 public String getName() { 14 return name; 15 } 19 public String getName() { return name; } 20 public void setName(String name) { this.name = name; } 16 21 17 public void setName(String name) { 18 this.name = name; 19 } 22 public String getDescription() { return description; } 23 public void setDescription(String description) { this.description = description; } 24 25 public LocalDate getDueDate() { return dueDate; } 26 public void setDueDate(LocalDate dueDate) { this.dueDate = dueDate; } 27 28 public String getPriority() { return priority; } 29 public void setPriority(String priority) { this.priority = priority; } 20 30 } 21 -
backend/src/main/java/com/trekr/backend/dto/discipline/TaskDto.java
r194c016 r545738f 1 1 package com.trekr.backend.dto.discipline; 2 2 3 public record TaskDto(Long taskId, String name, boolean isFinished) { 3 import com.trekr.backend.entity.discipline.TaskStatus; 4 5 import java.time.LocalDate; 6 7 public record TaskDto( 8 Long taskId, 9 String name, 10 boolean isFinished, 11 TaskStatus status, 12 String description, 13 LocalDate dueDate, 14 String priority 15 ) { 4 16 } 5 -
backend/src/main/java/com/trekr/backend/dto/discipline/UpdateTaskRequest.java
r194c016 r545738f 1 1 package com.trekr.backend.dto.discipline; 2 2 3 import com.trekr.backend.entity.discipline.TaskStatus; 3 4 import jakarta.validation.constraints.NotBlank; 5 6 import java.time.LocalDate; 4 7 5 8 public class UpdateTaskRequest { … … 8 11 private String name; 9 12 13 private String description; 14 private LocalDate dueDate; 15 private String priority; 16 private TaskStatus status; 17 10 18 public UpdateTaskRequest() { 11 19 } 12 20 13 public String getName() { 14 return name; 15 } 21 public String getName() { return name; } 22 public void setName(String name) { this.name = name; } 16 23 17 public void setName(String name) { 18 this.name = name; 19 } 24 public String getDescription() { return description; } 25 public void setDescription(String description) { this.description = description; } 26 27 public LocalDate getDueDate() { return dueDate; } 28 public void setDueDate(LocalDate dueDate) { this.dueDate = dueDate; } 29 30 public String getPriority() { return priority; } 31 public void setPriority(String priority) { this.priority = priority; } 32 33 public TaskStatus getStatus() { return status; } 34 public void setStatus(TaskStatus status) { this.status = status; } 20 35 } 21 -
backend/src/main/java/com/trekr/backend/entity/discipline/Task.java
r194c016 r545738f 3 3 import jakarta.persistence.Column; 4 4 import jakarta.persistence.Entity; 5 import jakarta.persistence.EnumType; 6 import jakarta.persistence.Enumerated; 5 7 import jakarta.persistence.FetchType; 6 8 import jakarta.persistence.GeneratedValue; … … 10 12 import jakarta.persistence.ManyToOne; 11 13 import jakarta.persistence.Table; 14 15 import java.time.LocalDate; 12 16 13 17 @Entity … … 23 27 private String name; 24 28 25 @Column(name = "is_finished", nullable = false) 26 private boolean finished; 29 @Enumerated(EnumType.STRING) 30 @Column(name = "status", nullable = false) 31 private TaskStatus status = TaskStatus.NOT_STARTED; 32 33 @Column(name = "description") 34 private String description; 35 36 @Column(name = "due_date") 37 private LocalDate dueDate; 38 39 @Column(name = "priority") 40 private String priority; 27 41 28 42 @ManyToOne(fetch = FetchType.LAZY) … … 37 51 } 38 52 39 public Long getTaskId() { 40 return taskId; 53 public Long getTaskId() { return taskId; } 54 public void setTaskId(Long taskId) { this.taskId = taskId; } 55 56 public String getName() { return name; } 57 public void setName(String name) { this.name = name; } 58 59 public TaskStatus getStatus() { return status; } 60 public void setStatus(TaskStatus status) { this.status = status; } 61 62 public boolean isFinished() { return TaskStatus.FINISHED == status; } 63 public void setFinished(boolean finished) { 64 this.status = finished ? TaskStatus.FINISHED : TaskStatus.NOT_STARTED; 41 65 } 42 66 43 public void setTaskId(Long taskId) { 44 this.taskId = taskId; 45 } 67 public String getDescription() { return description; } 68 public void setDescription(String description) { this.description = description; } 46 69 47 public String getName() { 48 return name; 49 } 70 public LocalDate getDueDate() { return dueDate; } 71 public void setDueDate(LocalDate dueDate) { this.dueDate = dueDate; } 50 72 51 public void setName(String name) { 52 this.name = name; 53 } 73 public String getPriority() { return priority; } 74 public void setPriority(String priority) { this.priority = priority; } 54 75 55 public boolean isFinished() { 56 return finished; 57 } 76 public DisciplineUser getDisciplineUser() { return disciplineUser; } 77 public void setDisciplineUser(DisciplineUser disciplineUser) { this.disciplineUser = disciplineUser; } 58 78 59 public void setFinished(boolean finished) { 60 this.finished = finished; 61 } 62 63 public DisciplineUser getDisciplineUser() { 64 return disciplineUser; 65 } 66 67 public void setDisciplineUser(DisciplineUser disciplineUser) { 68 this.disciplineUser = disciplineUser; 69 } 70 71 public CustomTrackingCategory getCustomTrackingCategory() { 72 return customTrackingCategory; 73 } 74 79 public CustomTrackingCategory getCustomTrackingCategory() { return customTrackingCategory; } 75 80 public void setCustomTrackingCategory(CustomTrackingCategory customTrackingCategory) { 76 81 this.customTrackingCategory = customTrackingCategory; -
backend/src/main/java/com/trekr/backend/repository/TaskRepository.java
r194c016 r545738f 2 2 3 3 import com.trekr.backend.entity.discipline.Task; 4 import com.trekr.backend.entity.discipline.TaskStatus; 4 5 import org.springframework.data.domain.Page; 5 6 import org.springframework.data.domain.Pageable; … … 19 20 long countByDisciplineUser_UserId(Long userId); 20 21 21 long countByDisciplineUser_UserIdAnd FinishedTrue(Long userId);22 long countByDisciplineUser_UserIdAndStatus(Long userId, TaskStatus status); 22 23 23 List<Task> findByDisciplineUser_UserIdAnd FinishedTrue(Long userId);24 List<Task> findByDisciplineUser_UserIdAndStatus(Long userId, TaskStatus status); 24 25 25 26 List<Task> findByCustomTrackingCategory_CustomTrackingIdAndCustomTrackingCategory_User_UserIdOrderByTaskIdDesc( … … 30 31 31 32 @Modifying 32 @Query("update Task t set t. finished = falsewhere t.disciplineUser.userId = :userId")33 int reset FinishedForUser(@Param("userId") Long userId);33 @Query("update Task t set t.status = :status where t.disciplineUser.userId = :userId") 34 int resetStatusForUser(@Param("userId") Long userId, @Param("status") TaskStatus status); 34 35 } 35 -
backend/src/main/java/com/trekr/backend/service/CustomTrackingService.java
r194c016 r545738f 8 8 import com.trekr.backend.dto.discipline.TasksResponse; 9 9 import com.trekr.backend.dto.discipline.UpdateTaskFinishedRequest; 10 import com.trekr.backend.dto.discipline.UpdateTaskStatusRequest; 11 import com.trekr.backend.entity.discipline.TaskStatus; 10 12 import com.trekr.backend.dto.discipline.UpdateTaskRequest; 11 13 import com.trekr.backend.entity.User; … … 81 83 customTrackingId, userId) 82 84 .stream() 83 .map(t -> new TaskDto(t.getTaskId(), t.getName(), t.isFinished() ))85 .map(t -> new TaskDto(t.getTaskId(), t.getName(), t.isFinished(), t.getStatus(), t.getDescription(), t.getDueDate(), t.getPriority())) 84 86 .toList(); 85 87 … … 101 103 Task task = new Task(); 102 104 task.setName(name.trim()); 103 task.setFinished(false); 105 task.setStatus(TaskStatus.NOT_STARTED); 106 task.setDescription(request.getDescription()); 107 task.setDueDate(request.getDueDate()); 108 task.setPriority(request.getPriority()); 104 109 task.setDisciplineUser(null); 105 110 task.setCustomTrackingCategory(category); 106 111 107 112 Task saved = taskRepository.save(task); 108 return new TaskDto(saved.getTaskId(), saved.getName(), saved.isFinished() );113 return new TaskDto(saved.getTaskId(), saved.getName(), saved.isFinished(), saved.getStatus(), saved.getDescription(), saved.getDueDate(), saved.getPriority()); 109 114 } 110 115 … … 127 132 128 133 task.setName(name.trim()); 129 Task saved = taskRepository.save(task); 130 return new TaskDto(saved.getTaskId(), saved.getName(), saved.isFinished()); 134 task.setDescription(request.getDescription()); 135 task.setDueDate(request.getDueDate()); 136 task.setPriority(request.getPriority()); 137 if (request.getStatus() != null) { 138 task.setStatus(request.getStatus()); 139 } 140 Task saved = taskRepository.save(task); 141 return new TaskDto(saved.getTaskId(), saved.getName(), saved.isFinished(), saved.getStatus(), saved.getDescription(), saved.getDueDate(), saved.getPriority()); 131 142 } 132 143 … … 151 162 task.setFinished(finished); 152 163 Task saved = taskRepository.save(task); 153 return new TaskDto(saved.getTaskId(), saved.getName(), saved.isFinished()); 164 return new TaskDto(saved.getTaskId(), saved.getName(), saved.isFinished(), saved.getStatus(), saved.getDescription(), saved.getDueDate(), saved.getPriority()); 165 } 166 167 @Transactional 168 public TaskDto updateCustomCategoryTaskStatus(Long userId, Long customTrackingId, Long taskId, 169 UpdateTaskStatusRequest request) { 170 Task task = taskRepository.findById(taskId) 171 .orElseThrow(() -> new RuntimeException("Task not found")); 172 173 if (task.getCustomTrackingCategory() == null 174 || !customTrackingId.equals(task.getCustomTrackingCategory().getCustomTrackingId()) 175 || task.getCustomTrackingCategory().getUser() == null 176 || !userId.equals(task.getCustomTrackingCategory().getUser().getUserId())) { 177 throw new RuntimeException("Task not found"); 178 } 179 180 if (request.getStatus() == null) { 181 throw new RuntimeException("status is required"); 182 } 183 184 task.setStatus(request.getStatus()); 185 Task saved = taskRepository.save(task); 186 return new TaskDto(saved.getTaskId(), saved.getName(), saved.isFinished(), saved.getStatus(), saved.getDescription(), saved.getDueDate(), saved.getPriority()); 154 187 } 155 188 -
backend/src/main/java/com/trekr/backend/service/DisciplineService.java
r194c016 r545738f 14 14 import com.trekr.backend.entity.discipline.Task; 15 15 import com.trekr.backend.entity.discipline.TaskDailyCompletion; 16 import com.trekr.backend.entity.discipline.TaskStatus; 16 17 import com.trekr.backend.entity.discipline.TaskDailyCompletionId; 17 18 import com.trekr.backend.repository.DailyCompletionRepository; … … 81 82 82 83 List<TaskDto> tasks = result.getContent().stream() 83 .map(t -> new TaskDto(t.getTaskId(), t.getName(), t.isFinished() ))84 .map(t -> new TaskDto(t.getTaskId(), t.getName(), t.isFinished(), t.getStatus(), t.getDescription(), t.getDueDate(), t.getPriority())) 84 85 .toList(); 85 86 … … 107 108 108 109 Task saved = taskRepository.save(task); 109 return new TaskDto(saved.getTaskId(), saved.getName(), saved.isFinished() );110 return new TaskDto(saved.getTaskId(), saved.getName(), saved.isFinished(), saved.getStatus(), saved.getDescription(), saved.getDueDate(), saved.getPriority()); 110 111 } 111 112 … … 126 127 task.setName(name.trim()); 127 128 Task saved = taskRepository.save(task); 128 return new TaskDto(saved.getTaskId(), saved.getName(), saved.isFinished() );129 return new TaskDto(saved.getTaskId(), saved.getName(), saved.isFinished(), saved.getStatus(), saved.getDescription(), saved.getDueDate(), saved.getPriority()); 129 130 } 130 131 … … 145 146 task.setFinished(finished); 146 147 Task saved = taskRepository.save(task); 147 return new TaskDto(saved.getTaskId(), saved.getName(), saved.isFinished() );148 return new TaskDto(saved.getTaskId(), saved.getName(), saved.isFinished(), saved.getStatus(), saved.getDescription(), saved.getDueDate(), saved.getPriority()); 148 149 } 149 150 … … 187 188 188 189 long total = taskRepository.countByDisciplineUser_UserId(userId); 189 long finished = taskRepository.countByDisciplineUser_UserIdAnd FinishedTrue(userId);190 long finished = taskRepository.countByDisciplineUser_UserIdAndStatus(userId, TaskStatus.FINISHED); 190 191 191 192 BigDecimal percent; … … 210 211 // (not strictly required for now, but matches schema and enables future analytics) 211 212 if (finished > 0) { 212 List<TaskDailyCompletion> links = taskRepository.findByDisciplineUser_UserIdAnd FinishedTrue(userId)213 List<TaskDailyCompletion> links = taskRepository.findByDisciplineUser_UserIdAndStatus(userId, TaskStatus.FINISHED) 213 214 .stream() 214 215 .map(t -> { … … 224 225 225 226 // Reset all tasks for next day 226 taskRepository.reset FinishedForUser(userId);227 taskRepository.resetStatusForUser(userId, TaskStatus.NOT_STARTED); 227 228 228 229 DailyCompletionDto dto = new DailyCompletionDto(savedCompletion.getDailyCompletionId(),
Note:
See TracChangeset
for help on using the changeset viewer.
