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
}
}