add needed routes in LinksController

This commit is contained in:
Julien LEICHER 2020-12-21 11:10:32 +01:00
parent 5f389ae5f8
commit 1d5570c578
No known key found for this signature in database
GPG Key ID: BE0761B6A007EB96
4 changed files with 277 additions and 6 deletions

View File

@ -18,9 +18,10 @@ namespace HN.Application
}
public CommentLinkCommand(Guid linkId)
public CommentLinkCommand(Guid linkId, string content = null)
{
LinkId = linkId;
Content = content;
}
}
}

View File

@ -1,5 +1,8 @@
using System;
using System.Threading.Tasks;
using Api.Models;
using HN.Application;
using HN.Domain;
using MediatR;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
@ -18,7 +21,7 @@ namespace Api.Controllers
}
/// <summary>
/// Retrieve all links already posted.
/// Récupère tous les liens postés.
/// </summary>
/// <returns></returns>
[ProducesResponseType(typeof(LinkDto[]), StatusCodes.Status200OK)]
@ -29,7 +32,68 @@ namespace Api.Controllers
}
/// <summary>
/// Post a new link.
/// Récupère um lien particulier.
/// </summary>
/// <param name="id"></param>
[HttpGet("{id}")]
public async Task<ActionResult<LinkDto>> GetLinkById(Guid id)
{
return Ok(await _bus.Send(new GetLinkQuery(id)));
}
/// <summary>
/// Upvote un lien particulier.
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpPut("{id}/upvote")]
[ProducesResponseType(StatusCodes.Status204NoContent)]
public async Task<IActionResult> Upvote(Guid id)
{
await _bus.Send(new VoteForLinkCommand(id, VoteType.Up));
return NoContent();
}
/// <summary>
/// Downvote un lien particulier.
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpPut("{id}/downvote")]
[ProducesResponseType(StatusCodes.Status204NoContent)]
public async Task<IActionResult> Downvote(Guid id)
{
await _bus.Send(new VoteForLinkCommand(id, VoteType.Down));
return NoContent();
}
/// <summary>
/// Récupère les commentaires d'un lien particulier.
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpGet("{id}/comments")]
public async Task<ActionResult<CommentDto[]>> Comments(Guid id)
{
return Ok(await _bus.Send(new GetLinkCommentsQuery(id)));
}
/// <summary>
/// Poste un nouveau commentaire sur un lien.
/// </summary>
/// <param name="id"></param>
/// <param name="command"></param>
/// <returns></returns>
[HttpPost("{id}/comments")]
[ProducesResponseType(StatusCodes.Status201Created)]
public async Task<IActionResult> AddComment(Guid id, AddCommentViewModel command)
{
var commentId = await _bus.Send(new CommentLinkCommand(id, command.Content));
return CreatedAtAction("", "", new { id = commentId }, null);
}
/// <summary>
/// Poste un nouveau lien.
/// </summary>
/// <param name="command"></param>
/// <returns></returns>
@ -38,7 +102,7 @@ namespace Api.Controllers
{
var result = await _bus.Send(command);
return Created("blabla", result);
return CreatedAtAction(nameof(GetLinkById), new { id = result });
}
}
}

View File

@ -0,0 +1,10 @@
using System.ComponentModel.DataAnnotations;
namespace Api.Models
{
public sealed class AddCommentViewModel
{
[Required]
public string Content { get; set; }
}
}

View File

@ -11,7 +11,7 @@
"tags": [
"Links"
],
"summary": "Retrieve all links already posted.",
"summary": "Récupère tous les liens postés.",
"operationId": "Links_GetLinks",
"responses": {
"200": {
@ -43,7 +43,7 @@
"tags": [
"Links"
],
"summary": "Post a new link.",
"summary": "Poste un nouveau lien.",
"operationId": "Links_CreateLink",
"requestBody": {
"x-name": "command",
@ -71,6 +71,163 @@
}
}
}
},
"/api/links/{id}": {
"get": {
"tags": [
"Links"
],
"summary": "Récupère um lien particulier.",
"operationId": "Links_GetLinkById",
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "string",
"format": "guid"
},
"x-position": 1
}
],
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/LinkDto"
}
}
}
}
}
}
},
"/api/links/{id}/upvote": {
"put": {
"tags": [
"Links"
],
"summary": "Upvote un lien particulier.",
"operationId": "Links_Upvote",
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "string",
"format": "guid"
},
"x-position": 1
}
],
"responses": {
"204": {
"description": ""
}
}
}
},
"/api/links/{id}/downvote": {
"put": {
"tags": [
"Links"
],
"summary": "Downvote un lien particulier.",
"operationId": "Links_Downvote",
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "string",
"format": "guid"
},
"x-position": 1
}
],
"responses": {
"204": {
"description": ""
}
}
}
},
"/api/links/{id}/comments": {
"get": {
"tags": [
"Links"
],
"summary": "Récupère les commentaires d'un lien particulier.",
"operationId": "Links_Comments",
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "string",
"format": "guid"
},
"x-position": 1
}
],
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/CommentDto"
}
}
}
}
}
}
},
"post": {
"tags": [
"Links"
],
"summary": "Poste un nouveau commentaire sur un lien.",
"operationId": "Links_AddComment",
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "string",
"format": "guid"
},
"x-position": 1
}
],
"requestBody": {
"x-name": "command",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/AddCommentViewModel"
}
}
},
"required": true,
"x-position": 2
},
"responses": {
"201": {
"description": ""
}
}
}
}
},
"components": {
@ -139,6 +296,45 @@
}
}
},
"CommentDto": {
"type": "object",
"additionalProperties": false,
"properties": {
"id": {
"type": "string",
"format": "guid"
},
"content": {
"type": "string",
"nullable": true
},
"createdAt": {
"type": "string",
"format": "date-time"
},
"upVotes": {
"type": "integer",
"format": "int32"
},
"downVotes": {
"type": "integer",
"format": "int32"
}
}
},
"AddCommentViewModel": {
"type": "object",
"additionalProperties": false,
"required": [
"content"
],
"properties": {
"content": {
"type": "string",
"minLength": 1
}
}
},
"AddLinkCommand": {
"type": "object",
"additionalProperties": false,