using System; using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using xIdentityHelper; using xCommons.Attributes; using xCommons.Extensions; using xIdentityModels.Constants; using xIdentityModels.Dtos; using xIdentityModels.Navigations; using xModels.Dtos; using System.Linq; using xExceptions.Constants; namespace xApi.Controllers { public partial class AccountController { // #region Friendship Actions ... /// /// Follow a User /// /// a user identifier which represent destination user /// an instance of XFriendshipFollowing [RequireXPowered] [HttpPost("Friendship/{destUser}/Follow")] [Authorize(Policy = XPolicies.EnabledUser)] public async Task> Follow( [FromRoute] string destUser ) { // // Do Action ... try { // // Validate Args ... ValidationProvider.NotEmpty(destUser); // var tokens = await RetrieveTokensAsXTokenResponse(); var result = await identityProvider .Follow( tokens, destUser ); // // Prepare Push Message ... // return Ok(result .ToDynamicObject()); } catch (Exception ex) { // var exResult = GetExceptionActionResult(ex); return exResult; } } /// /// Cancel Following Request /// /// a user identifier which represent destination user /// a boolean value [Authorize(Policy = XPolicies.EnabledUser)] [HttpPost("Friendship/{destUser}/Cancel")] public async Task> Cancel( [FromRoute] string destUser ) { // // Do Action ... try { // // Validate Args ... ValidationProvider.NotEmpty(destUser); // var tokens = await RetrieveTokensAsXTokenResponse(); var result = await identityProvider .Cancel( tokens, destUser ); // // Prepare Push Message ... // return Ok(result); } catch (Exception ex) { // var exResult = GetExceptionActionResult(ex); return exResult; } } /// /// Unfollow a Follower /// /// a user identifier which represent destination user /// [Authorize(Policy = XPolicies.EnabledUser)] [HttpPost("Friendship/{destUser}/UnFollowFollower")] public async Task UnFollowFollower( [FromRoute] string destUser ) { // // Do Action ... try { // // Validate Args ... ValidationProvider.NotEmpty(destUser); // var tokens = await RetrieveTokensAsXTokenResponse(); await identityProvider .UnFollowFollower( tokens, destUser ); // // Prepare Push Message ... // return Ok(); } catch (Exception ex) { // var exResult = GetExceptionActionResult(ex); return exResult; } } /// /// Unfollow Following /// /// a user identifier which represent destination user /// [Authorize(Policy = XPolicies.EnabledUser)] [HttpPost("Friendship/{destUser}/UnFollowFollowing")] public async Task UnFollowFollowing( [FromRoute] string destUser ) { // // Do Action ... try { // // Validate Args ... ValidationProvider.NotEmpty(destUser); // var tokens = await RetrieveTokensAsXTokenResponse(); await identityProvider .UnFollowFollowing( tokens, destUser ); // // Prepare Push Message ... // 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 = XPolicies.EnabledUser)] public async Task> Block( [FromRoute] string destUser ) { // // Do Action ... try { // // Validate Args ... ValidationProvider.NotEmpty(destUser); // var tokens = await RetrieveTokensAsXTokenResponse(); var result = await identityProvider .Block( tokens, destUser ); // // Prepare Push Message ... // return Ok(result .ToDynamicObject()); } catch (Exception ex) { // var exResult = GetExceptionActionResult(ex); // return exResult; } } /// /// Unblock a Blocked User /// /// a user identifier which represent destination user /// an instance of XFriendshipFollowing [HttpPost("Friendship/{destUser}/UnBlock")] [Authorize(Policy = XPolicies.EnabledUser)] public async Task> UnBlock( [FromRoute] string destUser ) { // // Do Action ... try { // // Validate Args ... ValidationProvider.NotEmpty(destUser); // var tokens = await RetrieveTokensAsXTokenResponse(); var result = await identityProvider .UnBlock( tokens, destUser ); // // Prepare Push Message ... // return Ok(result .ToDynamicObject()); } catch (Exception ex) { // var exResult = GetExceptionActionResult(ex); return exResult; } } /// /// Accept a Following Request /// /// a user identifier which represent destination user /// an instance of XFriendshipFollower [Authorize(Policy = XPolicies.EnabledUser)] [HttpPost("Friendship/{destUser}/AcceptRequest")] public async Task> AcceptRequest( [FromRoute] string destUser ) { // // Do Action ... try { // // Validate Args ... ValidationProvider.NotEmpty(destUser); // var tokens = await RetrieveTokensAsXTokenResponse(); var result = await identityProvider .AcceptRequest( tokens, destUser ); // // Prepare Push Message ... // 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 = XPolicies.EnabledUser)] [HttpPost("Friendship/{destUser}/RejectRequest")] public async Task> RejectRequest( [FromRoute] string destUser ) { // // Do Action ... try { // // Validate Args ... ValidationProvider.NotEmpty(destUser); // var tokens = await RetrieveTokensAsXTokenResponse(); var result = await identityProvider .RejectRequest( tokens, destUser ); // return Ok(result .ToDynamicObject()); } catch (Exception ex) { // var exResult = GetExceptionActionResult(ex); return exResult; } } #endregion // #region Friendship Getters ... /// /// Get Friendship Info Model between Specific User and Current User /// /// a user identifier which represent destination user /// an instance of XFriendshipInfoDto [Authorize(Policy = XPolicies.EnabledUser)] [HttpGet("Friendship/{destUser}/FriendshipInfo")] public async Task> FriendshipInfo( [FromRoute] string destUser ) { // // Do Action ... try { // // Validate Args ... ValidationProvider.NotEmpty(destUser); // var tokens = await RetrieveTokensAsXTokenResponse(); var result = await identityProvider .GetFriendshipInfo( tokens, destUser ); // return Ok(result .ToDynamicObject()); } catch (Exception ex) { // var exResult = GetExceptionActionResult(ex); return exResult; } } /// /// Check a User IsFollower of Requested User /// /// a user identifier which represent destination user /// a boolean value [Authorize(Policy = XPolicies.EnabledUser)] [HttpGet("Friendship/{destUser}/IsFollower")] public async Task> IsFollower( [FromRoute] string destUser ) { // // Do Action ... try { // // Validate Args ... ValidationProvider.NotEmpty(destUser); // var tokens = await RetrieveTokensAsXTokenResponse(); var result = await identityProvider .IsFollower( tokens, 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 = XPolicies.EnabledUser)] [HttpGet("Friendship/{destUser}/FollowerState")] public async Task> FollowerState( [FromRoute] string destUser ) { // // Do Action ... try { // // Validate Args ... ValidationProvider.NotEmpty(destUser); // var tokens = await RetrieveTokensAsXTokenResponse(); var result = await identityProvider .GetFollowerState( tokens, 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 = XPolicies.EnabledUser)] [HttpGet("Friendship/{destUser}/Follower")] public async Task> Follower( [FromRoute] string destUser ) { // // Do Action ... try { // // Validate Args ... ValidationProvider.NotEmpty(destUser); // var tokens = await RetrieveTokensAsXTokenResponse(); var result = await identityProvider .GetFollower( tokens, 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 = XPolicies.EnabledUser)] public async Task>> Followers() { // // Do Action ... try { // var tokens = await RetrieveTokensAsXTokenResponse(); var result = await identityProvider .GetFollowers(tokens); // 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 = XPolicies.EnabledUser)] public async Task>> AllFollowers() { // // Do Action ... try { // var tokens = await RetrieveTokensAsXTokenResponse(); var result = await identityProvider .GetAllFollowers(tokens); // 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 = 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 tokens = await RetrieveTokensAsXTokenResponse(); var result = await identityProvider .QueryFollowers( query: query, tokens: tokens, destUser: 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 = XPolicies.EnabledUser)] [HttpGet("Friendship/{destUser}/IsFollowing")] public async Task> IsFollowing( [FromRoute] string destUser ) { // // Do Action ... try { // // Validate Args ... ValidationProvider.NotEmpty(destUser); // var tokens = await RetrieveTokensAsXTokenResponse(); var result = await identityProvider .IsFollowing( tokens, 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 = XPolicies.EnabledUser)] [HttpGet("Friendship/{destUser}/FollowingState")] public async Task> FollowingState( [FromRoute] string destUser ) { // // Do Action ... try { // // Validate Args ... ValidationProvider.NotEmpty(destUser); // var tokens = await RetrieveTokensAsXTokenResponse(); var result = await identityProvider .GetFollowingState( tokens, 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 = XPolicies.EnabledUser)] [HttpGet("Friendship/{destUser}/Following")] public async Task> Following( [FromRoute] string destUser ) { // // Do Action ... try { // // Validate Args ... ValidationProvider.NotEmpty(destUser); // var tokens = await RetrieveTokensAsXTokenResponse(); var result = await identityProvider .GetFollowing( tokens, 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 = XPolicies.EnabledUser)] public async Task>> Followings() { // // Do Action ... try { // var tokens = await RetrieveTokensAsXTokenResponse(); var result = await identityProvider .GetFollowings(tokens); // 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 = XPolicies.EnabledUser)] public async Task>> AllFollowings() { // // Do Action ... try { // var tokens = await RetrieveTokensAsXTokenResponse(); var result = await identityProvider .GetAllFollowings(tokens); // return Ok(result .ToDynamicObject()); } catch (Exception ex) { // var exResult = GetExceptionActionResult(ex); return exResult; } } /// /// Return Following UserName's List of Current User /// /// a collection of UserNames [HttpGet("Friendship/FollowingsList")] [Authorize(Policy = XPolicies.EnabledUser)] public async Task>> FollowingsList() { // // Do Action ... try { // var tokens = await RetrieveTokensAsXTokenResponse(); var result = await identityProvider .GetFollowingList(tokens); // 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 = XPolicies.EnabledUser)] public async Task>> FollowersList() { // // Do Action ... try { // var tokens = await RetrieveTokensAsXTokenResponse(); var result = await identityProvider .GetFollowersList(tokens); // return Ok(result .ToDynamicObject()); } catch (Exception ex) { // var exResult = GetExceptionActionResult(ex); return exResult; } } /// /// Get All Followings List Includes Blocked, Requested and etc /// of Current User based On Query Model ... /// /// a Query Result of XFriendDto [HttpGet("Friendship/QueryFollowings")] [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 tokens = await RetrieveTokensAsXTokenResponse(); var result = await identityProvider .QueryFollowings( query: query, tokens: tokens, destUser: destUser ); // return Ok(result .ToDynamicObject()); } catch (Exception ex) { // var exResult = GetExceptionActionResult(ex); return exResult; } } #endregion } }