Changeset 42da64d for backend


Ignore:
Timestamp:
05/13/26 00:35:13 (8 weeks ago)
Author:
Andrej <asumanovski@…>
Branches:
master
Children:
447c39f
Parents:
a8381b1
Message:

Fixed auth issue

Location:
backend
Files:
3 added
2 deleted
9 edited

Legend:

Unmodified
Added
Removed
  • backend/src/main/java/com/trekr/backend/repository/TrainingSessionRepository.java

    ra8381b1 r42da64d  
    77import org.springframework.stereotype.Repository;
    88
     9import java.time.LocalDate;
     10import java.util.Collection;
     11
    912@Repository
    1013public interface TrainingSessionRepository extends JpaRepository<TrainingSession, Long> {
    1114    Page<TrainingSession> findByTrainingUser_UserIdOrderByDateDesc(Long userId, Pageable pageable);
    1215    java.util.List<TrainingSession> findByTrainingUser_UserIdAndDate(Long userId, java.time.LocalDate date);
     16
     17    @SuppressWarnings("unused")
     18    java.util.List<TrainingSession> findByTrainingUser_UserIdAndDateIn(Long userId, Collection<LocalDate> dates);
    1319}
  • backend/src/main/java/com/trekr/backend/service/AuthService.java

    ra8381b1 r42da64d  
    4343    }
    4444
     45    @Transactional(readOnly = true)
    4546    public AuthResponse login(LoginRequest request) {
    4647        String usernameOrEmail = request.getUsernameOrEmail().trim();
  • backend/src/main/java/com/trekr/backend/service/CustomTrackingService.java

    ra8381b1 r42da64d  
    3636    }
    3737
     38    @Transactional(readOnly = true)
    3839    public CustomTrackingCategoriesResponse getCustomTrackingCategories(Long userId) {
    3940        List<CustomTrackingCategoryDto> items = customTrackingCategoryRepository
     
    7273    }
    7374
     75    @Transactional(readOnly = true)
    7476    public TasksResponse getCustomCategoryTasks(Long userId, Long customTrackingId) {
    7577        requireOwnership(userId, customTrackingId);
  • backend/src/main/java/com/trekr/backend/service/DisciplineService.java

    ra8381b1 r42da64d  
    7171    }
    7272
     73    @Transactional(readOnly = true)
    7374    public TasksResponse getTasks(Long userId, int page, int size) {
    7475        if (!disciplineUserRepository.existsById(userId)) {
     
    162163     * Computes the daily completion percentage for the given date:
    163164     * finished_tasks / total_tasks * 100
    164      *
    165165     * - Persisted once per user+date. If already computed, it is not re-computed.
    166166     * - After computing, all tasks for that user are reset to unfinished.
     
    210210        // (not strictly required for now, but matches schema and enables future analytics)
    211211        if (finished > 0) {
    212             List<Task> finishedTasks = taskRepository.findByDisciplineUser_UserIdAndFinishedTrue(userId);
    213             for (Task t : finishedTasks) {
    214                 TaskDailyCompletion link = new TaskDailyCompletion();
    215                 link.setTask(t);
    216                 link.setDailyCompletion(savedCompletion);
    217                 link.setId(new TaskDailyCompletionId(t.getTaskId(), savedCompletion.getDailyCompletionId()));
    218                 taskDailyCompletionRepository.save(link);
    219             }
     212            List<TaskDailyCompletion> links = taskRepository.findByDisciplineUser_UserIdAndFinishedTrue(userId)
     213                    .stream()
     214                    .map(t -> {
     215                        TaskDailyCompletion link = new TaskDailyCompletion();
     216                        link.setTask(t);
     217                        link.setDailyCompletion(savedCompletion);
     218                        link.setId(new TaskDailyCompletionId(t.getTaskId(), savedCompletion.getDailyCompletionId()));
     219                        return link;
     220                    })
     221                    .toList();
     222            taskDailyCompletionRepository.saveAll(links);
    220223        }
    221224
     
    228231    }
    229232
     233    @Transactional(readOnly = true)
    230234    public DailyCompletionsResponse getDailyCompletions(Long userId, int page, int size) {
    231235        if (!disciplineUserRepository.existsById(userId)) {
  • backend/src/main/java/com/trekr/backend/service/FinanceService.java

    ra8381b1 r42da64d  
    6969    }
    7070
     71    @Transactional(readOnly = true)
    7172    public FinanceProfileResponse getProfile(Long userId) {
    7273        FinanceUser financeUser = financeUserRepository.findById(userId)
     
    8182    }
    8283
     84    @Transactional(readOnly = true)
    8385    public IncomesResponse getIncomes(Long userId, int page, int size) {
    8486        if (!financeUserRepository.existsById(userId)) {
  • backend/src/main/java/com/trekr/backend/service/InvestingService.java

    ra8381b1 r42da64d  
    5353    }
    5454
     55    @Transactional(readOnly = true)
    5556    public InvestingAssetsResponse getAssets(Long userId, int page, int size) {
    5657        if (!investorUserRepository.existsById(userId)) {
  • backend/src/main/java/com/trekr/backend/service/TrainingService.java

    ra8381b1 r42da64d  
    2121import java.math.RoundingMode;
    2222import java.time.LocalDate;
     23import java.util.Arrays;
    2324import java.util.List;
    2425import java.util.Locale;
     
    108109    }
    109110
     111    @Transactional(readOnly = true)
    110112    public TrainingSessionsResponse getSessions(Long userId, int page, int size) {
    111113        if (!trainingUserRepository.existsById(userId)) {
     
    134136    }
    135137
     138    @Transactional(readOnly = true)
    136139    public TrainingProfileResponse getProfile(Long userId) {
    137140        TrainingUser trainingUser = trainingUserRepository.findById(userId)
     
    202205
    203206        String normalized = type.replace('_', '-');
    204         return List.of(normalized.split("-"))
    205                 .stream()
    206                 .filter(part -> part != null && !part.isBlank())
     207        return Arrays.stream(normalized.split("-"))
     208                .filter(part -> !part.isBlank())
    207209                .map(part -> Character.toUpperCase(part.charAt(0)) + part.substring(1))
    208210                .collect(Collectors.joining(" "));
  • backend/src/main/java/com/trekr/backend/service/WeightService.java

    ra8381b1 r42da64d  
    2121import java.math.BigDecimal;
    2222import java.time.LocalDate;
     23import java.util.HashMap;
    2324import java.util.List;
     25import java.util.Map;
    2426
    2527@Service
     
    7375    }
    7476
     77    @Transactional(readOnly = true)
    7578    public WeightProfileResponse getProfile(Long userId) {
    7679        WeightUser weightUser = weightUserRepository.findById(userId)
     
    8487    }
    8588
     89    @Transactional(readOnly = true)
    8690    public WeightDailyIntakesResponse getDailyIntakes(Long userId, int page, int size) {
    8791        if (!weightUserRepository.existsById(userId)) {
     
    9296                .findByWeightUser_UserIdOrderByDateDesc(userId, PageRequest.of(page, size));
    9397
     98        List<LocalDate> dates = result.getContent().stream()
     99                .map(DailyIntake::getDate)
     100                .distinct()
     101                .toList();
     102
     103        Map<LocalDate, Integer> trainingCountsByDate = new HashMap<>();
     104        Map<LocalDate, BigDecimal> burnedCaloriesByDate = new HashMap<>();
     105        if (!dates.isEmpty()) {
     106            trainingSessionRepository.findByTrainingUser_UserIdAndDateIn(userId, dates).forEach(session -> {
     107                LocalDate sessionDate = session.getDate();
     108                trainingCountsByDate.merge(sessionDate, 1, Integer::sum);
     109                BigDecimal calories = session.getCalories() != null ? session.getCalories() : BigDecimal.ZERO;
     110                burnedCaloriesByDate.merge(sessionDate, calories, BigDecimal::add);
     111            });
     112        }
     113
    94114        List<WeightDailyIntakeDto> intakes = result.getContent().stream()
    95115                .map(d -> {
    96                     // Fetch training data for this date
    97                     var trainingSessions = trainingSessionRepository.findByTrainingUser_UserIdAndDate(userId, d.getDate());
    98                     boolean trainedThatDay = !trainingSessions.isEmpty();
    99                     BigDecimal burnedCalories = trainingSessions.stream()
    100                             .map(ts -> ts.getCalories() != null ? ts.getCalories() : BigDecimal.ZERO)
    101                             .reduce(BigDecimal.ZERO, BigDecimal::add)
     116                    boolean trainedThatDay = trainingCountsByDate.getOrDefault(d.getDate(), 0) > 0;
     117                    BigDecimal burnedCalories = burnedCaloriesByDate.getOrDefault(d.getDate(), BigDecimal.ZERO)
    102118                            .setScale(2, java.math.RoundingMode.HALF_UP);
    103                    
     119
    104120                    return new WeightDailyIntakeDto(
    105121                            d.getDailyIntakeId(),
     
    143159    }
    144160
    145     @Transactional
    146161    public WeightProfileResponse updateProfile(Long userId, WeightStartRequest request) {
    147162        WeightUser weightUser = weightUserRepository.findById(userId)
     
    163178    }
    164179
     180    @Transactional(readOnly = true)
    165181    public TodayTrainingInfoDto getTodayTrainingInfo(Long userId) {
    166182        // Try to get training user, if doesn't exist just return zeros
  • backend/src/main/resources/application.properties

    ra8381b1 r42da64d  
    4343spring.datasource.hikari.pool-name=trekrHikariPool
    4444# Remote PostgreSQL (especially via SSH tunnel) often has a small max_connections.
    45 # Use conservative defaults to avoid exhausting connection slots; override via env if needed.
    46 spring.datasource.hikari.maximum-pool-size=${SPRING_DATASOURCE_HIKARI_MAX_POOL_SIZE:4}
    47 spring.datasource.hikari.minimum-idle=${SPRING_DATASOURCE_HIKARI_MIN_IDLE:0}
     45# Use a slightly larger default so the app can serve more concurrent users without
     46# overloading the database; override via env if your provider has tighter limits.
     47spring.datasource.hikari.maximum-pool-size=${SPRING_DATASOURCE_HIKARI_MAX_POOL_SIZE:20}
     48spring.datasource.hikari.minimum-idle=${SPRING_DATASOURCE_HIKARI_MIN_IDLE:5}
    4849spring.datasource.hikari.connection-timeout=30000
    4950spring.datasource.hikari.idle-timeout=600000
Note: See TracChangeset for help on using the changeset viewer.