diff --git a/src/Api/Controllers/DevicesController.cs b/src/Api/Controllers/DevicesController.cs index 07ed4fce1a..9c97c31a00 100644 --- a/src/Api/Controllers/DevicesController.cs +++ b/src/Api/Controllers/DevicesController.cs @@ -9,6 +9,7 @@ using Bit.Api.Models; using Bit.Core.Exceptions; using Bit.Core.Domains; using Microsoft.AspNetCore.Identity; +using Bit.Core.Services; namespace Bit.Api.Controllers { @@ -17,13 +18,16 @@ namespace Bit.Api.Controllers public class DevicesController : Controller { private readonly IDeviceRepository _deviceRepository; + private readonly IDeviceService _deviceService; private readonly UserManager _userManager; public DevicesController( IDeviceRepository deviceRepository, + IDeviceService deviceService, UserManager userManager) { _deviceRepository = deviceRepository; + _deviceService = deviceService; _userManager = userManager; } @@ -65,7 +69,7 @@ namespace Bit.Api.Controllers public async Task Post([FromBody]DeviceRequestModel model) { var device = model.ToDevice(_userManager.GetUserId(User)); - await _deviceRepository.CreateAsync(device); + await _deviceService.SaveAsync(device); var response = new DeviceResponseModel(device); return response; @@ -81,7 +85,7 @@ namespace Bit.Api.Controllers throw new NotFoundException(); } - await _deviceRepository.ReplaceAsync(model.ToDevice(device)); + await _deviceService.SaveAsync(model.ToDevice(device)); var response = new DeviceResponseModel(device); return response; @@ -97,7 +101,26 @@ namespace Bit.Api.Controllers throw new NotFoundException(); } - await _deviceRepository.ReplaceAsync(model.ToDevice(device)); + await _deviceService.SaveAsync(model.ToDevice(device)); + + var response = new DeviceResponseModel(device); + return response; + } + + [AllowAnonymous] + [HttpPut("identifier/{identifier}/clear-token")] + [HttpPost("identifier/{identifier}/clear-token")] + public async Task PutClearToken(string identifier) + { + var device = await _deviceRepository.GetByIdentifierAsync(identifier, new Guid(_userManager.GetUserId(User))); + if(device == null) + { + await Task.Delay(2000); + throw new NotFoundException(); + } + + device.PushToken = null; + await _deviceService.SaveAsync(device); var response = new DeviceResponseModel(device); return response; diff --git a/src/Api/Startup.cs b/src/Api/Startup.cs index 50f71ad065..64452c7e0e 100644 --- a/src/Api/Startup.cs +++ b/src/Api/Startup.cs @@ -123,6 +123,7 @@ namespace Bit.Api services.AddSingleton(); services.AddScoped(); services.AddScoped(); + services.AddScoped(); // Cors services.AddCors(config => diff --git a/src/Core/Services/DeviceService.cs b/src/Core/Services/DeviceService.cs new file mode 100644 index 0000000000..a7b27b209f --- /dev/null +++ b/src/Core/Services/DeviceService.cs @@ -0,0 +1,31 @@ +using System; +using System.Threading.Tasks; +using Bit.Core.Domains; +using Bit.Core.Repositories; + +namespace Bit.Core.Services +{ + public class DeviceService : IDeviceService + { + private readonly IDeviceRepository _deviceRepository; + + public DeviceService( + IDeviceRepository deviceRepository) + { + _deviceRepository = deviceRepository; + } + + public async Task SaveAsync(Device device) + { + if(device.Id == default(Guid)) + { + await _deviceRepository.CreateAsync(device); + } + else + { + device.RevisionDate = DateTime.UtcNow; + await _deviceRepository.ReplaceAsync(device); + } + } + } +} diff --git a/src/Core/Services/IDeviceService.cs b/src/Core/Services/IDeviceService.cs new file mode 100644 index 0000000000..b3116d55e1 --- /dev/null +++ b/src/Core/Services/IDeviceService.cs @@ -0,0 +1,10 @@ +using System.Threading.Tasks; +using Bit.Core.Domains; + +namespace Bit.Core.Services +{ + public interface IDeviceService + { + Task SaveAsync(Device device); + } +}