Api: FormatRoute rename to Read

This commit is contained in:
pavelbannov 2019-06-14 11:15:28 +03:00
parent e9242435f5
commit 0b52eb9d26
4 changed files with 271 additions and 14 deletions

View File

@ -2,15 +2,52 @@
namespace ASC.Web.Api.Routing
{
public class FormatRouteAttribute : RouteAttribute
public class ReadAttribute : HttpGetAttribute
{
public FormatRouteAttribute(bool format = true) :
public ReadAttribute(bool format = true) :
base($"[controller]{(format ? ".{format}" : "")}")
{
}
public FormatRouteAttribute(string template, bool format = true) :
public ReadAttribute(string template, bool format = true, int order = 1) :
base($"[controller]/{template}{(!format ? "": (template.EndsWith("}") ? ".{format?}" : ".{format}"))}")
{
Order = order;
}
}
public class CreateAttribute : HttpPostAttribute
{
public CreateAttribute(bool format = true) :
base($"[controller]{(format ? ".{format}" : "")}")
{
}
public CreateAttribute(string template, bool format = true, int order = 1) :
base($"[controller]/{template}{(!format ? "": (template.EndsWith("}") ? ".{format?}" : ".{format}"))}")
{
Order = order;
}
}
public class UpdateAttribute : HttpPutAttribute
{
public UpdateAttribute(bool format = true) :
base($"[controller]{(format ? ".{format}" : "")}")
{
}
public UpdateAttribute(string template, bool format = true, int order = 1) :
base($"[controller]/{template}{(!format ? "": (template.EndsWith("}") ? ".{format?}" : ".{format}"))}")
{
Order = order;
}
}
public class DeleteAttribute : HttpDeleteAttribute
{
public DeleteAttribute(bool format = true) :
base($"[controller]{(format ? ".{format}" : "")}")
{
}
public DeleteAttribute(string template, bool format = true, int order = 1) :
base($"[controller]/{template}{(!format ? "": (template.EndsWith("}") ? ".{format?}" : ".{format}"))}")
{
Order = order;
}
}
}

View File

@ -1,11 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using ASC.Api.Core;
using ASC.Common.Web;
using ASC.Core;
using ASC.Core.Users;
using ASC.Web.Api.Models;
using ASC.Web.Api.Routing;
using ASC.Web.Core;
using ASC.Web.Core.Users;
using Microsoft.AspNetCore.Mvc;
namespace ASC.Employee.Core.Controllers
@ -15,47 +18,62 @@ namespace ASC.Employee.Core.Controllers
public class PeopleController : ControllerBase
{
public Common.Logging.LogManager LogManager { get; }
public ApiContext ApiContext { get; }
public PeopleController(ASC.Common.Logging.LogManager logManager)
{
LogManager = logManager;
ApiContext = HttpContext;
}
[FormatRoute, FormatRoute(false)]
[Read, Read(false)]
public IEnumerable<EmployeeWraper> GetAll()
{
return GetByStatus(EmployeeStatus.Active);
}
[FormatRoute("status/{status}")]
[Read("status/{status}")]
public IEnumerable<EmployeeWraper> GetByStatus(EmployeeStatus status)
{
if (CoreContext.Configuration.Personal) throw new Exception("Method not available");
var query = CoreContext.UserManager.GetUsers(status).AsEnumerable();
return query.Select(x => new EmployeeWraperFull(x, HttpContext));
return query.Select(x => new EmployeeWraperFull(x, ApiContext));
}
[FormatRoute("@self", Order = 1), FormatRoute("@self", false, Order = 1)]
[Read("@self"), Read("@self", false)]
public EmployeeWraper Self()
{
return new EmployeeWraperFull(CoreContext.UserManager.GetUsers(SecurityContext.CurrentAccount.ID), HttpContext);
return new EmployeeWraperFull(CoreContext.UserManager.GetUsers(SecurityContext.CurrentAccount.ID), ApiContext);
}
[FormatRoute("{username}", Order = 2)]
[Read("email"), Read("email", false)]
public EmployeeWraperFull GetByEmail([FromQuery]string email)
{
if (CoreContext.Configuration.Personal && !CoreContext.UserManager.GetUsers(SecurityContext.CurrentAccount.ID).IsOwner())
throw new MethodAccessException("Method not available");
var user = CoreContext.UserManager.GetUserByEmail(email);
if (user.ID == Constants.LostUser.ID)
{
throw new ItemNotFoundException("User not found");
}
return new EmployeeWraperFull(user);
}
[Read("{username}", Order = int.MaxValue)]
public EmployeeWraperFull GetById(string username)
{
if (CoreContext.Configuration.Personal) throw new MethodAccessException("Method not available");
var user = CoreContext.UserManager.GetUserByUserName(username);
if (user.ID == Constants.LostUser.ID)
{
Guid userId;
if (Guid.TryParse(username, out userId))
if (Guid.TryParse(username, out var userId))
{
user = CoreContext.UserManager.GetUsers(userId);
}
else
{
LogManager.Get("ASC.Api").Error(string.Format("Account {0} сould not get user by name {1}", SecurityContext.CurrentAccount.ID, username));
LogManager.Get("ASC.Api").Error(string.Format("Account {0} сould not get user by name {1}", SecurityContext.CurrentAccount.ID, username));
}
}
@ -66,5 +84,207 @@ namespace ASC.Employee.Core.Controllers
return new EmployeeWraperFull(user);
}
[Read("@search/{query}")]
public IEnumerable<EmployeeWraperFull> GetSearch(string query)
{
if (CoreContext.Configuration.Personal) throw new MethodAccessException("Method not available");
try
{
var groupId = Guid.Empty;
if ("group".Equals(ApiContext.FilterBy, StringComparison.OrdinalIgnoreCase) && !string.IsNullOrEmpty(ApiContext.FilterValue))
{
groupId = new Guid(ApiContext.FilterValue);
}
return CoreContext.UserManager.Search(query, EmployeeStatus.Active, groupId).Select(x => new EmployeeWraperFull(x));
}
catch (Exception error)
{
LogManager.Get("ASC.Api").Error(error);
}
return null;
}
[Read("search"), Read("search", false)]
public IEnumerable<EmployeeWraperFull> GetPeopleSearch([FromQuery]string query)
{
return GetSearch(query);
}
[Read("status/{status}/search"), Read("status/{status}/search", false)]
public IEnumerable<EmployeeWraperFull> GetAdvanced(EmployeeStatus status, [FromQuery]string query)
{
if (CoreContext.Configuration.Personal) throw new MethodAccessException("Method not available");
try
{
var list = CoreContext.UserManager.GetUsers(status).AsEnumerable();
if ("group".Equals(ApiContext.FilterBy, StringComparison.OrdinalIgnoreCase) && !string.IsNullOrEmpty(ApiContext.FilterValue))
{
var groupId = new Guid(ApiContext.FilterValue);
//Filter by group
list = list.Where(x => CoreContext.UserManager.IsUserInGroup(x.ID, groupId));
ApiContext.SetDataFiltered();
}
list = list.Where(x => x.FirstName != null && x.FirstName.IndexOf(query, StringComparison.OrdinalIgnoreCase) > -1 || (x.LastName != null && x.LastName.IndexOf(query, StringComparison.OrdinalIgnoreCase) != -1) ||
(x.UserName != null && x.UserName.IndexOf(query, StringComparison.OrdinalIgnoreCase) != -1) || (x.Email != null && x.Email.IndexOf(query, StringComparison.OrdinalIgnoreCase) != -1) || (x.Contacts != null && x.Contacts.Any(y => y.IndexOf(query, StringComparison.OrdinalIgnoreCase) != -1)));
return list.Select(x => new EmployeeWraperFull(x));
}
catch (Exception error)
{
LogManager.Get("ASC.Api").Error(error);
}
return null;
}
///// <summary>
///// Adds a new portal user from import with the first and last name, email address
///// </summary>
///// <short>
///// Add new import user
///// </short>
///// <param name="userList">The list of users to add</param>
///// <param name="importUsersAsCollaborators" optional="true">Add users as guests (bool type: false|true)</param>
///// <returns>Newly created users</returns>
//[Create("import/save")]
//public void SaveUsers(string userList, bool importUsersAsCollaborators)
//{
// lock (progressQueue.SynchRoot)
// {
// var task = progressQueue.GetItems().OfType<ImportUsersTask>().FirstOrDefault(t => (int)t.Id == TenantProvider.CurrentTenantID);
// if (task != null && task.IsCompleted)
// {
// progressQueue.Remove(task);
// task = null;
// }
// if (task == null)
// {
// progressQueue.Add(new ImportUsersTask(userList, importUsersAsCollaborators, GetHttpHeaders(HttpContext.Current.Request))
// {
// Id = TenantProvider.CurrentTenantID,
// UserId = SecurityContext.CurrentAccount.ID,
// Percentage = 0
// });
// }
// }
//}
//[Read("import/status")]
//public object GetStatus()
//{
// lock (progressQueue.SynchRoot)
// {
// var task = progressQueue.GetItems().OfType<ImportUsersTask>().FirstOrDefault(t => (int)t.Id == TenantProvider.CurrentTenantID);
// if (task == null) return null;
// return new
// {
// Completed = task.IsCompleted,
// Percents = (int)task.Percentage,
// UserCounter = task.GetUserCounter,
// Status = (int)task.Status,
// Error = (string)task.Error,
// task.Data
// };
// }
//}
[Read("filter"), Read("filter", false)]
public IEnumerable<EmployeeWraperFull> GetFullByFilter(EmployeeStatus? employeeStatus, Guid? groupId, EmployeeActivationStatus? activationStatus, EmployeeType? employeeType, bool? isAdministrator)
{
var users = GetByFilter(employeeStatus, groupId, activationStatus, employeeType, isAdministrator);
return users.Select(u => new EmployeeWraperFull(u, ApiContext));
}
[Read("simple/filter"), Read("simple/filter", false)]
public IEnumerable<EmployeeWraper> GetSimpleByFilter(EmployeeStatus? employeeStatus, Guid? groupId, EmployeeActivationStatus? activationStatus, EmployeeType? employeeType, bool? isAdministrator)
{
var users = GetByFilter(employeeStatus, groupId, activationStatus, employeeType, isAdministrator);
return users.Select(u => new EmployeeWraper(u));
}
private IEnumerable<UserInfo> GetByFilter(EmployeeStatus? employeeStatus, Guid? groupId, EmployeeActivationStatus? activationStatus, EmployeeType? employeeType, bool? isAdministrator)
{
if (CoreContext.Configuration.Personal) throw new MethodAccessException("Method not available");
var isAdmin = CoreContext.UserManager.GetUsers(SecurityContext.CurrentAccount.ID).IsAdmin() ||
WebItemSecurity.IsProductAdministrator(WebItemManager.PeopleProductID, SecurityContext.CurrentAccount.ID);
var status = isAdmin ? EmployeeStatus.All : EmployeeStatus.Default;
if (employeeStatus != null)
{
switch (employeeStatus)
{
case EmployeeStatus.Terminated:
case EmployeeStatus.All:
status = isAdmin ? (EmployeeStatus)employeeStatus : EmployeeStatus.Default;
break;
default:
status = (EmployeeStatus)employeeStatus;
break;
}
}
var users = string.IsNullOrEmpty(ApiContext.FilterValue) ?
CoreContext.UserManager.GetUsers(status).AsEnumerable() :
CoreContext.UserManager.Search(ApiContext.FilterValue, status).AsEnumerable();
if (groupId != null && !groupId.Equals(Guid.Empty))
{
users = users.Where(x => CoreContext.UserManager.IsUserInGroup(x.ID, (Guid)groupId));
}
if (activationStatus != null)
{
users = activationStatus == EmployeeActivationStatus.Activated ?
users.Where(x => x.ActivationStatus.HasFlag(EmployeeActivationStatus.Activated)) :
users.Where(x => x.ActivationStatus == EmployeeActivationStatus.NotActivated ||
x.ActivationStatus == EmployeeActivationStatus.Pending ||
x.ActivationStatus == EmployeeActivationStatus.AutoGenerated);
}
if (employeeType != null)
{
switch (employeeType)
{
case EmployeeType.User:
users = users.Where(x => !x.IsVisitor());
break;
case EmployeeType.Visitor:
users = users.Where(x => x.IsVisitor());
break;
}
}
if (isAdministrator.HasValue && isAdministrator.Value)
{
users = users.Where(x => x.IsAdmin() || x.GetListAdminModules().Any());
}
ApiContext.TotalCount = users.Count();
switch (ApiContext.SortBy)
{
case "firstname":
users = ApiContext.SortDescending ? users.OrderByDescending(r => r, UserInfoComparer.FirstName) : users.OrderBy(r => r, UserInfoComparer.FirstName);
break;
case "lastname":
users = ApiContext.SortDescending ? users.OrderByDescending(r => r, UserInfoComparer.LastName) : users.OrderBy(r => r, UserInfoComparer.LastName);
break;
default:
users = ApiContext.SortDescending ? users.OrderByDescending(r => r, UserInfoComparer.Default) : users.OrderBy(r => r, UserInfoComparer.Default);
break;
}
users = users.Skip((int)ApiContext.StartIndex).Take((int)ApiContext.Count - 1);
ApiContext.SetDataSorted();
ApiContext.SetDataPaginated();
return users;
}
}
}

View File

@ -15,7 +15,7 @@ namespace ASC.Web.Api.Controllers
[AllowAnonymous]
public class AuthenticationController : ControllerBase
{
[FormatRoute, FormatRoute(false)]
[Read, Read(false)]
[HttpPost]
public AuthenticationTokenData AuthenticateMe([FromBody]AuthModel auth)
{

View File

@ -11,7 +11,7 @@ namespace ASC.Web.Api.Controllers
[ApiController]
public class ModulesController : ControllerBase
{
[FormatRoute, FormatRoute(false)]
[Read, Read(false)]
public IEnumerable<Module> GetAll()
{
var result = new List<Module>(){