package space.luminic.finance.api import org.springframework.http.HttpHeaders import org.springframework.http.MediaType import org.springframework.http.ResponseEntity import io.swagger.v3.oas.annotations.enums.SecuritySchemeType import io.swagger.v3.oas.annotations.security.SecurityScheme import org.springframework.web.bind.annotation.* import space.luminic.finance.dtos.TransactionDTO import space.luminic.finance.mappers.TransactionMapper.toDto import space.luminic.finance.services.TransactionService @RestController @RequestMapping("/spaces/{spaceId}/transactions") @SecurityScheme( name = "bearerAuth", type = SecuritySchemeType.HTTP, bearerFormat = "JWT", scheme = "bearer" ) class TransactionController ( private val transactionService: TransactionService, ){ @PostMapping("/_search") fun getTransactions(@PathVariable spaceId: Int, @RequestBody filter: TransactionService.TransactionsFilter) : List{ return transactionService.getTransactions(spaceId, filter).map { it.toDto() } } @PostMapping("/_export") fun exportExcel(@PathVariable spaceId: Int, @RequestBody filter: TransactionService.TransactionsFilter): ResponseEntity { val excelBytes = transactionService.generateExcel(spaceId, filter) val headers = HttpHeaders() headers.contentType = MediaType.APPLICATION_OCTET_STREAM headers.setContentDispositionFormData("attachment", "transactions.xlsx") return ResponseEntity.ok() .headers(headers) .body(excelBytes) } @GetMapping("/{transactionId}") fun getTransaction(@PathVariable spaceId: Int, @PathVariable transactionId: Int): TransactionDTO { return transactionService.getTransaction(spaceId, transactionId).toDto() } @PostMapping fun createTransaction(@PathVariable spaceId: Int, @RequestBody transactionDTO: TransactionDTO.CreateTransactionDTO): Map { return mapOf("id" to transactionService.createTransaction(spaceId, transactionDTO)) } @PutMapping("/{transactionId}") fun updateTransaction(@PathVariable spaceId: Int, @PathVariable transactionId: Int, @RequestBody transactionDTO: TransactionDTO.UpdateTransactionDTO): Map { return mapOf("id" to transactionService.updateTransaction(spaceId, transactionId, transactionDTO)) } @DeleteMapping("/{transactionId}") fun deleteTransaction(@PathVariable spaceId: Int, @PathVariable transactionId: Int) { transactionService.deleteTransaction(spaceId, transactionId) } }