Add support for Listing and Removing API Keys - #27

Merged
nblumhardt merged 3 commits into
datalust:devfrom
andymac4182:apikey
Feb 27, 2018
Merged

Add support for Listing and Removing API Keys#27
nblumhardt merged 3 commits into
datalust:devfrom
andymac4182:apikey

Conversation

@andymac4182

Copy link
Copy Markdown
Contributor

This is an initial idea for listing and removing of API Keys it is based on my work in #26. I plan on adding support for adding api keys.

@nblumhardtnblumhardt mentioned this pull request Feb 25, 2018

@nblumhardtnblumhardt left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looking good! Added a bunch of thoughts since it's the first feature like this and there's not much existing code to compare with, keen to know your thoughts. Cheers!

namespace SeqCli.Cli.Commands.ApiKey
{
[Command("apikey", "list", "Send a structured log event to the server", Example =
"seqcli log -m 'Hello, {Name}!' -p Name=World -p App=Test")]

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Example/description is out of sync here

}

await connection.ApiKeys.RemoveAsync(apiKeyToRemove);
Console.WriteLine($"\"{_title}\" API Key removed");

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So far in this project we've taken the "unix" approach of not writing any output on success; keen to see how that goes, would be good to line this up.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sounds good. I will remove the line.

_connection = Enable<ConnectionFeature>();
Options.Add(
"t=|title=",
"",

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: param description here

{
_connectionFactory = connectionFactory;
_connection = Enable<ConnectionFeature>();
Options.Add(

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is id a worthwhile option/alternative to title? Would help with the ambiguous ones where names overlap.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have added Id and put a check in to ensure that they only specify a single value since both could be confusing as to if its removing only when both match or just one.

var connection = _connectionFactory.Connect(_connection);

var apiKeys = await connection.ApiKeys.ListAsync();
var apiKeyToRemove = apiKeys.FirstOrDefault(ak => ak.Title == _title);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would it make as much sense to remove all matches, instead of just the first, here?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ahh. I completely forgot you can have multiple with the same Title. I will fix that up.

});
foreach (var apiKey in data)
{
var apiKeyString = JsonConvert.SerializeObject(apiKey);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

Log.Debug("Retrieved ApiKeys {@ApiKeys}", apiKeys);
var data = apiKeys.Select(a => new
{
a.AppliedProperties,

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If we listed Id and Title first here, it might be a bit quicker to visually parse the output.

@andymac4182

Copy link
Copy Markdown
ContributorAuthor

Thanks for the feedback @nblumhardt I wasn't sure exactly the best way to approach a few of these but this has given me good direction. I will try get this updated shortly.


namespace SeqCli.Cli.Commands.ApiKey
{
[Command("apikey", "list", "Send a structured log event to the server", Example =

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The description of the command should be updated here :)

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @tsimbalar I have fixed that up now.

@nblumhardt
nblumhardt merged commit 003e541 into datalust:devFeb 27, 2018
@nblumhardt

Copy link
Copy Markdown
Member

👍

We might want to think a bit more about how output/formatting could work consistently for multiple entity types, e.g. maybe we output plain text (or colorized CSV?) by default, and use --json to switch on JSON mode like the other commands?

The output could also be made Seq-version-agnostic by side-stepping the strongly-typed ListAsync method and retrieving the result set as dynamic instead; the output mechanism could then just strip off the Links property and output JSON-document-per-line.

Tough balance to strike between ergonomics and automation-friendliness, should be fun :-)

@nblumhardtnblumhardt mentioned this pull request Mar 4, 2018
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@andymac4182@nblumhardt@tsimbalar
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Add support for Listing and Removing API Keys - #27

Merged
nblumhardt merged 3 commits into
datalust:devfrom
andymac4182:apikey
Feb 27, 2018
Merged

Add support for Listing and Removing API Keys#27
nblumhardt merged 3 commits into
datalust:devfrom
andymac4182:apikey

Conversation

@andymac4182

Copy link
Copy Markdown
Contributor

This is an initial idea for listing and removing of API Keys it is based on my work in #26. I plan on adding support for adding api keys.

@nblumhardtnblumhardt mentioned this pull request Feb 25, 2018

@nblumhardtnblumhardt left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looking good! Added a bunch of thoughts since it's the first feature like this and there's not much existing code to compare with, keen to know your thoughts. Cheers!

namespace SeqCli.Cli.Commands.ApiKey
{
[Command("apikey", "list", "Send a structured log event to the server", Example =
"seqcli log -m 'Hello, {Name}!' -p Name=World -p App=Test")]

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Example/description is out of sync here

}

await connection.ApiKeys.RemoveAsync(apiKeyToRemove);
Console.WriteLine($"\"{_title}\" API Key removed");

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So far in this project we've taken the "unix" approach of not writing any output on success; keen to see how that goes, would be good to line this up.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sounds good. I will remove the line.

_connection = Enable<ConnectionFeature>();
Options.Add(
"t=|title=",
"",

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: param description here

{
_connectionFactory = connectionFactory;
_connection = Enable<ConnectionFeature>();
Options.Add(

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is id a worthwhile option/alternative to title? Would help with the ambiguous ones where names overlap.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have added Id and put a check in to ensure that they only specify a single value since both could be confusing as to if its removing only when both match or just one.

var connection = _connectionFactory.Connect(_connection);

var apiKeys = await connection.ApiKeys.ListAsync();
var apiKeyToRemove = apiKeys.FirstOrDefault(ak => ak.Title == _title);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would it make as much sense to remove all matches, instead of just the first, here?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ahh. I completely forgot you can have multiple with the same Title. I will fix that up.

});
foreach (var apiKey in data)
{
var apiKeyString = JsonConvert.SerializeObject(apiKey);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

Log.Debug("Retrieved ApiKeys {@ApiKeys}", apiKeys);
var data = apiKeys.Select(a => new
{
a.AppliedProperties,

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If we listed Id and Title first here, it might be a bit quicker to visually parse the output.

@andymac4182

Copy link
Copy Markdown
ContributorAuthor

Thanks for the feedback @nblumhardt I wasn't sure exactly the best way to approach a few of these but this has given me good direction. I will try get this updated shortly.


namespace SeqCli.Cli.Commands.ApiKey
{
[Command("apikey", "list", "Send a structured log event to the server", Example =

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The description of the command should be updated here :)

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @tsimbalar I have fixed that up now.

@nblumhardt
nblumhardt merged commit 003e541 into datalust:devFeb 27, 2018
@nblumhardt

Copy link
Copy Markdown
Member

👍

We might want to think a bit more about how output/formatting could work consistently for multiple entity types, e.g. maybe we output plain text (or colorized CSV?) by default, and use --json to switch on JSON mode like the other commands?

The output could also be made Seq-version-agnostic by side-stepping the strongly-typed ListAsync method and retrieving the result set as dynamic instead; the output mechanism could then just strip off the Links property and output JSON-document-per-line.

Tough balance to strike between ergonomics and automation-friendliness, should be fun :-)

@nblumhardtnblumhardt mentioned this pull request Mar 4, 2018
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@andymac4182@nblumhardt@tsimbalar
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add support for Listing and Removing API Keys - #27

Merged
nblumhardt merged 3 commits into
datalust:devfrom
andymac4182:apikey
Feb 27, 2018
Merged

Add support for Listing and Removing API Keys#27
nblumhardt merged 3 commits into
datalust:devfrom
andymac4182:apikey

Conversation

@andymac4182

Copy link
Copy Markdown
Contributor

This is an initial idea for listing and removing of API Keys it is based on my work in #26. I plan on adding support for adding api keys.

@nblumhardtnblumhardt mentioned this pull request Feb 25, 2018

@nblumhardtnblumhardt left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looking good! Added a bunch of thoughts since it's the first feature like this and there's not much existing code to compare with, keen to know your thoughts. Cheers!

namespace SeqCli.Cli.Commands.ApiKey
{
[Command("apikey", "list", "Send a structured log event to the server", Example =
"seqcli log -m 'Hello, {Name}!' -p Name=World -p App=Test")]

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Example/description is out of sync here

}

await connection.ApiKeys.RemoveAsync(apiKeyToRemove);
Console.WriteLine($"\"{_title}\" API Key removed");

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So far in this project we've taken the "unix" approach of not writing any output on success; keen to see how that goes, would be good to line this up.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sounds good. I will remove the line.

_connection = Enable<ConnectionFeature>();
Options.Add(
"t=|title=",
"",

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: param description here

{
_connectionFactory = connectionFactory;
_connection = Enable<ConnectionFeature>();
Options.Add(

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is id a worthwhile option/alternative to title? Would help with the ambiguous ones where names overlap.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have added Id and put a check in to ensure that they only specify a single value since both could be confusing as to if its removing only when both match or just one.

var connection = _connectionFactory.Connect(_connection);

var apiKeys = await connection.ApiKeys.ListAsync();
var apiKeyToRemove = apiKeys.FirstOrDefault(ak => ak.Title == _title);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would it make as much sense to remove all matches, instead of just the first, here?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ahh. I completely forgot you can have multiple with the same Title. I will fix that up.

});
foreach (var apiKey in data)
{
var apiKeyString = JsonConvert.SerializeObject(apiKey);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

Log.Debug("Retrieved ApiKeys {@ApiKeys}", apiKeys);
var data = apiKeys.Select(a => new
{
a.AppliedProperties,

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If we listed Id and Title first here, it might be a bit quicker to visually parse the output.

@andymac4182

Copy link
Copy Markdown
ContributorAuthor

Thanks for the feedback @nblumhardt I wasn't sure exactly the best way to approach a few of these but this has given me good direction. I will try get this updated shortly.


namespace SeqCli.Cli.Commands.ApiKey
{
[Command("apikey", "list", "Send a structured log event to the server", Example =

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The description of the command should be updated here :)

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @tsimbalar I have fixed that up now.

@nblumhardt
nblumhardt merged commit 003e541 into datalust:devFeb 27, 2018
@nblumhardt

Copy link
Copy Markdown
Member

👍

We might want to think a bit more about how output/formatting could work consistently for multiple entity types, e.g. maybe we output plain text (or colorized CSV?) by default, and use --json to switch on JSON mode like the other commands?

The output could also be made Seq-version-agnostic by side-stepping the strongly-typed ListAsync method and retrieving the result set as dynamic instead; the output mechanism could then just strip off the Links property and output JSON-document-per-line.

Tough balance to strike between ergonomics and automation-friendliness, should be fun :-)

@nblumhardtnblumhardt mentioned this pull request Mar 4, 2018
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@andymac4182@nblumhardt@tsimbalar
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add support for Listing and Removing API Keys - #27

Merged
nblumhardt merged 3 commits into
datalust:devfrom
andymac4182:apikey
Feb 27, 2018
Merged

Add support for Listing and Removing API Keys#27
nblumhardt merged 3 commits into
datalust:devfrom
andymac4182:apikey

Conversation

@andymac4182

Copy link
Copy Markdown
Contributor

This is an initial idea for listing and removing of API Keys it is based on my work in #26. I plan on adding support for adding api keys.

@nblumhardtnblumhardt mentioned this pull request Feb 25, 2018

@nblumhardtnblumhardt left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looking good! Added a bunch of thoughts since it's the first feature like this and there's not much existing code to compare with, keen to know your thoughts. Cheers!

namespace SeqCli.Cli.Commands.ApiKey
{
[Command("apikey", "list", "Send a structured log event to the server", Example =
"seqcli log -m 'Hello, {Name}!' -p Name=World -p App=Test")]

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Example/description is out of sync here

}

await connection.ApiKeys.RemoveAsync(apiKeyToRemove);
Console.WriteLine($"\"{_title}\" API Key removed");

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So far in this project we've taken the "unix" approach of not writing any output on success; keen to see how that goes, would be good to line this up.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sounds good. I will remove the line.

_connection = Enable<ConnectionFeature>();
Options.Add(
"t=|title=",
"",

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: param description here

{
_connectionFactory = connectionFactory;
_connection = Enable<ConnectionFeature>();
Options.Add(

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is id a worthwhile option/alternative to title? Would help with the ambiguous ones where names overlap.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have added Id and put a check in to ensure that they only specify a single value since both could be confusing as to if its removing only when both match or just one.

var connection = _connectionFactory.Connect(_connection);

var apiKeys = await connection.ApiKeys.ListAsync();
var apiKeyToRemove = apiKeys.FirstOrDefault(ak => ak.Title == _title);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would it make as much sense to remove all matches, instead of just the first, here?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ahh. I completely forgot you can have multiple with the same Title. I will fix that up.

});
foreach (var apiKey in data)
{
var apiKeyString = JsonConvert.SerializeObject(apiKey);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

Log.Debug("Retrieved ApiKeys {@ApiKeys}", apiKeys);
var data = apiKeys.Select(a => new
{
a.AppliedProperties,

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If we listed Id and Title first here, it might be a bit quicker to visually parse the output.

@andymac4182

Copy link
Copy Markdown
ContributorAuthor

Thanks for the feedback @nblumhardt I wasn't sure exactly the best way to approach a few of these but this has given me good direction. I will try get this updated shortly.


namespace SeqCli.Cli.Commands.ApiKey
{
[Command("apikey", "list", "Send a structured log event to the server", Example =

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The description of the command should be updated here :)

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @tsimbalar I have fixed that up now.

@nblumhardt
nblumhardt merged commit 003e541 into datalust:devFeb 27, 2018
@nblumhardt

Copy link
Copy Markdown
Member

👍

We might want to think a bit more about how output/formatting could work consistently for multiple entity types, e.g. maybe we output plain text (or colorized CSV?) by default, and use --json to switch on JSON mode like the other commands?

The output could also be made Seq-version-agnostic by side-stepping the strongly-typed ListAsync method and retrieving the result set as dynamic instead; the output mechanism could then just strip off the Links property and output JSON-document-per-line.

Tough balance to strike between ergonomics and automation-friendliness, should be fun :-)

@nblumhardtnblumhardt mentioned this pull request Mar 4, 2018
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@andymac4182@nblumhardt@tsimbalar
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Add support for Listing and Removing API Keys - #27

Merged
nblumhardt merged 3 commits into
datalust:devfrom
andymac4182:apikey
Feb 27, 2018
Merged

Add support for Listing and Removing API Keys#27
nblumhardt merged 3 commits into
datalust:devfrom
andymac4182:apikey

Conversation

@andymac4182

Copy link
Copy Markdown
Contributor

This is an initial idea for listing and removing of API Keys it is based on my work in #26. I plan on adding support for adding api keys.

@nblumhardtnblumhardt mentioned this pull request Feb 25, 2018

@nblumhardtnblumhardt left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looking good! Added a bunch of thoughts since it's the first feature like this and there's not much existing code to compare with, keen to know your thoughts. Cheers!

namespace SeqCli.Cli.Commands.ApiKey
{
[Command("apikey", "list", "Send a structured log event to the server", Example =
"seqcli log -m 'Hello, {Name}!' -p Name=World -p App=Test")]

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Example/description is out of sync here

}

await connection.ApiKeys.RemoveAsync(apiKeyToRemove);
Console.WriteLine($"\"{_title}\" API Key removed");

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So far in this project we've taken the "unix" approach of not writing any output on success; keen to see how that goes, would be good to line this up.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sounds good. I will remove the line.

_connection = Enable<ConnectionFeature>();
Options.Add(
"t=|title=",
"",

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: param description here

{
_connectionFactory = connectionFactory;
_connection = Enable<ConnectionFeature>();
Options.Add(

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is id a worthwhile option/alternative to title? Would help with the ambiguous ones where names overlap.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have added Id and put a check in to ensure that they only specify a single value since both could be confusing as to if its removing only when both match or just one.

var connection = _connectionFactory.Connect(_connection);

var apiKeys = await connection.ApiKeys.ListAsync();
var apiKeyToRemove = apiKeys.FirstOrDefault(ak => ak.Title == _title);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would it make as much sense to remove all matches, instead of just the first, here?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ahh. I completely forgot you can have multiple with the same Title. I will fix that up.

});
foreach (var apiKey in data)
{
var apiKeyString = JsonConvert.SerializeObject(apiKey);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

Log.Debug("Retrieved ApiKeys {@ApiKeys}", apiKeys);
var data = apiKeys.Select(a => new
{
a.AppliedProperties,

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If we listed Id and Title first here, it might be a bit quicker to visually parse the output.

@andymac4182

Copy link
Copy Markdown
ContributorAuthor

Thanks for the feedback @nblumhardt I wasn't sure exactly the best way to approach a few of these but this has given me good direction. I will try get this updated shortly.


namespace SeqCli.Cli.Commands.ApiKey
{
[Command("apikey", "list", "Send a structured log event to the server", Example =

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The description of the command should be updated here :)

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @tsimbalar I have fixed that up now.

@nblumhardt
nblumhardt merged commit 003e541 into datalust:devFeb 27, 2018
@nblumhardt

Copy link
Copy Markdown
Member

👍

We might want to think a bit more about how output/formatting could work consistently for multiple entity types, e.g. maybe we output plain text (or colorized CSV?) by default, and use --json to switch on JSON mode like the other commands?

The output could also be made Seq-version-agnostic by side-stepping the strongly-typed ListAsync method and retrieving the result set as dynamic instead; the output mechanism could then just strip off the Links property and output JSON-document-per-line.

Tough balance to strike between ergonomics and automation-friendliness, should be fun :-)

@nblumhardtnblumhardt mentioned this pull request Mar 4, 2018
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@andymac4182@nblumhardt@tsimbalar
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add support for Listing and Removing API Keys - #27

Merged
nblumhardt merged 3 commits into
datalust:devfrom
andymac4182:apikey
Feb 27, 2018
Merged

Add support for Listing and Removing API Keys#27
nblumhardt merged 3 commits into
datalust:devfrom
andymac4182:apikey

Conversation

@andymac4182

Copy link
Copy Markdown
Contributor

This is an initial idea for listing and removing of API Keys it is based on my work in #26. I plan on adding support for adding api keys.

@nblumhardtnblumhardt mentioned this pull request Feb 25, 2018

@nblumhardtnblumhardt left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looking good! Added a bunch of thoughts since it's the first feature like this and there's not much existing code to compare with, keen to know your thoughts. Cheers!

namespace SeqCli.Cli.Commands.ApiKey
{
[Command("apikey", "list", "Send a structured log event to the server", Example =
"seqcli log -m 'Hello, {Name}!' -p Name=World -p App=Test")]

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Example/description is out of sync here

}

await connection.ApiKeys.RemoveAsync(apiKeyToRemove);
Console.WriteLine($"\"{_title}\" API Key removed");

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So far in this project we've taken the "unix" approach of not writing any output on success; keen to see how that goes, would be good to line this up.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sounds good. I will remove the line.

_connection = Enable<ConnectionFeature>();
Options.Add(
"t=|title=",
"",

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: param description here

{
_connectionFactory = connectionFactory;
_connection = Enable<ConnectionFeature>();
Options.Add(

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is id a worthwhile option/alternative to title? Would help with the ambiguous ones where names overlap.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have added Id and put a check in to ensure that they only specify a single value since both could be confusing as to if its removing only when both match or just one.

var connection = _connectionFactory.Connect(_connection);

var apiKeys = await connection.ApiKeys.ListAsync();
var apiKeyToRemove = apiKeys.FirstOrDefault(ak => ak.Title == _title);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would it make as much sense to remove all matches, instead of just the first, here?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ahh. I completely forgot you can have multiple with the same Title. I will fix that up.

});
foreach (var apiKey in data)
{
var apiKeyString = JsonConvert.SerializeObject(apiKey);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

Log.Debug("Retrieved ApiKeys {@ApiKeys}", apiKeys);
var data = apiKeys.Select(a => new
{
a.AppliedProperties,

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If we listed Id and Title first here, it might be a bit quicker to visually parse the output.

@andymac4182

Copy link
Copy Markdown
ContributorAuthor

Thanks for the feedback @nblumhardt I wasn't sure exactly the best way to approach a few of these but this has given me good direction. I will try get this updated shortly.


namespace SeqCli.Cli.Commands.ApiKey
{
[Command("apikey", "list", "Send a structured log event to the server", Example =

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The description of the command should be updated here :)

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @tsimbalar I have fixed that up now.

@nblumhardt
nblumhardt merged commit 003e541 into datalust:devFeb 27, 2018
@nblumhardt

Copy link
Copy Markdown
Member

👍

We might want to think a bit more about how output/formatting could work consistently for multiple entity types, e.g. maybe we output plain text (or colorized CSV?) by default, and use --json to switch on JSON mode like the other commands?

The output could also be made Seq-version-agnostic by side-stepping the strongly-typed ListAsync method and retrieving the result set as dynamic instead; the output mechanism could then just strip off the Links property and output JSON-document-per-line.

Tough balance to strike between ergonomics and automation-friendliness, should be fun :-)

@nblumhardtnblumhardt mentioned this pull request Mar 4, 2018
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@andymac4182@nblumhardt@tsimbalar
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add support for Listing and Removing API Keys - #27

Merged
nblumhardt merged 3 commits into
datalust:devfrom
andymac4182:apikey
Feb 27, 2018
Merged

Add support for Listing and Removing API Keys#27
nblumhardt merged 3 commits into
datalust:devfrom
andymac4182:apikey

Conversation

@andymac4182

Copy link
Copy Markdown
Contributor

This is an initial idea for listing and removing of API Keys it is based on my work in #26. I plan on adding support for adding api keys.

@nblumhardtnblumhardt mentioned this pull request Feb 25, 2018

@nblumhardtnblumhardt left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looking good! Added a bunch of thoughts since it's the first feature like this and there's not much existing code to compare with, keen to know your thoughts. Cheers!

namespace SeqCli.Cli.Commands.ApiKey
{
[Command("apikey", "list", "Send a structured log event to the server", Example =
"seqcli log -m 'Hello, {Name}!' -p Name=World -p App=Test")]

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Example/description is out of sync here

}

await connection.ApiKeys.RemoveAsync(apiKeyToRemove);
Console.WriteLine($"\"{_title}\" API Key removed");

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So far in this project we've taken the "unix" approach of not writing any output on success; keen to see how that goes, would be good to line this up.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sounds good. I will remove the line.

_connection = Enable<ConnectionFeature>();
Options.Add(
"t=|title=",
"",

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: param description here

{
_connectionFactory = connectionFactory;
_connection = Enable<ConnectionFeature>();
Options.Add(

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is id a worthwhile option/alternative to title? Would help with the ambiguous ones where names overlap.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have added Id and put a check in to ensure that they only specify a single value since both could be confusing as to if its removing only when both match or just one.

var connection = _connectionFactory.Connect(_connection);

var apiKeys = await connection.ApiKeys.ListAsync();
var apiKeyToRemove = apiKeys.FirstOrDefault(ak => ak.Title == _title);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would it make as much sense to remove all matches, instead of just the first, here?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ahh. I completely forgot you can have multiple with the same Title. I will fix that up.

});
foreach (var apiKey in data)
{
var apiKeyString = JsonConvert.SerializeObject(apiKey);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

Log.Debug("Retrieved ApiKeys {@ApiKeys}", apiKeys);
var data = apiKeys.Select(a => new
{
a.AppliedProperties,

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If we listed Id and Title first here, it might be a bit quicker to visually parse the output.

@andymac4182

Copy link
Copy Markdown
ContributorAuthor

Thanks for the feedback @nblumhardt I wasn't sure exactly the best way to approach a few of these but this has given me good direction. I will try get this updated shortly.


namespace SeqCli.Cli.Commands.ApiKey
{
[Command("apikey", "list", "Send a structured log event to the server", Example =

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The description of the command should be updated here :)

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @tsimbalar I have fixed that up now.

@nblumhardt
nblumhardt merged commit 003e541 into datalust:devFeb 27, 2018
@nblumhardt

Copy link
Copy Markdown
Member

👍

We might want to think a bit more about how output/formatting could work consistently for multiple entity types, e.g. maybe we output plain text (or colorized CSV?) by default, and use --json to switch on JSON mode like the other commands?

The output could also be made Seq-version-agnostic by side-stepping the strongly-typed ListAsync method and retrieving the result set as dynamic instead; the output mechanism could then just strip off the Links property and output JSON-document-per-line.

Tough balance to strike between ergonomics and automation-friendliness, should be fun :-)

@nblumhardtnblumhardt mentioned this pull request Mar 4, 2018
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@andymac4182@nblumhardt@tsimbalar
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Add support for Listing and Removing API Keys - #27

Merged
nblumhardt merged 3 commits into
datalust:devfrom
andymac4182:apikey
Feb 27, 2018
Merged

Add support for Listing and Removing API Keys#27
nblumhardt merged 3 commits into
datalust:devfrom
andymac4182:apikey

Conversation

@andymac4182

Copy link
Copy Markdown
Contributor

This is an initial idea for listing and removing of API Keys it is based on my work in #26. I plan on adding support for adding api keys.

@nblumhardtnblumhardt mentioned this pull request Feb 25, 2018

@nblumhardtnblumhardt left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looking good! Added a bunch of thoughts since it's the first feature like this and there's not much existing code to compare with, keen to know your thoughts. Cheers!

namespace SeqCli.Cli.Commands.ApiKey
{
[Command("apikey", "list", "Send a structured log event to the server", Example =
"seqcli log -m 'Hello, {Name}!' -p Name=World -p App=Test")]

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Example/description is out of sync here

}

await connection.ApiKeys.RemoveAsync(apiKeyToRemove);
Console.WriteLine($"\"{_title}\" API Key removed");

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So far in this project we've taken the "unix" approach of not writing any output on success; keen to see how that goes, would be good to line this up.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sounds good. I will remove the line.

_connection = Enable<ConnectionFeature>();
Options.Add(
"t=|title=",
"",

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: param description here

{
_connectionFactory = connectionFactory;
_connection = Enable<ConnectionFeature>();
Options.Add(

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is id a worthwhile option/alternative to title? Would help with the ambiguous ones where names overlap.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have added Id and put a check in to ensure that they only specify a single value since both could be confusing as to if its removing only when both match or just one.

var connection = _connectionFactory.Connect(_connection);

var apiKeys = await connection.ApiKeys.ListAsync();
var apiKeyToRemove = apiKeys.FirstOrDefault(ak => ak.Title == _title);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would it make as much sense to remove all matches, instead of just the first, here?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ahh. I completely forgot you can have multiple with the same Title. I will fix that up.

});
foreach (var apiKey in data)
{
var apiKeyString = JsonConvert.SerializeObject(apiKey);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

Log.Debug("Retrieved ApiKeys {@ApiKeys}", apiKeys);
var data = apiKeys.Select(a => new
{
a.AppliedProperties,

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If we listed Id and Title first here, it might be a bit quicker to visually parse the output.

@andymac4182

Copy link
Copy Markdown
ContributorAuthor

Thanks for the feedback @nblumhardt I wasn't sure exactly the best way to approach a few of these but this has given me good direction. I will try get this updated shortly.


namespace SeqCli.Cli.Commands.ApiKey
{
[Command("apikey", "list", "Send a structured log event to the server", Example =

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The description of the command should be updated here :)

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @tsimbalar I have fixed that up now.

@nblumhardt
nblumhardt merged commit 003e541 into datalust:devFeb 27, 2018
@nblumhardt

Copy link
Copy Markdown
Member

👍

We might want to think a bit more about how output/formatting could work consistently for multiple entity types, e.g. maybe we output plain text (or colorized CSV?) by default, and use --json to switch on JSON mode like the other commands?

The output could also be made Seq-version-agnostic by side-stepping the strongly-typed ListAsync method and retrieving the result set as dynamic instead; the output mechanism could then just strip off the Links property and output JSON-document-per-line.

Tough balance to strike between ergonomics and automation-friendliness, should be fun :-)

@nblumhardtnblumhardt mentioned this pull request Mar 4, 2018
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@andymac4182@nblumhardt@tsimbalar