Add DELETE endpoint to remove a conversation by ID
This commit is contained in:
parent
d404722844
commit
3d7ba68511
@ -141,6 +141,7 @@ La aplicación expone una API REST completa:
|
|||||||
|---------------------------------------|--------|-----------------------
|
|---------------------------------------|--------|-----------------------
|
||||||
| `/api/v1/conversations` | GET | Listar conversaciones
|
| `/api/v1/conversations` | GET | Listar conversaciones
|
||||||
| `/api/v1/conversations` | POST | Crear conversación
|
| `/api/v1/conversations` | POST | Crear conversación
|
||||||
|
| `/api/v1/conversations/{id}` | DELETE | Elimina conversación
|
||||||
| `/api/v1/conversations/{id}/messages` | GET | Obtener mensajes
|
| `/api/v1/conversations/{id}/messages` | GET | Obtener mensajes
|
||||||
| `/api/v1/conversations/{id}/messages` | POST | Enviar mensaje
|
| `/api/v1/conversations/{id}/messages` | POST | Enviar mensaje
|
||||||
|
|
||||||
|
@ -0,0 +1,45 @@
|
|||||||
|
package com.pablotj.ai.chat.application.usecase;
|
||||||
|
|
||||||
|
import com.pablotj.ai.chat.domain.exception.ConversationNotFoundException;
|
||||||
|
import com.pablotj.ai.chat.domain.model.ConversationId;
|
||||||
|
import com.pablotj.ai.chat.domain.repository.ConversationRepository;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Use case for deleting a specific conversation.
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
@Transactional
|
||||||
|
public class DeleteConversationUseCase {
|
||||||
|
|
||||||
|
private static final Logger logger = LoggerFactory.getLogger(DeleteConversationUseCase.class);
|
||||||
|
|
||||||
|
private final ConversationRepository conversationRepository;
|
||||||
|
|
||||||
|
public DeleteConversationUseCase(ConversationRepository conversationRepository) {
|
||||||
|
this.conversationRepository = conversationRepository;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deletes the specified conversation.
|
||||||
|
*
|
||||||
|
* @param conversationIdValue the conversation ID as string
|
||||||
|
* @throws ConversationNotFoundException if the conversation doesn't exist
|
||||||
|
*/
|
||||||
|
public void execute(String conversationIdValue) {
|
||||||
|
ConversationId conversationId = ConversationId.of(conversationIdValue);
|
||||||
|
|
||||||
|
logger.debug("Attempting to delete conversation: {}", conversationId);
|
||||||
|
|
||||||
|
if (!conversationRepository.existsById(conversationId)) {
|
||||||
|
throw new ConversationNotFoundException(conversationId);
|
||||||
|
}
|
||||||
|
|
||||||
|
conversationRepository.deleteById(conversationId);
|
||||||
|
|
||||||
|
logger.info("Conversation deleted: {}", conversationId);
|
||||||
|
}
|
||||||
|
}
|
@ -4,6 +4,7 @@ import com.pablotj.ai.chat.application.dto.ConversationDto;
|
|||||||
import com.pablotj.ai.chat.application.dto.ConversationMessageDto;
|
import com.pablotj.ai.chat.application.dto.ConversationMessageDto;
|
||||||
import com.pablotj.ai.chat.application.dto.ConversationSummaryDto;
|
import com.pablotj.ai.chat.application.dto.ConversationSummaryDto;
|
||||||
import com.pablotj.ai.chat.application.usecase.CreateConversationUseCase;
|
import com.pablotj.ai.chat.application.usecase.CreateConversationUseCase;
|
||||||
|
import com.pablotj.ai.chat.application.usecase.DeleteConversationUseCase;
|
||||||
import com.pablotj.ai.chat.application.usecase.GetConversationHistoryUseCase;
|
import com.pablotj.ai.chat.application.usecase.GetConversationHistoryUseCase;
|
||||||
import com.pablotj.ai.chat.application.usecase.GetConversationMessagesUseCase;
|
import com.pablotj.ai.chat.application.usecase.GetConversationMessagesUseCase;
|
||||||
import com.pablotj.ai.chat.application.usecase.ProcessUserMessageUseCase;
|
import com.pablotj.ai.chat.application.usecase.ProcessUserMessageUseCase;
|
||||||
@ -23,6 +24,7 @@ import org.slf4j.LoggerFactory;
|
|||||||
import org.springframework.http.HttpStatus;
|
import org.springframework.http.HttpStatus;
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
import org.springframework.web.bind.annotation.CrossOrigin;
|
import org.springframework.web.bind.annotation.CrossOrigin;
|
||||||
|
import org.springframework.web.bind.annotation.DeleteMapping;
|
||||||
import org.springframework.web.bind.annotation.GetMapping;
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
import org.springframework.web.bind.annotation.PathVariable;
|
import org.springframework.web.bind.annotation.PathVariable;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
@ -46,16 +48,18 @@ public class ConversationController {
|
|||||||
private final GetConversationHistoryUseCase getConversationHistoryUseCase;
|
private final GetConversationHistoryUseCase getConversationHistoryUseCase;
|
||||||
private final GetConversationMessagesUseCase getConversationMessagesUseCase;
|
private final GetConversationMessagesUseCase getConversationMessagesUseCase;
|
||||||
private final ProcessUserMessageUseCase processUserMessageUseCase;
|
private final ProcessUserMessageUseCase processUserMessageUseCase;
|
||||||
|
private final DeleteConversationUseCase deleteConversationUseCase;
|
||||||
|
|
||||||
public ConversationController(
|
public ConversationController(CreateConversationUseCase createConversationUseCase,
|
||||||
CreateConversationUseCase createConversationUseCase,
|
GetConversationHistoryUseCase getConversationHistoryUseCase,
|
||||||
GetConversationHistoryUseCase getConversationHistoryUseCase,
|
GetConversationMessagesUseCase getConversationMessagesUseCase,
|
||||||
GetConversationMessagesUseCase getConversationMessagesUseCase,
|
ProcessUserMessageUseCase processUserMessageUseCase,
|
||||||
ProcessUserMessageUseCase processUserMessageUseCase) {
|
DeleteConversationUseCase deleteConversationUseCase) {
|
||||||
this.createConversationUseCase = createConversationUseCase;
|
this.createConversationUseCase = createConversationUseCase;
|
||||||
this.getConversationHistoryUseCase = getConversationHistoryUseCase;
|
this.getConversationHistoryUseCase = getConversationHistoryUseCase;
|
||||||
this.getConversationMessagesUseCase = getConversationMessagesUseCase;
|
this.getConversationMessagesUseCase = getConversationMessagesUseCase;
|
||||||
this.processUserMessageUseCase = processUserMessageUseCase;
|
this.processUserMessageUseCase = processUserMessageUseCase;
|
||||||
|
this.deleteConversationUseCase = deleteConversationUseCase;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Operation(
|
@Operation(
|
||||||
@ -152,4 +156,27 @@ public class ConversationController {
|
|||||||
|
|
||||||
return ResponseEntity.ok(aiResponse);
|
return ResponseEntity.ok(aiResponse);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Operation(
|
||||||
|
summary = "Delete a conversation",
|
||||||
|
description = "Deletes the specified conversation by its unique identifier"
|
||||||
|
)
|
||||||
|
@ApiResponses(value = {
|
||||||
|
@ApiResponse(responseCode = "204", description = "Conversation successfully deleted"),
|
||||||
|
@ApiResponse(responseCode = "404", description = "Conversation not found"),
|
||||||
|
@ApiResponse(responseCode = "500", description = "Internal server error")
|
||||||
|
})
|
||||||
|
@DeleteMapping("/{conversationId}")
|
||||||
|
public ResponseEntity<Void> deleteConversation(
|
||||||
|
@Parameter(description = "Unique conversation identifier", required = true)
|
||||||
|
@PathVariable String conversationId) {
|
||||||
|
|
||||||
|
logger.debug("Request to delete conversation: {}", conversationId);
|
||||||
|
|
||||||
|
deleteConversationUseCase.execute(conversationId);
|
||||||
|
|
||||||
|
logger.info("Conversation deleted: {}", conversationId);
|
||||||
|
|
||||||
|
return ResponseEntity.noContent().build();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user