Skip to content

Commit

Permalink
Cleanup
Browse files Browse the repository at this point in the history
  • Loading branch information
drasticactions committed Jan 16, 2024
1 parent 07fe420 commit a969e33
Show file tree
Hide file tree
Showing 19 changed files with 301 additions and 79 deletions.
2 changes: 1 addition & 1 deletion src/FishyFlip/ATProtoDebug.cs
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ internal ATProtoDebug(ATProtocol proto)
/// <param name="decode">Delegate to decode the CAR response.</param>
/// <param name="cancellationToken">Cancellation Token. Defaults to null.</param>
/// <returns>Result of <see cref="Success"/>. Use <see cref="OnCarDecoded"/> to read response.</returns>
public Task<Result<Success>> GetCarAsync(
public Task<Result<Success?>> GetCarAsync(
string path,
OnCarDecoded decode,
CancellationToken cancellationToken = default)
Expand Down
204 changes: 175 additions & 29 deletions src/FishyFlip/ATProtoSync.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,47 +24,114 @@ internal ATProtoSync(ATProtocol proto)

private HttpClient Client => this.proto.Client;

/// <summary>
/// Get a Blob.
/// </summary>
/// <param name="did"><see cref="ATDid"/>.</param>
/// <param name="cid"><see cref="Cid"/>.</param>
/// <param name="cancellationToken">Optional cancellation token.</param>
/// <returns>Result of Blob.</returns>
public async Task<Result<Blob?>> GetBlobAsync(ATDid did, Cid cid, CancellationToken cancellationToken = default)
{
string url = $"{Constants.Urls.ATProtoSync.GetBlob}?did={did}&cid={cid}";
return await this.Client.GetBlob(url, this.Options.JsonSerializerOptions, cancellationToken, this.Options.Logger);
}

/// <summary>
/// Get Head of Repo.
/// </summary>
/// <param name="did"><see cref="ATDid"/>.</param>
/// <param name="cancellationToken">Optional cancellation token.</param>
/// <returns>Result of Head.</returns>
[Obsolete("Deprecated in favor of GetLatestCommitAsync")]
public Task<Result<Head?>> GetHeadAsync(ATDid did, CancellationToken cancellationToken = default)
=> this.Client.Get<Head>($"{Constants.Urls.ATProtoSync.GetHead}?did={did}", this.Options.JsonSerializerOptions,
cancellationToken, this.Options.Logger);
=> this.Client.Get<Head>(
$"{Constants.Urls.ATProtoSync.GetHead}?did={did}",
this.Options.JsonSerializerOptions,
cancellationToken,
this.Options.Logger);

/// <summary>
/// Get latest commit for a repo.
/// </summary>
/// <param name="did"><see cref="ATDid"/>.</param>
/// <param name="cancellationToken">Optional cancellation token.</param>
/// <returns>Result of LatestCommit.</returns>
public Task<Result<LatestCommit?>> GetLatestCommitAsync(ATDid did, CancellationToken cancellationToken = default)
=> this.Client.Get<LatestCommit>($"{Constants.Urls.ATProtoSync.GetLatestCommit}?did={did}", this.Options.JsonSerializerOptions,
cancellationToken, this.Options.Logger);
=> this.Client.Get<LatestCommit>(
$"{Constants.Urls.ATProtoSync.GetLatestCommit}?did={did}",
this.Options.JsonSerializerOptions,
cancellationToken,
this.Options.Logger);

/// <summary>
/// Notify of update for given hostname.
/// </summary>
/// <param name="hostname">Hostname.</param>
/// <param name="cancellationToken">Optional cancellation token.</param>
/// <returns>Result of Success.</returns>
public Task<Result<Success?>> NotifyOfUpdateAsync(string hostname, CancellationToken cancellationToken = default)
=> this.Client.Get<Success>($"{Constants.Urls.ATProtoSync.NotifyOfUpdate}?hostname={hostname}", this.Options.JsonSerializerOptions, cancellationToken, this.Options.Logger);

/// <summary>
/// Request crawl for given hostname.
/// </summary>
/// <param name="hostname">Hostname.</param>
/// <param name="cancellationToken">Optional cancellation token.</param>
/// <returns>Result of Success.</returns>
public Task<Result<Success?>> RequestCrawlAsync(string hostname, CancellationToken cancellationToken = default)
=> this.Client.Get<Success>($"{Constants.Urls.ATProtoSync.RequestCrawl}?hostname={hostname}", this.Options.JsonSerializerOptions, cancellationToken, this.Options.Logger);

public Task<Result<Success>> GetRepoAsync(ATDid repo, OnCarDecoded onDecoded, string? since = default, CancellationToken cancellationToken = default)
/// <summary>
/// Get Repo.
/// Uses OnCarDecoded to decode CAR file while downloading.
/// </summary>
/// <param name="repo"><see cref="ATDid"/> of repo.</param>
/// <param name="onDecoded">Callback method for decoding CAR file.</param>
/// <param name="since">Optional Since value.</param>
/// <param name="cancellationToken">Optional cancellation token.</param>
/// <returns>Result of Success.</returns>
public Task<Result<Success?>> GetRepoAsync(ATDid repo, OnCarDecoded onDecoded, string? since = default, CancellationToken cancellationToken = default)
{
var url = since is not null
? $"{Constants.Urls.ATProtoSync.GetRepo}?did={repo}&since={since}"
: $"{Constants.Urls.ATProtoSync.GetRepo}?did={repo}";
return this.Client.GetCarAsync(
url,
this.Options.JsonSerializerOptions, cancellationToken, this.Options.Logger, onDecoded);
this.Options.JsonSerializerOptions,
cancellationToken,
this.Options.Logger,
onDecoded);
}

public Task<Result<Success>> DownloadRepoAsync(ATDid repo, string? path = default, string? filename = default,
CancellationToken cancellationToken = default)
/// <summary>
/// Download Repo as CAR file.
/// </summary>
/// <param name="repo">Repo.</param>
/// <param name="path">Path to file.</param>
/// <param name="filename">Filename.</param>
/// <param name="cancellationToken">Optional Cancellation Token.</param>
/// <returns>Result of Success.</returns>
public Task<Result<Success?>> DownloadRepoAsync(ATDid repo, string? path = default, string? filename = default, CancellationToken cancellationToken = default)
{
filename ??= $"{repo}-repo.car";
return this.Client.DownloadCarAsync(
$"{Constants.Urls.ATProtoSync.GetRepo}?did={repo}",
path ?? Directory.GetCurrentDirectory(), filename,
this.Options.JsonSerializerOptions, cancellationToken, this.Options.Logger);
path ?? Directory.GetCurrentDirectory(),
filename,
this.Options.JsonSerializerOptions,
cancellationToken,
this.Options.Logger);
}

/// <summary>
/// Get Commit Path.
/// </summary>
/// <param name="did">Actor ATDid.</param>
/// <param name="latest">Latest Cid Commit.</param>
/// <param name="earliest">Earliest Cid Commit.</param>
/// <param name="cancellationToken">Optional Cancellation Token.</param>
/// <returns>result of CommitPath.</returns>
[Obsolete("Deprecated in Repo V3. This should no longer work.")]
public async Task<Result<CommitPath?>> GetCommitPathAsync(ATDid did, Cid? latest = default, Cid? earliest = default, CancellationToken cancellationToken = default)
{
Expand All @@ -82,32 +149,61 @@ public Task<Result<Success>> DownloadRepoAsync(ATDid repo, string? path = defaul
return await this.Client.Get<CommitPath>(url, this.Options.JsonSerializerOptions, cancellationToken, this.Options.Logger);
}

public Task<Result<Success>> GetBlocksAsync(ATDid did, Cid[] commits, OnCarDecoded onDecoded,
CancellationToken cancellationToken = default)
/// <summary>
/// Get Blocks.
/// </summary>
/// <param name="did">Actor ATDid.</param>
/// <param name="commits">Array of Cid Commits.</param>
/// <param name="onDecoded">OnCarDecoded callback.</param>
/// <param name="cancellationToken">Optional Cancellation Token.</param>
/// <returns>Blocks.</returns>
public Task<Result<Success?>> GetBlocksAsync(ATDid did, Cid[] commits, OnCarDecoded onDecoded, CancellationToken cancellationToken = default)
{
var commitList = string.Join("&", commits.Select(n => $"cids={n}"));
var url = $"{Constants.Urls.ATProtoSync.GetBlocks}?did={did}&{commitList}";

return this.Client.GetCarAsync(
url,
this.Options.JsonSerializerOptions, cancellationToken, this.Options.Logger, onDecoded);
this.Options.JsonSerializerOptions,
cancellationToken,
this.Options.Logger,
onDecoded);
}

public Task<Result<Success>> DownloadBlocksAsync(ATDid did, Cid[] commits, string? path = default, string? filename = default,
CancellationToken cancellationToken = default)
/// <summary>
/// Download Blocks as CAR file.
/// </summary>
/// <param name="did">Actor ATDid.</param>
/// <param name="commits">Array of Cid Commits.</param>
/// <param name="path">Path to file.</param>
/// <param name="filename">Filename.</param>
/// <param name="cancellationToken">Optional Cancellation Token.</param>
/// <returns>Blocks.</returns>
public Task<Result<Success?>> DownloadBlocksAsync(ATDid did, Cid[] commits, string? path = default, string? filename = default, CancellationToken cancellationToken = default)
{
var commitList = string.Join("&", commits.Select(n => $"cids={n}"));
var url = $"{Constants.Urls.ATProtoSync.GetBlocks}?did={did}&{commitList}";
filename ??= $"{did}-blocks.car";
return this.Client.DownloadCarAsync(
url,
path ?? Directory.GetCurrentDirectory(), filename,
this.Options.JsonSerializerOptions, cancellationToken, this.Options.Logger);
path ?? Directory.GetCurrentDirectory(),
filename,
this.Options.JsonSerializerOptions,
cancellationToken,
this.Options.Logger);
}

/// <summary>
/// Get Checkout.
/// Uses OnCarDecoded to decode CAR file while downloading.
/// </summary>
/// <param name="did">Actor ATDid.</param>
/// <param name="onDecoded">OnCarDecoded callback.</param>
/// <param name="commit">Cid Commit.</param>
/// <param name="cancellationToken">Optional Cancellation token.</param>
/// <returns>Result of success.</returns>
[Obsolete("Deprecated in favor of GetRepo")]
public Task<Result<Success>> GetCheckoutAsync(ATDid did, OnCarDecoded onDecoded, Cid? commit = default,
CancellationToken cancellationToken = default)
public Task<Result<Success?>> GetCheckoutAsync(ATDid did, OnCarDecoded onDecoded, Cid? commit = default, CancellationToken cancellationToken = default)
{
var url = $"{Constants.Urls.ATProtoSync.GetCheckout}?did={did}";
if (commit is not null)
Expand All @@ -117,11 +213,22 @@ public Task<Result<Success>> GetCheckoutAsync(ATDid did, OnCarDecoded onDecoded,

return this.Client.GetCarAsync(
url,
this.Options.JsonSerializerOptions, cancellationToken, this.Options.Logger, onDecoded);
this.Options.JsonSerializerOptions,
cancellationToken,
this.Options.Logger,
onDecoded);
}

public Task<Result<Success>> DownloadCheckoutAsync(ATDid did, Cid? commit = default, string? path = default, string? filename = default,
CancellationToken cancellationToken = default)
/// <summary>
/// Download Checkout as CAR file.
/// </summary>
/// <param name="did">Actor ATDid.</param>
/// <param name="commit">CID Commit.</param>
/// <param name="path">Path for file.</param>
/// <param name="filename">Filename.</param>
/// <param name="cancellationToken">Optional Cancellation Token.</param>
/// <returns>Result of success.</returns>
public Task<Result<Success?>> DownloadCheckoutAsync(ATDid did, Cid? commit = default, string? path = default, string? filename = default, CancellationToken cancellationToken = default)
{
var url = $"{Constants.Urls.ATProtoSync.GetCheckout}?did={did}";
if (commit is not null)
Expand All @@ -134,8 +241,18 @@ public Task<Result<Success>> DownloadCheckoutAsync(ATDid did, Cid? commit = defa
return this.Client.DownloadCarAsync(url, path ?? Directory.GetCurrentDirectory(), filename, this.Options.JsonSerializerOptions, cancellationToken, this.Options.Logger);
}

public Task<Result<Success>> GetRecordAsync(string collection, ATDid repo, string rkey, OnCarDecoded onDecoded, Cid? commit = default,
CancellationToken cancellationToken = default)
/// <summary>
/// Get Record.
/// Uses OnCarDecoded to decode CAR file while downloading.
/// </summary>
/// <param name="collection">Collection name.</param>
/// <param name="repo">Repo.</param>
/// <param name="rkey">Rkey.</param>
/// <param name="onDecoded">On decoded callback.</param>
/// <param name="commit">Commit.</param>
/// <param name="cancellationToken">Optional cancellation token.</param>
/// <returns>Result of success.</returns>
public Task<Result<Success?>> GetRecordAsync(string collection, ATDid repo, string rkey, OnCarDecoded onDecoded, Cid? commit = default, CancellationToken cancellationToken = default)
{
var url = $"{Constants.Urls.ATProtoSync.GetRecord}?collection={collection}&did={repo}&rkey={rkey}";
if (commit is not null)
Expand All @@ -145,11 +262,30 @@ public Task<Result<Success>> GetRecordAsync(string collection, ATDid repo, strin

return this.Client.GetCarAsync(
url,
this.Options.JsonSerializerOptions, cancellationToken, this.Options.Logger, onDecoded);
this.Options.JsonSerializerOptions,
cancellationToken,
this.Options.Logger,
onDecoded);
}

public Task<Result<Success>> DownloadRecordAsync(string collection, ATDid repo, string rkey, Cid? commit = default,
string? path = default, string? filename = default,
/// <summary>
/// Download Record as CAR file.
/// </summary>
/// <param name="collection">Collection name.</param>
/// <param name="repo">Repo.</param>
/// <param name="rkey">Rkey.</param>
/// <param name="commit">Commit.</param>
/// <param name="path">File path.</param>
/// <param name="filename">File name.</param>
/// <param name="cancellationToken">Optional cancellation token.</param>
/// <returns>Result of success.</returns>
public Task<Result<Success?>> DownloadRecordAsync(
string collection,
ATDid repo,
string rkey,
Cid? commit = default,
string? path = default,
string? filename = default,
CancellationToken cancellationToken = default)
{
var url = $"{Constants.Urls.ATProtoSync.GetRecord}?collection={collection}&did={repo}&rkey={rkey}";
Expand All @@ -162,10 +298,20 @@ public Task<Result<Success>> DownloadRecordAsync(string collection, ATDid repo,

return this.Client.DownloadCarAsync(
url,
path ?? Directory.GetCurrentDirectory(), filename,
this.Options.JsonSerializerOptions, cancellationToken, this.Options.Logger);
path ?? Directory.GetCurrentDirectory(),
filename,
this.Options.JsonSerializerOptions,
cancellationToken,
this.Options.Logger);
}

/// <summary>
/// List Repos.
/// </summary>
/// <param name="limit">Limit, defaults to 50.</param>
/// <param name="cursor">Optional Cursor. Used to continue response.</param>
/// <param name="cancellationToken">Optional Cancellation Token.</param>
/// <returns>Result of RepoList.</returns>
public async Task<Result<RepoList?>> ListReposAsync(
int limit = 50,
string? cursor = default,
Expand Down
1 change: 0 additions & 1 deletion src/FishyFlip/ATWebSocketProtocolOptions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
// Copyright (c) Drastic Actions. All rights reserved.
// </copyright>


namespace FishyFlip;

/// <summary>
Expand Down
2 changes: 2 additions & 0 deletions src/FishyFlip/FishyFlip.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsPackable>true</IsPackable>
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
<WarningsAsErrors>nullable</WarningsAsErrors>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" />
Expand Down
35 changes: 32 additions & 3 deletions src/FishyFlip/Models/ATHandle.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,33 @@

namespace FishyFlip.Models;

/// <summary>
/// ATHandle.
/// </summary>
public class ATHandle : ATIdentifier
{
/// <summary>
/// Initializes a new instance of the <see cref="ATHandle"/> class.
/// </summary>
/// <param name="handle">Handle.</param>
[JsonConstructor]
protected ATHandle(string Handle)
protected ATHandle(string handle)
{
this.Handle = Handle;
this.Handle = handle;
}

/// <summary>
/// Gets the handle.
/// </summary>
public string Handle { get; }

public static ATHandle? Create(string uri)
/// <summary>
/// Creates an ATHandle from a string.
/// </summary>
/// <param name="uri">The URI as string.</param>
/// <returns>ATHandle.</returns>
/// <exception cref="ArgumentNullException">Thrown if uri is null or empty.</exception>
public static new ATHandle? Create(string uri)
{
if (string.IsNullOrEmpty(uri))
{
Expand All @@ -30,6 +46,12 @@ protected ATHandle(string Handle)
return null;
}

/// <summary>
/// Is the given string a valid ATHandle.
/// </summary>
/// <param name="uri">The uri as string.</param>
/// <returns>Bool.</returns>
/// <exception cref="ArgumentNullException">Thrown if uri is null or empty.</exception>
public static bool IsValid(string uri)
{
if (string.IsNullOrEmpty(uri))
Expand All @@ -40,11 +62,18 @@ public static bool IsValid(string uri)
return HandleValidator.EnsureValidHandle(uri);
}

/// <inheritdoc/>
public override string ToString()
{
return this.Handle.ToString();
}

/// <summary>
/// Create an ATHandle from a ATURI.
/// </summary>
/// <param name="uri">ATUri.</param>
/// <returns>ATHandle.</returns>
/// <exception cref="ArgumentNullException">Thrown if uri is null.</exception>
internal static ATHandle? Create(ATUri uri)
{
if (uri == null)
Expand Down
Loading

0 comments on commit a969e33

Please sign in to comment.