add GetCommentById and TokenViewModel

This commit is contained in:
YuukanOO 2021-01-15 10:10:24 +01:00
parent 3bb2982057
commit e8a4a87bb3
6 changed files with 180 additions and 61 deletions

View File

@ -0,0 +1,17 @@
using System;
using System.ComponentModel.DataAnnotations;
using MediatR;
namespace MyHN.Application
{
public class GetCommentByIdQuery : IRequest<CommentDto>
{
[Required]
public Guid Id { get; set; }
public GetCommentByIdQuery(Guid id)
{
Id = id;
}
}
}

View File

@ -0,0 +1,34 @@
using System.Threading;
using System.Threading.Tasks;
using MediatR;
using System.Linq;
using MyHN.Domain;
namespace MyHN.Application
{
public class GetCommentByIdQueryHandler : IRequestHandler<GetCommentByIdQuery, CommentDto>
{
private readonly IContext _context;
public GetCommentByIdQueryHandler(IContext context)
{
_context = context;
}
public Task<CommentDto> Handle(GetCommentByIdQuery request, CancellationToken cancellationToken)
{
var result = from comment in _context.Comments
where comment.Id == request.Id
select new CommentDto
{
Id = comment.Id,
CreatedAt = comment.CreatedAt,
Content = comment.Content,
UpvotesCount = comment.Votes.Count(v => v.Direction == VoteType.Up),
DownvotesCount = comment.Votes.Count(v => v.Direction == VoteType.Down)
};
return Task.FromResult(result.Single());
}
}
}

View File

@ -31,6 +31,11 @@ namespace Api.Controllers
_factory = factory; _factory = factory;
} }
/// <summary>
/// Permet de créer un nouveau compte utilisateur sur la plateforme.
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[HttpPost] [HttpPost]
[ProducesResponseType(StatusCodes.Status400BadRequest)] [ProducesResponseType(StatusCodes.Status400BadRequest)]
[ProducesResponseType(StatusCodes.Status204NoContent)] [ProducesResponseType(StatusCodes.Status204NoContent)]
@ -46,9 +51,14 @@ namespace Api.Controllers
return NoContent(); return NoContent();
} }
/// <summary>
/// Permet de récupèrer un jeton pour un utilisateur afin d'effectuer des appels authentifiés.
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[HttpPost("token")] [HttpPost("token")]
[ProducesResponseType(StatusCodes.Status400BadRequest)] [ProducesResponseType(StatusCodes.Status400BadRequest)]
[ProducesResponseType(typeof(string), StatusCodes.Status200OK)] [ProducesResponseType(typeof(TokenViewModel), StatusCodes.Status200OK)]
public async Task<IActionResult> Login(LoginViewModel request) public async Task<IActionResult> Login(LoginViewModel request)
{ {
var user = await _userManager.FindByNameAsync(request.Username); var user = await _userManager.FindByNameAsync(request.Username);
@ -80,7 +90,7 @@ namespace Api.Controllers
SecurityAlgorithms.HmacSha256Signature), SecurityAlgorithms.HmacSha256Signature),
}; };
return Ok(new JwtSecurityTokenHandler().CreateEncodedJwt(tokenDescriptor)); return Ok(new TokenViewModel(user.UserName, new JwtSecurityTokenHandler().CreateEncodedJwt(tokenDescriptor)));
} }
} }
} }

View File

@ -33,7 +33,15 @@ namespace Api.Controllers
public async Task<IActionResult> CreateComment(CommentLinkCommand command) public async Task<IActionResult> CreateComment(CommentLinkCommand command)
{ {
var commentId = await _bus.Send(command); var commentId = await _bus.Send(command);
return Created($"comments/{commentId}", null); return CreatedAtAction(nameof(GetById), new { id = commentId }, null);
}
[HttpGet("{id:guid}")]
[ProducesResponseType(StatusCodes.Status404NotFound)]
[ProducesResponseType(typeof(CommentDto), StatusCodes.Status200OK)]
public async Task<CommentDto> GetById(Guid id)
{
return await _bus.Send(new GetCommentByIdQuery(id));
} }
/// <summary> /// <summary>
@ -75,15 +83,5 @@ namespace Api.Controllers
}); });
return NoContent(); return NoContent();
} }
[HttpGet("me")]
public IActionResult Me()
{
return Ok(new
{
UserId = User.Identity.Name,
Authenticated = User.Identity.IsAuthenticated
});
}
} }
} }

View File

@ -0,0 +1,19 @@
using System.ComponentModel.DataAnnotations;
namespace Api.Models
{
public class TokenViewModel
{
[Required]
public string Token { get; set; }
[Required]
public string Username { get; set; }
public TokenViewModel(string username, string token)
{
Token = token;
Username = username;
}
}
}

View File

@ -11,6 +11,7 @@
"tags": [ "tags": [
"Accounts" "Accounts"
], ],
"summary": "Permet de créer un nouveau compte utilisateur sur la plateforme.",
"operationId": "Accounts_Register", "operationId": "Accounts_Register",
"requestBody": { "requestBody": {
"x-name": "request", "x-name": "request",
@ -46,6 +47,7 @@
"tags": [ "tags": [
"Accounts" "Accounts"
], ],
"summary": "Permet de récupèrer un jeton pour un utilisateur afin d'effectuer des appels authentifiés.",
"operationId": "Accounts_Login", "operationId": "Accounts_Login",
"requestBody": { "requestBody": {
"x-name": "request", "x-name": "request",
@ -75,7 +77,7 @@
"content": { "content": {
"application/json": { "application/json": {
"schema": { "schema": {
"type": "string" "$ref": "#/components/schemas/TokenViewModel"
} }
} }
} }
@ -139,6 +141,48 @@
} }
} }
}, },
"/api/comments/{id}": {
"get": {
"tags": [
"Comments"
],
"operationId": "Comments_GetById",
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "string",
"format": "guid"
},
"x-position": 1
}
],
"responses": {
"404": {
"description": "",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ProblemDetails"
}
}
}
},
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/CommentDto"
}
}
}
}
}
}
},
"/api/comments/{id}/upvote": { "/api/comments/{id}/upvote": {
"put": { "put": {
"tags": [ "tags": [
@ -231,27 +275,6 @@
} }
} }
}, },
"/api/comments/me": {
"get": {
"tags": [
"Comments"
],
"operationId": "Comments_Me",
"responses": {
"200": {
"description": "",
"content": {
"application/octet-stream": {
"schema": {
"type": "string",
"format": "binary"
}
}
}
}
}
}
},
"/api/links": { "/api/links": {
"get": { "get": {
"tags": [ "tags": [
@ -551,6 +574,24 @@
} }
} }
}, },
"TokenViewModel": {
"type": "object",
"additionalProperties": false,
"required": [
"token",
"username"
],
"properties": {
"token": {
"type": "string",
"minLength": 1
},
"username": {
"type": "string",
"minLength": 1
}
}
},
"LoginViewModel": { "LoginViewModel": {
"type": "object", "type": "object",
"additionalProperties": false, "additionalProperties": false,
@ -588,6 +629,32 @@
} }
} }
}, },
"CommentDto": {
"type": "object",
"additionalProperties": false,
"properties": {
"id": {
"type": "string",
"format": "guid"
},
"createdAt": {
"type": "string",
"format": "date-time"
},
"content": {
"type": "string",
"nullable": true
},
"upvotesCount": {
"type": "integer",
"format": "int32"
},
"downvotesCount": {
"type": "integer",
"format": "int32"
}
}
},
"LinkDto": { "LinkDto": {
"type": "object", "type": "object",
"additionalProperties": false, "additionalProperties": false,
@ -618,32 +685,6 @@
} }
} }
}, },
"CommentDto": {
"type": "object",
"additionalProperties": false,
"properties": {
"id": {
"type": "string",
"format": "guid"
},
"createdAt": {
"type": "string",
"format": "date-time"
},
"content": {
"type": "string",
"nullable": true
},
"upvotesCount": {
"type": "integer",
"format": "int32"
},
"downvotesCount": {
"type": "integer",
"format": "int32"
}
}
},
"CreateLinkCommand": { "CreateLinkCommand": {
"type": "object", "type": "object",
"additionalProperties": false, "additionalProperties": false,