Add: missing @RequestBody annotations in some controllers as well as some missing fields in entities.

This commit is contained in:
Jose
2026-01-26 14:16:14 +01:00
parent e4461f7790
commit c5a2c19efb
15 changed files with 122 additions and 59 deletions

View File

@@ -1,7 +1,9 @@
package net.miarma.backend.huertos.controller; package net.miarma.backend.huertos.controller;
import net.miarma.backend.huertos.dto.BalanceDto; import net.miarma.backend.huertos.dto.BalanceDto;
import net.miarma.backend.huertos.dto.view.VBalanceWithTotalsDto;
import net.miarma.backend.huertos.mapper.BalanceMapper; import net.miarma.backend.huertos.mapper.BalanceMapper;
import net.miarma.backend.huertos.mapper.view.VBalanceWithTotalsMapper;
import net.miarma.backend.huertos.model.Balance; import net.miarma.backend.huertos.model.Balance;
import net.miarma.backend.huertos.service.BalanceService; import net.miarma.backend.huertos.service.BalanceService;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
@@ -27,6 +29,12 @@ public class BalanceController {
return ResponseEntity.ok(BalanceMapper.toDto(balance)); return ResponseEntity.ok(BalanceMapper.toDto(balance));
} }
@GetMapping("/with-totals")
@PreAuthorize("hasAnyRole('HUERTOS_ROLE_ADMIN', 'HUERTOS_ROLE_DEV')")
public ResponseEntity<VBalanceWithTotalsDto> getWithTotals() {
return ResponseEntity.ok(VBalanceWithTotalsMapper.toDto(balanceService.getWithTotals()));
}
@PostMapping @PostMapping
@PreAuthorize("hasAnyRole('HUERTOS_ROLE_ADMIN', 'HUERTOS_ROLE_DEV')") @PreAuthorize("hasAnyRole('HUERTOS_ROLE_ADMIN', 'HUERTOS_ROLE_DEV')")
public ResponseEntity<BalanceDto> setBalance(BalanceDto dto) { public ResponseEntity<BalanceDto> setBalance(BalanceDto dto) {

View File

@@ -34,7 +34,7 @@ public class ExpenseController {
@PostMapping @PostMapping
@PreAuthorize("hasAnyRole('HUERTOS_ROLE_ADMIN', 'HUERTOS_ROLE_DEV')") @PreAuthorize("hasAnyRole('HUERTOS_ROLE_ADMIN', 'HUERTOS_ROLE_DEV')")
public ResponseEntity<ExpenseDto.Response> create(ExpenseDto.Request dto) { public ResponseEntity<ExpenseDto.Response> create(@RequestBody ExpenseDto.Request dto) {
return ResponseEntity.ok( return ResponseEntity.ok(
ExpenseMapper.toResponse( ExpenseMapper.toResponse(
expenseService.create( expenseService.create(

View File

@@ -1,14 +1,13 @@
package net.miarma.backend.huertos.controller; package net.miarma.backend.huertos.controller;
import net.miarma.backend.huertos.dto.ExpenseDto;
import net.miarma.backend.huertos.dto.IncomeDto; import net.miarma.backend.huertos.dto.IncomeDto;
import net.miarma.backend.huertos.dto.view.VIncomesWithFullNamesDto; import net.miarma.backend.huertos.dto.view.VIncomesWithInfoDto;
import net.miarma.backend.huertos.mapper.ExpenseMapper;
import net.miarma.backend.huertos.mapper.IncomeMapper; import net.miarma.backend.huertos.mapper.IncomeMapper;
import net.miarma.backend.huertos.mapper.view.VIncomesWithFullNamesMapper; import net.miarma.backend.huertos.mapper.view.VIncomesWithInfoMapper;
import net.miarma.backend.huertos.model.Income; import net.miarma.backend.huertos.model.Income;
import net.miarma.backend.huertos.service.HuertosUserMetadataService;
import net.miarma.backend.huertos.service.IncomeService; import net.miarma.backend.huertos.service.IncomeService;
import net.miarma.backend.huertos.service.view.VIncomesWithFullNamesService; import net.miarma.backend.huertos.service.view.VIncomesWithInfoService;
import net.miarma.backlib.security.JwtService; import net.miarma.backlib.security.JwtService;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
@@ -23,12 +22,12 @@ import java.util.UUID;
@RequestMapping("/incomes") @RequestMapping("/incomes")
public class IncomeController { public class IncomeController {
private IncomeService incomeService; private IncomeService incomeService;
private VIncomesWithFullNamesService vIncomesWithFullNamesService; private VIncomesWithInfoService vIncomesWithInfoService;
private JwtService jwtService; private JwtService jwtService;
public IncomeController(IncomeService incomeService, VIncomesWithFullNamesService vIncomesWithFullNamesService, JwtService jwtService) { public IncomeController(IncomeService incomeService, VIncomesWithInfoService vIncomesWithInfoService, JwtService jwtService) {
this.incomeService = incomeService; this.incomeService = incomeService;
this.vIncomesWithFullNamesService = vIncomesWithFullNamesService; this.vIncomesWithInfoService = vIncomesWithInfoService;
this.jwtService = jwtService; this.jwtService = jwtService;
} }
@@ -43,13 +42,13 @@ public class IncomeController {
); );
} }
@GetMapping("/with-names") @GetMapping("/with-info")
@PreAuthorize("hasAnyRole('HUERTOS_ROLE_ADMIN', 'HUERTOS_ROLE_DEV')") @PreAuthorize("hasAnyRole('HUERTOS_ROLE_ADMIN', 'HUERTOS_ROLE_DEV')")
public ResponseEntity<List<VIncomesWithFullNamesDto>> getAllWithNames() { public ResponseEntity<List<VIncomesWithInfoDto>> getAllWithInfo() {
return ResponseEntity.ok( return ResponseEntity.ok(
vIncomesWithFullNamesService.getAll() vIncomesWithInfoService.getAll()
.stream() .stream()
.map(VIncomesWithFullNamesMapper::toResponse) .map(VIncomesWithInfoMapper::toResponse)
.toList() .toList()
); );
} }
@@ -79,7 +78,7 @@ public class IncomeController {
@PostMapping @PostMapping
@PreAuthorize("hasAnyRole('HUERTOS_ROLE_ADMIN', 'HUERTOS_ROLE_DEV')") @PreAuthorize("hasAnyRole('HUERTOS_ROLE_ADMIN', 'HUERTOS_ROLE_DEV')")
public ResponseEntity<IncomeDto.Response> create(IncomeDto.Request dto) { public ResponseEntity<IncomeDto.Response> create(@RequestBody IncomeDto.Request dto) {
return ResponseEntity.ok( return ResponseEntity.ok(
IncomeMapper.toResponse( IncomeMapper.toResponse(
incomeService.create( incomeService.create(

View File

@@ -52,10 +52,10 @@ public class RequestController {
} }
@PostMapping @PostMapping
public ResponseEntity<RequestDto.Response> create(RequestDto.Request dto) { public ResponseEntity<RequestDto.Response> create(@RequestBody RequestDto.Request dto) {
return ResponseEntity.ok( return ResponseEntity.ok(
RequestMapper.toResponse( RequestMapper.toResponse(
requestService.createWaitlist( requestService.create(
RequestMapper.toEntity(dto) RequestMapper.toEntity(dto)
))); )));
} }

View File

@@ -7,11 +7,20 @@ import java.util.UUID;
public class IncomeDto { public class IncomeDto {
public static class Request { public static class Request {
private UUID userId; private UUID userId;
private Integer memberNumber;
private String concept; private String concept;
private BigDecimal amount; private BigDecimal amount;
private Byte type; private Byte type;
private Byte frequency; private Byte frequency;
public Integer getMemberNumber() {
return memberNumber;
}
public void setMemberNumber(Integer memberNumber) {
this.memberNumber = memberNumber;
}
public UUID getUserId() { public UUID getUserId() {
return userId; return userId;
} }

View File

@@ -4,10 +4,11 @@ import java.math.BigDecimal;
import java.time.Instant; import java.time.Instant;
import java.util.UUID; import java.util.UUID;
public class VIncomesWithFullNamesDto { public class VIncomesWithInfoDto {
private UUID incomeId; private UUID incomeId;
private UUID userId; private UUID userId;
private String displayName; private String displayName;
private Integer memberNumber;
private String concept; private String concept;
private BigDecimal amount; private BigDecimal amount;
private Byte type; private Byte type;
@@ -34,6 +35,14 @@ public class VIncomesWithFullNamesDto {
return displayName; return displayName;
} }
public Integer getMemberNumber() {
return memberNumber;
}
public void setMemberNumber(Integer memberNumber) {
this.memberNumber = memberNumber;
}
public void setDisplayName(String displayName) { public void setDisplayName(String displayName) {
this.displayName = displayName; this.displayName = displayName;
} }

View File

@@ -1,15 +1,16 @@
package net.miarma.backend.huertos.mapper.view; package net.miarma.backend.huertos.mapper.view;
import net.miarma.backend.huertos.dto.view.VIncomesWithFullNamesDto; import net.miarma.backend.huertos.dto.view.VIncomesWithInfoDto;
import net.miarma.backend.huertos.model.view.VIncomesWithFullNames; import net.miarma.backend.huertos.model.view.VIncomesWithInfo;
public class VIncomesWithFullNamesMapper { public class VIncomesWithInfoMapper {
public static VIncomesWithFullNamesDto toResponse(VIncomesWithFullNames entity) { public static VIncomesWithInfoDto toResponse(VIncomesWithInfo entity) {
VIncomesWithFullNamesDto dto = new VIncomesWithFullNamesDto(); VIncomesWithInfoDto dto = new VIncomesWithInfoDto();
dto.setIncomeId(entity.getIncomeId()); dto.setIncomeId(entity.getIncomeId());
dto.setUserId(entity.getUserId()); dto.setUserId(entity.getUserId());
dto.setDisplayName(entity.getDisplayName()); dto.setDisplayName(entity.getDisplayName());
dto.setMemberNumber(entity.getMemberNumber());
dto.setConcept(entity.getConcept()); dto.setConcept(entity.getConcept());
dto.setAmount(entity.getAmount()); dto.setAmount(entity.getAmount());
dto.setType(entity.getType()); dto.setType(entity.getType());

View File

@@ -24,9 +24,15 @@ public class Request {
private Byte status; private Byte status;
@Column(name = "requested_by", columnDefinition = "BINARY(16)") @Column(name = "requested_by", columnDefinition = "BINARY(16)")
private byte[] requestedByBin;
@Transient
private UUID requestedBy; private UUID requestedBy;
@Column(name = "target_user_id", columnDefinition = "BINARY(16)") @Column(name = "target_user_id", columnDefinition = "BINARY(16)")
private byte[] targetUserIdBin;
@Transient
private UUID targetUserId; private UUID targetUserId;
@Column(name = "created_at", nullable = false) @Column(name = "created_at", nullable = false)
@@ -38,6 +44,14 @@ public class Request {
if (requestId != null) { if (requestId != null) {
requestIdBin = UuidUtil.uuidToBin(requestId); requestIdBin = UuidUtil.uuidToBin(requestId);
} }
if (requestedBy != null) {
requestedByBin = UuidUtil.uuidToBin(requestedBy);
}
if (targetUserId != null) {
targetUserIdBin = UuidUtil.uuidToBin(targetUserId);
}
} }
@PostLoad @PostLoad
@@ -45,6 +59,14 @@ public class Request {
if (requestIdBin != null) { if (requestIdBin != null) {
requestId = UuidUtil.binToUUID(requestIdBin); requestId = UuidUtil.binToUUID(requestIdBin);
} }
if (requestedByBin != null) {
requestedBy = UuidUtil.binToUUID(requestedByBin);
}
if (targetUserIdBin != null) {
targetUserId = UuidUtil.binToUUID(targetUserIdBin);
}
} }
public UUID getRequestId() { public UUID getRequestId() {

View File

@@ -10,8 +10,8 @@ import java.util.UUID;
@Entity @Entity
@Immutable @Immutable
@Table(name = "v_incomes_with_full_names") @Table(name = "v_incomes_with_info")
public class VIncomesWithFullNames { public class VIncomesWithInfo {
@Id @Id
@Column(name = "income_id", columnDefinition = "BINARY(16)") @Column(name = "income_id", columnDefinition = "BINARY(16)")
@@ -29,6 +29,9 @@ public class VIncomesWithFullNames {
@Column(name = "display_name") @Column(name = "display_name")
private String displayName; private String displayName;
@Column(name = "member_number")
private Integer memberNumber;
private String concept; private String concept;
private BigDecimal amount; private BigDecimal amount;
private Byte type; private Byte type;
@@ -60,6 +63,8 @@ public class VIncomesWithFullNames {
return displayName; return displayName;
} }
public Integer getMemberNumber() { return memberNumber; }
public String getConcept() { public String getConcept() {
return concept; return concept;
} }

View File

@@ -4,7 +4,9 @@ import net.miarma.backend.huertos.model.view.VBalanceWithTotals;
import org.springframework.data.repository.Repository; import org.springframework.data.repository.Repository;
import java.util.List; import java.util.List;
import java.util.Optional;
public interface VBalanceWithTotalsRepository extends Repository<VBalanceWithTotals, byte[]> { public interface VBalanceWithTotalsRepository extends Repository<VBalanceWithTotals, Byte> {
List<VBalanceWithTotals> findAll(); List<VBalanceWithTotals> findAll();
Optional<VBalanceWithTotals> findById(Byte id);
} }

View File

@@ -1,12 +0,0 @@
package net.miarma.backend.huertos.repository.view;
import net.miarma.backend.huertos.model.view.VIncomesWithFullNames;
import org.springframework.data.repository.Repository;
import java.util.List;
import java.util.Optional;
public interface VIncomesWithFullNamesRepository extends Repository<VIncomesWithFullNames, byte[]> {
List<VIncomesWithFullNames> findAll();
Optional<VIncomesWithFullNames> findById(byte[] incomeId);
}

View File

@@ -0,0 +1,12 @@
package net.miarma.backend.huertos.repository.view;
import net.miarma.backend.huertos.model.view.VIncomesWithInfo;
import org.springframework.data.repository.Repository;
import java.util.List;
import java.util.Optional;
public interface VIncomesWithInfoRepository extends Repository<VIncomesWithInfo, byte[]> {
List<VIncomesWithInfo> findAll();
Optional<VIncomesWithInfo> findById(byte[] incomeId);
}

View File

@@ -1,8 +1,9 @@
package net.miarma.backend.huertos.service; package net.miarma.backend.huertos.service;
import java.time.Instant; import java.time.Instant;
import java.util.Optional;
import net.miarma.backend.huertos.model.view.VBalanceWithTotals;
import net.miarma.backend.huertos.repository.view.VBalanceWithTotalsRepository;
import net.miarma.backlib.exception.ConflictException; import net.miarma.backlib.exception.ConflictException;
import net.miarma.backlib.exception.NotFoundException; import net.miarma.backlib.exception.NotFoundException;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@@ -15,40 +16,47 @@ import net.miarma.backend.huertos.repository.BalanceRepository;
@Transactional @Transactional
public class BalanceService { public class BalanceService {
private final BalanceRepository repo; private final BalanceRepository balanceRepository;
private final VBalanceWithTotalsRepository vBalanceWithTotalsRepository;
public BalanceService(BalanceRepository repo) { public BalanceService(BalanceRepository balanceRepository, VBalanceWithTotalsRepository vBalanceWithTotalsRepository) {
this.repo = repo; this.balanceRepository = balanceRepository;
this.vBalanceWithTotalsRepository = vBalanceWithTotalsRepository;
} }
public Balance get() { public Balance get() {
return repo.findById((byte) 1) return balanceRepository.findById((byte) 1)
.orElseThrow(() -> new NotFoundException("Balance not found"));
}
public VBalanceWithTotals getWithTotals() {
return vBalanceWithTotalsRepository.findById((byte) 1)
.orElseThrow(() -> new NotFoundException("Balance not found")); .orElseThrow(() -> new NotFoundException("Balance not found"));
} }
public Balance create(Balance balance) { public Balance create(Balance balance) {
if (repo.existsById((byte) 1)) { if (balanceRepository.existsById((byte) 1)) {
throw new ConflictException("Balance already exists"); throw new ConflictException("Balance already exists");
} }
balance.setId((byte) 1); balance.setId((byte) 1);
balance.setCreatedAt(Instant.now()); balance.setCreatedAt(Instant.now());
return repo.save(balance); return balanceRepository.save(balance);
} }
public Balance update(Balance dto) { public Balance update(Balance dto) {
Balance balance = repo.findById((byte) 1) Balance balance = balanceRepository.findById((byte) 1)
.orElseThrow(() -> new NotFoundException("Balance not found")); .orElseThrow(() -> new NotFoundException("Balance not found"));
if (dto.getInitialBank() != null) balance.setInitialBank(dto.getInitialBank()); if (dto.getInitialBank() != null) balance.setInitialBank(dto.getInitialBank());
if (dto.getInitialCash() != null) balance.setInitialCash(dto.getInitialCash()); if (dto.getInitialCash() != null) balance.setInitialCash(dto.getInitialCash());
return repo.save(balance); return balanceRepository.save(balance);
} }
public void delete() { public void delete() {
if (!repo.existsById((byte) 1)) { if (!balanceRepository.existsById((byte) 1)) {
throw new NotFoundException("Balance not found"); throw new NotFoundException("Balance not found");
} }
repo.deleteById((byte) 1); balanceRepository.deleteById((byte) 1);
} }
} }

View File

@@ -63,7 +63,7 @@ public class RequestService {
.toList(); .toList();
} }
public Request createWaitlist(Request request) { public Request create(Request request) {
if (request.getType() == null) { if (request.getType() == null) {
throw new BadRequestException("type is required"); throw new BadRequestException("type is required");
} }

View File

@@ -7,31 +7,31 @@ import net.miarma.backlib.exception.NotFoundException;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import jakarta.transaction.Transactional; import jakarta.transaction.Transactional;
import net.miarma.backend.huertos.model.view.VIncomesWithFullNames; import net.miarma.backend.huertos.model.view.VIncomesWithInfo;
import net.miarma.backend.huertos.repository.view.VIncomesWithFullNamesRepository; import net.miarma.backend.huertos.repository.view.VIncomesWithInfoRepository;
import net.miarma.backlib.util.UuidUtil; import net.miarma.backlib.util.UuidUtil;
@Service @Service
@Transactional @Transactional
public class VIncomesWithFullNamesService { public class VIncomesWithInfoService {
private final VIncomesWithFullNamesRepository repository; private final VIncomesWithInfoRepository repository;
public VIncomesWithFullNamesService(VIncomesWithFullNamesRepository repository) { public VIncomesWithInfoService(VIncomesWithInfoRepository repository) {
this.repository = repository; this.repository = repository;
} }
public List<VIncomesWithFullNames> getAll() { public List<VIncomesWithInfo> getAll() {
return repository.findAll(); return repository.findAll();
} }
public VIncomesWithFullNames getById(UUID incomeId) { public VIncomesWithInfo getById(UUID incomeId) {
byte[] idBytes = UuidUtil.uuidToBin(incomeId); byte[] idBytes = UuidUtil.uuidToBin(incomeId);
return repository.findById(idBytes) return repository.findById(idBytes)
.orElseThrow(() -> new NotFoundException("Income not found")); .orElseThrow(() -> new NotFoundException("Income not found"));
} }
public List<VIncomesWithFullNames> getByUserId(UUID userId) { public List<VIncomesWithInfo> getByUserId(UUID userId) {
byte[] idBytes = UuidUtil.uuidToBin(userId); byte[] idBytes = UuidUtil.uuidToBin(userId);
return repository.findAll().stream() return repository.findAll().stream()
.filter(i -> i.getUserId().equals(userId)) .filter(i -> i.getUserId().equals(userId))