MessageController.java
package com.seebie.server.controller;
import com.seebie.server.dto.MessageDto;
import com.seebie.server.service.MessageService;
import jakarta.validation.Valid;
import org.springframework.http.MediaType;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.UUID;
// if we use server.servlet.context-path=/api, static content and API all come from the same base
// so we can use that for api-only requests only if the UI is served separately
@RestController
@RequestMapping(path="/api", produces = MediaType.APPLICATION_JSON_VALUE)
public class MessageController {
private final MessageService messageService;
public MessageController(MessageService messageService) {
this.messageService = messageService;
}
@PreAuthorize("hasRole('ROLE_ADMIN') || #publicId == authentication.principal.publicId")
@GetMapping("/user/{publicId}/chat")
public List<MessageDto> getChatHistory(@PathVariable UUID publicId) {
return messageService.getMessages(publicId);
}
@PreAuthorize("hasRole('ROLE_ADMIN') || #publicId == authentication.principal.publicId")
@PostMapping("/user/{publicId}/chat")
public MessageDto submitPrompt(@Valid @RequestBody MessageDto prompt, @PathVariable UUID publicId) {
return messageService.processPrompt(prompt, publicId);
}
@PreAuthorize("hasRole('ROLE_ADMIN') || #publicId == authentication.principal.publicId")
@DeleteMapping("/user/{publicId}/chat")
public void deleteChatHistory(@PathVariable UUID publicId) {
messageService.deleteMessages(publicId);
}
}