UserController.java

package cl.prgm.portaltrip.infrastructure.web.controller;

import java.util.UUID;

import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import cl.prgm.portaltrip.application.service.PortalActivityService;
import cl.prgm.portaltrip.application.service.UserService;
import cl.prgm.portaltrip.infrastructure.web.dto.ApiResponseDto;
import cl.prgm.portaltrip.infrastructure.web.dto.PortalActivityRequestDto;
import cl.prgm.portaltrip.infrastructure.web.dto.PortalActivityResponseDto;
import cl.prgm.portaltrip.infrastructure.web.dto.UserProfileResponseDto;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import jakarta.validation.Valid;

@RestController
@RequestMapping(path = "/api/v1/users", produces = MediaType.APPLICATION_JSON_VALUE)
@Tag(name = "Users")
@SecurityRequirement(name = "bearerAuth")
public class UserController {

	private final UserService userService;
	private final PortalActivityService portalActivityService;

	public UserController(UserService userService, PortalActivityService portalActivityService) {
		this.userService = userService;
		this.portalActivityService = portalActivityService;
	}

	@GetMapping("/me")
	@Operation(summary = "Get the authenticated user and current balance")
	public ApiResponseDto<UserProfileResponseDto> me(JwtAuthenticationToken authentication) {
		UUID userId = UUID.fromString(authentication.getToken().getClaimAsString("user_id"));
		UserProfileResponseDto user = UserProfileResponseDto.from(userService.findById(userId));
		return ApiResponseDto.success(HttpStatus.OK, "Profile retrieved successfully", user);
	}

	@PostMapping("/me/portal-activity/start")
	@Operation(summary = "Start or resume a portal interaction cycle")
	public ApiResponseDto<PortalActivityResponseDto> startPortalActivity(JwtAuthenticationToken authentication) {
		UUID userId = UUID.fromString(authentication.getToken().getClaimAsString("user_id"));
		return ApiResponseDto.success(HttpStatus.OK, "Portal activity started", portalActivityService.start(userId));
	}

	@PostMapping("/me/portal-activity")
	@Operation(summary = "Validate activity and credit a completed portal interaction")
	public ApiResponseDto<PortalActivityResponseDto> reportPortalActivity(JwtAuthenticationToken authentication,
			@Valid @RequestBody PortalActivityRequestDto sample) {
		UUID userId = UUID.fromString(authentication.getToken().getClaimAsString("user_id"));
		return ApiResponseDto.success(HttpStatus.OK, "Portal activity recorded", portalActivityService.report(userId, sample));
	}
}