diff --git a/DysonNetwork.Pass/Account/AccountPublicController.cs b/DysonNetwork.Pass/Account/AccountPublicController.cs index f230ddfd..b63f6acd 100644 --- a/DysonNetwork.Pass/Account/AccountPublicController.cs +++ b/DysonNetwork.Pass/Account/AccountPublicController.cs @@ -68,7 +68,7 @@ public class AccountPublicController( } [HttpGet("search")] - public async Task> Search([FromQuery] string query, [FromQuery] int take = 20) + public async Task> SearchAccounts([FromQuery] string query, [FromQuery] int take = 20) { if (string.IsNullOrWhiteSpace(query)) return []; diff --git a/DysonNetwork.Shared/Registry/RemoteAccountService.cs b/DysonNetwork.Shared/Registry/RemoteAccountService.cs index 9c8e811e..869931ef 100644 --- a/DysonNetwork.Shared/Registry/RemoteAccountService.cs +++ b/DysonNetwork.Shared/Registry/RemoteAccountService.cs @@ -51,4 +51,4 @@ public class RemoteAccountService(AccountService.AccountServiceClient accounts) .Select(SnAccountStatus.FromProtoValue) .ToDictionary(s => s.AccountId, s => s); } -} \ No newline at end of file +} diff --git a/DysonNetwork.Sphere/Publisher/PublisherController.cs b/DysonNetwork.Sphere/Publisher/PublisherController.cs index bbaf823c..87cab806 100644 --- a/DysonNetwork.Sphere/Publisher/PublisherController.cs +++ b/DysonNetwork.Sphere/Publisher/PublisherController.cs @@ -24,53 +24,6 @@ public class PublisherController( IServiceScopeFactory factory ) : ControllerBase { - [HttpGet("{name}")] - public async Task> 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> GetPublisherHeatmap(string name) - { - var heatmap = await ps.GetPublisherHeatmap(name); - if (heatmap is null) - return NotFound(); - return Ok(heatmap); - } - - [HttpGet("{name}/stats")] - public async Task> 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>> 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>> 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( } } } - diff --git a/DysonNetwork.Sphere/Publisher/PublisherPublicController.cs b/DysonNetwork.Sphere/Publisher/PublisherPublicController.cs new file mode 100644 index 00000000..8b2104c6 --- /dev/null +++ b/DysonNetwork.Sphere/Publisher/PublisherPublicController.cs @@ -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>> SearchPublishers([FromQuery] string query, [FromQuery] int take = 20) + { + if (string.IsNullOrWhiteSpace(query)) + return Ok(new List()); + 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> 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> GetPublisherHeatmap(string name) + { + var heatmap = await ps.GetPublisherHeatmap(name); + if (heatmap is null) + return NotFound(); + return Ok(heatmap); + } + + [HttpGet("{name}/stats")] + public async Task> 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>> 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(); + } +}