using System; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Bit.Core.Repositories; using Microsoft.AspNetCore.Authorization; using Bit.Core.Models.Api; using Bit.Core.Exceptions; using Bit.Core.Services; using Bit.Core; namespace Bit.Api.Controllers { [Route("organizations")] [Authorize("Application")] public class OrganizationsController : Controller { private readonly IOrganizationRepository _organizationRepository; private readonly IOrganizationUserRepository _organizationUserRepository; private readonly IOrganizationService _organizationService; private readonly IUserService _userService; private readonly CurrentContext _currentContext; public OrganizationsController( IOrganizationRepository organizationRepository, IOrganizationUserRepository organizationUserRepository, IOrganizationService organizationService, IUserService userService, CurrentContext currentContext) { _organizationRepository = organizationRepository; _organizationUserRepository = organizationUserRepository; _organizationService = organizationService; _userService = userService; _currentContext = currentContext; } [HttpGet("{id}")] public async Task Get(string id) { var organization = await _organizationRepository.GetByIdAsync(new Guid(id)); if(organization == null || !_currentContext.OrganizationAdmin(organization.Id)) { throw new NotFoundException(); } return new OrganizationResponseModel(organization); } [HttpGet("")] public async Task> GetUser() { var userId = _userService.GetProperUserId(User).Value; var organizations = await _organizationRepository.GetManyByUserIdAsync(userId); var responses = organizations.Select(o => new OrganizationResponseModel(o)); return new ListResponseModel(responses); } [HttpPost("")] public async Task Post([FromBody]OrganizationCreateRequestModel model) { var user = await _userService.GetUserByPrincipalAsync(User); var organizationSignup = model.ToOrganizationSignup(user); var result = await _organizationService.SignUpAsync(organizationSignup); return new OrganizationResponseModel(result.Item1); } [HttpPut("{id}")] [HttpPost("{id}")] public async Task Put(string id, [FromBody]OrganizationUpdateRequestModel model) { var organization = await _organizationRepository.GetByIdAsync(new Guid(id)); if(organization == null || !_currentContext.OrganizationAdmin(organization.Id)) { throw new NotFoundException(); } await _organizationRepository.ReplaceAsync(model.ToOrganization(organization)); return new OrganizationResponseModel(organization); } [HttpDelete("{id}")] [HttpPost("{id}/delete")] public async Task Delete(string id) { var organization = await _organizationRepository.GetByIdAsync(new Guid(id)); if(organization == null || !_currentContext.OrganizationAdmin(organization.Id)) { throw new NotFoundException(); } await _organizationRepository.DeleteAsync(organization); } } }