package space.luminic.finance.services import org.springframework.stereotype.Service import space.luminic.finance.dtos.RecurrentOperationDTO import space.luminic.finance.models.NotFoundException import space.luminic.finance.models.RecurrentOperation import space.luminic.finance.repos.RecurrentOperationRepo import space.luminic.finance.repos.SpaceRepo @Service class RecurrentOperationServiceImpl( private val authService: AuthService, private val spaceRepo: SpaceRepo, private val recurrentOperationRepo: RecurrentOperationRepo, private val categoryService: CategoryService ): RecurrentOperationService { override fun findBySpaceId(spaceId: Int): List { val userId = authService.getSecurityUserId() spaceRepo.findSpaceById(spaceId, userId) return recurrentOperationRepo.findAllBySpaceId(spaceId) } override fun findBySpaceIdAndId( spaceId: Int, id: Int ): RecurrentOperation { val userId = authService.getSecurityUserId() spaceRepo.findSpaceById(spaceId, userId) return recurrentOperationRepo.findBySpaceIdAndId(spaceId, id) ?: throw NotFoundException("Cannot find recurrent operation with id ${id}") } override fun create(spaceId: Int, operation: RecurrentOperationDTO.CreateRecurrentOperationDTO): Int { val userId = authService.getSecurityUserId() val space = spaceRepo.findSpaceById(spaceId, userId) ?: throw NotFoundException("Cannot find space with id ${spaceId}") val category = categoryService.getCategory(spaceId, operation.categoryId) val creatingOperation = RecurrentOperation( space = space, category = category, name = operation.name, amount = operation.amount, date = operation.date ) return recurrentOperationRepo.create(creatingOperation, userId) } override fun update(spaceId: Int, operationId: Int, operation: RecurrentOperationDTO.UpdateRecurrentOperationDTO) { val userId = authService.getSecurityUserId() spaceRepo.findSpaceById(spaceId, userId) val newCategory = categoryService.getCategory(spaceId, operation.categoryId) val existingOperation = recurrentOperationRepo.findBySpaceIdAndId(spaceId,operationId ) ?: throw NotFoundException("Cannot find operation with id $operationId") val updatedOperation = existingOperation.copy( category = newCategory, name = operation.name, amount = operation.amount, date = operation.date ) recurrentOperationRepo.update(updatedOperation, userId) } override fun delete(spaceId: Int, id: Int) { val userId = authService.getSecurityUserId() spaceRepo.findSpaceById(spaceId, userId) recurrentOperationRepo.delete(id) } }