Search publishers endpoint

🎨 Optimize publishers code structure
This commit is contained in:
2026-02-03 00:06:47 +08:00
parent 463245e915
commit 3532ca00a8
4 changed files with 72 additions and 51 deletions

View File

@@ -68,7 +68,7 @@ public class AccountPublicController(
}
[HttpGet("search")]
public async Task<List<SnAccount>> Search([FromQuery] string query, [FromQuery] int take = 20)
public async Task<List<SnAccount>> SearchAccounts([FromQuery] string query, [FromQuery] int take = 20)
{
if (string.IsNullOrWhiteSpace(query))
return [];

View File

@@ -51,4 +51,4 @@ public class RemoteAccountService(AccountService.AccountServiceClient accounts)
.Select(SnAccountStatus.FromProtoValue)
.ToDictionary(s => s.AccountId, s => s);
}
}
}

View File

@@ -24,53 +24,6 @@ public class PublisherController(
IServiceScopeFactory factory
) : ControllerBase
{
[HttpGet("{name}")]
public async Task<ActionResult<SnPublisher>> GetPublisher(string name)
{
var publisher = await db.Publishers.Where(e => e.Name == name).FirstOrDefaultAsync();
if (publisher is null)
return NotFound();
if (publisher.AccountId is null)
return Ok(publisher);
var account = await accounts.GetAccountAsync(
new GetAccountRequest { Id = publisher.AccountId.Value.ToString() }
);
publisher.Account = SnAccount.FromProtoValue(account);
return Ok(publisher);
}
[HttpGet("{name}/heatmap")]
public async Task<ActionResult<ActivityHeatmap>> GetPublisherHeatmap(string name)
{
var heatmap = await ps.GetPublisherHeatmap(name);
if (heatmap is null)
return NotFound();
return Ok(heatmap);
}
[HttpGet("{name}/stats")]
public async Task<ActionResult<PublisherService.PublisherStats>> GetPublisherStats(string name)
{
var stats = await ps.GetPublisherStats(name);
if (stats is null)
return NotFound();
return Ok(stats);
}
[HttpGet("of/{accountId:guid}")]
public async Task<ActionResult<List<SnPublisher>>> GetAccountManagedPublishers(Guid accountId)
{
var members = await db
.PublisherMembers.Where(m => m.AccountId == accountId)
.Where(m => m.JoinedAt != null)
.Include(e => e.Publisher)
.ToListAsync();
return members.Select(m => m.Publisher).ToList();
}
[HttpGet]
[Authorize]
public async Task<ActionResult<List<SnPublisher>>> ListManagedPublishers()
@@ -111,7 +64,7 @@ public class PublisherController(
public Guid RelatedUserId { get; set; }
[Required]
public Shared.Models.PublisherMemberRole Role { get; set; }
public PublisherMemberRole Role { get; set; }
}
[HttpPost("invites/{name}")]
@@ -948,4 +901,3 @@ public class PublisherController(
}
}
}

View File

@@ -0,0 +1,69 @@
using DysonNetwork.Shared.Models;
using DysonNetwork.Shared.Registry;
using Microsoft.EntityFrameworkCore;
using Microsoft.AspNetCore.Mvc;
namespace DysonNetwork.Sphere.Publisher;
[ApiController]
[Route("/api/publishers")]
public class PublisherPublicController(AppDatabase db, RemoteAccountService accounts, PublisherService ps) : ControllerBase
{
[HttpGet("search")]
public async Task<ActionResult<List<SnPublisher>>> SearchPublishers([FromQuery] string query, [FromQuery] int take = 20)
{
if (string.IsNullOrWhiteSpace(query))
return Ok(new List<SnPublisher>());
var publishers = await db.Publishers
.Where(a => EF.Functions.ILike(a.Name, $"%{query}%") ||
EF.Functions.ILike(a.Nick, $"%{query}%") ||
(a.Bio != null && EF.Functions.ILike(a.Bio, $"%{query}%")))
.Take(take)
.ToListAsync();
return Ok(publishers);
}
[HttpGet("{name}")]
public async Task<ActionResult<SnPublisher>> GetPublisher(string name)
{
var publisher = await db.Publishers.Where(e => e.Name == name).FirstOrDefaultAsync();
if (publisher is null)
return NotFound();
if (publisher.AccountId is null)
return Ok(publisher);
publisher.Account = SnAccount.FromProtoValue(await accounts.GetAccount(publisher.AccountId.Value));
return Ok(publisher);
}
[HttpGet("{name}/heatmap")]
public async Task<ActionResult<ActivityHeatmap>> GetPublisherHeatmap(string name)
{
var heatmap = await ps.GetPublisherHeatmap(name);
if (heatmap is null)
return NotFound();
return Ok(heatmap);
}
[HttpGet("{name}/stats")]
public async Task<ActionResult<PublisherService.PublisherStats>> GetPublisherStats(string name)
{
var stats = await ps.GetPublisherStats(name);
if (stats is null)
return NotFound();
return Ok(stats);
}
[HttpGet("of/{accountId:guid}")]
public async Task<ActionResult<List<SnPublisher>>> GetAccountManagedPublishers(Guid accountId)
{
var members = await db
.PublisherMembers.Where(m => m.AccountId == accountId)
.Where(m => m.JoinedAt != null)
.Include(e => e.Publisher)
.ToListAsync();
return members.Select(m => m.Publisher).ToList();
}
}