DeclaredExperienceController.java

package fr.avenirsesr.portfolio.student.progress.declared.experience.application.adapter.controller;

import fr.avenirsesr.portfolio.common.data.application.adapter.dto.PageInfoDTO;
import fr.avenirsesr.portfolio.common.data.application.adapter.response.PagedResponse;
import fr.avenirsesr.portfolio.common.data.domain.model.PageCriteria;
import fr.avenirsesr.portfolio.common.data.domain.model.PagedResult;
import fr.avenirsesr.portfolio.student.progress.declared.experience.application.adapter.dto.DeclaredExperienceRequest;
import fr.avenirsesr.portfolio.student.progress.declared.experience.application.adapter.dto.DeclaredExperienceViewDTO;
import fr.avenirsesr.portfolio.student.progress.declared.experience.application.adapter.mapper.DeclaredExperienceMapper;
import fr.avenirsesr.portfolio.student.progress.declared.experience.domain.model.DeclaredExperience;
import fr.avenirsesr.portfolio.student.progress.declared.experience.domain.port.input.DeclaredExperienceService;
import jakarta.validation.Valid;
import java.net.URI;
import java.util.List;
import java.util.UUID;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

@Slf4j
@AllArgsConstructor
@RestController
@RequestMapping("/me/declared/experiences")
public class DeclaredExperienceController {
  private final DeclaredExperienceService declaredExperienceService;

  @PostMapping("/")
  public ResponseEntity<DeclaredExperienceViewDTO> createDeclaredExperience(
      @Valid @RequestBody DeclaredExperienceRequest request) {
    DeclaredExperience experience =
        declaredExperienceService.create(
            request.title(),
            request.experienceType(),
            request.organization(),
            request.activitySector(),
            request.location(),
            request.description(),
            request.sourceOfInformation(),
            request.summary(),
            request.externalLink(),
            request.startDate(),
            request.endDate());

    return ResponseEntity.created(URI.create("/me/declared/experiences/" + experience.getId()))
        .body(DeclaredExperienceMapper.toDTO(experience));
  }

  @GetMapping("/{experienceId}")
  public ResponseEntity<DeclaredExperienceViewDTO> getDeclaredExperience(
      @Valid @PathVariable UUID experienceId) {
    DeclaredExperience experience = declaredExperienceService.get(experienceId);

    return ResponseEntity.ok(DeclaredExperienceMapper.toDTO(experience));
  }

  @GetMapping("/view")
  public ResponseEntity<PagedResponse<DeclaredExperienceViewDTO>> getDeclaredExperienceView(
      @RequestParam(required = false) Integer page,
      @RequestParam(required = false) Integer pageSize) {
    PagedResult<DeclaredExperience> pagedExperiences =
        declaredExperienceService.getView(new PageCriteria(page, pageSize));

    return ResponseEntity.ok(
        new PagedResponse<>(
            pagedExperiences.content().stream().map(DeclaredExperienceMapper::toDTO).toList(),
            PageInfoDTO.fromDomain(pagedExperiences.pageInfo())));
  }

  @PutMapping("/{experienceId}")
  public ResponseEntity<DeclaredExperienceViewDTO> updateDeclaredExperience(
      @Valid @PathVariable UUID experienceId,
      @Valid @RequestBody DeclaredExperienceRequest request) {
    var experience =
        declaredExperienceService.update(
            experienceId,
            request.title(),
            request.experienceType(),
            request.organization(),
            request.activitySector(),
            request.location(),
            request.description(),
            request.sourceOfInformation(),
            request.summary(),
            request.externalLink(),
            request.startDate(),
            request.endDate());

    return ResponseEntity.ok(DeclaredExperienceMapper.toDTO(experience));
  }

  @DeleteMapping("/")
  public ResponseEntity<String> deleteDeclaredExperiences(@RequestBody List<UUID> experienceIds) {
    declaredExperienceService.delete(experienceIds);
    return ResponseEntity.ok("Declared experiences successfully deleted");
  }
}