ProgramProgressController.java

package fr.avenirsesr.portfolio.api.application.adapter.controller;

import fr.avenirsesr.portfolio.api.application.adapter.dto.ProgramProgressDTO;
import fr.avenirsesr.portfolio.api.application.adapter.dto.ProgramProgressOverviewDTO;
import fr.avenirsesr.portfolio.api.application.adapter.dto.ProgramProgressViewDTO;
import fr.avenirsesr.portfolio.api.application.adapter.mapper.ProgramProgressMapper;
import fr.avenirsesr.portfolio.api.application.adapter.mapper.ProgramProgressOverviewMapper;
import fr.avenirsesr.portfolio.api.application.adapter.mapper.ProgramProgressViewMapper;
import fr.avenirsesr.portfolio.api.application.adapter.util.UserUtil;
import fr.avenirsesr.portfolio.api.domain.model.SortCriteria;
import fr.avenirsesr.portfolio.api.domain.model.Student;
import fr.avenirsesr.portfolio.api.domain.port.input.ProgramProgressService;
import java.security.Principal;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
@Slf4j
@AllArgsConstructor
@RequestMapping("/me/program-progress")
public class ProgramProgressController {
  private final ProgramProgressService programProgressService;
  private final UserUtil userUtil;

  @GetMapping("/overview")
  public List<ProgramProgressOverviewDTO> getSkillsOverview(Principal principal) {
    Student student = userUtil.getStudent(principal);
    return programProgressService.getSkillsOverview(student).entrySet().stream()
        .map(
            entry ->
                ProgramProgressOverviewMapper.fromDomainToDto(entry.getKey(), entry.getValue()))
        .toList();
  }

  @GetMapping("/view")
  public List<ProgramProgressViewDTO> getSkillsView(
      Principal principal, @RequestParam(name = "sort", required = false) String sortRaw) {
    SortCriteria sortCriteria = SortCriteria.fromString(sortRaw);
    Student student = userUtil.getStudent(principal);

    return programProgressService.getSkillsView(student, sortCriteria).entrySet().stream()
        .map(entry -> ProgramProgressViewMapper.fromDomainToDto(entry.getKey(), entry.getValue()))
        .toList();
  }

  @GetMapping()
  public List<ProgramProgressDTO> getAllProgramProgress(Principal principal) {
    Student student = userUtil.getStudent(principal);
    return programProgressService.getAllProgramProgress(student).stream()
        .map(ProgramProgressMapper::fromDomainToDto)
        .toList();
  }
}