🐛 Fix post get API missing the reference post
This commit is contained in:
@@ -18,35 +18,35 @@ public class AppDatabase(
|
|||||||
IConfiguration configuration
|
IConfiguration configuration
|
||||||
) : DbContext(options)
|
) : DbContext(options)
|
||||||
{
|
{
|
||||||
public DbSet<PermissionNode> PermissionNodes { get; set; }
|
public DbSet<PermissionNode> PermissionNodes { get; set; } = null!;
|
||||||
public DbSet<PermissionGroup> PermissionGroups { get; set; }
|
public DbSet<PermissionGroup> PermissionGroups { get; set; } = null!;
|
||||||
public DbSet<PermissionGroupMember> PermissionGroupMembers { get; set; }
|
public DbSet<PermissionGroupMember> PermissionGroupMembers { get; set; } = null!;
|
||||||
|
|
||||||
public DbSet<MagicSpell> MagicSpells { get; set; }
|
public DbSet<MagicSpell> MagicSpells { get; set; } = null!;
|
||||||
public DbSet<Account.Account> Accounts { get; set; }
|
public DbSet<Account.Account> Accounts { get; set; } = null!;
|
||||||
public DbSet<AccountConnection> AccountConnections { get; set; }
|
public DbSet<AccountConnection> AccountConnections { get; set; } = null!;
|
||||||
public DbSet<AccountProfile> AccountProfiles { get; set; }
|
public DbSet<AccountProfile> AccountProfiles { get; set; } = null!;
|
||||||
public DbSet<AccountContact> AccountContacts { get; set; }
|
public DbSet<AccountContact> AccountContacts { get; set; } = null!;
|
||||||
public DbSet<AccountAuthFactor> AccountAuthFactors { get; set; }
|
public DbSet<AccountAuthFactor> AccountAuthFactors { get; set; } = null!;
|
||||||
public DbSet<Relationship> AccountRelationships { get; set; }
|
public DbSet<Relationship> AccountRelationships { get; set; } = null!;
|
||||||
public DbSet<Status> AccountStatuses { get; set; }
|
public DbSet<Status> AccountStatuses { get; set; } = null!;
|
||||||
public DbSet<CheckInResult> AccountCheckInResults { get; set; }
|
public DbSet<CheckInResult> AccountCheckInResults { get; set; } = null!;
|
||||||
public DbSet<AccountBadge> Badges { get; set; }
|
public DbSet<AccountBadge> Badges { get; set; } = null!;
|
||||||
public DbSet<ActionLog> ActionLogs { get; set; }
|
public DbSet<ActionLog> ActionLogs { get; set; } = null!;
|
||||||
public DbSet<AbuseReport> AbuseReports { get; set; }
|
public DbSet<AbuseReport> AbuseReports { get; set; } = null!;
|
||||||
|
|
||||||
public DbSet<AuthSession> AuthSessions { get; set; }
|
public DbSet<AuthSession> AuthSessions { get; set; } = null!;
|
||||||
public DbSet<AuthChallenge> AuthChallenges { get; set; }
|
public DbSet<AuthChallenge> AuthChallenges { get; set; } = null!;
|
||||||
public DbSet<AuthClient> AuthClients { get; set; }
|
public DbSet<AuthClient> AuthClients { get; set; } = null!;
|
||||||
|
|
||||||
public DbSet<Wallet.Wallet> Wallets { get; set; }
|
public DbSet<Wallet.Wallet> Wallets { get; set; } = null!;
|
||||||
public DbSet<WalletPocket> WalletPockets { get; set; }
|
public DbSet<WalletPocket> WalletPockets { get; set; } = null!;
|
||||||
public DbSet<Order> PaymentOrders { get; set; }
|
public DbSet<Order> PaymentOrders { get; set; } = null!;
|
||||||
public DbSet<Transaction> PaymentTransactions { get; set; }
|
public DbSet<Transaction> PaymentTransactions { get; set; } = null!;
|
||||||
public DbSet<Subscription> WalletSubscriptions { get; set; }
|
public DbSet<Subscription> WalletSubscriptions { get; set; } = null!;
|
||||||
public DbSet<Coupon> WalletCoupons { get; set; }
|
public DbSet<Coupon> WalletCoupons { get; set; } = null!;
|
||||||
|
|
||||||
public DbSet<Punishment> Punishments { get; set; }
|
public DbSet<Punishment> Punishments { get; set; } = null!;
|
||||||
|
|
||||||
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
|
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
|
||||||
{
|
{
|
||||||
|
@@ -20,7 +20,6 @@ public class OidcProviderController(
|
|||||||
OidcProviderService oidcService,
|
OidcProviderService oidcService,
|
||||||
IConfiguration configuration,
|
IConfiguration configuration,
|
||||||
IOptions<OidcProviderOptions> options,
|
IOptions<OidcProviderOptions> options,
|
||||||
ILogger<OidcProviderController> logger
|
|
||||||
)
|
)
|
||||||
: ControllerBase
|
: ControllerBase
|
||||||
{
|
{
|
||||||
@@ -36,74 +35,74 @@ public class OidcProviderController(
|
|||||||
case "authorization_code" when request.Code == null:
|
case "authorization_code" when request.Code == null:
|
||||||
return BadRequest("Authorization code is required");
|
return BadRequest("Authorization code is required");
|
||||||
case "authorization_code":
|
case "authorization_code":
|
||||||
{
|
{
|
||||||
var client = await oidcService.FindClientByIdAsync(request.ClientId.Value);
|
var client = await oidcService.FindClientByIdAsync(request.ClientId.Value);
|
||||||
if (client == null ||
|
if (client == null ||
|
||||||
!await oidcService.ValidateClientCredentialsAsync(request.ClientId.Value, request.ClientSecret))
|
!await oidcService.ValidateClientCredentialsAsync(request.ClientId.Value, request.ClientSecret))
|
||||||
return BadRequest(new ErrorResponse
|
return BadRequest(new ErrorResponse
|
||||||
{ Error = "invalid_client", ErrorDescription = "Invalid client credentials" });
|
{ Error = "invalid_client", ErrorDescription = "Invalid client credentials" });
|
||||||
|
|
||||||
// Generate tokens
|
// Generate tokens
|
||||||
var tokenResponse = await oidcService.GenerateTokenResponseAsync(
|
|
||||||
clientId: request.ClientId.Value,
|
|
||||||
authorizationCode: request.Code!,
|
|
||||||
redirectUri: request.RedirectUri,
|
|
||||||
codeVerifier: request.CodeVerifier
|
|
||||||
);
|
|
||||||
|
|
||||||
return Ok(tokenResponse);
|
|
||||||
}
|
|
||||||
case "refresh_token" when string.IsNullOrEmpty(request.RefreshToken):
|
|
||||||
return BadRequest(new ErrorResponse
|
|
||||||
{ Error = "invalid_request", ErrorDescription = "Refresh token is required" });
|
|
||||||
case "refresh_token":
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
// Decode the base64 refresh token to get the session ID
|
|
||||||
var sessionIdBytes = Convert.FromBase64String(request.RefreshToken);
|
|
||||||
var sessionId = new Guid(sessionIdBytes);
|
|
||||||
|
|
||||||
// Find the session and related data
|
|
||||||
var session = await oidcService.FindSessionByIdAsync(sessionId);
|
|
||||||
var now = SystemClock.Instance.GetCurrentInstant();
|
|
||||||
if (session?.AppId is null || session.ExpiredAt < now)
|
|
||||||
{
|
|
||||||
return BadRequest(new ErrorResponse
|
|
||||||
{
|
|
||||||
Error = "invalid_grant",
|
|
||||||
ErrorDescription = "Invalid or expired refresh token"
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get the client
|
|
||||||
var client = await oidcService.FindClientByIdAsync(session.AppId.Value);
|
|
||||||
if (client == null)
|
|
||||||
{
|
|
||||||
return BadRequest(new ErrorResponse
|
|
||||||
{
|
|
||||||
Error = "invalid_client",
|
|
||||||
ErrorDescription = "Client not found"
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generate new tokens
|
|
||||||
var tokenResponse = await oidcService.GenerateTokenResponseAsync(
|
var tokenResponse = await oidcService.GenerateTokenResponseAsync(
|
||||||
clientId: session.AppId!.Value,
|
clientId: request.ClientId.Value,
|
||||||
sessionId: session.Id
|
authorizationCode: request.Code!,
|
||||||
|
redirectUri: request.RedirectUri,
|
||||||
|
codeVerifier: request.CodeVerifier
|
||||||
);
|
);
|
||||||
|
|
||||||
return Ok(tokenResponse);
|
return Ok(tokenResponse);
|
||||||
}
|
}
|
||||||
catch (FormatException)
|
case "refresh_token" when string.IsNullOrEmpty(request.RefreshToken):
|
||||||
|
return BadRequest(new ErrorResponse
|
||||||
|
{ Error = "invalid_request", ErrorDescription = "Refresh token is required" });
|
||||||
|
case "refresh_token":
|
||||||
{
|
{
|
||||||
return BadRequest(new ErrorResponse
|
try
|
||||||
{
|
{
|
||||||
Error = "invalid_grant",
|
// Decode the base64 refresh token to get the session ID
|
||||||
ErrorDescription = "Invalid refresh token format"
|
var sessionIdBytes = Convert.FromBase64String(request.RefreshToken);
|
||||||
});
|
var sessionId = new Guid(sessionIdBytes);
|
||||||
|
|
||||||
|
// Find the session and related data
|
||||||
|
var session = await oidcService.FindSessionByIdAsync(sessionId);
|
||||||
|
var now = SystemClock.Instance.GetCurrentInstant();
|
||||||
|
if (session?.AppId is null || session.ExpiredAt < now)
|
||||||
|
{
|
||||||
|
return BadRequest(new ErrorResponse
|
||||||
|
{
|
||||||
|
Error = "invalid_grant",
|
||||||
|
ErrorDescription = "Invalid or expired refresh token"
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the client
|
||||||
|
var client = await oidcService.FindClientByIdAsync(session.AppId.Value);
|
||||||
|
if (client == null)
|
||||||
|
{
|
||||||
|
return BadRequest(new ErrorResponse
|
||||||
|
{
|
||||||
|
Error = "invalid_client",
|
||||||
|
ErrorDescription = "Client not found"
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Generate new tokens
|
||||||
|
var tokenResponse = await oidcService.GenerateTokenResponseAsync(
|
||||||
|
clientId: session.AppId!.Value,
|
||||||
|
sessionId: session.Id
|
||||||
|
);
|
||||||
|
|
||||||
|
return Ok(tokenResponse);
|
||||||
|
}
|
||||||
|
catch (FormatException)
|
||||||
|
{
|
||||||
|
return BadRequest(new ErrorResponse
|
||||||
|
{
|
||||||
|
Error = "invalid_grant",
|
||||||
|
ErrorDescription = "Invalid refresh token format"
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
default:
|
default:
|
||||||
return BadRequest(new ErrorResponse { Error = "unsupported_grant_type" });
|
return BadRequest(new ErrorResponse { Error = "unsupported_grant_type" });
|
||||||
}
|
}
|
||||||
@@ -238,4 +237,4 @@ public class TokenRequest
|
|||||||
[JsonPropertyName("code_verifier")]
|
[JsonPropertyName("code_verifier")]
|
||||||
[FromForm(Name = "code_verifier")]
|
[FromForm(Name = "code_verifier")]
|
||||||
public string? CodeVerifier { get; set; }
|
public string? CodeVerifier { get; set; }
|
||||||
}
|
}
|
||||||
|
@@ -144,6 +144,8 @@ public class PostController(
|
|||||||
.Where(e => e.Slug == slug && e.Publisher.Name == publisherName)
|
.Where(e => e.Slug == slug && e.Publisher.Name == publisherName)
|
||||||
.Include(e => e.Tags)
|
.Include(e => e.Tags)
|
||||||
.Include(e => e.Categories)
|
.Include(e => e.Categories)
|
||||||
|
.Include(e => e.RepliedPost)
|
||||||
|
.Include(e => e.ForwardedPost)
|
||||||
.FilterWithVisibility(currentUser, userFriends, userPublishers)
|
.FilterWithVisibility(currentUser, userFriends, userPublishers)
|
||||||
.FirstOrDefaultAsync();
|
.FirstOrDefaultAsync();
|
||||||
if (post is null) return NotFound();
|
if (post is null) return NotFound();
|
||||||
@@ -175,6 +177,8 @@ public class PostController(
|
|||||||
.Include(e => e.Publisher)
|
.Include(e => e.Publisher)
|
||||||
.Include(e => e.Tags)
|
.Include(e => e.Tags)
|
||||||
.Include(e => e.Categories)
|
.Include(e => e.Categories)
|
||||||
|
.Include(e => e.RepliedPost)
|
||||||
|
.Include(e => e.ForwardedPost)
|
||||||
.FilterWithVisibility(currentUser, userFriends, userPublishers)
|
.FilterWithVisibility(currentUser, userFriends, userPublishers)
|
||||||
.FirstOrDefaultAsync();
|
.FirstOrDefaultAsync();
|
||||||
if (post is null) return NotFound();
|
if (post is null) return NotFound();
|
||||||
|
Reference in New Issue
Block a user