Initial ...

This commit is contained in:
2026-03-22 14:09:53 +03:30
commit a855ea6b70
33 changed files with 6649 additions and 0 deletions
@@ -0,0 +1,135 @@
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.Dtos;
namespace xApi.Controllers {
public partial class AccountController {
//
#region Admin Actions ...
/// <summary>
/// Ban Specific Users
/// </summary>
/// <param name="model">an instance of <see>XUserNameIdRequest</see> which represents user identifier list to Ban</param>
/// <returns>a list of banned users identifiers</returns>
[RequireXPowered]
[HttpPost ("Ban")]
[Authorize (Policy = XPolicies.EnabledAdmin)]
public async Task<ActionResult<IEnumerable<string>>> Ban (
[FromBody] XUserNameIdRequest model
) {
//
// Do Action ...
try {
//
// Validate Args ...
await ValidationProvider
.GroupValidationBuilder ()
.AddNotNull (model)
.AddNotZeroChilds (model.Ids)
.ValidateGroupAsync ();
//
var tokens = await RetrieveTokensAsXTokenResponse ();
var result = await identityProvider
.Ban (
tokens,
model
);
//
return Ok (result)
.ToDynamicObject ();
} catch (Exception ex) {
//
var exResult = GetExceptionActionResult (ex);
return exResult;
}
}
/// <summary>
/// UnBann Specific Users
/// </summary>
/// <param name="model">an instance of <see>XUserNameIdRequest</see> which represents user identifier list to Ban</param>
/// <returns>a list of unbanned users identifiers</returns>
[RequireXPowered]
[HttpPost ("UnBan")]
[Authorize (Policy = XPolicies.EnabledAdmin)]
public async Task<ActionResult<IEnumerable<string>>> UnBan (
[FromBody] XUserNameIdRequest model
) {
//
// Do Action ...
try {
//
// Validate Args ...
await ValidationProvider
.GroupValidationBuilder ()
.AddNotNull (model)
.AddNotZeroChilds (model.Ids)
.ValidateGroupAsync ();
//
var tokens = await RetrieveTokensAsXTokenResponse ();
var result = await identityProvider
.UnBan (
tokens,
model
);
//
return Ok (result
.ToDynamicObject ());
} catch (Exception ex) {
//
var exResult = GetExceptionActionResult (ex);
return exResult;
}
}
/// <summary>
/// Check Specific User is Banned or not
/// </summary>
/// <param name="userSelectByParam">specified user's identifier</param>
/// <returns>a boolean value which represent user banned or not</returns>
[RequireXPowered]
[HttpGet ("IsBanned/{userSelectByParam?}")]
[Authorize (Policy = XPolicies.EnabledAdmin)]
[Authorize (Policy = XPolicies.EnabledAgent)]
public async Task<ActionResult<bool>> IsBanned (
[FromRoute] string userSelectByParam = null
) {
//
// Do Action ...
try {
//
// Validate Args ...
if (userSelectByParam.IsNullOrEmpty ()) {
userSelectByParam = User.Identity.Name;
}
ValidationProvider.NotEmpty (userSelectByParam);
//
var tokens = await RetrieveTokensAsXTokenResponse ();
var result = await identityProvider
.IsBanned (
tokens,
userSelectByParam
);
//
return Ok (result);
} catch (Exception ex) {
//
var exResult = GetExceptionActionResult (ex);
return exResult;
}
}
#endregion
}
}
@@ -0,0 +1,388 @@
using System;
using System.Threading.Tasks;
using IdentityModel.Client;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using xIdentityHelper;
using xCommons.Attributes;
using xCommons.Extensions;
using xExceptions.Constants;
using xIdentityModels.Models;
using xModels.Dtos;
using static xIdentityHelper.XApiScopeHelper;
namespace xApi.Controllers {
public partial class AccountController {
//
#region Authentication Actions ...
/// <summary>
/// Retrieve OAuth Discovery Document
/// </summary>
/// <returns>an instance of <see>DiscoveryDocumentResponse</see></returns>
[AllowAnonymous]
[RequireXPowered]
[HttpGet ("DiscoveryDocument")]
public async Task<ActionResult<DiscoveryDocumentResponse>> GetDiscoveryDocument () {
//
try {
//
var result = await identityProvider
.RequestDiscoveryDocument ();
//
// Ceck Response Result ...
if (result.IsError) {
XException.InvalidConfiguration.Throw ();
}
//
return Ok (result
.ToDynamicObject ());
} catch (Exception ex) {
//
var result = GetExceptionActionResult (ex);
return result;
}
}
/// <summary>
/// Request AccessToken for Specific XApiScope
/// </summary>
/// <param name="scope">a member of <see>XApiScope</see></param>
/// <returns>an instance of <see>XTokenResponse</see></returns>
[AllowAnonymous]
[RequireXPowered]
[HttpPost ("RequestScopeAccessToken")]
public async Task<ActionResult<XTokenResponse>> RequestScopeAccessToken (
[FromHeader] XApiScope scope
) {
//
// Do Action ...
try {
//
// Validate Args ...
var scopeName = string.Empty;
try {
scopeName = scope.GetStringValue ();
} catch { }
ValidationProvider.NotEmpty (scopeName);
//
var result = await identityProvider
.RequestScopeAccessToken (scopeName);
//
return Ok (result
.ToDynamicObject ());
} catch (Exception ex) {
//
var result = GetExceptionActionResult (ex);
return result;
}
}
/// <summary>
/// Authenticate User
/// </summary>
/// <remarks>
/// Sample request:
///
/// {
/// "password": "",
/// "userSelectBy": "",
/// }
///
/// </remarks>
/// <param name="model">User Login Required Info, an instance of <see>XLoginRequest</see></param>
/// <returns>an instance of <see>XTokenResponse</see></returns>
[AllowAnonymous]
[RequireXPowered]
[HttpPost ("Authenticate")]
public async Task<ActionResult<XTokenResponse>> Authenticate (
[FromBody] XLoginRequest model
) {
try {
//
// Validate Args ...
if (!ModelState.IsValid) {
XException.InvalidArgs.Throw ();
}
await ValidationProvider
.GroupValidationBuilder ()
.AddNotNull (model)
.AddNotEmpty (
model.UserSelectBy,
model.Password
)
.ValidateGroupAsync ();
//
var result = await identityProvider
.Authenticate (model);
//
return Ok (result
.ToDynamicObject ());
} catch (Exception ex) {
//
var result = GetExceptionActionResult (ex);
return result;
}
}
/// <summary>
/// Authenticate User
/// </summary>
/// <remarks>
/// Sample request:
///
/// {
/// "language": "fa-IR"
/// "password": "",
/// "userSelectBy": "",
/// "device": {
/// "os":"Mac",
/// "browser":"Chrome",
/// "osVersion":"mac-os-x-15",
/// "userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) x-framework-test/0.0.0 Chrome/87.0.4280.141 Electron/11.2.0 Safari/537.36",
/// "deviceType":3,
/// "identifier":"[Mac]-[mac-os-x-15]-[3]-[Chrome]-[Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) x-framework-test/0.0.0 Chrome/87.0.4280.141 Electron/11.2.0 Safari/537.36]",
/// "token":"96f400dd9aa5c57a8cec9d6f4775bad3"
/// }
/// }
///
/// </remarks>
/// <param name="model">User Login Required Info, an instance of <see>XLoginRequest</see></param>
/// <returns>an instance of <see>XLoginResponse</see></returns>
[AllowAnonymous]
[RequireXPowered]
[HttpPost ("Login")]
public async Task<ActionResult<XLoginResponse>> Login (
[FromBody] XLoginRequest model
) {
try {
//
// Validate Args ...
if (!ModelState.IsValid) {
XException.InvalidArgs.Throw ();
}
await ValidationProvider
.GroupValidationBuilder ()
.AddNotNull (
model,
model.Device)
.AddNotEmpty (
model.Language,
model.UserSelectBy,
model.Password
)
.ValidateGroupAsync ();
//
var result = await identityProvider
.Login (model);
//
return Ok (result
.ToDynamicObject ());
} catch (Exception ex) {
//
var result = GetExceptionActionResult (ex);
return result;
}
}
/// <summary>
/// Logout User
/// </summary>
[RequireXPowered]
[HttpPost ("Logout")]
[Authorize (Policy = XPolicies.User)]
public async Task<ActionResult> Logout () {
try {
//
var tokens = await RetrieveTokensAsXTokenResponse ();
await identityProvider
.Logout (tokens);
//
return Ok ();
} catch (Exception ex) {
//
var result = GetExceptionActionResult (ex);
return result;
}
}
/// <summary>
/// Refresh Expired Tokens
/// </summary>
/// <remarks>
/// in addition to AccessToken, you had to pass RefreshToken due to Headers
/// </remarks>
/// <returns>an instance of <see>XTokenResponse</see></returns>
[AllowAnonymous]
[RequireXPowered]
[HttpPost ("RefreshTokens")]
public async Task<ActionResult<XTokenResponse>> RefreshTokens () {
//
try {
//
// Retrieve Toke Response ...
var model = await RetrieveTokensAsXTokenResponse ();
//
// Validate Args ...
ValidationProvider
.GroupValidationBuilder ()
.AddNotNull (model)
.AddNotEmpty (
model.AccessToken,
model.RefreshToken)
.ValidateGroup ();
//
var result = await identityProvider
.RefreshTokens (model);
//
return Ok (result
.ToDynamicObject ());
} catch (Exception ex) {
//
var result = GetExceptionActionResult (ex);
return result;
}
}
/// <summary>
/// Validate a Revision Checksum
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
[HttpPost ("Validate")]
[Authorize (Policy = XPolicies.EnabledUser)]
public async Task<ActionResult<bool>> Validate (
[FromBody] XValidateRevisionRequest model
) {
//
// Do Action ...
try {
//
// Validate Args ...
await ValidationProvider
.GroupValidationBuilder ()
.AddNotNull (model)
.AddNotEmpty (model.Revision)
.ValidateGroupAsync ();
//
// Get Request ...
var tokens = await RetrieveTokensAsXTokenResponse ();
var result = tokens.ValidateRevisionChecksum (
model.Revision,
identityProvider.RevisionSecretKey
);
//
// Return Result
return Ok (result);
} catch (Exception ex) {
//
var result = GetExceptionActionResult (ex);
return result;
}
}
#endregion
//
#region Password Actions ...
/// <summary>
/// Change a User's Password ...
/// </summary>
/// <remarks>
/// for this action you have to provide:
/// - Lang: client device currently used locale, such as: en-US.
/// - Password: user's current active password.
/// - NewPassword: user's new password to change.
/// - Device: user's client device which is an instance of XDevice.
/// - ReturnUrl: client application Login URL.
///
/// Sample request:
///
/// {
/// "lang": "fa-IR",
/// "password": ""
/// "newPassword": "",
/// "returnUrl": "http://localhost/login",
/// "device": {
/// "os":"Mac",
/// "browser":"Chrome",
/// "osVersion":"mac-os-x-15",
/// "userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) x-framework-test/0.0.0 Chrome/87.0.4280.141 Electron/11.2.0 Safari/537.36",
/// "deviceType":3,
/// "identifier":"[Mac]-[mac-os-x-15]-[3]-[Chrome]-[Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) x-framework-test/0.0.0 Chrome/87.0.4280.141 Electron/11.2.0 Safari/537.36]",
/// "token":"96f400dd9aa5c57a8cec9d6f4775bad3"
/// }
/// }
///
/// </remarks>
/// <param name="model">an instance of <see>XActionRequest</see> class which provider requirement for action</param>
/// <returns></returns>
[RequireXPowered]
[HttpPost ("ChangePassword")]
[Authorize (Policy = XPolicies.User)]
[Authorize (Policy = XPolicies.EnabledUser)]
public async Task<ActionResult> ChangePassword (
[FromBody] XActionRequest model
) {
//
// Do Action ...
try {
//
// Validate Args ...
if (!ModelState.IsValid) {
XException.InvalidArgs.Throw ();
}
await ValidationProvider
.GroupValidationBuilder ()
.AddNotNull (
model,
model.Device
)
.AddNotEmpty (
model.Lang,
model.Password,
model.NewPassword,
model.ReturnUrl
)
.ValidateGroupAsync ();
//
// Get User Select By ...
var userSelectByParam = GetUserSelectByParam (
model,
forceNotNull : false
);
if (userSelectByParam.IsNullOrEmpty ()) {
userSelectByParam = User.Identity.Name;
}
ValidationProvider.NotEmpty (userSelectByParam);
//
// Get Request ...
var tokens = await RetrieveTokensAsXTokenResponse ();
await identityProvider
.ChangePassword (tokens, model);
//
return Ok ();
} catch (Exception ex) {
//
var exResult = GetExceptionActionResult (ex);
return exResult;
}
}
#endregion
}
}
@@ -0,0 +1,910 @@
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 ...
/// <summary>
/// Follow a User
/// </summary>
/// <param name="destUser">a user identifier which represent destination user</param>
/// <returns>an instance of <see>XFriendshipFollowing</see></returns>
[RequireXPowered]
[HttpPost("Friendship/{destUser}/Follow")]
[Authorize(Policy = XPolicies.EnabledUser)]
public async Task<ActionResult<XFriendshipFollowing>> 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;
}
}
/// <summary>
/// Cancel Following Request
/// </summary>
/// <param name="destUser">a user identifier which represent destination user</param>
/// <returns>a boolean value</returns>
[Authorize(Policy = XPolicies.EnabledUser)]
[HttpPost("Friendship/{destUser}/Cancel")]
public async Task<ActionResult<bool>> 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;
}
}
/// <summary>
/// Unfollow a Follower
/// </summary>
/// <param name="destUser">a user identifier which represent destination user</param>
/// <returns></returns>
[Authorize(Policy = XPolicies.EnabledUser)]
[HttpPost("Friendship/{destUser}/UnFollowFollower")]
public async Task<ActionResult> 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;
}
}
/// <summary>
/// Unfollow Following
/// </summary>
/// <param name="destUser">a user identifier which represent destination user</param>
/// <returns></returns>
[Authorize(Policy = XPolicies.EnabledUser)]
[HttpPost("Friendship/{destUser}/UnFollowFollowing")]
public async Task<ActionResult> 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;
}
}
/// <summary>
/// Block a Follower
/// </summary>
/// <param name="destUser">a user identifier which represent destination user</param>
/// <returns>an instance of <see>XFriendshipFollowing</see></returns>
[HttpPost("Friendship/{destUser}/Block")]
[Authorize(Policy = XPolicies.EnabledUser)]
public async Task<ActionResult<XFriendshipFollowing>> 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;
}
}
/// <summary>
/// Unblock a Blocked User
/// </summary>
/// <param name="destUser">a user identifier which represent destination user</param>
/// <returns>an instance of <see>XFriendshipFollowing</see></returns>
[HttpPost("Friendship/{destUser}/UnBlock")]
[Authorize(Policy = XPolicies.EnabledUser)]
public async Task<ActionResult<XFriendshipFollowing>> 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;
}
}
/// <summary>
/// Accept a Following Request
/// </summary>
/// <param name="destUser">a user identifier which represent destination user</param>
/// <returns>an instance of <see>XFriendshipFollower</see></returns>
[Authorize(Policy = XPolicies.EnabledUser)]
[HttpPost("Friendship/{destUser}/AcceptRequest")]
public async Task<ActionResult<XFriendshipFollower>> 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;
}
}
/// <summary>
/// Reject a Following Request
/// </summary>
/// <param name="destUser">a user identifier which represent destination user</param>
/// <returns>an instance of <see>XFriendshipFollower</see></returns>
[Authorize(Policy = XPolicies.EnabledUser)]
[HttpPost("Friendship/{destUser}/RejectRequest")]
public async Task<ActionResult<XFriendshipFollower>> 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 ...
/// <summary>
/// Get Friendship Info Model between Specific User and Current User
/// </summary>
/// <param name="destUser">a user identifier which represent destination user</param>
/// <returns>an instance of <see>XFriendshipInfoDto</see></returns>
[Authorize(Policy = XPolicies.EnabledUser)]
[HttpGet("Friendship/{destUser}/FriendshipInfo")]
public async Task<ActionResult<XFriendshipInfoDto>> 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;
}
}
/// <summary>
/// Check a User IsFollower of Requested User
/// </summary>
/// <param name="destUser">a user identifier which represent destination user</param>
/// <returns>a boolean value</returns>
[Authorize(Policy = XPolicies.EnabledUser)]
[HttpGet("Friendship/{destUser}/IsFollower")]
public async Task<ActionResult<bool>> 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;
}
}
/// <summary>
/// Get Follower State of a User
/// </summary>
/// <param name="destUser">a user identifier which represent destination user</param>
/// <returns>an instance of <see>XFriendshipState</see></returns>
[Authorize(Policy = XPolicies.EnabledUser)]
[HttpGet("Friendship/{destUser}/FollowerState")]
public async Task<ActionResult<XFriendshipState>> 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;
}
}
/// <summary>
/// Get Specific Follower
/// </summary>
/// <param name="destUser">a user identifier which represent destination user</param>
/// <returns>an instance of <see>XFriendshipFollower</see></returns>
[Authorize(Policy = XPolicies.EnabledUser)]
[HttpGet("Friendship/{destUser}/Follower")]
public async Task<ActionResult<XFriendshipFollower>> 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;
}
}
/// <summary>
/// Get Followers List Of Current User
/// </summary>
/// <returns>a collection of <see>XFriendshipFollower</see></returns>
[HttpGet("Friendship/Followers")]
[Authorize(Policy = XPolicies.EnabledUser)]
public async Task<ActionResult<IEnumerable<XFriendshipFollower>>> 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;
}
}
/// <summary>
/// Get All Followers List Includes Blocked, Requested and etc
/// of Current User
/// </summary>
/// <returns>a collection of <see>XFriendshipFollower</see></returns>
[HttpGet("Friendship/AllFollowers")]
[Authorize(Policy = XPolicies.EnabledUser)]
public async Task<ActionResult<IEnumerable<XFriendshipFollower>>> 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;
}
}
/// <summary>
/// Get All Followers List Includes Blocked, Requested and etc
/// of Current User based On Query Model ...
/// </summary>
/// <returns>a Query Result of <see>XFriendDto</see></returns>
[HttpGet("Friendship/QueryFollowers")]
[Authorize(Policy = XPolicies.EnabledUser)]
public async Task<ActionResult<XQueryResult<XFriendDto>>> 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;
}
}
/// <summary>
/// Check a User is in Followings of Current User
/// </summary>
/// <param name="destUser">a user identifier which represent destination user</param>
/// <returns>a boolean value</returns>
[Authorize(Policy = XPolicies.EnabledUser)]
[HttpGet("Friendship/{destUser}/IsFollowing")]
public async Task<ActionResult<bool>> 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;
}
}
/// <summary>
/// Get Following State Relation between Specific User
/// and Current User
/// </summary>
/// <param name="destUser">a user identifier which represent destination user</param>
/// <returns>an instance of <see>XFriendshipState</see></returns>
[Authorize(Policy = XPolicies.EnabledUser)]
[HttpGet("Friendship/{destUser}/FollowingState")]
public async Task<ActionResult<XFriendshipState>> 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;
}
}
/// <summary>
/// Get Specific Following Model
/// </summary>
/// <param name="destUser">a user identifier which represent destination user</param>
/// <returns>an instance of <see>XFriendshipFollowing</see></returns>
[Authorize(Policy = XPolicies.EnabledUser)]
[HttpGet("Friendship/{destUser}/Following")]
public async Task<ActionResult<XFriendshipFollowing>> 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;
}
}
/// <summary>
/// Get Followings of Current User
/// </summary>
/// <returns>a collection of <see>XFriendshipFollowing</see></returns>
[HttpGet("Friendship/Followings")]
[Authorize(Policy = XPolicies.EnabledUser)]
public async Task<ActionResult<IEnumerable<XFriendshipFollowing>>> 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;
}
}
/// <summary>
/// Get All Following List Includes Blocked, Requested and etc
/// of Current User
/// </summary>
/// <returns>a collection of <see>XFriendshipFollowing</see></returns>
[HttpGet("Friendship/AllFollowings")]
[Authorize(Policy = XPolicies.EnabledUser)]
public async Task<ActionResult<IEnumerable<XFriendshipFollowing>>> 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;
}
}
/// <summary>
/// Return Following UserName's List of Current User
/// </summary>
/// <returns>a collection of UserNames</returns>
[HttpGet("Friendship/FollowingsList")]
[Authorize(Policy = XPolicies.EnabledUser)]
public async Task<ActionResult<IEnumerable<string>>> 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;
}
}
/// <summary>
/// Return Followers UserName's List of Current User
/// </summary>
/// <returns>a collection of UserNames</returns>
[HttpGet("Friendship/FollowersList")]
[Authorize(Policy = XPolicies.EnabledUser)]
public async Task<ActionResult<IEnumerable<string>>> 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;
}
}
/// <summary>
/// Get All Followings List Includes Blocked, Requested and etc
/// of Current User based On Query Model ...
/// </summary>
/// <returns>a Query Result of <see>XFriendDto</see></returns>
[HttpGet("Friendship/QueryFollowings")]
[Authorize(Policy = XPolicies.EnabledUser)]
public async Task<ActionResult<XQueryResult<XFriendDto>>> 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
}
}
@@ -0,0 +1,93 @@
using System;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using xCommons.Attributes;
using xCommons.Extensions;
using xModels.Dtos;
namespace xApi.Controllers
{
public partial class AccountController
{
#region Open Actions ...
[AllowAnonymous]
[RequireXPowered]
[HttpGet("GetUserInfo")]
public async Task<ActionResult<string>> GetUserInfo(
[FromHeader] string token,
[FromQuery] string request
)
{
//
// Do Action ...
try
{
//
// Validate Args ...
await ValidationProvider
.GroupValidationBuilder()
.AddNotEmpty(token)
.AddNotEmpty(request)
.ValidateGroupAsync();
//
var result = await identityProvider.GetUserInfo(
token: token,
request: request
);
//
// Return Result
return Ok(result
.ToDynamicObject());
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
return result;
}
}
[AllowAnonymous]
[RequireXPowered]
[HttpGet("GetUserInfoByDevice")]
public async Task<ActionResult<string>> GetUserInfoByDevice(
[FromQuery] string userSelectByParam,
[FromBody] XDeviceDto device
)
{
//
// Do Action ...
try
{
//
// Validate Args ...
await ValidationProvider
.GroupValidationBuilder()
.AddNotEmpty(userSelectByParam)
.AddNotNull(device)
.ValidateGroupAsync();
//
var result = await identityProvider.GetUserInfo(
userSelectByParam: userSelectByParam,
device: device
);
//
// Return Result
return Ok(result
.ToDynamicObject());
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
return result;
}
}
#endregion
}
}
@@ -0,0 +1,528 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using xIdentityHelper;
using xCommons.Attributes;
using xCommons.Extensions;
using xIdentityModels.Dtos;
using xIdentityModels.Models;
using xModels.Dtos;
namespace xApi.Controllers
{
public partial class AccountController
{
//
#region Retrieve Actions ...
/// <summary>
/// Retrieve User Names based on UserIds
/// </summary>
/// <param name="ids">a comma seperated list of UserIds</param>
/// <returns>a collection of UserNames</returns>
[RequireXPowered]
[HttpGet("Profile/{ids}/GetNames")]
[Authorize(Policy = XPolicies.User)]
[Authorize(Policy = XPolicies.EnabledUser)]
public async Task<ActionResult<IEnumerable<string>>> GetNames(
[FromRoute] string ids
)
{
//
// Do Action ...
try
{
//
ValidationProvider.NotEmpty(ids);
//
var tokens = await RetrieveTokensAsXTokenResponse();
var result = await identityProvider.GetUserNames(
tokens,
ids
);
//
// Return Result
return Ok(result
.ToDynamicObject());
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
return result;
}
}
/// <summary>
/// get user ids and retrieve corresponding user names
/// </summary>
/// <param name="model">an instance of <see>XUserNameIdRequest</see> which represent required UserIds collection</param>
/// <returns>a collection of <see>XUserNameIdResponse</see> instance</returns>
[RequireXPowered]
[HttpPost("Profile/GetNameIds")]
[Authorize(Policy = XPolicies.User)]
[Authorize(Policy = XPolicies.EnabledUser)]
public async Task<ActionResult<IEnumerable<XUserNameIdResponse>>> GetNameIds(
[FromBody] XUserNameIdRequest model
)
{
//
// Do Action ...
try
{
//
ValidationProvider.NotNull(model);
//
var tokens = await RetrieveTokensAsXTokenResponse();
var result = await identityProvider.GetUserNameIds(
tokens,
model
);
//
// Return Result
return Ok(result
.ToDynamicObject());
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
return result;
}
}
/// <summary>
/// Get Profile Object of Specific User
/// </summary>
/// <param name="userSelectByParam">determine's which user profile must be retrieved</param>
/// <returns>an instance of <see>XUserProfileDto</see></returns>
[RequireXPowered]
[Authorize(Policy = XPolicies.User)]
[HttpGet("Profile/{userSelectByParam?}")]
[Authorize(Policy = XPolicies.EnabledUser)]
public async Task<ActionResult<XUserProfileDto>> GetProfile(
[FromRoute] string userSelectByParam = ""
)
{
//
// Do Action ...
try
{
//
// Validate Args ...
if (userSelectByParam.IsNullOrEmpty())
{
userSelectByParam = User.Identity.Name;
}
ValidationProvider.NotEmpty(userSelectByParam);
//
var tokens = await RetrieveTokensAsXTokenResponse();
var result = await identityProvider
.GetUserProfile(
tokens,
userSelectByParam
);
//
// Return Result
return Ok(result
.ToDynamicObject());
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
return result;
}
}
/// <summary>
/// Query Users
/// for specifiy users role for query user 'role: string' and 'forceRole: boolean' in header
/// </summary>
/// <param name="query">how to filter results based on <see>XQuery</see> structure</param>
/// <param name="role">an string which represent user role</param>
/// <param name="forceRole">if it's true the user must has exact role, otherwise top level users also listed</param>
/// <returns>an instance of <see>XQueryResult</see> of <see>XUserProfileDto</see></returns>
[RequireXPowered]
[HttpGet("Profile/Query")]
[Authorize(Policy = XPolicies.EnabledAdmin)]
[Authorize(Policy = XPolicies.EnabledAgent)]
public async Task<ActionResult<XQueryResult<XUserProfileDto>>> QueryProfiles(
[FromQuery] XQuery query, [FromHeader] string role, [FromHeader] bool forceRole = false
)
{
//
// Do Action ...
try
{
//
var tokens = await RetrieveTokensAsXTokenResponse();
var result = new XQueryResult<XUserProfileDto>();
if (role.IsNullOrEmpty())
{
//
result = await identityProvider.QueryUsers(
tokens,
query
);
}
else
{
//
result = await identityProvider.QueryInRoleUsers(
tokens,
role,
query,
forceRole
);
}
//
return Ok(result
.ToDynamicObject());
}
catch (Exception ex)
{
//
var exception = GetExceptionActionResult(ex);
return exception;
}
}
/// <summary>
/// Query Specified User's Profile Images
/// </summary>
/// <param name="userSelectByParam">determine's which user profile must be retrieved</param>
/// <param name="query">how to filter results based on <see>XQuery</see> structure</param>
/// <returns>an instance of <see>XQueryResult</see> of <see>XProfileImage</see></returns>
[RequireXPowered]
[Authorize(Policy = XPolicies.User)]
[Authorize(Policy = XPolicies.EnabledUser)]
[Authorize(Policy = XPolicies.EnabledAdmin)]
[HttpGet("Profile/Avatars/Query/{userSelectByParam?}")]
public async Task<ActionResult<XQueryResult<XProfileImageDto>>> QueryAvatars(
[FromQuery] XQuery query, [FromRoute] string userSelectByParam = null
)
{
//
// Do Action ...
try
{
//
if (userSelectByParam.IsNullOrEmpty())
{
userSelectByParam = User.Identity.Name;
}
ValidationProvider.NotEmpty(userSelectByParam);
//
var tokens = await RetrieveTokensAsXTokenResponse();
var result = await identityProvider.QueryAvatars(
tokens,
userSelectByParam,
query
);
//
return Ok(result
.ToDynamicObject());
}
catch (Exception ex)
{
//
var exception = GetExceptionActionResult(ex);
return exception;
}
}
#endregion
//
#region Update Actions ...
/// <summary>
/// Update User Profile based on <see>XProfileUpdateRequest</see> (FirstName/LastName/DateOfBirth)
/// </summary>
/// <param name="model">user update info, an instance of <see>XProfileUpdateRequest</see></param>
/// <param name="userSelectByParam">determine's which user profile must be retrieved</param>
/// <returns>an instance of <see>XUserProfileDto</see></returns>
[RequireXPowered]
[Authorize(Policy = XPolicies.EnabledUser)]
[HttpPost("Profile/Update/{userSelectByParam?}")]
public async Task<ActionResult<XUserProfileDto>> UpdateProfile(
[FromBody] XProfileUpdateRequest model, [FromRoute] string userSelectByParam = null
)
{
//
// Do Action ...
try
{
//
// Validate Args ...
if (userSelectByParam.IsNullOrEmpty())
{
userSelectByParam = User.Identity.Name;
}
ValidationProvider.NotEmpty(userSelectByParam);
//
var tokens = await RetrieveTokensAsXTokenResponse();
var result = await identityProvider.ProfileUpdateAsync(
tokens,
userSelectByParam,
model
);
//
// Prepare Push Message ...
//
// Return Result
return Ok(result
.ToDynamicObject());
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
return result;
}
}
/// <summary>
/// Update a User Profile based on <see>XProfileUpdateRequest</see> Full
/// </summary>
/// <param name="model">user update info, an instance of <see>XProfileUpdateRequest</see></param>
/// <param name="userSelectByParam">determine's which user profile must be retrieved</param>
/// <returns>an instance of <see>XUserProfileDto</see></returns>
[RequireXPowered]
[HttpPost("Profile/{userSelectByParam?}")]
[Authorize(Policy = XPolicies.EnabledAdminOrAgent)]
public async Task<ActionResult<XUserProfileDto>> FullUpdateProfile(
[FromBody] XProfileUpdateRequest model, [FromRoute] string userSelectByParam = null
)
{
//
// Do Action ...
try
{
//
// Validate Args ...
if (userSelectByParam.IsNullOrEmpty())
{
userSelectByParam = User.Identity.Name;
}
ValidationProvider.NotEmpty(userSelectByParam);
//
var tokens = await RetrieveTokensAsXTokenResponse();
var result = await identityProvider.FullProfileUpdateAsync(
tokens,
userSelectByParam,
model
);
//
// Prepare Push Message ...
//
// Return Result
return Ok(result
.ToDynamicObject());
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
return result;
}
}
#endregion
//
#region Avatar Actions ...
/// <summary>
/// Add a New Profile Image
/// </summary>
/// <param name="file">an specific File to upload, <see>IFormFile</see></param>
/// <returns>an instance of <see>XUserProfileDto</see></returns>
[RequireXPowered]
[HttpPost("Profile/Avatar")]
[RequestSizeLimit(966_367_641)]
[Authorize(Policy = XPolicies.User)]
[Authorize(Policy = XPolicies.EnabledUser)]
public async Task<ActionResult<XUserProfileDto>> AddAvatar(
[FromForm] IFormFile file
)
{
//
// Do Action ...
try
{
//
// Validate Args ...
ValidationProvider.NotNull(file);
//
// Get Request ...
var tokens = await RetrieveTokensAsXTokenResponse();
var result = await identityProvider
.AddAvatar(
tokens,
file
);
//
// Prepare Push Message ...
//
return Ok(result
.ToDynamicObject());
}
catch (Exception ex)
{
//
var exResult = GetExceptionActionResult(ex);
return exResult;
}
}
/// <summary>
/// Add a New Collection of Profile Images
/// </summary>
/// <param name="files">a collection of Files to upload, <see>IFormFileCollection</see></param>
/// <returns>an instance of <see>XUserProfileDto</see></returns>
[RequireXPowered]
[HttpPost("Profile/Avatars")]
[RequestSizeLimit(966_367_641)]
[Authorize(Policy = XPolicies.User)]
[Authorize(Policy = XPolicies.EnabledUser)]
public async Task<ActionResult<XUserProfileDto>> AddAvatars(
[FromForm] IFormFileCollection files
)
{
//
// Do Action ...
try
{
//
// Validate Args ...
ValidationProvider.NotZeroChilds(files);
//
// Get Request ...
var tokens = await RetrieveTokensAsXTokenResponse();
var result = await identityProvider.AddAvatars(
tokens,
files
);
//
// Prepare Push Message ...
//
return Ok(result
.ToDynamicObject());
}
catch (Exception ex)
{
//
var exResult = GetExceptionActionResult(ex);
return exResult;
}
}
/// <summary>
/// set Specified Profile Image as Avatar
/// </summary>
/// <param name="id">an integer which reperesent AvatarId to set as current Avatar</param>
/// <returns>an instance of <see>XUserProfileDto</see></returns>
[RequireXPowered]
[HttpPost("Profile/Avatars/{id:int}/Set")]
[Authorize(Policy = XPolicies.User)]
[Authorize(Policy = XPolicies.EnabledUser)]
public async Task<ActionResult<XUserProfileDto>> SetAvatar(
[FromRoute] int id
)
{
//
// Do Action ...
try
{
//
// Get Request ...
var tokens = await RetrieveTokensAsXTokenResponse();
var result = await identityProvider
.SetAvatar(
tokens,
id
);
//
// Prepare Push Message ...
//
return Ok(result
.ToDynamicObject());
}
catch (Exception ex)
{
//
var exception = GetExceptionActionResult(ex);
return exception;
}
}
/// <summary>
/// Remove Profile Images
/// </summary>
/// <param name="ids">a comma seperated list of avatarIds to remove</param>
/// <returns>an instance of <see>XUserProfileDto</see></returns>
[RequireXPowered]
[Authorize(Policy = XPolicies.User)]
[HttpDelete("Profile/Avatars/{ids}")]
[Authorize(Policy = XPolicies.EnabledUser)]
public async Task<ActionResult<XUserProfileDto>> RemoveAvatars(
[FromRoute] string ids
)
{
//
// Do Action ...
try
{
//
// Validate Args ...
ValidationProvider.NotEmpty(ids);
//
// Get Request ...
var tokens = await RetrieveTokensAsXTokenResponse();
var result = await identityProvider
.RemoveAvatars(
tokens,
ids
);
//
// Prepare Push Message ...
//
return Ok(result
.ToDynamicObject());
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
return result;
}
}
#endregion
}
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,54 @@
using System;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using xCommons.Attributes;
using xCommons.Extensions;
using xIdentityHelper;
using xIdentityModels.Dtos;
using xModels.Dtos;
namespace xApi.Controllers
{
public partial class AccountController
{
//
#region Actions ...
/// <summary>
/// Query Open To Search Users Profiles ...
/// Query all Users Which their Profiles is Open To Search ...
/// </summary>
/// <param name="query">how to filter results based on <see>XQuery</see> structure</param>
/// <returns>an instance of <see>XQueryResult</see> of <see>XUserProfileDto</see></returns>
[RequireXPowered]
[HttpGet("OpenToSearch/Query")]
[Authorize(Policy = XPolicies.EnabledUser)]
public async Task<ActionResult<XQueryResult<XUserProfileDto>>> QueryOpenToSearchProfiles(
[FromQuery] XQuery query
)
{
//
// Do Action ...
try
{
//
var tokens = await RetrieveTokensAsXTokenResponse();
var result = await identityProvider.QueryOpenToSearchUsers(
tokens,
query
);
//
return Ok(result
.ToDynamicObject());
}
catch (Exception ex)
{
//
var exception = GetExceptionActionResult(ex);
return exception;
}
}
#endregion
}
}