namespace SVSim.Database.Services.Friend; public interface IFriendService { Task GetFriendsAsync(long viewerId, CancellationToken ct); Task GetReceiveAppliesAsync(long viewerId, CancellationToken ct); Task GetSendAppliesAsync(long viewerId, CancellationToken ct); Task GetPlayedTogetherAsync(long viewerId, CancellationToken ct); /// Returns null when not found, self-search, or any error. Task SearchAsync(long viewerId, int targetViewerId, CancellationToken ct); /// No-op if target missing, self, already friends, already-pending apply, or at outgoing-apply cap. Task SendApplyAsync(long viewerId, int targetViewerId, CancellationToken ct); /// No-op if apply not addressed to caller, would push either side past friend cap. Cleans reverse-direction apply if present. Task ApproveApplyAsync(long viewerId, int applyId, CancellationToken ct); /// No-op if apply not addressed to caller. Task RejectApplyAsync(long viewerId, int applyId, CancellationToken ct); /// No-op if apply not sent by caller. Task CancelApplyAsync(long viewerId, int applyId, CancellationToken ct); Task RejectAllAppliesAsync(long viewerId, CancellationToken ct); Task CancelAllAppliesAsync(long viewerId, CancellationToken ct); /// Deletes both directions of the friendship (A→B and B→A). Task RejectFriendAsync(long viewerId, int targetViewerId, CancellationToken ct); }