Changeset 545738f for backend


Ignore:
Timestamp:
06/22/26 19:00:39 (2 weeks ago)
Author:
Andrej <asumanovski@…>
Branches:
master
Children:
c0086c0
Parents:
194c016
Message:

Switched to dockerized db and improved Task model and Task Ui

Location:
backend
Files:
1 added
9 edited

Legend:

Unmodified
Added
Removed
  • backend/src/main/java/com/trekr/backend/config/SecurityConfig.java

    r194c016 r545738f  
    4949        config.setAllowedOrigins(List.of(
    5050                "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"));
    5254        config.setAllowedMethods(List.of("GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS"));
    5355        config.setAllowedHeaders(List.of("Authorization", "Content-Type", "Accept", "Origin", "X-Requested-With"));
  • backend/src/main/java/com/trekr/backend/controller/CustomTrackingController.java

    r194c016 r545738f  
    99import com.trekr.backend.dto.discipline.UpdateTaskFinishedRequest;
    1010import com.trekr.backend.dto.discipline.UpdateTaskRequest;
     11import com.trekr.backend.dto.discipline.UpdateTaskStatusRequest;
    1112import com.trekr.backend.security.UserPrincipal;
    1213import com.trekr.backend.service.CustomTrackingService;
     
    7980    }
    8081
     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
    8192    @DeleteMapping("/{customTrackingId}/tasks/{taskId}")
    8293    @ResponseStatus(HttpStatus.NO_CONTENT)
  • backend/src/main/java/com/trekr/backend/dto/discipline/CreateTaskRequest.java

    r194c016 r545738f  
    22
    33import jakarta.validation.constraints.NotBlank;
     4
     5import java.time.LocalDate;
    46
    57public class CreateTaskRequest {
     
    810    private String name;
    911
     12    private String description;
     13    private LocalDate dueDate;
     14    private String priority;
     15
    1016    public CreateTaskRequest() {
    1117    }
    1218
    13     public String getName() {
    14         return name;
    15     }
     19    public String getName() { return name; }
     20    public void setName(String name) { this.name = name; }
    1621
    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; }
    2030}
    21 
  • backend/src/main/java/com/trekr/backend/dto/discipline/TaskDto.java

    r194c016 r545738f  
    11package com.trekr.backend.dto.discipline;
    22
    3 public record TaskDto(Long taskId, String name, boolean isFinished) {
     3import com.trekr.backend.entity.discipline.TaskStatus;
     4
     5import java.time.LocalDate;
     6
     7public record TaskDto(
     8        Long taskId,
     9        String name,
     10        boolean isFinished,
     11        TaskStatus status,
     12        String description,
     13        LocalDate dueDate,
     14        String priority
     15) {
    416}
    5 
  • backend/src/main/java/com/trekr/backend/dto/discipline/UpdateTaskRequest.java

    r194c016 r545738f  
    11package com.trekr.backend.dto.discipline;
    22
     3import com.trekr.backend.entity.discipline.TaskStatus;
    34import jakarta.validation.constraints.NotBlank;
     5
     6import java.time.LocalDate;
    47
    58public class UpdateTaskRequest {
     
    811    private String name;
    912
     13    private String description;
     14    private LocalDate dueDate;
     15    private String priority;
     16    private TaskStatus status;
     17
    1018    public UpdateTaskRequest() {
    1119    }
    1220
    13     public String getName() {
    14         return name;
    15     }
     21    public String getName() { return name; }
     22    public void setName(String name) { this.name = name; }
    1623
    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; }
    2035}
    21 
  • backend/src/main/java/com/trekr/backend/entity/discipline/Task.java

    r194c016 r545738f  
    33import jakarta.persistence.Column;
    44import jakarta.persistence.Entity;
     5import jakarta.persistence.EnumType;
     6import jakarta.persistence.Enumerated;
    57import jakarta.persistence.FetchType;
    68import jakarta.persistence.GeneratedValue;
     
    1012import jakarta.persistence.ManyToOne;
    1113import jakarta.persistence.Table;
     14
     15import java.time.LocalDate;
    1216
    1317@Entity
     
    2327    private String name;
    2428
    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;
    2741
    2842    @ManyToOne(fetch = FetchType.LAZY)
     
    3751    }
    3852
    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;
    4165    }
    4266
    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; }
    4669
    47     public String getName() {
    48         return name;
    49     }
     70    public LocalDate getDueDate() { return dueDate; }
     71    public void setDueDate(LocalDate dueDate) { this.dueDate = dueDate; }
    5072
    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; }
    5475
    55     public boolean isFinished() {
    56         return finished;
    57     }
     76    public DisciplineUser getDisciplineUser() { return disciplineUser; }
     77    public void setDisciplineUser(DisciplineUser disciplineUser) { this.disciplineUser = disciplineUser; }
    5878
    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; }
    7580    public void setCustomTrackingCategory(CustomTrackingCategory customTrackingCategory) {
    7681        this.customTrackingCategory = customTrackingCategory;
  • backend/src/main/java/com/trekr/backend/repository/TaskRepository.java

    r194c016 r545738f  
    22
    33import com.trekr.backend.entity.discipline.Task;
     4import com.trekr.backend.entity.discipline.TaskStatus;
    45import org.springframework.data.domain.Page;
    56import org.springframework.data.domain.Pageable;
     
    1920    long countByDisciplineUser_UserId(Long userId);
    2021
    21     long countByDisciplineUser_UserIdAndFinishedTrue(Long userId);
     22    long countByDisciplineUser_UserIdAndStatus(Long userId, TaskStatus status);
    2223
    23     List<Task> findByDisciplineUser_UserIdAndFinishedTrue(Long userId);
     24    List<Task> findByDisciplineUser_UserIdAndStatus(Long userId, TaskStatus status);
    2425
    2526    List<Task> findByCustomTrackingCategory_CustomTrackingIdAndCustomTrackingCategory_User_UserIdOrderByTaskIdDesc(
     
    3031
    3132    @Modifying
    32     @Query("update Task t set t.finished = false where t.disciplineUser.userId = :userId")
    33     int resetFinishedForUser(@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);
    3435}
    35 
  • backend/src/main/java/com/trekr/backend/service/CustomTrackingService.java

    r194c016 r545738f  
    88import com.trekr.backend.dto.discipline.TasksResponse;
    99import com.trekr.backend.dto.discipline.UpdateTaskFinishedRequest;
     10import com.trekr.backend.dto.discipline.UpdateTaskStatusRequest;
     11import com.trekr.backend.entity.discipline.TaskStatus;
    1012import com.trekr.backend.dto.discipline.UpdateTaskRequest;
    1113import com.trekr.backend.entity.User;
     
    8183                        customTrackingId, userId)
    8284                .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()))
    8486                .toList();
    8587
     
    101103        Task task = new Task();
    102104        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());
    104109        task.setDisciplineUser(null);
    105110        task.setCustomTrackingCategory(category);
    106111
    107112        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());
    109114    }
    110115
     
    127132
    128133        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());
    131142    }
    132143
     
    151162        task.setFinished(finished);
    152163        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());
    154187    }
    155188
  • backend/src/main/java/com/trekr/backend/service/DisciplineService.java

    r194c016 r545738f  
    1414import com.trekr.backend.entity.discipline.Task;
    1515import com.trekr.backend.entity.discipline.TaskDailyCompletion;
     16import com.trekr.backend.entity.discipline.TaskStatus;
    1617import com.trekr.backend.entity.discipline.TaskDailyCompletionId;
    1718import com.trekr.backend.repository.DailyCompletionRepository;
     
    8182
    8283        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()))
    8485                .toList();
    8586
     
    107108
    108109        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());
    110111    }
    111112
     
    126127        task.setName(name.trim());
    127128        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());
    129130    }
    130131
     
    145146        task.setFinished(finished);
    146147        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());
    148149    }
    149150
     
    187188
    188189        long total = taskRepository.countByDisciplineUser_UserId(userId);
    189         long finished = taskRepository.countByDisciplineUser_UserIdAndFinishedTrue(userId);
     190        long finished = taskRepository.countByDisciplineUser_UserIdAndStatus(userId, TaskStatus.FINISHED);
    190191
    191192        BigDecimal percent;
     
    210211        // (not strictly required for now, but matches schema and enables future analytics)
    211212        if (finished > 0) {
    212             List<TaskDailyCompletion> links = taskRepository.findByDisciplineUser_UserIdAndFinishedTrue(userId)
     213            List<TaskDailyCompletion> links = taskRepository.findByDisciplineUser_UserIdAndStatus(userId, TaskStatus.FINISHED)
    213214                    .stream()
    214215                    .map(t -> {
     
    224225
    225226        // Reset all tasks for next day
    226         taskRepository.resetFinishedForUser(userId);
     227        taskRepository.resetStatusForUser(userId, TaskStatus.NOT_STARTED);
    227228
    228229        DailyCompletionDto dto = new DailyCompletionDto(savedCompletion.getDailyCompletionId(),
Note: See TracChangeset for help on using the changeset viewer.