Index: ChapterX.API/Controllers/NotificationsController.cs
===================================================================
--- ChapterX.API/Controllers/NotificationsController.cs	(revision 877c13c3dd0934c1d31da7988d0d2c2c5925ed55)
+++ ChapterX.API/Controllers/NotificationsController.cs	(revision 7fbb91c66b46c3063caa934a83d6d0681406c83c)
@@ -1,4 +1,5 @@
 using ChapterX.Application.Notification.Commands;
 using ChapterX.Application.Notification.Queries;
+using ChapterX.Domain.Repositories;
 using MediatR;
 using Microsoft.AspNetCore.Authorization;
@@ -13,10 +14,40 @@
     {
         private readonly IMediator _mediator;
+        private readonly INotificationRepository _notificationRepository;
         private readonly ILogger<NotificationsController> _logger;
 
-        public NotificationsController(IMediator mediator, ILogger<NotificationsController> logger)
+        public NotificationsController(IMediator mediator, INotificationRepository notificationRepository, ILogger<NotificationsController> logger)
         {
             _mediator = mediator;
+            _notificationRepository = notificationRepository;
             _logger = logger;
+        }
+
+        [HttpGet("user/{userId:int}")]
+        [Authorize]
+        public async Task<ActionResult> GetByUser(int userId)
+        {
+            var notifications = await _notificationRepository.GetByUserIdAsync(userId);
+            var result = notifications.Select(n => new
+            {
+                id = n.Id,
+                content = n.Content,
+                isRead = n.IsRead,
+                createdAt = n.CreatedAt,
+                type = n.Type ?? "info",
+                link = n.Link,
+            });
+            return Ok(result);
+        }
+
+        [HttpPut("{id:int}/read")]
+        [Authorize]
+        public async Task<ActionResult> MarkRead(int id)
+        {
+            var notification = await _notificationRepository.GetByIdAsync(id);
+            if (notification == null) return NotFound();
+            notification.IsRead = true;
+            await _notificationRepository.UpdateAsync(notification);
+            return Ok();
         }
 
