diff --git a/NEXT_RELEASE.md b/NEXT_RELEASE.md index 9862d96..bfdd6bf 100644 --- a/NEXT_RELEASE.md +++ b/NEXT_RELEASE.md @@ -3,7 +3,6 @@ ## Breaking changes - `ShareItem(...)` now returns `ItemShareResult` instead of `void`. -- The single-email `ShareItem(...)` overloads were removed. Use a collection of email addresses for restricted links, or omit the collection entirely for unrestricted links. ## Highlights @@ -24,6 +23,6 @@ onePassword.ShareItem(item, vault, "recipient@example.com"); After: ```csharp -var restrictedShare = onePassword.ShareItem(item, vault, new[] { "recipient@example.com" }); +var restrictedShare = onePassword.ShareItem(item, vault, "recipient@example.com"); var unrestrictedShare = onePassword.ShareItem(item, vault); ``` diff --git a/OnePassword.NET.Tests/OnePasswordManagerCommandTests.cs b/OnePassword.NET.Tests/OnePasswordManagerCommandTests.cs index d538658..3a86f41 100644 --- a/OnePassword.NET.Tests/OnePasswordManagerCommandTests.cs +++ b/OnePassword.NET.Tests/OnePasswordManagerCommandTests.cs @@ -84,7 +84,33 @@ public void ShareItemWithoutEmailsOmitsEmailsFlag() } [Test] - public void ShareItemWithSingleEmailUsesEmailsFlag() + public void ShareItemStringSingleEmailOverloadUsesEmailsFlag() + { + using var fakeCli = new FakeCli(); + var manager = fakeCli.CreateManager(); + + var result = manager.ShareItem("item-id", "vault-id", "recipient@example.com"); + + Assert.Multiple(() => + { + Assert.That(result.RawResponse, Is.EqualTo("{}")); + Assert.That(fakeCli.LastArguments, Does.Contain("--emails recipient@example.com")); + }); + } + + [Test] + public void ShareItemObjectSingleEmailOverloadUsesEmailsFlag() + { + using var fakeCli = new FakeCli(); + var manager = fakeCli.CreateManager(); + + manager.ShareItem(new TestItem("item-id"), new TestVault("vault-id"), "recipient@example.com"); + + Assert.That(fakeCli.LastArguments, Does.Contain("--emails recipient@example.com")); + } + + [Test] + public void ShareItemWithSingleEmailCollectionUsesEmailsFlag() { using var fakeCli = new FakeCli(); var manager = fakeCli.CreateManager(); diff --git a/OnePassword.NET/IOnePasswordManager.Items.cs b/OnePassword.NET/IOnePasswordManager.Items.cs index 8d2261f..7068407 100644 --- a/OnePassword.NET/IOnePasswordManager.Items.cs +++ b/OnePassword.NET/IOnePasswordManager.Items.cs @@ -145,6 +145,26 @@ public ImmutableList SearchForItems(string? vaultId = null, bool? includeA /// Thrown when there is an invalid argument. public void MoveItem(string itemId, string currentVaultId, string destinationVaultId); + /// Shares an item. + /// The item to share. + /// The vault that contains the item to share. + /// The recipient email address. + /// The delay before the link expires. + /// Expires the link after a single view. + /// The created share result. + /// Thrown when there is an invalid argument. + public ItemShareResult ShareItem(IItem item, IVault vault, string emailAddress, TimeSpan? expiresIn = null, bool? viewOnce = null); + + /// Shares an item. + /// The ID of the item to share. + /// The ID of the vault that contains the item to share. + /// The recipient email address. + /// The delay before the link expires. + /// Expires the link after a single view. + /// The created share result. + /// Thrown when there is an invalid argument. + public ItemShareResult ShareItem(string itemId, string vaultId, string emailAddress, TimeSpan? expiresIn = null, bool? viewOnce = null); + /// Shares an item. /// The item to share. /// The vault that contains the item to share. diff --git a/OnePassword.NET/OnePasswordManager.Items.cs b/OnePassword.NET/OnePasswordManager.Items.cs index e77bebf..45f8463 100644 --- a/OnePassword.NET/OnePasswordManager.Items.cs +++ b/OnePassword.NET/OnePasswordManager.Items.cs @@ -249,6 +249,38 @@ public void MoveItem(string itemId, string currentVaultId, string destinationVau Op(command); } + /// + public ItemShareResult ShareItem(IItem item, IVault vault, string emailAddress, TimeSpan? expiresIn = null, bool? viewOnce = null) + { + if (item is null || item.Id.Length == 0) + throw new ArgumentException($"{nameof(item.Id)} cannot be empty.", nameof(item)); + if (vault is null || vault.Id.Length == 0) + throw new ArgumentException($"{nameof(vault.Id)} cannot be empty.", nameof(vault)); + if (emailAddress is null || emailAddress.Length == 0) + throw new ArgumentException($"{nameof(emailAddress)} cannot be empty.", nameof(emailAddress)); + var trimmedEmailAddress = emailAddress.Trim(); + if (trimmedEmailAddress.Length == 0) + throw new ArgumentException($"{nameof(trimmedEmailAddress)} cannot be empty.", nameof(emailAddress)); + + return ShareItem(item.Id, vault.Id, trimmedEmailAddress, expiresIn, viewOnce); + } + + /// + public ItemShareResult ShareItem(string itemId, string vaultId, string emailAddress, TimeSpan? expiresIn = null, bool? viewOnce = null) + { + if (itemId is null || itemId.Length == 0) + throw new ArgumentException($"{nameof(itemId)} cannot be empty.", nameof(itemId)); + if (vaultId is null || vaultId.Length == 0) + throw new ArgumentException($"{nameof(vaultId)} cannot be empty.", nameof(vaultId)); + if (emailAddress is null || emailAddress.Length == 0) + throw new ArgumentException($"{nameof(emailAddress)} cannot be empty.", nameof(emailAddress)); + var trimmedEmailAddress = emailAddress.Trim(); + if (trimmedEmailAddress.Length == 0) + throw new ArgumentException($"{nameof(trimmedEmailAddress)} cannot be empty.", nameof(emailAddress)); + + return ShareItem(itemId, vaultId, new[] { trimmedEmailAddress }, expiresIn, viewOnce); + } + /// public ItemShareResult ShareItem(IItem item, IVault vault, IReadOnlyCollection? emailAddresses = null, TimeSpan? expiresIn = null, bool? viewOnce = null) { diff --git a/README.md b/README.md index 4c0a6ff..c0c80b5 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,6 @@ This library has no dependencies. ## Breaking changes for the next x.x.x release - `ShareItem(...)` now returns `ItemShareResult` instead of `void`. -- The single-email `ShareItem(...)` overloads were removed. Pass a collection of email addresses for restricted links, or omit the collection entirely for unrestricted links. ## Quick start @@ -144,13 +143,24 @@ Console.WriteLine(share.Url); var share = onePassword.ShareItem( item, vault, - new[] { "recipient@example.com" }, + "recipient@example.com", expiresIn: TimeSpan.FromDays(7), viewOnce: true); Console.WriteLine(share.Url); ``` +### Sharing an item with multiple email restrictions + +```csharp +var share = onePassword.ShareItem( + item, + vault, + new[] { "recipient1@example.com", "recipient2@example.com" }); + +Console.WriteLine(share.Url); +``` + ### Archiving an item ```csharp diff --git a/docfx/docs/quick-start.md b/docfx/docs/quick-start.md index 62592de..5449f30 100644 --- a/docfx/docs/quick-start.md +++ b/docfx/docs/quick-start.md @@ -1,6 +1,6 @@ # Quick start -> Starting with the next x.x.x release, `ShareItem(...)` returns `ItemShareResult` and the single-email overloads are removed. Pass a collection of email addresses for restricted links, or omit the collection entirely for unrestricted links. +> Starting with the next x.x.x release, `ShareItem(...)` returns `ItemShareResult` instead of `void`. ### Creating an instance of the manager @@ -122,13 +122,24 @@ Console.WriteLine(share.Url); var share = onePassword.ShareItem( item, vault, - new[] { "recipient@example.com" }, + "recipient@example.com", expiresIn: TimeSpan.FromDays(7), viewOnce: true); Console.WriteLine(share.Url); ``` +### Sharing an item with multiple email restrictions + +```csharp +var share = onePassword.ShareItem( + item, + vault, + new[] { "recipient1@example.com", "recipient2@example.com" }); + +Console.WriteLine(share.Url); +``` + ### Archiving an item ```csharp