From 922a759fb131baf15a7a08e294d552f5a0e7aba9 Mon Sep 17 00:00:00 2001 From: Laura Hausmann Date: Tue, 7 May 2024 02:33:47 +0200 Subject: [PATCH] [backend/api] Add user settings endpoints (ISH-299) --- .../Controllers/SettingsController.cs | 65 +++++++++++++++++++ .../SettingsControllerModel.cs | 10 +++ .../Core/Services/ApiService.cs | 1 + .../Schemas/UserSettingsEntity.cs | 9 +++ 4 files changed, 85 insertions(+) create mode 100644 Iceshrimp.Backend/Controllers/SettingsController.cs create mode 100644 Iceshrimp.Frontend/Core/ControllerModels/SettingsControllerModel.cs create mode 100644 Iceshrimp.Shared/Schemas/UserSettingsEntity.cs diff --git a/Iceshrimp.Backend/Controllers/SettingsController.cs b/Iceshrimp.Backend/Controllers/SettingsController.cs new file mode 100644 index 00000000..636425a0 --- /dev/null +++ b/Iceshrimp.Backend/Controllers/SettingsController.cs @@ -0,0 +1,65 @@ +using System.Net.Mime; +using Iceshrimp.Backend.Core.Database; +using Iceshrimp.Backend.Core.Database.Tables; +using Iceshrimp.Backend.Core.Middleware; +using Iceshrimp.Shared.Schemas; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.RateLimiting; + +namespace Iceshrimp.Backend.Controllers; + +[ApiController] +[Authenticate] +[Authorize] +[EnableRateLimiting("sliding")] +[Route("/api/iceshrimp/settings")] +[Produces(MediaTypeNames.Application.Json)] +public class SettingsController(DatabaseContext db) : ControllerBase +{ + [HttpGet] + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(UserSettingsEntity))] + public async Task GetSettings() + { + var settings = await GetOrInitUserSettings(); + + var res = new UserSettingsEntity + { + FilterInaccessible = settings.FilterInaccessible, + PrivateMode = settings.PrivateMode, + DefaultNoteVisibility = (NoteVisibility)settings.DefaultNoteVisibility, + DefaultRenoteVisibility = (NoteVisibility)settings.DefaultNoteVisibility + }; + + return Ok(res); + } + + [HttpPut] + [Consumes(MediaTypeNames.Application.Json)] + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(object))] + public async Task UpdateSettings(UserSettingsEntity newSettings) + { + var settings = await GetOrInitUserSettings(); + + settings.FilterInaccessible = newSettings.FilterInaccessible; + settings.PrivateMode = newSettings.PrivateMode; + settings.DefaultNoteVisibility = (Note.NoteVisibility)newSettings.DefaultNoteVisibility; + settings.DefaultRenoteVisibility = (Note.NoteVisibility)newSettings.DefaultRenoteVisibility; + + return Ok(new object()); + } + + private async Task GetOrInitUserSettings() + { + var user = HttpContext.GetUserOrFail(); + var settings = user.UserSettings; + if (settings == null) + { + settings = new UserSettings { User = user }; + db.Add(settings); + await db.SaveChangesAsync(); + await db.ReloadEntityAsync(settings); + } + + return settings; + } +} \ No newline at end of file diff --git a/Iceshrimp.Frontend/Core/ControllerModels/SettingsControllerModel.cs b/Iceshrimp.Frontend/Core/ControllerModels/SettingsControllerModel.cs new file mode 100644 index 00000000..ed209545 --- /dev/null +++ b/Iceshrimp.Frontend/Core/ControllerModels/SettingsControllerModel.cs @@ -0,0 +1,10 @@ +using Iceshrimp.Frontend.Core.Services; +using Iceshrimp.Shared.Schemas; + +namespace Iceshrimp.Frontend.Core.ControllerModels; + +internal class SettingsControllerModel(ApiClient api) +{ + public Task GetSettings() => api.Call(HttpMethod.Get, "/settings"); + public Task UpdateSettings(UserSettingsEntity settings) => api.Call(HttpMethod.Put, "/settings", data: settings); +} \ No newline at end of file diff --git a/Iceshrimp.Frontend/Core/Services/ApiService.cs b/Iceshrimp.Frontend/Core/Services/ApiService.cs index e7a340c3..84f7e4b9 100644 --- a/Iceshrimp.Frontend/Core/Services/ApiService.cs +++ b/Iceshrimp.Frontend/Core/Services/ApiService.cs @@ -9,6 +9,7 @@ internal class ApiService(ApiClient client) public readonly AuthControllerModel Auth = new(client); public readonly DriveControllerModel Drive = new(client); public readonly AdminControllerModel Admin = new(client); + public readonly SettingsControllerModel Settings = new(client); public readonly TimelineControllerModel Timelines = new(client); public readonly NotificationControllerModel Notifications = new(client); diff --git a/Iceshrimp.Shared/Schemas/UserSettingsEntity.cs b/Iceshrimp.Shared/Schemas/UserSettingsEntity.cs new file mode 100644 index 00000000..989c6a8e --- /dev/null +++ b/Iceshrimp.Shared/Schemas/UserSettingsEntity.cs @@ -0,0 +1,9 @@ +namespace Iceshrimp.Shared.Schemas; + +public class UserSettingsEntity +{ + public NoteVisibility DefaultNoteVisibility { get; set; } + public NoteVisibility DefaultRenoteVisibility { get; set; } + public bool PrivateMode { get; set; } + public bool FilterInaccessible { get; set; } +} \ No newline at end of file