[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")]
[Route("/api/iceshrimp/v1/note")]
[Produces(MediaTypeNames.Application.Json)]
public class NoteController(DatabaseContext db, NoteService noteSvc) : ControllerBase
public class NoteController(DatabaseContext db, NoteService noteSvc, NoteRenderer noteRenderer) : ControllerBase
{
[HttpGet("{id}")]
[Authenticate]
@ -33,7 +33,7 @@ public class NoteController(DatabaseContext db, NoteService noteSvc) : Controlle
.FirstOrDefaultAsync() ??
throw GracefulException.NotFound("User not found");
return Ok(NoteRenderer.RenderOne(note.EnforceRenoteReplyVisibility()));
return Ok(noteRenderer.RenderOne(note.EnforceRenoteReplyVisibility()));
}
[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);
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;
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);
}

View file

@ -1,19 +1,24 @@
using Iceshrimp.Backend.Controllers.Schemas;
using Iceshrimp.Backend.Core.Configuration;
using Iceshrimp.Backend.Core.Database.Tables;
using Microsoft.Extensions.Options;
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
{
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);
}

View file

@ -17,7 +17,7 @@ namespace Iceshrimp.Backend.Controllers;
[EnableRateLimiting("sliding")]
[Route("/api/iceshrimp/v1/timeline")]
[Produces(MediaTypeNames.Application.Json)]
public class TimelineController(DatabaseContext db, IDistributedCache cache) : ControllerBase
public class TimelineController(DatabaseContext db, IDistributedCache cache, NoteRenderer noteRenderer) : ControllerBase
{
[HttpGet("home")]
[Authenticate]
@ -40,6 +40,6 @@ public class TimelineController(DatabaseContext db, IDistributedCache cache) : C
.PrecomputeVisibilities(user)
.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")]
[Route("/api/iceshrimp/v1/user/{id}")]
[Produces(MediaTypeNames.Application.Json)]
public class UserController(DatabaseContext db) : ControllerBase
public class UserController(DatabaseContext db, UserRenderer userRenderer, NoteRenderer noteRenderer) : ControllerBase
{
[HttpGet]
[ProducesResponseType(StatusCodes.Status200OK, Type = typeof(UserResponse))]
@ -26,7 +26,7 @@ public class UserController(DatabaseContext db) : ControllerBase
.FirstOrDefaultAsync(p => p.Id == id) ??
throw GracefulException.NotFound("User not found");
return Ok(UserRenderer.RenderOne(user));
return Ok(userRenderer.RenderOne(user));
}
[HttpGet("notes")]
@ -48,6 +48,6 @@ public class UserController(DatabaseContext db) : ControllerBase
.Paginate(pq, ControllerContext)
.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<UserRenderer>()
.AddScoped<NoteRenderer>()
.AddScoped<Controllers.Renderers.NoteRenderer>()
.AddScoped<Controllers.Renderers.UserRenderer>()
.AddScoped<NotificationRenderer>()
.AddScoped<ActivityPubController>();