package com.sb.web.account.service; import com.sb.web.account.domain.QuickEntry; import com.sb.web.account.dto.QuickEntryRequest; import com.sb.web.account.dto.QuickEntryResponse; import com.sb.web.account.mapper.QuickEntryMapper; import com.sb.web.common.exception.ApiException; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; /** * 자주 쓰는 내역(빠른 등록 템플릿) 서비스 — 사용자별. */ @Service @RequiredArgsConstructor public class QuickEntryService { private final QuickEntryMapper mapper; public List list(Long memberId) { return mapper.findByMember(memberId).stream().map(QuickEntryResponse::from).toList(); } @Transactional public QuickEntryResponse create(QuickEntryRequest req, Long memberId) { Integer max = mapper.maxSortOrder(memberId); QuickEntry e = QuickEntry.builder() .memberId(memberId) .label(blankToNull(req.getLabel())) .type(req.getType()) .category("EXPENSE".equals(req.getType()) || "INCOME".equals(req.getType()) ? blankToNull(req.getCategory()) : null) .amount(req.getAmount()) .memo(blankToNull(req.getMemo())) .walletId(req.getWalletId()) .sortOrder(max == null ? 0 : max + 1) .build(); mapper.insert(e); return QuickEntryResponse.from(mapper.findByIdAndMember(e.getId(), memberId)); } @Transactional public void delete(Long id, Long memberId) { if (mapper.findByIdAndMember(id, memberId) == null) { throw new ApiException(HttpStatus.NOT_FOUND, "자주 쓰는 내역을 찾을 수 없습니다."); } mapper.delete(id, memberId); } private String blankToNull(String s) { return (s == null || s.isBlank()) ? null : s.trim(); } }