Skip to content

Commit

Permalink
Cwdoe 1428 inject catalog permissions (#114)
Browse files Browse the repository at this point in the history
* Adjusted MSEL permissions to use Units.
* Added Units to the MSEL ViewModel.
* Created an endpoint to get all MSEL users (teams and units)
  • Loading branch information
sei-tspencer authored Aug 20, 2024
1 parent b55f795 commit ad3da7c
Show file tree
Hide file tree
Showing 13 changed files with 81 additions and 40 deletions.
2 changes: 1 addition & 1 deletion Blueprint.Api/Blueprint.Api.csproj
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk.Web">

<PropertyGroup>
<Version>1.2.0-rc11</Version>
<Version>1.2.0-rc12</Version>
<TargetFramework>net6.0</TargetFramework>
<DocumentationFile>bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml</DocumentationFile>
<NoWarn>CS1591</NoWarn>
Expand Down
19 changes: 18 additions & 1 deletion Blueprint.Api/Controllers/UserController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,24 @@ public async Task<IActionResult> Get(Guid id, CancellationToken ct)
return Ok(user);
}

/// <summary>
/// Gets all MSEL Users
/// </summary>
/// <remarks>
/// Returns a list of all of the MSEL Users.
/// </remarks>
/// <param name="mselId">The id of the MSEL</param>
/// <param name="ct"></param>
/// <returns></returns>
[HttpGet("msels/{mselId}/users")]
[ProducesResponseType(typeof(IEnumerable<User>), (int)HttpStatusCode.OK)]
[SwaggerOperation(OperationId = "getMselUsers")]
public async Task<IActionResult> GetByMsel(Guid mselId, CancellationToken ct)
{
var list = await _userService.GetByMselAsync(mselId, ct);
return Ok(list);
}

/// <summary>
/// Gets all Users for a team
/// </summary>
Expand Down Expand Up @@ -173,4 +191,3 @@ public async Task<IActionResult> Delete(Guid id, CancellationToken ct)

}
}

Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,12 @@ public static class EvaluatorRequirement
{
public static async Task<Boolean> IsMet(Guid userId, Guid? mselId, BlueprintContext blueprintContext)
{
var mselTeamIdList = await blueprintContext.Teams
var mselUnitIdList = await blueprintContext.MselUnits
.Where(t => t.MselId == mselId)
.Select(t => t.Id)
.Select(t => t.UnitId)
.ToListAsync();
var isSuccess = await blueprintContext.TeamUsers
.Where(tu => tu.UserId == userId && mselTeamIdList.Contains(tu.TeamId))
var isSuccess = await blueprintContext.UnitUsers
.Where(tu => tu.UserId == userId && mselUnitIdList.Contains(tu.UnitId))
.AnyAsync();
if (isSuccess)
{
Expand All @@ -34,4 +34,3 @@ public static async Task<Boolean> IsMet(Guid userId, Guid? mselId, BlueprintCont
}
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,12 @@ public static class MoveEditorRequirement
{
public static async Task<Boolean> IsMet(Guid userId, Guid mselId, BlueprintContext blueprintContext)
{
var mselTeamIdList = await blueprintContext.Teams
var mselUnitIdList = await blueprintContext.MselUnits
.Where(t => t.MselId == mselId)
.Select(t => t.Id)
.Select(t => t.UnitId)
.ToListAsync();
var isSuccess = await blueprintContext.TeamUsers
.Where(tu => tu.UserId == userId && mselTeamIdList.Contains(tu.TeamId))
var isSuccess = await blueprintContext.UnitUsers
.Where(tu => tu.UserId == userId && mselUnitIdList.Contains(tu.UnitId))
.AnyAsync();
if (isSuccess)
{
Expand All @@ -34,4 +34,3 @@ public static async Task<Boolean> IsMet(Guid userId, Guid mselId, BlueprintConte
}
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,12 @@ public static class MselApproverRequirement
{
public static async Task<Boolean> IsMet(Guid userId, Guid? mselId, BlueprintContext blueprintContext)
{
var mselTeamIdList = await blueprintContext.Teams
var mselUnitIdList = await blueprintContext.MselUnits
.Where(t => t.MselId == mselId)
.Select(t => t.Id)
.Select(t => t.UnitId)
.ToListAsync();
var isSuccess = await blueprintContext.TeamUsers
.Where(tu => tu.UserId == userId && mselTeamIdList.Contains(tu.TeamId))
var isSuccess = await blueprintContext.UnitUsers
.Where(tu => tu.UserId == userId && mselUnitIdList.Contains(tu.UnitId))
.AnyAsync();
if (isSuccess)
{
Expand All @@ -34,4 +34,3 @@ public static async Task<Boolean> IsMet(Guid userId, Guid? mselId, BlueprintCont
}
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,12 @@ public static class MselEditorRequirement
{
public static async Task<Boolean> IsMet(Guid userId, Guid? mselId, BlueprintContext blueprintContext)
{
var mselTeamIdList = await blueprintContext.Teams
var mselUnitIdList = await blueprintContext.MselUnits
.Where(t => t.MselId == mselId)
.Select(t => t.Id)
.Select(t => t.UnitId)
.ToListAsync();
var isSuccess = await blueprintContext.TeamUsers
.Where(tu => tu.UserId == userId && mselTeamIdList.Contains(tu.TeamId))
var isSuccess = await blueprintContext.UnitUsers
.Where(tu => tu.UserId == userId && mselUnitIdList.Contains(tu.UnitId))
.AnyAsync();
if (isSuccess)
{
Expand All @@ -34,4 +34,3 @@ public static async Task<Boolean> IsMet(Guid userId, Guid? mselId, BlueprintCont
}
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,12 @@ public static async Task<Boolean> IsMet(Guid userId, Guid? mselId, BlueprintCont
}
else
{
var mselTeamIdList = await blueprintContext.Teams
var mselUnitIdList = await blueprintContext.MselUnits
.Where(t => t.MselId == mselId)
.Select(t => t.Id)
.Select(t => t.UnitId)
.ToListAsync();
var isSuccess = await blueprintContext.TeamUsers
.Where(tu => tu.UserId == userId && mselTeamIdList.Contains(tu.TeamId))
var isSuccess = await blueprintContext.UnitUsers
.Where(tu => tu.UserId == userId && mselUnitIdList.Contains(tu.UnitId))
.AnyAsync();
if (isSuccess)
{
Expand All @@ -42,4 +42,3 @@ public static async Task<Boolean> IsMet(Guid userId, Guid? mselId, BlueprintCont
}
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -21,16 +21,15 @@ public static async Task<Boolean> IsMet(Guid userId, Guid? mselId, BlueprintCont
}
else
{
var mselTeamIdList = await blueprintContext.Teams
var mselUnitIdList = await blueprintContext.MselUnits
.Where(t => t.MselId == mselId)
.Select(t => t.Id)
.Select(t => t.UnitId)
.ToListAsync();
var isSuccess = await blueprintContext.TeamUsers
.Where(tu => tu.UserId == userId && mselTeamIdList.Contains(tu.TeamId))
var isSuccess = await blueprintContext.UnitUsers
.Where(tu => tu.UserId == userId && mselUnitIdList.Contains(tu.UnitId))
.AnyAsync();
return isSuccess;
}
}
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,12 @@ public static async Task<Boolean> IsMet(Guid userId, Guid? mselId, BlueprintCont
}
else
{
var mselTeamIdList = await blueprintContext.Teams
var mselUnitIdList = await blueprintContext.MselUnits
.Where(t => t.MselId == mselId)
.Select(t => t.Id)
.Select(t => t.UnitId)
.ToListAsync();
var isSuccess = await blueprintContext.TeamUsers
.Where(tu => tu.UserId == userId && mselTeamIdList.Contains(tu.TeamId))
var isSuccess = await blueprintContext.UnitUsers
.Where(tu => tu.UserId == userId && mselUnitIdList.Contains(tu.UnitId))
.AnyAsync();
if (isSuccess)
{
Expand All @@ -48,4 +48,3 @@ public static async Task<Boolean> IsMet(Guid userId, Guid? mselId, BlueprintCont
}
}
}

4 changes: 2 additions & 2 deletions Blueprint.Api/Infrastructure/Mappings/MselProfile.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ public class MselProfile : AutoMapper.Profile
public MselProfile()
{
CreateMap<MselEntity, Msel>()
.ForMember(m => m.Units, opt => opt.MapFrom(x => x.MselUnits.Select(y => y.Unit)))
.ForMember(m => m.Pages, opt => opt.ExplicitExpansion());

CreateMap<Msel, MselEntity>()
Expand All @@ -22,6 +23,7 @@ public MselProfile()
.ForMember(m => m.Pages, opt => opt.Ignore())
.ForMember(m => m.ScenarioEvents, opt => opt.Ignore())
.ForMember(m => m.Teams, opt => opt.Ignore())
.ForMember(m => m.MselUnits, opt => opt.Ignore())
.ForMember(m => m.UserMselRoles, opt => opt.Ignore());

CreateMap<MselEntity, MselEntity>()
Expand All @@ -30,5 +32,3 @@ public MselProfile()
}
}
}


2 changes: 2 additions & 0 deletions Blueprint.Api/Services/MselService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,8 @@ public MselService(
}

var mselEntity = await _context.Msels
.Include(m => m.MselUnits)
.ThenInclude(t => t.Unit)
.Include(m => m.Teams)
.ThenInclude(t => t.TeamUsers)
.ThenInclude(tu => tu.User)
Expand Down
30 changes: 29 additions & 1 deletion Blueprint.Api/Services/UserService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ public interface IUserService
{
Task<IEnumerable<ViewModels.User>> GetAsync(CancellationToken ct);
Task<ViewModels.User> GetAsync(Guid id, CancellationToken ct);
Task<IEnumerable<ViewModels.User>> GetByMselAsync(Guid mselId, CancellationToken ct);
Task<IEnumerable<ViewModels.User>> GetByTeamAsync(Guid teamId, CancellationToken ct);
Task<IEnumerable<ViewModels.User>> GetByUnitAsync(Guid unitId, CancellationToken ct);
Task<ViewModels.User> CreateAsync(ViewModels.User user, CancellationToken ct);
Expand Down Expand Up @@ -77,6 +78,34 @@ public UserService(BlueprintContext context, IPrincipal user, IAuthorizationServ
return item;
}

public async Task<IEnumerable<ViewModels.User>> GetByMselAsync(Guid mselId, CancellationToken ct)
{
if (
!(await MselViewRequirement.IsMet(_user.GetId(), mselId, _context)) &&
!(await _authorizationService.AuthorizeAsync(_user, null, new ContentDeveloperRequirement())).Succeeded
)
throw new ForbiddenException();

var mselUnitIdList = await _context.MselUnits
.Where(t => t.MselId == mselId)
.Select(t => t.UnitId)
.ToListAsync();
var unitUsers = await _context.UnitUsers
.Where(tu => mselUnitIdList.Contains(tu.UnitId))
.Select(tu => tu.User)
.ToListAsync(ct);
var mselTeamIdList = await _context.Teams
.Where(t => t.MselId == mselId)
.Select(t => t.Id)
.ToListAsync();
var teamUsers = await _context.TeamUsers
.Where(tu => mselTeamIdList.Contains(tu.TeamId))
.Select(tu => tu.User)
.ToListAsync(ct);
var items = unitUsers.Union(teamUsers);
return _mapper.Map<IEnumerable<User>>(items);
}

public async Task<IEnumerable<ViewModels.User>> GetByTeamAsync(Guid teamId, CancellationToken ct)
{
if (!(await _authorizationService.AuthorizeAsync(_user, null, new FullRightsRequirement())).Succeeded)
Expand Down Expand Up @@ -171,4 +200,3 @@ public async Task<bool> DeleteAsync(Guid id, CancellationToken ct)

}
}

1 change: 1 addition & 0 deletions Blueprint.Api/ViewModels/Msel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ public class Msel : Base
public virtual ICollection<DataField> DataFields { get; set; } = new HashSet<DataField>();
public virtual ICollection<ScenarioEvent> ScenarioEvents { get; set; } = new HashSet<ScenarioEvent>();
public ICollection<Team> Teams { get; set; } = new List<Team>();
public ICollection<Unit> Units { get; set; } = new List<Unit>();
public ICollection<UserMselRole> UserMselRoles { get; set; } = new List<UserMselRole>();
public string HeaderRowMetadata { get; set; }
public virtual ICollection<Organization> Organizations { get; set; } = new HashSet<Organization>();
Expand Down

0 comments on commit ad3da7c

Please sign in to comment.