source: ChapterX.API/Controllers/StoriesController.cs@ e882b92

main
Last change on this file since e882b92 was e882b92, checked in by kikisrbinoska <srbinoskakristina07@…>, 13 days ago

Added corrected entitef from the ER diagram and changes for the logic to be coresponding to the ddl

  • Property mode set to 100644
File size: 4.8 KB
Line 
1using ChapterX.Application.Story.Commands;
2using ChapterX.Application.Story.Queries;
3using MediatR;
4using Microsoft.AspNetCore.Authorization;
5using Microsoft.AspNetCore.Mvc;
6using Microsoft.Extensions.Logging;
7using System.Security.Claims;
8
9namespace ChapterX.API.Controllers
10{
11 [Route("api/[controller]")]
12 [ApiController]
13 public class StoriesController : ControllerBase
14 {
15 private readonly IMediator _mediator;
16 private readonly ILogger<StoriesController> _logger;
17
18 public StoriesController(IMediator mediator, ILogger<StoriesController> logger)
19 {
20 _mediator = mediator;
21 _logger = logger;
22 }
23
24 // GET: api/Stories
25 [HttpGet]
26 [AllowAnonymous]
27 public async Task<ActionResult> GetAll([FromQuery] GetAllRequest request)
28 {
29 _logger.LogInformation("Fetching all stories");
30 var response = await _mediator.Send(request);
31 var stories = response.Stories.Select(s => new
32 {
33 id = s.Id,
34 userId = s.UserId,
35 title = s.Title,
36 shortDescription = s.ShortDescription,
37 image = s.Image,
38 content = s.Content,
39 status = s.Status,
40 matureContent = s.MatureContent,
41 createdAt = s.CreatedAt,
42 updatedAt = s.UpdatedAt,
43 writer = s.Writer == null ? null : new { user = s.Writer.User == null ? null : new { username = s.Writer.User.Username } },
44 hasGenres = s.HasGenres.Select(hg => new { genre = new { name = hg.Genre?.Name ?? "" } }),
45 likes = s.Likes.Select(l => new { userId = l.UserId }),
46 comments = s.Comments.Select(c => new { id = c.Id }),
47 chapters = s.Chapters.Select(c => new { id = c.Id, viewCount = c.ViewCount }),
48 });
49 return Ok(new { stories });
50 }
51
52 // GET: api/Stories/5
53 [HttpGet("{id:int}")]
54 [AllowAnonymous]
55 public async Task<ActionResult> GetById([FromRoute] int id)
56 {
57 _logger.LogInformation("Fetching story with ID: {StoryId}", id);
58 var response = await _mediator.Send(new GetRequest(id));
59 if (response.Story == null) return NotFound();
60 var s = response.Story;
61 return Ok(new
62 {
63 id = s.Id,
64 userId = s.UserId,
65 title = s.Title,
66 shortDescription = s.ShortDescription,
67 image = s.Image,
68 content = s.Content,
69 status = s.Status,
70 matureContent = s.MatureContent,
71 createdAt = s.CreatedAt,
72 updatedAt = s.UpdatedAt,
73 writer = s.Writer == null ? null : new { user = s.Writer.User == null ? null : new { username = s.Writer.User.Username } },
74 hasGenres = s.HasGenres.Select(hg => new { genre = new { name = hg.Genre?.Name ?? "" } }),
75 likes = s.Likes.Select(l => new { userId = l.UserId }),
76 comments = s.Comments.Select(c => new { id = c.Id }),
77 chapters = s.Chapters.Select(c => new { id = c.Id, viewCount = c.ViewCount }),
78 });
79 }
80
81 // POST: api/Stories
82 [HttpPost]
83 [Authorize]
84 public async Task<ActionResult> Add([FromBody] AddRequest request)
85 {
86 var callerId = int.Parse(User.FindFirstValue(ClaimTypes.NameIdentifier)!);
87 _logger.LogInformation("Adding a new story for UserId: {UserId}", callerId);
88 var response = await _mediator.Send(request with { UserId = callerId });
89 return Ok(response);
90 }
91
92 // PUT: api/Stories/5
93 [HttpPut("{id:int}")]
94 [Authorize]
95 public async Task<ActionResult> Update([FromRoute] int id, [FromBody] UpdateRequest request)
96 {
97 _logger.LogInformation("Updating story with ID: {StoryId}", id);
98 if (id != request.Id)
99 {
100 return BadRequest("Route ID and body ID must match.");
101 }
102
103 var callerId = int.Parse(User.FindFirstValue(ClaimTypes.NameIdentifier)!);
104 var response = await _mediator.Send(request with { CallerId = callerId });
105 return Ok(response);
106 }
107
108 // DELETE: api/Stories/5
109 [HttpDelete("{id:int}")]
110 [Authorize]
111 public async Task<ActionResult> Delete([FromRoute] int id)
112 {
113 _logger.LogInformation("Deleting story with ID: {StoryId}", id);
114 var callerId = int.Parse(User.FindFirstValue(ClaimTypes.NameIdentifier)!);
115 var isAdmin = User.IsInRole("Admin");
116 var response = await _mediator.Send(new DeleteRequest(id, callerId, isAdmin));
117 return Ok(response);
118 }
119 }
120}
121
Note: See TracBrowser for help on using the repository browser.