diff --git a/src/Api/Controllers/CiphersController.cs b/src/Api/Controllers/CiphersController.cs index 8d9b82bf1..826bfc898 100644 --- a/src/Api/Controllers/CiphersController.cs +++ b/src/Api/Controllers/CiphersController.cs @@ -70,6 +70,20 @@ namespace Bit.Api.Controllers model.FolderRelationships); } + [HttpPut("{id}/favorite")] + public async Task Favorite(string id) + { + var cipher = await _cipherRepository.GetByIdAsync(new Guid(id), new Guid(_userManager.GetUserId(User))); + if(cipher == null) + { + throw new NotFoundException(); + } + + cipher.Favorite = !cipher.Favorite; + + await _cipherRepository.ReplaceAsync(cipher); + } + [HttpDelete("{id}")] public async Task Delete(string id) { diff --git a/src/Api/Models/Request/SiteRequestModel.cs b/src/Api/Models/Request/SiteRequestModel.cs index a9c6ebdf0..07b4cacad 100644 --- a/src/Api/Models/Request/SiteRequestModel.cs +++ b/src/Api/Models/Request/SiteRequestModel.cs @@ -10,6 +10,7 @@ namespace Bit.Api.Models { [StringLength(36)] public string FolderId { get; set; } + public bool Favorite { get; set; } [Required] [EncryptedString] [StringLength(300)] @@ -40,6 +41,7 @@ namespace Bit.Api.Models public Cipher ToCipher(Cipher existingSite) { existingSite.FolderId = string.IsNullOrWhiteSpace(FolderId) ? null : (Guid?)new Guid(FolderId); + existingSite.Favorite = Favorite; existingSite.Data = JsonConvert.SerializeObject(new SiteDataModel(this), new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }); existingSite.Type = Core.Enums.CipherType.Site; diff --git a/src/Api/Models/Response/CipherResponseModel.cs b/src/Api/Models/Response/CipherResponseModel.cs index 8b713695b..e2a35cd86 100644 --- a/src/Api/Models/Response/CipherResponseModel.cs +++ b/src/Api/Models/Response/CipherResponseModel.cs @@ -16,6 +16,7 @@ namespace Bit.Api.Models Id = cipher.Id.ToString(); FolderId = cipher.FolderId?.ToString(); Type = cipher.Type; + Favorite = cipher.Favorite; Data = cipher.Data; RevisionDate = cipher.RevisionDate; @@ -35,6 +36,7 @@ namespace Bit.Api.Models public string Id { get; set; } public string FolderId { get; set; } public Core.Enums.CipherType Type { get; set; } + public bool Favorite { get; set; } public dynamic Data { get; set; } public DateTime RevisionDate { get; set; } } diff --git a/src/Api/Models/Response/SiteResponseModel.cs b/src/Api/Models/Response/SiteResponseModel.cs index c186b55bc..91a1489ed 100644 --- a/src/Api/Models/Response/SiteResponseModel.cs +++ b/src/Api/Models/Response/SiteResponseModel.cs @@ -1,6 +1,5 @@ using System; using Bit.Core.Domains; -using Newtonsoft.Json; namespace Bit.Api.Models { @@ -23,6 +22,7 @@ namespace Bit.Api.Models Id = cipher.Id.ToString(); FolderId = cipher.FolderId?.ToString(); + Favorite = cipher.Favorite; Name = data.Name; Uri = data.Uri; Username = data.Username; @@ -33,6 +33,7 @@ namespace Bit.Api.Models public string Id { get; set; } public string FolderId { get; set; } + public bool Favorite { get; set; } public string Name { get; set; } public string Uri { get; set; } public string Username { get; set; } diff --git a/src/Core/Domains/Cipher.cs b/src/Core/Domains/Cipher.cs index 4a8593492..46accfb29 100644 --- a/src/Core/Domains/Cipher.cs +++ b/src/Core/Domains/Cipher.cs @@ -9,6 +9,7 @@ namespace Bit.Core.Domains public Guid UserId { get; set; } public Guid? FolderId { get; set; } public Enums.CipherType Type { get; set; } + public bool Favorite { get; set; } public string Data { get; set; } public DateTime CreationDate { get; internal set; } = DateTime.UtcNow; public DateTime RevisionDate { get; internal set; } = DateTime.UtcNow; diff --git a/src/Core/Repositories/SqlServer/CipherRepository.cs b/src/Core/Repositories/SqlServer/CipherRepository.cs index 037f594cf..ad91274da 100644 --- a/src/Core/Repositories/SqlServer/CipherRepository.cs +++ b/src/Core/Repositories/SqlServer/CipherRepository.cs @@ -138,6 +138,7 @@ namespace Bit.Core.Repositories.SqlServer -- Do not update [UserId] -- Do not update [FolderId] -- Do not update [Type] + -- Do not update [Favorite] [Data] = TC.[Data], -- Do not update [CreationDate] [RevisionDate] = TC.[RevisionDate]