|
|
|
@ -2,6 +2,8 @@ |
|
|
|
using Bit.Api.SecretManagerFeatures.Models.Request; |
|
|
|
using Bit.Api.SecretManagerFeatures.Models.Request; |
|
|
|
using Bit.Api.SecretManagerFeatures.Models.Response; |
|
|
|
using Bit.Api.SecretManagerFeatures.Models.Response; |
|
|
|
using Bit.Api.Utilities; |
|
|
|
using Bit.Api.Utilities; |
|
|
|
|
|
|
|
using Bit.Core.Context; |
|
|
|
|
|
|
|
using Bit.Core.Enums; |
|
|
|
using Bit.Core.Exceptions; |
|
|
|
using Bit.Core.Exceptions; |
|
|
|
using Bit.Core.Repositories; |
|
|
|
using Bit.Core.Repositories; |
|
|
|
using Bit.Core.SecretManagerFeatures.Projects.Interfaces; |
|
|
|
using Bit.Core.SecretManagerFeatures.Projects.Interfaces; |
|
|
|
@ -18,24 +20,32 @@ public class ProjectsController : Controller |
|
|
|
private readonly ICreateProjectCommand _createProjectCommand; |
|
|
|
private readonly ICreateProjectCommand _createProjectCommand; |
|
|
|
private readonly IUpdateProjectCommand _updateProjectCommand; |
|
|
|
private readonly IUpdateProjectCommand _updateProjectCommand; |
|
|
|
private readonly IDeleteProjectCommand _deleteProjectCommand; |
|
|
|
private readonly IDeleteProjectCommand _deleteProjectCommand; |
|
|
|
|
|
|
|
private readonly ICurrentContext _currentContext; |
|
|
|
|
|
|
|
|
|
|
|
public ProjectsController( |
|
|
|
public ProjectsController( |
|
|
|
IUserService userService, |
|
|
|
IUserService userService, |
|
|
|
IProjectRepository projectRepository, |
|
|
|
IProjectRepository projectRepository, |
|
|
|
ICreateProjectCommand createProjectCommand, |
|
|
|
ICreateProjectCommand createProjectCommand, |
|
|
|
IUpdateProjectCommand updateProjectCommand, |
|
|
|
IUpdateProjectCommand updateProjectCommand, |
|
|
|
IDeleteProjectCommand deleteProjectCommand) |
|
|
|
IDeleteProjectCommand deleteProjectCommand, |
|
|
|
|
|
|
|
ICurrentContext currentContext) |
|
|
|
{ |
|
|
|
{ |
|
|
|
_userService = userService; |
|
|
|
_userService = userService; |
|
|
|
_projectRepository = projectRepository; |
|
|
|
_projectRepository = projectRepository; |
|
|
|
_createProjectCommand = createProjectCommand; |
|
|
|
_createProjectCommand = createProjectCommand; |
|
|
|
_updateProjectCommand = updateProjectCommand; |
|
|
|
_updateProjectCommand = updateProjectCommand; |
|
|
|
_deleteProjectCommand = deleteProjectCommand; |
|
|
|
_deleteProjectCommand = deleteProjectCommand; |
|
|
|
|
|
|
|
_currentContext = currentContext; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
[HttpPost("organizations/{organizationId}/projects")] |
|
|
|
[HttpPost("organizations/{organizationId}/projects")] |
|
|
|
public async Task<ProjectResponseModel> CreateAsync([FromRoute] Guid organizationId, [FromBody] ProjectCreateRequestModel createRequest) |
|
|
|
public async Task<ProjectResponseModel> CreateAsync([FromRoute] Guid organizationId, [FromBody] ProjectCreateRequestModel createRequest) |
|
|
|
{ |
|
|
|
{ |
|
|
|
|
|
|
|
if (!await _currentContext.OrganizationUser(organizationId)) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
throw new NotFoundException(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
var result = await _createProjectCommand.CreateAsync(createRequest.ToProject(organizationId)); |
|
|
|
var result = await _createProjectCommand.CreateAsync(createRequest.ToProject(organizationId)); |
|
|
|
return new ProjectResponseModel(result); |
|
|
|
return new ProjectResponseModel(result); |
|
|
|
} |
|
|
|
} |
|
|
|
@ -43,15 +53,22 @@ public class ProjectsController : Controller |
|
|
|
[HttpPut("projects/{id}")] |
|
|
|
[HttpPut("projects/{id}")] |
|
|
|
public async Task<ProjectResponseModel> UpdateProjectAsync([FromRoute] Guid id, [FromBody] ProjectUpdateRequestModel updateRequest) |
|
|
|
public async Task<ProjectResponseModel> UpdateProjectAsync([FromRoute] Guid id, [FromBody] ProjectUpdateRequestModel updateRequest) |
|
|
|
{ |
|
|
|
{ |
|
|
|
var result = await _updateProjectCommand.UpdateAsync(updateRequest.ToProject(id)); |
|
|
|
var userId = _userService.GetProperUserId(User).Value; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var result = await _updateProjectCommand.UpdateAsync(updateRequest.ToProject(id), userId); |
|
|
|
return new ProjectResponseModel(result); |
|
|
|
return new ProjectResponseModel(result); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
[HttpGet("organizations/{organizationId}/projects")] |
|
|
|
[HttpGet("organizations/{organizationId}/projects")] |
|
|
|
public async Task<ListResponseModel<ProjectResponseModel>> GetProjectsByOrganizationAsync([FromRoute] Guid organizationId) |
|
|
|
public async Task<ListResponseModel<ProjectResponseModel>> GetProjectsByOrganizationAsync( |
|
|
|
|
|
|
|
[FromRoute] Guid organizationId) |
|
|
|
{ |
|
|
|
{ |
|
|
|
var userId = _userService.GetProperUserId(User).Value; |
|
|
|
var userId = _userService.GetProperUserId(User).Value; |
|
|
|
var projects = await _projectRepository.GetManyByOrganizationIdAsync(organizationId, userId); |
|
|
|
var orgAdmin = await _currentContext.OrganizationAdmin(organizationId); |
|
|
|
|
|
|
|
var accessClient = AccessClientHelper.ToAccessClient(_currentContext.ClientType, orgAdmin); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var projects = await _projectRepository.GetManyByOrganizationIdAsync(organizationId, userId, accessClient); |
|
|
|
|
|
|
|
|
|
|
|
var responses = projects.Select(project => new ProjectResponseModel(project)); |
|
|
|
var responses = projects.Select(project => new ProjectResponseModel(project)); |
|
|
|
return new ListResponseModel<ProjectResponseModel>(responses); |
|
|
|
return new ListResponseModel<ProjectResponseModel>(responses); |
|
|
|
} |
|
|
|
} |
|
|
|
@ -64,13 +81,32 @@ public class ProjectsController : Controller |
|
|
|
{ |
|
|
|
{ |
|
|
|
throw new NotFoundException(); |
|
|
|
throw new NotFoundException(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var userId = _userService.GetProperUserId(User).Value; |
|
|
|
|
|
|
|
var orgAdmin = await _currentContext.OrganizationAdmin(project.OrganizationId); |
|
|
|
|
|
|
|
var accessClient = AccessClientHelper.ToAccessClient(_currentContext.ClientType, orgAdmin); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var hasAccess = accessClient switch |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
AccessClientType.NoAccessCheck => true, |
|
|
|
|
|
|
|
AccessClientType.User => await _projectRepository.UserHasReadAccessToProject(id, userId), |
|
|
|
|
|
|
|
_ => false, |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!hasAccess) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
throw new NotFoundException(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return new ProjectResponseModel(project); |
|
|
|
return new ProjectResponseModel(project); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
[HttpPost("projects/delete")] |
|
|
|
[HttpPost("projects/delete")] |
|
|
|
public async Task<ListResponseModel<BulkDeleteResponseModel>> BulkDeleteProjectsAsync([FromBody] List<Guid> ids) |
|
|
|
public async Task<ListResponseModel<BulkDeleteResponseModel>> BulkDeleteProjectsAsync([FromBody] List<Guid> ids) |
|
|
|
{ |
|
|
|
{ |
|
|
|
var results = await _deleteProjectCommand.DeleteProjects(ids); |
|
|
|
var userId = _userService.GetProperUserId(User).Value; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var results = await _deleteProjectCommand.DeleteProjects(ids, userId); |
|
|
|
var responses = results.Select(r => new BulkDeleteResponseModel(r.Item1.Id, r.Item2)); |
|
|
|
var responses = results.Select(r => new BulkDeleteResponseModel(r.Item1.Id, r.Item2)); |
|
|
|
return new ListResponseModel<BulkDeleteResponseModel>(responses); |
|
|
|
return new ListResponseModel<BulkDeleteResponseModel>(responses); |
|
|
|
} |
|
|
|
} |
|
|
|
|