Skip to content
This repository was archived by the owner on Jun 1, 2026. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 13 additions & 13 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -8,28 +8,28 @@
<PackageVersion Include="CaseConverter" Version="2.0.1" />
<PackageVersion Include="Duende.IdentityModel.OidcClient" Version="7.0.0" />
<PackageVersion Include="Duende.IdentityModel.OidcClient.Extensions" Version="7.0.0" />
<PackageVersion Include="Microsoft.Extensions.Logging.Console" Version="10.0.0" />
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.0" />
<PackageVersion Include="Microsoft.Extensions.Logging.Debug" Version="10.0.0" />
<PackageVersion Include="Microsoft.Extensions.Logging.Console" Version="10.0.1" />
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.1" />
<PackageVersion Include="Microsoft.Extensions.Logging.Debug" Version="10.0.1" />
<PackageVersion Include="Microsoft.Identity.Client" Version="4.79.2" />
<PackageVersion Include="Microsoft.Testing.Extensions.TrxReport" Version="2.0.2" />
<PackageVersion Include="StyleCop.Analyzers" Version="1.2.0-beta.556" />
<PackageVersion Include="System.IdentityModel.Tokens.Jwt" Version="8.15.0" />
<PackageVersion Include="IpfsShipyard.Ipfs.Core" Version="0.8.0" />
<PackageVersion Include="PeterO.Cbor" Version="5.0.0-alpha2" />
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly" Version="10.0.0" />
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="10.0.0" />
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly" Version="10.0.1" />
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="10.0.1" />
<PackageVersion Include="Microsoft.Windows.SDK.BuildTools" Version="10.0.26100.1742" />
<PackageVersion Include="Microsoft.WindowsAppSDK" Version="1.8.251106002" />
<PackageVersion Include="System.IO.Pipelines" Version="10.0.0" />
<PackageVersion Include="System.IO.Pipelines" Version="10.0.1" />
<PackageVersion Include="System.Memory" Version="4.6.3" />
<PackageVersion Include="System.Memory.Data" Version="10.0.0" />
<PackageVersion Include="System.Text.Json" Version="10.0.0" />
<PackageVersion Include="System.Memory.Data" Version="10.0.1" />
<PackageVersion Include="System.Text.Json" Version="10.0.1" />
<PackageVersion Include="MSTest" Version="4.0.2" />
<PackageVersion Include="GitVersion.MSBuild" Version="6.5.1" />
<PackageVersion Include="Duende.IdentityModel" Version="8.0.0" />
<PackageVersion Include="DnsClient" Version="1.8.0" />
<PackageVersion Include="Microsoft.Bcl.Memory" Version="10.0.0" />
<PackageVersion Include="Microsoft.Bcl.Memory" Version="10.0.1" />
<PackageVersion Include="Microsoft.Bcl.HashCode" Version="6.0.0" />
<PackageVersion Include="System.Buffers" Version="4.6.1" />
<PackageVersion Include="BouncyCastle.Cryptography" Version="2.6.2" />
Expand All @@ -40,9 +40,9 @@
<PackageVersion Include="ZstdSharp.Port" Version="0.8.6" />
<PackageVersion Include="Microsoft.AspNetCore.Authentication" Version="2.3.0" />
<PackageVersion Include="Microsoft.AspNetCore.Authentication.Cookies" Version="2.3.0" />
<PackageVersion Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="10.0.0" />
<PackageVersion Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="10.0.0" />
<PackageVersion Include="Microsoft.Extensions.Configuration.Abstractions" Version="10.0.0" />
<PackageVersion Include="Microsoft.Extensions.Caching.Abstractions" Version="10.0.0" />
<PackageVersion Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="10.0.1" />
<PackageVersion Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="10.0.1" />
<PackageVersion Include="Microsoft.Extensions.Configuration.Abstractions" Version="10.0.1" />
<PackageVersion Include="Microsoft.Extensions.Caching.Abstractions" Version="10.0.1" />
</ItemGroup>
</Project>
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ public abstract class ActorController : ControllerBase
/// <see cref="FishyFlip.Lexicon.App.Bsky.Actor.SavedFeedsPref"/> (app.bsky.actor.defs#savedFeedsPref) <br/>
/// <see cref="FishyFlip.Lexicon.App.Bsky.Actor.SavedFeedsPrefV2"/> (app.bsky.actor.defs#savedFeedsPrefV2) <br/>
/// <see cref="FishyFlip.Lexicon.App.Bsky.Actor.PersonalDetailsPref"/> (app.bsky.actor.defs#personalDetailsPref) <br/>
/// <see cref="FishyFlip.Lexicon.App.Bsky.Actor.DeclaredAgePref"/> (app.bsky.actor.defs#declaredAgePref) <br/>
/// <see cref="FishyFlip.Lexicon.App.Bsky.Actor.FeedViewPref"/> (app.bsky.actor.defs#feedViewPref) <br/>
/// <see cref="FishyFlip.Lexicon.App.Bsky.Actor.ThreadViewPref"/> (app.bsky.actor.defs#threadViewPref) <br/>
/// <see cref="FishyFlip.Lexicon.App.Bsky.Actor.InterestsPref"/> (app.bsky.actor.defs#interestsPref) <br/>
Expand Down
124 changes: 124 additions & 0 deletions src/FishyFlip.Xrpc/Lexicon/App/Bsky/Contact/ContactController.g.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
// <auto-generated />
// This file was generated by FFSourceGen.
// Do not modify this file.

#nullable enable annotations
#nullable disable warnings

namespace FishyFlip.Xrpc.Lexicon.App.Bsky.Contact
{

/// <summary>
/// app.bsky.contact XRPC Group.
/// </summary>
[ApiController]
public abstract class ContactController : ControllerBase
{

/// <summary>
/// Removes a match that was found via contact import. It shouldn't appear again if the same contact is re-imported. Requires authentication.
/// <br/> Possible Errors: <br/>
/// <see cref="FishyFlip.Lexicon.InvalidDidError"/> <br/>
/// <see cref="FishyFlip.Lexicon.InternalErrorError"/> <br/>
/// </summary>
/// <param name="subject">The subject's DID to dismiss the match with.</param>
/// <param name="cancellationToken"></param>
/// <returns>Result of <see cref="FishyFlip.Lexicon.App.Bsky.Contact.DismissMatchOutput"/></returns>
[HttpPost("/xrpc/app.bsky.contact.dismissMatch")]
public abstract Task<Results<ATResult<FishyFlip.Lexicon.App.Bsky.Contact.DismissMatchOutput>, ATErrorResult>> DismissMatchAsync ([FromBody] FishyFlip.Lexicon.App.Bsky.Contact.DismissMatchInput input, CancellationToken cancellationToken);

/// <summary>
/// Returns the matched contacts (contacts that were mutually imported). Excludes dismissed matches. Requires authentication.
/// <br/> Possible Errors: <br/>
/// <see cref="FishyFlip.Lexicon.InvalidDidError"/> <br/>
/// <see cref="FishyFlip.Lexicon.InvalidLimitError"/> <br/>
/// <see cref="FishyFlip.Lexicon.InvalidCursorError"/> <br/>
/// <see cref="FishyFlip.Lexicon.InternalErrorError"/> <br/>
/// </summary>
/// <param name="limit"></param>
/// <param name="cursor"></param>
/// <param name="cancellationToken"></param>
/// <returns>Result of <see cref="FishyFlip.Lexicon.App.Bsky.Contact.GetMatchesOutput"/></returns>
[HttpGet("/xrpc/app.bsky.contact.getMatches")]
public abstract Task<Results<ATResult<FishyFlip.Lexicon.App.Bsky.Contact.GetMatchesOutput>, ATErrorResult>> GetMatchesAsync ([FromQuery] int? limit = 50, [FromQuery] string? cursor = default, CancellationToken cancellationToken = default);

/// <summary>
/// Gets the user's current contact import status. Requires authentication.
/// <br/> Possible Errors: <br/>
/// <see cref="FishyFlip.Lexicon.InvalidDidError"/> <br/>
/// <see cref="FishyFlip.Lexicon.InternalErrorError"/> <br/>
/// </summary>
/// <param name="cancellationToken"></param>
/// <returns>Result of <see cref="FishyFlip.Lexicon.App.Bsky.Contact.GetSyncStatusOutput"/></returns>
[HttpGet("/xrpc/app.bsky.contact.getSyncStatus")]
public abstract Task<Results<ATResult<FishyFlip.Lexicon.App.Bsky.Contact.GetSyncStatusOutput>, ATErrorResult>> GetSyncStatusAsync (CancellationToken cancellationToken = default);

/// <summary>
/// Import contacts for securely matching with other users. This follows the protocol explained in https://docs.bsky.app/blog/contact-import-rfc. Requires authentication.
/// <br/> Possible Errors: <br/>
/// <see cref="FishyFlip.Lexicon.InvalidDidError"/> <br/>
/// <see cref="FishyFlip.Lexicon.InvalidContactsError"/> <br/>
/// <see cref="FishyFlip.Lexicon.TooManyContactsError"/> <br/>
/// <see cref="FishyFlip.Lexicon.InvalidTokenError"/> <br/>
/// <see cref="FishyFlip.Lexicon.InternalErrorError"/> <br/>
/// </summary>
/// <param name="token">JWT to authenticate the call. Use the JWT received as a response to the call to `app.bsky.contact.verifyPhone`.</param>
/// <param name="contacts">List of phone numbers in global E.164 format (e.g., '+12125550123'). Phone numbers that cannot be normalized into a valid phone number will be discarded. Should not repeat the 'phone' input used in `app.bsky.contact.verifyPhone`.</param>
/// <param name="cancellationToken"></param>
/// <returns>Result of <see cref="FishyFlip.Lexicon.App.Bsky.Contact.ImportContactsOutput"/></returns>
[HttpPost("/xrpc/app.bsky.contact.importContacts")]
public abstract Task<Results<ATResult<FishyFlip.Lexicon.App.Bsky.Contact.ImportContactsOutput>, ATErrorResult>> ImportContactsAsync ([FromBody] FishyFlip.Lexicon.App.Bsky.Contact.ImportContactsInput input, CancellationToken cancellationToken);

/// <summary>
/// Removes all stored hashes used for contact matching, existing matches, and sync status. Requires authentication.
/// <br/> Possible Errors: <br/>
/// <see cref="FishyFlip.Lexicon.InvalidDidError"/> <br/>
/// <see cref="FishyFlip.Lexicon.InternalErrorError"/> <br/>
/// </summary>
/// <param name="cancellationToken"></param>
/// <returns>Result of <see cref="FishyFlip.Lexicon.App.Bsky.Contact.RemoveDataOutput"/></returns>
[HttpPost("/xrpc/app.bsky.contact.removeData")]
public abstract Task<Results<ATResult<FishyFlip.Lexicon.App.Bsky.Contact.RemoveDataOutput>, ATErrorResult>> RemoveDataAsync ([FromBody] FishyFlip.Lexicon.App.Bsky.Contact.RemoveDataInput input, CancellationToken cancellationToken);

/// <summary>
/// System endpoint to send notifications related to contact imports. Requires role authentication.
/// </summary>
/// <param name="from">The DID of who this notification comes from.</param>
/// <param name="to">The DID of who this notification should go to.</param>
/// <param name="cancellationToken"></param>
/// <returns>Result of <see cref="FishyFlip.Lexicon.App.Bsky.Contact.SendNotificationOutput"/></returns>
[HttpPost("/xrpc/app.bsky.contact.sendNotification")]
public abstract Task<Results<ATResult<FishyFlip.Lexicon.App.Bsky.Contact.SendNotificationOutput>, ATErrorResult>> SendNotificationAsync ([FromBody] FishyFlip.Lexicon.App.Bsky.Contact.SendNotificationInput input, CancellationToken cancellationToken);

/// <summary>
/// Starts a phone verification flow. The phone passed will receive a code via SMS that should be passed to `app.bsky.contact.verifyPhone`. Requires authentication.
/// <br/> Possible Errors: <br/>
/// <see cref="FishyFlip.Lexicon.RateLimitExceededError"/> <br/>
/// <see cref="FishyFlip.Lexicon.InvalidDidError"/> <br/>
/// <see cref="FishyFlip.Lexicon.InvalidPhoneError"/> <br/>
/// <see cref="FishyFlip.Lexicon.InternalErrorError"/> <br/>
/// </summary>
/// <param name="phone">The phone number to receive the code via SMS.</param>
/// <param name="cancellationToken"></param>
/// <returns>Result of <see cref="FishyFlip.Lexicon.App.Bsky.Contact.StartPhoneVerificationOutput"/></returns>
[HttpPost("/xrpc/app.bsky.contact.startPhoneVerification")]
public abstract Task<Results<ATResult<FishyFlip.Lexicon.App.Bsky.Contact.StartPhoneVerificationOutput>, ATErrorResult>> StartPhoneVerificationAsync ([FromBody] FishyFlip.Lexicon.App.Bsky.Contact.StartPhoneVerificationInput input, CancellationToken cancellationToken);

/// <summary>
/// Verifies control over a phone number with a code received via SMS and starts a contact import session. Requires authentication.
/// <br/> Possible Errors: <br/>
/// <see cref="FishyFlip.Lexicon.RateLimitExceededError"/> <br/>
/// <see cref="FishyFlip.Lexicon.InvalidDidError"/> <br/>
/// <see cref="FishyFlip.Lexicon.InvalidPhoneError"/> <br/>
/// <see cref="FishyFlip.Lexicon.InvalidCodeError"/> <br/>
/// <see cref="FishyFlip.Lexicon.InternalErrorError"/> <br/>
/// </summary>
/// <param name="phone">The phone number to verify. Should be the same as the one passed to `app.bsky.contact.startPhoneVerification`.</param>
/// <param name="code">The code received via SMS as a result of the call to `app.bsky.contact.startPhoneVerification`.</param>
/// <param name="cancellationToken"></param>
/// <returns>Result of <see cref="FishyFlip.Lexicon.App.Bsky.Contact.VerifyPhoneOutput"/></returns>
[HttpPost("/xrpc/app.bsky.contact.verifyPhone")]
public abstract Task<Results<ATResult<FishyFlip.Lexicon.App.Bsky.Contact.VerifyPhoneOutput>, ATErrorResult>> VerifyPhoneAsync ([FromBody] FishyFlip.Lexicon.App.Bsky.Contact.VerifyPhoneInput input, CancellationToken cancellationToken);
}
}

18 changes: 18 additions & 0 deletions src/FishyFlip/Lexicon/ATErrorGenerator.g.cs
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,10 @@ public static FishyFlip.Models.ATError Generate(int statusCode, ErrorDetail deta
return new SetNotFoundError(statusCode, detail);
case "InvalidScopeReference":
return new InvalidScopeReferenceError(statusCode, detail);
case "InvalidDid":
return new InvalidDidError(statusCode, detail);
case "InternalError":
return new InternalErrorError(statusCode, detail);
case "SubjectHasAction":
return new SubjectHasActionError(statusCode, detail);
case "DuplicateExternalId":
Expand Down Expand Up @@ -102,6 +106,10 @@ public static FishyFlip.Models.ATError Generate(int statusCode, ErrorDetail deta
return new HostNotFoundError(statusCode, detail);
case "UnknownList":
return new UnknownListError(statusCode, detail);
case "InvalidLimit":
return new InvalidLimitError(statusCode, detail);
case "InvalidCursor":
return new InvalidCursorError(statusCode, detail);
case "NotFound":
return new NotFoundError(statusCode, detail);
case "RecordNotFound":
Expand All @@ -110,6 +118,10 @@ public static FishyFlip.Models.ATError Generate(int statusCode, ErrorDetail deta
return new ActorNotFoundError(statusCode, detail);
case "BadExpiration":
return new BadExpirationError(statusCode, detail);
case "InvalidContacts":
return new InvalidContactsError(statusCode, detail);
case "TooManyContacts":
return new TooManyContactsError(statusCode, detail);
case "HandleNotFound":
return new HandleNotFoundError(statusCode, detail);
case "DidNotFound":
Expand All @@ -124,12 +136,18 @@ public static FishyFlip.Models.ATError Generate(int statusCode, ErrorDetail deta
return new LexiconNotFoundError(statusCode, detail);
case "BadQueryString":
return new BadQueryStringError(statusCode, detail);
case "RateLimitExceeded":
return new RateLimitExceededError(statusCode, detail);
case "InvalidPhone":
return new InvalidPhoneError(statusCode, detail);
case "FutureCursor":
return new FutureCursorError(statusCode, detail);
case "ConsumerTooSlow":
return new ConsumerTooSlowError(statusCode, detail);
case "TokenRequired":
return new TokenRequiredError(statusCode, detail);
case "InvalidCode":
return new InvalidCodeError(statusCode, detail);
default:
return new FishyFlip.Models.ATError(statusCode, detail);
}
Expand Down
Loading