Files
luminic-space-back-v2/src/main/kotlin/space/luminic/finance/api/TransactionController.kt
2026-03-10 15:11:09 +03:00

66 lines
2.5 KiB
Kotlin

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<TransactionDTO>{
return transactionService.getTransactions(spaceId, filter).map { it.toDto() }
}
@PostMapping("/_export")
fun exportExcel(@PathVariable spaceId: Int, @RequestBody filter: TransactionService.TransactionsFilter): ResponseEntity<ByteArray> {
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<String, Int> {
return mapOf("id" to transactionService.createTransaction(spaceId, transactionDTO))
}
@PutMapping("/{transactionId}")
fun updateTransaction(@PathVariable spaceId: Int, @PathVariable transactionId: Int, @RequestBody transactionDTO: TransactionDTO.UpdateTransactionDTO): Map<String, Int> {
return mapOf("id" to transactionService.updateTransaction(spaceId, transactionId, transactionDTO))
}
@DeleteMapping("/{transactionId}")
fun deleteTransaction(@PathVariable spaceId: Int, @PathVariable transactionId: Int) {
transactionService.deleteTransaction(spaceId, transactionId)
}
}