Index: ChapterX.Infrastructure/Repositories/LikesRepository.cs
===================================================================
--- ChapterX.Infrastructure/Repositories/LikesRepository.cs	(revision 877c13c3dd0934c1d31da7988d0d2c2c5925ed55)
+++ ChapterX.Infrastructure/Repositories/LikesRepository.cs	(revision d300631ac3354730c3b03cb7b160974af50e7894)
@@ -2,9 +2,5 @@
 using ChapterX.Domain.Repositories;
 using ChapterX.Infrastructure.Data.DataContext;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
+using Microsoft.EntityFrameworkCore;
 
 namespace ChapterX.Infrastructure.Repositories
@@ -15,4 +11,19 @@
         {
         }
+
+        public async Task<IEnumerable<Likes>> GetByStoryIdAsync(int storyId, CancellationToken cancellationToken = default)
+            => await _dbSet.Where(l => l.StoryId == storyId).ToListAsync(cancellationToken);
+
+        public async Task<bool> ExistsAsync(int userId, int storyId, CancellationToken cancellationToken = default)
+            => await _dbSet.AnyAsync(l => l.UserId == userId && l.StoryId == storyId, cancellationToken);
+
+        public async Task<bool> DeleteByUserAndStoryAsync(int userId, int storyId, CancellationToken cancellationToken = default)
+        {
+            var like = await _dbSet.FirstOrDefaultAsync(l => l.UserId == userId && l.StoryId == storyId, cancellationToken);
+            if (like == null) return false;
+            _dbSet.Remove(like);
+            await _context.SaveChangesAsync(cancellationToken);
+            return true;
+        }
     }
 }
