using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using xCommons.Attributes; using xCommons.Extensions; using xExceptions.Constants; using xIdentityHelper; using xIdentityModels.Constants; using xIdentityModels.Dtos; using xIdentityModels.Navigations; using xModels.Dtos; using static IdentityServer4.IdentityServerConstants; namespace xIds.Controllers { public partial class AccountController { // #region Friendship Actions ... // #region Actions ... /// /// Follow a User /// /// a user identifier which represent destination user /// an instance of XFriendshipFollowing [RequireXPowered] [HttpPost("Friendship/{destUser}/Follow")] [Authorize(Policy = LocalApi.PolicyName)] [Authorize(Policy = XPolicies.EnabledUser)] public async Task> Follow( [FromRoute] string destUser ) { // // Do Action ... try { // // Validate Args ... ValidationProvider.NotEmpty(destUser); // var result = await IdentityManager .Follow( User.Identity.Name, destUser ); // return Ok(result .ToDynamicObject()); } catch (Exception ex) { // var exResult = GetExceptionActionResult(ex); return exResult; } } /// /// Cancel Following /// /// a user identifier which represent destination user /// a boolean value [HttpPost("Friendship/{destUser}/Cancel")] [Authorize(Policy = LocalApi.PolicyName)] [Authorize(Policy = XPolicies.EnabledUser)] public async Task> Cancel( [FromRoute] string destUser ) { // // Do Action ... try { // // Validate Args ... ValidationProvider.NotEmpty(destUser); // var result = await IdentityManager .Cancel( User.Identity.Name, destUser ); // return Ok(result); } catch (Exception ex) { // var exResult = GetExceptionActionResult(ex); return exResult; } } /// /// Unfollow a Follower /// /// a user identifier which represent destination user /// [HttpPost("Friendship/{destUser}/UnFollowFollower")] [Authorize(Policy = LocalApi.PolicyName)] [Authorize(Policy = XPolicies.EnabledUser)] public async Task UnFollowFollower( [FromRoute] string destUser ) { // // Do Action ... try { // // Validate Args ... ValidationProvider.NotEmpty(destUser); // await IdentityManager .UnFollowFollower( User.Identity.Name, destUser ); // return Ok(); } catch (Exception ex) { // var exResult = GetExceptionActionResult(ex); return exResult; } } /// /// Unfollow Following /// /// a user identifier which represent destination user /// [Authorize(Policy = LocalApi.PolicyName)] [Authorize(Policy = XPolicies.EnabledUser)] [HttpPost("Friendship/{destUser}/UnFollowFollowing")] public async Task UnFollowFollowing( [FromRoute] string destUser ) { // // Do Action ... try { // // Validate Args ... ValidationProvider.NotEmpty(destUser); // await IdentityManager .UnFollowFollowing( User.Identity.Name, destUser ); // return Ok(); } catch (Exception ex) { // var exResult = GetExceptionActionResult(ex); return exResult; } } /// /// Block a Follower /// /// a user identifier which represent destination user /// an instance of XFriendshipFollowing [HttpPost("Friendship/{destUser}/Block")] [Authorize(Policy = LocalApi.PolicyName)] [Authorize(Policy = XPolicies.EnabledUser)] public async Task> Block( [FromRoute] string destUser ) { // // Do Action ... try { // // Validate Args ... ValidationProvider.NotEmpty(destUser); // var result = await IdentityManager .Block( User.Identity.Name, destUser ); // return Ok(result .ToDynamicObject()); } catch (Exception ex) { // var exResult = GetExceptionActionResult(ex); // return exResult; } } /// /// Unblock a Blocked User /// /// an instance of XFriendshipFollowing /// an instance of XFriendshipFollowing [HttpPost("Friendship/{destUser}/UnBlock")] [Authorize(Policy = LocalApi.PolicyName)] [Authorize(Policy = XPolicies.EnabledUser)] public async Task> UnBlock( [FromRoute] string destUser ) { // // Do Action ... try { // // Validate Args ... ValidationProvider.NotEmpty(destUser); // var result = await IdentityManager .UnBlock( User.Identity.Name, destUser ); // return Ok(result .ToDynamicObject()); } catch (Exception ex) { // var exResult = GetExceptionActionResult(ex); return exResult; } } #endregion // #region Request Handlers ... /// /// Accept a Following Request /// /// a user identifier which represent destination user /// an instance of XFriendshipFollower [Authorize(Policy = LocalApi.PolicyName)] [Authorize(Policy = XPolicies.EnabledUser)] [HttpPost("Friendship/{destUser}/AcceptRequest")] public async Task> AcceptRequest( [FromRoute] string destUser ) { // // Do Action ... try { // // Validate Args ... ValidationProvider.NotEmpty(destUser); // var result = await IdentityManager .AcceptRequest( User.Identity.Name, destUser ); // return Ok(result .ToDynamicObject()); } catch (Exception ex) { // var exResult = GetExceptionActionResult(ex); return exResult; } } /// /// Reject a Following Request /// /// a user identifier which represent destination user /// an instance of XFriendshipFollower [Authorize(Policy = LocalApi.PolicyName)] [Authorize(Policy = XPolicies.EnabledUser)] [HttpPost("Friendship/{destUser}/RejectRequest")] public async Task> RejectRequest( [FromRoute] string destUser ) { // // Do Action ... try { // // Validate Args ... ValidationProvider.NotEmpty(destUser); // var result = await IdentityManager .RejectRequest( User.Identity.Name, destUser ); // return Ok(result .ToDynamicObject()); } catch (Exception ex) { // var exResult = GetExceptionActionResult(ex); return exResult; } } #endregion // #region Getters ... /// /// Check a User IsFollower of Requested User /// /// a user identifier which represent destination user /// a boolean value [Authorize(Policy = LocalApi.PolicyName)] [Authorize(Policy = XPolicies.EnabledUser)] [HttpGet("Friendship/{destUser}/IsFollower")] public async Task> IsFollower( [FromRoute] string destUser ) { // // Do Action ... try { // // Validate Args ... ValidationProvider.NotEmpty(destUser); // var result = await IdentityManager .IsFollower( User.Identity.Name, destUser ); // return Ok(result); } catch (Exception ex) { // var exResult = GetExceptionActionResult(ex); return exResult; } } /// /// Get Follower State of a User /// /// a user identifier which represent destination user /// an instance of XFriendshipState [Authorize(Policy = LocalApi.PolicyName)] [Authorize(Policy = XPolicies.EnabledUser)] [HttpGet("Friendship/{destUser}/FollowerState")] public async Task> FollowerState( [FromRoute] string destUser ) { // // Do Action ... try { // // Validate Args ... ValidationProvider.NotEmpty(destUser); // var result = await IdentityManager .GetFollowerState( User.Identity.Name, destUser ); // return Ok(result); } catch (Exception ex) { // var exResult = GetExceptionActionResult(ex); return exResult; } } /// /// Get Specific Follower /// /// a user identifier which represent destination user /// an instance of XFriendshipFollower [Authorize(Policy = LocalApi.PolicyName)] [Authorize(Policy = XPolicies.EnabledUser)] [HttpGet("Friendship/{destUser}/Follower")] public async Task> Follower( [FromRoute] string destUser ) { // // Do Action ... try { // // Validate Args ... ValidationProvider.NotEmpty(destUser); // var result = await IdentityManager .GetFollower( User.Identity.Name, destUser ); // return Ok(result .ToDynamicObject()); } catch (Exception ex) { // var exResult = GetExceptionActionResult(ex); return exResult; } } /// /// Get Followers List Of Current User /// /// a collection of XFriendshipFollower [HttpGet("Friendship/Followers")] [Authorize(Policy = LocalApi.PolicyName)] [Authorize(Policy = XPolicies.EnabledUser)] public async Task>> Followers() { // // Do Action ... try { // var result = await IdentityManager .GetFollowers(User.Identity.Name); // return Ok(result .ToDynamicObject()); } catch (Exception ex) { // var exResult = GetExceptionActionResult(ex); // return exResult; } } /// /// Get All Followers List Includes Blocked, Requested and etc /// of Current User /// /// a collection of XFriendshipFollower [HttpGet("Friendship/AllFollowers")] [Authorize(Policy = LocalApi.PolicyName)] [Authorize(Policy = XPolicies.EnabledUser)] public async Task>> AllFollowers() { // // Do Action ... try { // var result = await IdentityManager .GetAllFollowers(User.Identity.Name); // return Ok(result .ToDynamicObject()); } catch (Exception ex) { // var exResult = GetExceptionActionResult(ex); return exResult; } } /// /// Get All Followers List Includes Blocked, Requested and etc /// of Current User based On Query Model ... /// /// a Query Result of XFriendDto [HttpGet("Friendship/QueryFollowers")] [Authorize(Policy = LocalApi.PolicyName)] [Authorize(Policy = XPolicies.EnabledUser)] public async Task>> QueryFollowers( [FromQuery] XQuery query, [FromQuery] string destUser ) { // // Do Action ... try { // // Normalizing Dest User ... var userInfo = await GetUserInfo(); bool isAdmin = userInfo.Roles.Contains(XUserRoles.ADMIN); if (destUser.IsNullOrEmpty()) { destUser = userInfo.UserName; } bool isDestUserValid = isAdmin || destUser == userInfo.UserId || destUser == userInfo.Email || destUser == userInfo.PhoneNumber || destUser == userInfo.UserName; if (!isDestUserValid) { XException.NotAllowed.Throw(); } // var result = await IdentityManager .QueryFollowers( query: query, userSelectByParam: destUser ); // return Ok(result .ToDynamicObject()); } catch (Exception ex) { // var exResult = GetExceptionActionResult(ex); return exResult; } } /// /// Check a User is in Followings of Current User /// /// a user identifier which represent destination user /// a boolean value [Authorize(Policy = LocalApi.PolicyName)] [Authorize(Policy = XPolicies.EnabledUser)] [HttpGet("Friendship/{destUser}/IsFollowing")] public async Task> IsFollowing( [FromRoute] string destUser ) { // // Do Action ... try { // // Validate Args ... ValidationProvider.NotEmpty(destUser); // var result = await IdentityManager .IsFollowing( User.Identity.Name, destUser ); // return Ok(result); } catch (Exception ex) { // var exResult = GetExceptionActionResult(ex); return exResult; } } /// /// Get Following State Relation between Specific User /// and Current User /// /// a user identifier which represent destination user /// an instance of XFriendshipState [Authorize(Policy = LocalApi.PolicyName)] [Authorize(Policy = XPolicies.EnabledUser)] [HttpGet("Friendship/{destUser}/FollowingState")] public async Task> FollowingState( [FromRoute] string destUser ) { // // Do Action ... try { // // Validate Args ... ValidationProvider.NotEmpty(destUser); // var result = await IdentityManager .GetFollowingState( User.Identity.Name, destUser ); // return Ok(result); } catch (Exception ex) { // var exResult = GetExceptionActionResult(ex); return exResult; } } /// /// Get Specific Following Model /// /// a user identifier which represent destination user /// an instance of XFriendshipFollowing [Authorize(Policy = LocalApi.PolicyName)] [Authorize(Policy = XPolicies.EnabledUser)] [HttpGet("Friendship/{destUser}/Following")] public async Task> Following( [FromRoute] string destUser ) { // // Do Action ... try { // // Validate Args ... ValidationProvider.NotEmpty(destUser); // var result = await IdentityManager .GetFollowing( User.Identity.Name, destUser ); // return Ok(result .ToDynamicObject()); } catch (Exception ex) { // var exResult = GetExceptionActionResult(ex); return exResult; } } /// /// Get Followings of Current User /// /// a collection of XFriendshipFollowing [HttpGet("Friendship/Followings")] [Authorize(Policy = LocalApi.PolicyName)] [Authorize(Policy = XPolicies.EnabledUser)] public async Task>> Followings() { // // Do Action ... try { // var result = await IdentityManager .GetFollowings(User.Identity.Name); // return Ok(result .ToDynamicObject()); } catch (Exception ex) { // var exResult = GetExceptionActionResult(ex); return exResult; } } /// /// Get All Following List Includes Blocked, Requested and etc /// of Current User /// /// a collection of XFriendshipFollowing [HttpGet("Friendship/AllFollowings")] [Authorize(Policy = LocalApi.PolicyName)] [Authorize(Policy = XPolicies.EnabledUser)] public async Task>> AllFollowings() { // // Do Action ... try { // var result = await IdentityManager .GetAllFollowings(User.Identity.Name); // return Ok(result .ToDynamicObject()); } catch (Exception ex) { // var exResult = GetExceptionActionResult(ex); return exResult; } } /// /// Get All Following List Includes Blocked, Requested and etc /// of Current User based On Query Model ... /// /// a Query Result of XFriendDto [HttpGet("Friendship/QueryFollowings")] [Authorize(Policy = LocalApi.PolicyName)] [Authorize(Policy = XPolicies.EnabledUser)] public async Task>> QueryFollowings( [FromQuery] XQuery query, [FromQuery] string destUser ) { // // Do Action ... try { // // Normalizing Dest User ... var userInfo = await GetUserInfo(); bool isAdmin = userInfo.Roles.Contains(XUserRoles.ADMIN); if (destUser.IsNullOrEmpty()) { destUser = userInfo.UserName; } bool isDestUserValid = isAdmin || destUser == userInfo.UserId || destUser == userInfo.Email || destUser == userInfo.PhoneNumber || destUser == userInfo.UserName; if (!isDestUserValid) { XException.NotAllowed.Throw(); } // var result = await IdentityManager .QueryFollowings( query: query, userSelectByParam: destUser ); // return Ok(result .ToDynamicObject()); } catch (Exception ex) { // var exResult = GetExceptionActionResult(ex); return exResult; } } #endregion // #region Others ... /// /// Return Following UserName's List of Current User /// /// a collection of UserNames [HttpGet("Friendship/FollowingsList")] [Authorize(Policy = LocalApi.PolicyName)] [Authorize(Policy = XPolicies.EnabledUser)] public async Task>> FollowingsList() { // // Do Action ... try { // var result = await IdentityManager .GetFollowingList(User.Identity.Name); // return Ok(result .ToDynamicObject()); } catch (Exception ex) { // var exResult = GetExceptionActionResult(ex); return exResult; } } /// /// Return Followers UserName's List of Current User /// /// a collection of UserNames [HttpGet("Friendship/FollowersList")] [Authorize(Policy = LocalApi.PolicyName)] [Authorize(Policy = XPolicies.EnabledUser)] public async Task>> FollowersList() { // // Do Action ... try { // var result = await IdentityManager .GetFollowersList(User.Identity.Name); // return Ok(result .ToDynamicObject()); } catch (Exception ex) { // var exResult = GetExceptionActionResult(ex); return exResult; } } /// /// Get Friendship Info Model between Specific User and Current User /// /// a user identifier which represent destination user /// an instance of XFriendshipInfoDto [HttpGet("Friendship/{destUser}/FriendshipInfo")] [Authorize(Policy = LocalApi.PolicyName)] [Authorize(Policy = XPolicies.EnabledUser)] public async Task> FriendshipInfo( [FromRoute] string destUser ) { // // Do Action ... try { // var result = await IdentityManager .GetFriendshipInfo(User.Identity.Name, destUser); // return Ok(result .ToDynamicObject()); } catch (Exception ex) { // var exResult = GetExceptionActionResult(ex); return exResult; } } #endregion #endregion } }