Changeset 73b69b2 for ChapterX.API


Ignore:
Timestamp:
03/24/26 22:13:36 (3 months ago)
Author:
kikisrbinoska <srbinoskakristina07@…>
Branches:
main
Children:
7fbb91c
Parents:
acf690c
Message:

Fixed reading lists,comments and likes

Location:
ChapterX.API/Controllers
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • ChapterX.API/Controllers/CommentsController.cs

    racf690c r73b69b2  
    11using ChapterX.Application.Comment.Commands;
    22using ChapterX.Application.Comment.Queries;
     3using ChapterX.Domain.Repositories;
    34using MediatR;
    45using Microsoft.AspNetCore.Authorization;
     
    1314    {
    1415        private readonly IMediator _mediator;
     16        private readonly ICommentRepository _commentRepository;
    1517        private readonly ILogger<CommentsController> _logger;
    1618
    17         public CommentsController(IMediator mediator, ILogger<CommentsController> logger)
     19        public CommentsController(IMediator mediator, ICommentRepository commentRepository, ILogger<CommentsController> logger)
    1820        {
    1921            _mediator = mediator;
     22            _commentRepository = commentRepository;
    2023            _logger = logger;
     24        }
     25
     26        [HttpGet("story/{storyId:int}")]
     27        [AllowAnonymous]
     28        public async Task<ActionResult> GetByStory(int storyId)
     29        {
     30            var comments = await _commentRepository.GetByStoryIdAsync(storyId);
     31            var result = comments.Select(c => new
     32            {
     33                id = c.Id,
     34                content = c.Content,
     35                userId = c.UserId,
     36                storyId = c.StoryId,
     37                username = c.User?.Username ?? "",
     38                createdAt = c.CreatedAt,
     39            });
     40            return Ok(result);
    2141        }
    2242
  • ChapterX.API/Controllers/LikesController.cs

    racf690c r73b69b2  
    11using ChapterX.Application.Likes.Commands;
    22using ChapterX.Application.Likes.Queries;
     3using ChapterX.Domain.Repositories;
    34using MediatR;
    45using Microsoft.AspNetCore.Authorization;
     
    1314    {
    1415        private readonly IMediator _mediator;
     16        private readonly ILikesRepository _likesRepository;
    1517        private readonly ILogger<LikesController> _logger;
    1618
    17         public LikesController(IMediator mediator, ILogger<LikesController> logger)
     19        public LikesController(IMediator mediator, ILikesRepository likesRepository, ILogger<LikesController> logger)
    1820        {
    1921            _mediator = mediator;
     22            _likesRepository = likesRepository;
    2023            _logger = logger;
     24        }
     25
     26        [HttpGet("story/{storyId:int}")]
     27        [AllowAnonymous]
     28        public async Task<ActionResult> GetByStory(int storyId)
     29        {
     30            var likes = await _likesRepository.GetByStoryIdAsync(storyId);
     31            return Ok(new { count = likes.Count(), userIds = likes.Select(l => l.UserId).ToList() });
     32        }
     33
     34        [HttpDelete("user/{userId:int}/story/{storyId:int}")]
     35        [Authorize]
     36        public async Task<ActionResult> DeleteByUserAndStory(int userId, int storyId)
     37        {
     38            var deleted = await _likesRepository.DeleteByUserAndStoryAsync(userId, storyId);
     39            if (!deleted) return NotFound();
     40            return Ok();
    2141        }
    2242
     
    4363        public async Task<ActionResult> Add([FromBody] AddRequest request)
    4464        {
    45             _logger.LogInformation("Adding a new like for ChapterId: {ChapterId}", request.ChapterId);
     65            _logger.LogInformation("Adding a new like for StoryId: {StoryId}", request.StoryId);
     66            var exists = await _likesRepository.ExistsAsync(request.UserId, request.StoryId);
     67            if (exists) return Ok();
    4668            var response = await _mediator.Send(request);
    4769            return Ok(response);
  • ChapterX.API/Controllers/NotificationsController.cs

    racf690c r73b69b2  
    11using ChapterX.Application.Notification.Commands;
    22using ChapterX.Application.Notification.Queries;
     3using ChapterX.Domain.Repositories;
    34using MediatR;
    45using Microsoft.AspNetCore.Authorization;
     
    1314    {
    1415        private readonly IMediator _mediator;
     16        private readonly INotificationRepository _notificationRepository;
    1517        private readonly ILogger<NotificationsController> _logger;
    1618
    17         public NotificationsController(IMediator mediator, ILogger<NotificationsController> logger)
     19        public NotificationsController(IMediator mediator, INotificationRepository notificationRepository, ILogger<NotificationsController> logger)
    1820        {
    1921            _mediator = mediator;
     22            _notificationRepository = notificationRepository;
    2023            _logger = logger;
     24        }
     25
     26        [HttpGet("user/{userId:int}")]
     27        [Authorize]
     28        public async Task<ActionResult> GetByUser(int userId)
     29        {
     30            var notifications = await _notificationRepository.GetByUserIdAsync(userId);
     31            var result = notifications.Select(n => new
     32            {
     33                id = n.Id,
     34                content = n.Content,
     35                isRead = n.IsRead,
     36                createdAt = n.CreatedAt,
     37                type = n.Type ?? "info",
     38                link = n.Link,
     39            });
     40            return Ok(result);
     41        }
     42
     43        [HttpPut("{id:int}/read")]
     44        [Authorize]
     45        public async Task<ActionResult> MarkRead(int id)
     46        {
     47            var notification = await _notificationRepository.GetByIdAsync(id);
     48            if (notification == null) return NotFound();
     49            notification.IsRead = true;
     50            await _notificationRepository.UpdateAsync(notification);
     51            return Ok();
    2152        }
    2253
  • ChapterX.API/Controllers/ReadingListItemsController.cs

    racf690c r73b69b2  
    11using ChapterX.Application.ReadingListItems.Commands;
    22using ChapterX.Application.ReadingListItems.Queries;
     3using ChapterX.Domain.Repositories;
    34using MediatR;
    45using Microsoft.AspNetCore.Authorization;
     
    1314    {
    1415        private readonly IMediator _mediator;
     16        private readonly IReadingListItemsRepository _readingListItemsRepository;
    1517        private readonly ILogger<ReadingListItemsController> _logger;
    1618
    17         public ReadingListItemsController(IMediator mediator, ILogger<ReadingListItemsController> logger)
     19        public ReadingListItemsController(IMediator mediator, IReadingListItemsRepository readingListItemsRepository, ILogger<ReadingListItemsController> logger)
    1820        {
    1921            _mediator = mediator;
     22            _readingListItemsRepository = readingListItemsRepository;
    2023            _logger = logger;
    2124        }
     
    7073            return Ok(response);
    7174        }
     75
     76        [HttpDelete("{listId:int}/story/{storyId:int}")]
     77        [Authorize]
     78        public async Task<ActionResult> DeleteByListAndStory(int listId, int storyId)
     79        {
     80            _logger.LogInformation("Removing story {StoryId} from list {ListId}", storyId, listId);
     81            var deleted = await _readingListItemsRepository.DeleteByListAndStoryAsync(listId, storyId);
     82            return deleted ? Ok() : NotFound();
     83        }
    7284    }
    7385}
  • ChapterX.API/Controllers/ReadingListsController.cs

    racf690c r73b69b2  
    11using ChapterX.Application.ReadingList.Commands;
    22using ChapterX.Application.ReadingList.Queries;
     3using ChapterX.Domain.Repositories;
    34using MediatR;
    45using Microsoft.AspNetCore.Authorization;
     
    1314    {
    1415        private readonly IMediator _mediator;
     16        private readonly IReadingListRepository _readingListRepository;
    1517        private readonly ILogger<ReadingListsController> _logger;
    1618
    17         public ReadingListsController(IMediator mediator, ILogger<ReadingListsController> logger)
     19        public ReadingListsController(IMediator mediator, IReadingListRepository readingListRepository, ILogger<ReadingListsController> logger)
    1820        {
    1921            _mediator = mediator;
     22            _readingListRepository = readingListRepository;
    2023            _logger = logger;
     24        }
     25
     26        [HttpGet("user/{userId:int}")]
     27        [Authorize]
     28        public async Task<ActionResult> GetByUser(int userId)
     29        {
     30            _logger.LogInformation("Fetching reading lists for user {UserId}", userId);
     31            var lists = await _readingListRepository.GetByUserIdAsync(userId);
     32            var result = lists.Select(l => MapList(l));
     33            return Ok(result);
    2134        }
    2235
     
    2639        {
    2740            _logger.LogInformation("Fetching all reading lists");
    28             var response = await _mediator.Send(new GetAllRequest());
    29             return Ok(response);
     41            var lists = await _readingListRepository.GetAllAsync();
     42            var result = lists.Select(l => MapList(l));
     43            return Ok(result);
    3044        }
     45
     46        private static object MapList(Domain.Entities.ReadingList l) => new
     47        {
     48            id = l.Id,
     49            name = l.Name,
     50            content = l.Content,
     51            isPublic = l.IsPublic,
     52            userId = l.UserId,
     53            createdAt = l.CreatedAt,
     54            username = l.User?.Username ?? "",
     55            readingListItems = l.ReadingListItems.Select(i => new
     56            {
     57                listId = i.ListId,
     58                storyId = i.StoryId,
     59                addedAt = i.AddedAt,
     60                storyTitle = i.Story?.ShortDescription ?? "",
     61                authorUsername = i.Story?.Writer?.User?.Username ?? "",
     62                genres = i.Story?.HasGenres.Select(hg => hg.Genre?.Name).Where(n => n != null).ToList() ?? []
     63            }).ToList()
     64        };
    3165
    3266        [HttpGet("{id:int}")]
Note: See TracChangeset for help on using the changeset viewer.