ItemHistoryController.java

package com.oliwier.listmebackend.api;

import com.oliwier.listmebackend.api.dto.ItemHistoryResponse;
import com.oliwier.listmebackend.domain.model.Device;
import com.oliwier.listmebackend.domain.repository.ItemRepository;
import com.oliwier.listmebackend.identity.CurrentDevice;
import lombok.RequiredArgsConstructor;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;

import java.math.BigDecimal;
import java.util.List;

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

    private final ItemRepository itemRepository;

    @GetMapping("/history")
    public List<ItemHistoryResponse> getHistory(
            @CurrentDevice Device device,
            @RequestParam(defaultValue = "") String q,
            @RequestParam(defaultValue = "8") int limit) {

        int cap = Math.min(limit, 20);
        List<Object[]> rows = itemRepository.findHistoryRaw(
                device.getId().toString(), q.trim(), cap);

        return rows.stream().map(r -> new ItemHistoryResponse(
                (String) r[0],
                (String) r[1],
                r[2] != null ? new BigDecimal(r[2].toString()) : null,
                (String) r[3]
        )).toList();
    }
}