DeviceController.java

package com.oliwier.listmebackend.api;

import com.oliwier.listmebackend.api.dto.DeviceResponse;
import com.oliwier.listmebackend.api.dto.UpdateDeviceRequest;
import com.oliwier.listmebackend.domain.model.Device;
import com.oliwier.listmebackend.domain.repository.DeviceRepository;
import com.oliwier.listmebackend.identity.CurrentDevice;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.server.ResponseStatusException;

import java.util.UUID;

@RestController
@RequestMapping("/api/devices")
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class DeviceController {

    private final DeviceRepository deviceRepository;

    @GetMapping("/me")
    public DeviceResponse me(@CurrentDevice Device device) {
        return DeviceResponse.from(device);
    }

    @PatchMapping("/me")
    @Transactional
    public DeviceResponse updateMe(@CurrentDevice Device device,
                                   @Valid @RequestBody UpdateDeviceRequest req) {
        device.setDisplayName(req.displayName());
        device.setProfilePicture(req.profilePicture());
        return DeviceResponse.from(deviceRepository.save(device));
    }

    @GetMapping("/{deviceId}")
    public DeviceResponse getDevice(@PathVariable UUID deviceId) {
        return deviceRepository.findById(deviceId)
                .map(DeviceResponse::from)
                .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Device not found"));
    }
}