[backend/api] Return identicon for users without avatars

This commit is contained in:
Laura Hausmann 2024-02-22 22:43:58 +01:00
parent e4505d9d00
commit 703e58b3fe
No known key found for this signature in database
GPG key ID: D044E84C5BE01605
6 changed files with 23 additions and 16 deletions

View file

@ -16,7 +16,7 @@ namespace Iceshrimp.Backend.Controllers;
[EnableRateLimiting("sliding")] [EnableRateLimiting("sliding")]
[Route("/api/iceshrimp/v1/note")] [Route("/api/iceshrimp/v1/note")]
[Produces(MediaTypeNames.Application.Json)] [Produces(MediaTypeNames.Application.Json)]
public class NoteController(DatabaseContext db, NoteService noteSvc) : ControllerBase public class NoteController(DatabaseContext db, NoteService noteSvc, NoteRenderer noteRenderer) : ControllerBase
{ {
[HttpGet("{id}")] [HttpGet("{id}")]
[Authenticate] [Authenticate]
@ -33,7 +33,7 @@ public class NoteController(DatabaseContext db, NoteService noteSvc) : Controlle
.FirstOrDefaultAsync() ?? .FirstOrDefaultAsync() ??
throw GracefulException.NotFound("User not found"); throw GracefulException.NotFound("User not found");
return Ok(NoteRenderer.RenderOne(note.EnforceRenoteReplyVisibility())); return Ok(noteRenderer.RenderOne(note.EnforceRenoteReplyVisibility()));
} }
[HttpPost] [HttpPost]
@ -57,6 +57,6 @@ public class NoteController(DatabaseContext db, NoteService noteSvc) : Controlle
var note = await noteSvc.CreateNoteAsync(user, Note.NoteVisibility.Public, request.Text, request.Cw, reply); var note = await noteSvc.CreateNoteAsync(user, Note.NoteVisibility.Public, request.Text, request.Cw, reply);
return Ok(NoteRenderer.RenderOne(note)); return Ok(noteRenderer.RenderOne(note));
} }
} }

View file

@ -3,14 +3,14 @@ using Iceshrimp.Backend.Core.Database.Tables;
namespace Iceshrimp.Backend.Controllers.Renderers; namespace Iceshrimp.Backend.Controllers.Renderers;
public class NoteRenderer public class NoteRenderer(UserRenderer userRenderer)
{ {
public static NoteResponse RenderOne(Note note) public NoteResponse RenderOne(Note note)
{ {
return new NoteResponse { Id = note.Id, Text = note.Text, User = UserRenderer.RenderOne(note.User) }; return new NoteResponse { Id = note.Id, Text = note.Text, User = userRenderer.RenderOne(note.User) };
} }
public static IEnumerable<NoteResponse> RenderMany(IEnumerable<Note> notes) public IEnumerable<NoteResponse> RenderMany(IEnumerable<Note> notes)
{ {
return notes.Select(RenderOne); return notes.Select(RenderOne);
} }

View file

@ -1,19 +1,24 @@
using Iceshrimp.Backend.Controllers.Schemas; using Iceshrimp.Backend.Controllers.Schemas;
using Iceshrimp.Backend.Core.Configuration;
using Iceshrimp.Backend.Core.Database.Tables; using Iceshrimp.Backend.Core.Database.Tables;
using Microsoft.Extensions.Options;
namespace Iceshrimp.Backend.Controllers.Renderers; namespace Iceshrimp.Backend.Controllers.Renderers;
public class UserRenderer public class UserRenderer(IOptions<Config.InstanceSection> config)
{ {
public static UserResponse RenderOne(User user) public UserResponse RenderOne(User user)
{ {
return new UserResponse return new UserResponse
{ {
Id = user.Id, Username = user.Username, AvatarUrl = user.AvatarUrl, BannerUrl = user.BannerUrl Id = user.Id,
Username = user.Username,
AvatarUrl = user.AvatarUrl ?? $"https://{config.Value.WebDomain}/identicon/{user.Id}",
BannerUrl = user.BannerUrl
}; };
} }
public static IEnumerable<UserResponse> RenderMany(IEnumerable<User> users) public IEnumerable<UserResponse> RenderMany(IEnumerable<User> users)
{ {
return users.Select(RenderOne); return users.Select(RenderOne);
} }

View file

@ -17,7 +17,7 @@ namespace Iceshrimp.Backend.Controllers;
[EnableRateLimiting("sliding")] [EnableRateLimiting("sliding")]
[Route("/api/iceshrimp/v1/timeline")] [Route("/api/iceshrimp/v1/timeline")]
[Produces(MediaTypeNames.Application.Json)] [Produces(MediaTypeNames.Application.Json)]
public class TimelineController(DatabaseContext db, IDistributedCache cache) : ControllerBase public class TimelineController(DatabaseContext db, IDistributedCache cache, NoteRenderer noteRenderer) : ControllerBase
{ {
[HttpGet("home")] [HttpGet("home")]
[Authenticate] [Authenticate]
@ -40,6 +40,6 @@ public class TimelineController(DatabaseContext db, IDistributedCache cache) : C
.PrecomputeVisibilities(user) .PrecomputeVisibilities(user)
.ToListAsync(); .ToListAsync();
return Ok(NoteRenderer.RenderMany(notes.EnforceRenoteReplyVisibility())); return Ok(noteRenderer.RenderMany(notes.EnforceRenoteReplyVisibility()));
} }
} }

View file

@ -15,7 +15,7 @@ namespace Iceshrimp.Backend.Controllers;
[EnableRateLimiting("sliding")] [EnableRateLimiting("sliding")]
[Route("/api/iceshrimp/v1/user/{id}")] [Route("/api/iceshrimp/v1/user/{id}")]
[Produces(MediaTypeNames.Application.Json)] [Produces(MediaTypeNames.Application.Json)]
public class UserController(DatabaseContext db) : ControllerBase public class UserController(DatabaseContext db, UserRenderer userRenderer, NoteRenderer noteRenderer) : ControllerBase
{ {
[HttpGet] [HttpGet]
[ProducesResponseType(StatusCodes.Status200OK, Type = typeof(UserResponse))] [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(UserResponse))]
@ -26,7 +26,7 @@ public class UserController(DatabaseContext db) : ControllerBase
.FirstOrDefaultAsync(p => p.Id == id) ?? .FirstOrDefaultAsync(p => p.Id == id) ??
throw GracefulException.NotFound("User not found"); throw GracefulException.NotFound("User not found");
return Ok(UserRenderer.RenderOne(user)); return Ok(userRenderer.RenderOne(user));
} }
[HttpGet("notes")] [HttpGet("notes")]
@ -48,6 +48,6 @@ public class UserController(DatabaseContext db) : ControllerBase
.Paginate(pq, ControllerContext) .Paginate(pq, ControllerContext)
.ToListAsync(); .ToListAsync();
return Ok(NoteRenderer.RenderMany(notes.EnforceRenoteReplyVisibility())); return Ok(noteRenderer.RenderMany(notes.EnforceRenoteReplyVisibility()));
} }
} }

View file

@ -49,6 +49,8 @@ public static class ServiceExtensions
.AddScoped<ErrorHandlerMiddleware>() .AddScoped<ErrorHandlerMiddleware>()
.AddScoped<UserRenderer>() .AddScoped<UserRenderer>()
.AddScoped<NoteRenderer>() .AddScoped<NoteRenderer>()
.AddScoped<Controllers.Renderers.NoteRenderer>()
.AddScoped<Controllers.Renderers.UserRenderer>()
.AddScoped<NotificationRenderer>() .AddScoped<NotificationRenderer>()
.AddScoped<ActivityPubController>(); .AddScoped<ActivityPubController>();