In your .API/Controllers
folder, add a new controller called MessagesController.cs
.
We'll start by adding an Authorize
attribute, adding our ActionFilter
to log user activity, and adding our Route
attribute. We'll also inject our MessageService
and UserService
into the controller:
Copy [Authorize]
[ServiceFilter(typeof(LogUserActivity))]
[Route("api/users/{userId}/[controller]")]
public class MessagesController : Controller
{
private readonly IMessageService _messageService;
private readonly IUserService _userService;
public MessagesController(IMessageService messageService, IUserService userService)
{
_messageService = messageService;
_userService = userService;
}
}
Add Get Message Method
Next, we'll add a GetMessage()
method. We'll give it a Name
attribute, because we'll use it in our Create
route (remember CreatedAtRoute()
?).
Copy [HttpGet("{id}", Name = "GetMessage")]
public async Task<IActionResult> GetMessage(int userId, int id)
{
if (userId != int.Parse(User.FindFirst(ClaimTypes.NameIdentifier).Value))
return Unauthorized();
var message = await _messageService.GetMessage(id);
if (message == null)
return NotFound();
return Ok(message);
}
Add Create Message Method
Next, we'll add a CreateMessage()
method below:
Copy [HttpPost]
public async Task<IActionResult> CreateMessage(int userId, [FromBody] MessageForCreation messageForCreation)
{
if (userId != int.Parse(User.FindFirst(ClaimTypes.NameIdentifier).Value))
return Unauthorized();
messageForCreation.SenderId = userId;
var messageToReturn = await _messageService.CreateMessage(messageForCreation);
if (messageToReturn != null)
return CreatedAtRoute("GetMessage", new { id = messageToReturn.Id }, messageToReturn);
throw new Exception("Creating the message failed on save.");
}
Testing in Postman
Get a fresh token from the /api/auth/login
endpoint.
Send a POST
request to http://localhost:5000/api/users/{senderId}/messages
. Supply the user Id of the user you have the token for in the endpoint.
We'll also include a body with the recipientId
and the message content
. Here's an example:
Copy {
"recipientId": "2104",
"content": "Test message from Anita to Flores"
}
You should get a 201 Created
response with the senderId
, recipientId
, dateSent
, and content
in the response: