Compare commits
	
		
			6 commits
		
	
	
		
			6ea8861da2
			...
			39b0917585
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 39b0917585 | |||
| e83895255e | |||
| b5f9ef9bd6 | |||
| e76c634738 | |||
| e7e4937082 | |||
| df93f28273 | 
					 33 changed files with 372 additions and 4373 deletions
				
			
		|  | @ -9,6 +9,7 @@ using Foxnouns.Backend.Services; | ||||||
| using Foxnouns.Backend.Utils; | using Foxnouns.Backend.Utils; | ||||||
| using Microsoft.AspNetCore.Mvc; | using Microsoft.AspNetCore.Mvc; | ||||||
| using Microsoft.EntityFrameworkCore; | using Microsoft.EntityFrameworkCore; | ||||||
|  | using NodaTime; | ||||||
| 
 | 
 | ||||||
| namespace Foxnouns.Backend.Controllers; | namespace Foxnouns.Backend.Controllers; | ||||||
| 
 | 
 | ||||||
|  | @ -19,7 +20,8 @@ public class MembersController( | ||||||
|     MemberRendererService memberRenderer, |     MemberRendererService memberRenderer, | ||||||
|     ISnowflakeGenerator snowflakeGenerator, |     ISnowflakeGenerator snowflakeGenerator, | ||||||
|     ObjectStorageService objectStorageService, |     ObjectStorageService objectStorageService, | ||||||
|     IQueue queue) : ApiControllerBase |     IQueue queue, | ||||||
|  |     IClock clock) : ApiControllerBase | ||||||
| { | { | ||||||
|     private readonly ILogger _logger = logger.ForContext<MembersController>(); |     private readonly ILogger _logger = logger.ForContext<MembersController>(); | ||||||
| 
 | 
 | ||||||
|  | @ -114,4 +116,30 @@ public class MembersController( | ||||||
|         List<FieldEntry>? Names, |         List<FieldEntry>? Names, | ||||||
|         List<Pronoun>? Pronouns, |         List<Pronoun>? Pronouns, | ||||||
|         List<Field>? Fields); |         List<Field>? Fields); | ||||||
|  | 
 | ||||||
|  |     [HttpPost("/api/v2/users/@me/members/{memberRef}/reroll-sid")] | ||||||
|  |     [Authorize("member.update")] | ||||||
|  |     [ProducesResponseType<UserRendererService.UserResponse>(statusCode: StatusCodes.Status200OK)] | ||||||
|  |     public async Task<IActionResult> RerollSidAsync(string memberRef) | ||||||
|  |     { | ||||||
|  |         var member = await db.ResolveMemberAsync(CurrentUser!.Id, memberRef); | ||||||
|  | 
 | ||||||
|  |         var minTimeAgo = clock.GetCurrentInstant() - Duration.FromHours(1); | ||||||
|  |         if (CurrentUser!.LastSidReroll > minTimeAgo) | ||||||
|  |             throw new ApiError.BadRequest("Cannot reroll short ID yet"); | ||||||
|  | 
 | ||||||
|  |         // Using ExecuteUpdateAsync here as the new short ID is generated by the database | ||||||
|  |         await db.Members.Where(m => m.Id == member.Id) | ||||||
|  |             .ExecuteUpdateAsync(s => s | ||||||
|  |                 .SetProperty(m => m.Sid, _ => db.FindFreeMemberSid())); | ||||||
|  | 
 | ||||||
|  |         await db.Users.Where(u => u.Id == CurrentUser.Id) | ||||||
|  |             .ExecuteUpdateAsync(s => s | ||||||
|  |                 .SetProperty(u => u.LastSidReroll, clock.GetCurrentInstant()) | ||||||
|  |                 .SetProperty(u => u.LastActive, clock.GetCurrentInstant())); | ||||||
|  | 
 | ||||||
|  |         // Re-fetch member to fetch the new sid | ||||||
|  |         var updatedMember = await db.ResolveMemberAsync(CurrentUser!.Id, memberRef); | ||||||
|  |         return Ok(memberRenderer.RenderMember(updatedMember, CurrentToken)); | ||||||
|  |     } | ||||||
| } | } | ||||||
|  | @ -8,6 +8,7 @@ using Foxnouns.Backend.Services; | ||||||
| using Foxnouns.Backend.Utils; | using Foxnouns.Backend.Utils; | ||||||
| using Microsoft.AspNetCore.Mvc; | using Microsoft.AspNetCore.Mvc; | ||||||
| using Microsoft.EntityFrameworkCore; | using Microsoft.EntityFrameworkCore; | ||||||
|  | using NodaTime; | ||||||
| 
 | 
 | ||||||
| namespace Foxnouns.Backend.Controllers; | namespace Foxnouns.Backend.Controllers; | ||||||
| 
 | 
 | ||||||
|  | @ -16,7 +17,8 @@ public class UsersController( | ||||||
|     DatabaseContext db, |     DatabaseContext db, | ||||||
|     UserRendererService userRenderer, |     UserRendererService userRenderer, | ||||||
|     ISnowflakeGenerator snowflakeGenerator, |     ISnowflakeGenerator snowflakeGenerator, | ||||||
|     IQueue queue) : ApiControllerBase |     IQueue queue, | ||||||
|  |     IClock clock) : ApiControllerBase | ||||||
| { | { | ||||||
|     [HttpGet("{userRef}")] |     [HttpGet("{userRef}")] | ||||||
|     [ProducesResponseType<UserRendererService.UserResponse>(statusCode: StatusCodes.Status200OK)] |     [ProducesResponseType<UserRendererService.UserResponse>(statusCode: StatusCodes.Status200OK)] | ||||||
|  | @ -213,4 +215,24 @@ public class UsersController( | ||||||
|     { |     { | ||||||
|         public bool? DarkMode { get; init; } |         public bool? DarkMode { get; init; } | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     [HttpPost("@me/reroll-sid")] | ||||||
|  |     [Authorize("user.update")] | ||||||
|  |     [ProducesResponseType<UserRendererService.UserResponse>(statusCode: StatusCodes.Status200OK)] | ||||||
|  |     public async Task<IActionResult> RerollSidAsync() | ||||||
|  |     { | ||||||
|  |         var minTimeAgo = clock.GetCurrentInstant() - Duration.FromHours(1); | ||||||
|  |         if (CurrentUser!.LastSidReroll > minTimeAgo) | ||||||
|  |             throw new ApiError.BadRequest("Cannot reroll short ID yet"); | ||||||
|  | 
 | ||||||
|  |         // Using ExecuteUpdateAsync here as the new short ID is generated by the database | ||||||
|  |         await db.Users.Where(u => u.Id == CurrentUser.Id) | ||||||
|  |             .ExecuteUpdateAsync(s => s | ||||||
|  |                 .SetProperty(u => u.Sid, _ => db.FindFreeUserSid()) | ||||||
|  |                 .SetProperty(u => u.LastSidReroll, clock.GetCurrentInstant()) | ||||||
|  |                 .SetProperty(u => u.LastActive, clock.GetCurrentInstant())); | ||||||
|  |          | ||||||
|  |         var user = await db.ResolveUserAsync(CurrentUser.Id); | ||||||
|  |         return Ok(await userRenderer.RenderUserAsync(user, CurrentUser, CurrentToken, renderMembers: false)); | ||||||
|  |     } | ||||||
| } | } | ||||||
|  | @ -60,19 +60,39 @@ public class DatabaseContext : DbContext | ||||||
|     protected override void OnModelCreating(ModelBuilder modelBuilder) |     protected override void OnModelCreating(ModelBuilder modelBuilder) | ||||||
|     { |     { | ||||||
|         modelBuilder.Entity<User>().HasIndex(u => u.Username).IsUnique(); |         modelBuilder.Entity<User>().HasIndex(u => u.Username).IsUnique(); | ||||||
|  |         modelBuilder.Entity<User>().HasIndex(u => u.Sid).IsUnique(); | ||||||
|         modelBuilder.Entity<Member>().HasIndex(m => new { m.UserId, m.Name }).IsUnique(); |         modelBuilder.Entity<Member>().HasIndex(m => new { m.UserId, m.Name }).IsUnique(); | ||||||
|  |         modelBuilder.Entity<Member>().HasIndex(m => m.Sid).IsUnique(); | ||||||
|         modelBuilder.Entity<TemporaryKey>().HasIndex(k => k.Key).IsUnique(); |         modelBuilder.Entity<TemporaryKey>().HasIndex(k => k.Key).IsUnique(); | ||||||
| 
 | 
 | ||||||
|  |         modelBuilder.Entity<User>().Property(u => u.Sid).HasDefaultValueSql("find_free_user_sid()"); | ||||||
|         modelBuilder.Entity<User>().Property(u => u.Fields).HasColumnType("jsonb"); |         modelBuilder.Entity<User>().Property(u => u.Fields).HasColumnType("jsonb"); | ||||||
|         modelBuilder.Entity<User>().Property(u => u.Names).HasColumnType("jsonb"); |         modelBuilder.Entity<User>().Property(u => u.Names).HasColumnType("jsonb"); | ||||||
|         modelBuilder.Entity<User>().Property(u => u.Pronouns).HasColumnType("jsonb"); |         modelBuilder.Entity<User>().Property(u => u.Pronouns).HasColumnType("jsonb"); | ||||||
|         modelBuilder.Entity<User>().Property(u => u.CustomPreferences).HasColumnType("jsonb"); |         modelBuilder.Entity<User>().Property(u => u.CustomPreferences).HasColumnType("jsonb"); | ||||||
|         modelBuilder.Entity<User>().Property(u => u.Settings).HasColumnType("jsonb"); |         modelBuilder.Entity<User>().Property(u => u.Settings).HasColumnType("jsonb"); | ||||||
| 
 | 
 | ||||||
|  |         modelBuilder.Entity<Member>().Property(m => m.Sid).HasDefaultValueSql("find_free_member_sid()"); | ||||||
|         modelBuilder.Entity<Member>().Property(m => m.Fields).HasColumnType("jsonb"); |         modelBuilder.Entity<Member>().Property(m => m.Fields).HasColumnType("jsonb"); | ||||||
|         modelBuilder.Entity<Member>().Property(m => m.Names).HasColumnType("jsonb"); |         modelBuilder.Entity<Member>().Property(m => m.Names).HasColumnType("jsonb"); | ||||||
|         modelBuilder.Entity<Member>().Property(m => m.Pronouns).HasColumnType("jsonb"); |         modelBuilder.Entity<Member>().Property(m => m.Pronouns).HasColumnType("jsonb"); | ||||||
|  | 
 | ||||||
|  |         modelBuilder.HasDbFunction(typeof(DatabaseContext).GetMethod(nameof(FindFreeUserSid))!) | ||||||
|  |             .HasName("find_free_user_sid"); | ||||||
|  | 
 | ||||||
|  |         modelBuilder.HasDbFunction(typeof(DatabaseContext).GetMethod(nameof(FindFreeMemberSid))!) | ||||||
|  |             .HasName("find_free_member_sid"); | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     /// <summary> | ||||||
|  |     /// Dummy method that calls <c>find_free_user_sid()</c> when used in an EF Core query. | ||||||
|  |     /// </summary> | ||||||
|  |     public string FindFreeUserSid() => throw new NotSupportedException(); | ||||||
|  | 
 | ||||||
|  |     /// <summary> | ||||||
|  |     /// Dummy method that calls <c>find_free_member_sid()</c> when used in an EF Core query. | ||||||
|  |     /// </summary> | ||||||
|  |     public string FindFreeMemberSid() => throw new NotSupportedException(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| [SuppressMessage("ReSharper", "UnusedType.Global", Justification = "Used by EF Core's migration generator")] | [SuppressMessage("ReSharper", "UnusedType.Global", Justification = "Used by EF Core's migration generator")] | ||||||
|  |  | ||||||
|  | @ -1,412 +0,0 @@ | ||||||
| // <auto-generated /> |  | ||||||
| using Foxnouns.Backend.Database; |  | ||||||
| using Microsoft.EntityFrameworkCore; |  | ||||||
| using Microsoft.EntityFrameworkCore.Infrastructure; |  | ||||||
| using Microsoft.EntityFrameworkCore.Migrations; |  | ||||||
| using Microsoft.EntityFrameworkCore.Storage.ValueConversion; |  | ||||||
| using NodaTime; |  | ||||||
| using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; |  | ||||||
| 
 |  | ||||||
| #nullable disable |  | ||||||
| 
 |  | ||||||
| namespace Foxnouns.Backend.Database.Migrations |  | ||||||
| { |  | ||||||
|     [DbContext(typeof(DatabaseContext))] |  | ||||||
|     [Migration("20240527132444_Init")] |  | ||||||
|     partial class Init |  | ||||||
|     { |  | ||||||
|         /// <inheritdoc /> |  | ||||||
|         protected override void BuildTargetModel(ModelBuilder modelBuilder) |  | ||||||
|         { |  | ||||||
| #pragma warning disable 612, 618 |  | ||||||
|             modelBuilder |  | ||||||
|                 .HasAnnotation("ProductVersion", "8.0.5") |  | ||||||
|                 .HasAnnotation("Relational:MaxIdentifierLength", 63); |  | ||||||
| 
 |  | ||||||
|             NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.AuthMethod", b => |  | ||||||
|                 { |  | ||||||
|                     b.Property<long>("Id") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<int>("AuthType") |  | ||||||
|                         .HasColumnType("integer") |  | ||||||
|                         .HasColumnName("auth_type"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<long?>("FediverseApplicationId") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("fediverse_application_id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("RemoteId") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("remote_id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("RemoteUsername") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("remote_username"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<long>("UserId") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.HasKey("Id") |  | ||||||
|                         .HasName("pk_auth_methods"); |  | ||||||
| 
 |  | ||||||
|                     b.HasIndex("FediverseApplicationId") |  | ||||||
|                         .HasDatabaseName("ix_auth_methods_fediverse_application_id"); |  | ||||||
| 
 |  | ||||||
|                     b.HasIndex("UserId") |  | ||||||
|                         .HasDatabaseName("ix_auth_methods_user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.ToTable("auth_methods", (string)null); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.FediverseApplication", b => |  | ||||||
|                 { |  | ||||||
|                     b.Property<long>("Id") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("ClientId") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("client_id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("ClientSecret") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("client_secret"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Domain") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("domain"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<int>("InstanceType") |  | ||||||
|                         .HasColumnType("integer") |  | ||||||
|                         .HasColumnName("instance_type"); |  | ||||||
| 
 |  | ||||||
|                     b.HasKey("Id") |  | ||||||
|                         .HasName("pk_fediverse_applications"); |  | ||||||
| 
 |  | ||||||
|                     b.ToTable("fediverse_applications", (string)null); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.Member", b => |  | ||||||
|                 { |  | ||||||
|                     b.Property<long>("Id") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Avatar") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("avatar"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Bio") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("bio"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("DisplayName") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("display_name"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string[]>("Links") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text[]") |  | ||||||
|                         .HasColumnName("links"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Name") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("name"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<bool>("Unlisted") |  | ||||||
|                         .HasColumnType("boolean") |  | ||||||
|                         .HasColumnName("unlisted"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<long>("UserId") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.HasKey("Id") |  | ||||||
|                         .HasName("pk_members"); |  | ||||||
| 
 |  | ||||||
|                     b.HasIndex("UserId", "Name") |  | ||||||
|                         .IsUnique() |  | ||||||
|                         .HasDatabaseName("ix_members_user_id_name"); |  | ||||||
| 
 |  | ||||||
|                     b.ToTable("members", (string)null); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.Token", b => |  | ||||||
|                 { |  | ||||||
|                     b.Property<long>("Id") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<Instant>("ExpiresAt") |  | ||||||
|                         .HasColumnType("timestamp with time zone") |  | ||||||
|                         .HasColumnName("expires_at"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<bool>("ManuallyExpired") |  | ||||||
|                         .HasColumnType("boolean") |  | ||||||
|                         .HasColumnName("manually_expired"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string[]>("Scopes") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text[]") |  | ||||||
|                         .HasColumnName("scopes"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<long>("UserId") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.HasKey("Id") |  | ||||||
|                         .HasName("pk_tokens"); |  | ||||||
| 
 |  | ||||||
|                     b.HasIndex("UserId") |  | ||||||
|                         .HasDatabaseName("ix_tokens_user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.ToTable("tokens", (string)null); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.User", b => |  | ||||||
|                 { |  | ||||||
|                     b.Property<long>("Id") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Avatar") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("avatar"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Bio") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("bio"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("DisplayName") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("display_name"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string[]>("Links") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text[]") |  | ||||||
|                         .HasColumnName("links"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("MemberTitle") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("member_title"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<int>("Role") |  | ||||||
|                         .HasColumnType("integer") |  | ||||||
|                         .HasColumnName("role"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Username") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("username"); |  | ||||||
| 
 |  | ||||||
|                     b.HasKey("Id") |  | ||||||
|                         .HasName("pk_users"); |  | ||||||
| 
 |  | ||||||
|                     b.HasIndex("Username") |  | ||||||
|                         .IsUnique() |  | ||||||
|                         .HasDatabaseName("ix_users_username"); |  | ||||||
| 
 |  | ||||||
|                     b.ToTable("users", (string)null); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.AuthMethod", b => |  | ||||||
|                 { |  | ||||||
|                     b.HasOne("Foxnouns.Backend.Database.Models.FediverseApplication", "FediverseApplication") |  | ||||||
|                         .WithMany() |  | ||||||
|                         .HasForeignKey("FediverseApplicationId") |  | ||||||
|                         .HasConstraintName("fk_auth_methods_fediverse_applications_fediverse_application_id"); |  | ||||||
| 
 |  | ||||||
|                     b.HasOne("Foxnouns.Backend.Database.Models.User", "User") |  | ||||||
|                         .WithMany("AuthMethods") |  | ||||||
|                         .HasForeignKey("UserId") |  | ||||||
|                         .OnDelete(DeleteBehavior.Cascade) |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasConstraintName("fk_auth_methods_users_user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("FediverseApplication"); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("User"); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.Member", b => |  | ||||||
|                 { |  | ||||||
|                     b.HasOne("Foxnouns.Backend.Database.Models.User", "User") |  | ||||||
|                         .WithMany("Members") |  | ||||||
|                         .HasForeignKey("UserId") |  | ||||||
|                         .OnDelete(DeleteBehavior.Cascade) |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasConstraintName("fk_members_users_user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.OwnsOne("System.Collections.Generic.List<Foxnouns.Backend.Database.Models.Field>", "Fields", b1 => |  | ||||||
|                         { |  | ||||||
|                             b1.Property<long>("MemberId") |  | ||||||
|                                 .HasColumnType("bigint"); |  | ||||||
| 
 |  | ||||||
|                             b1.Property<int>("Capacity") |  | ||||||
|                                 .HasColumnType("integer"); |  | ||||||
| 
 |  | ||||||
|                             b1.HasKey("MemberId"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToTable("members"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToJson("fields"); |  | ||||||
| 
 |  | ||||||
|                             b1.WithOwner() |  | ||||||
|                                 .HasForeignKey("MemberId") |  | ||||||
|                                 .HasConstraintName("fk_members_members_id"); |  | ||||||
|                         }); |  | ||||||
| 
 |  | ||||||
|                     b.OwnsOne("System.Collections.Generic.List<Foxnouns.Backend.Database.Models.FieldEntry>", "Names", b1 => |  | ||||||
|                         { |  | ||||||
|                             b1.Property<long>("MemberId") |  | ||||||
|                                 .HasColumnType("bigint"); |  | ||||||
| 
 |  | ||||||
|                             b1.Property<int>("Capacity") |  | ||||||
|                                 .HasColumnType("integer"); |  | ||||||
| 
 |  | ||||||
|                             b1.HasKey("MemberId"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToTable("members"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToJson("names"); |  | ||||||
| 
 |  | ||||||
|                             b1.WithOwner() |  | ||||||
|                                 .HasForeignKey("MemberId") |  | ||||||
|                                 .HasConstraintName("fk_members_members_id"); |  | ||||||
|                         }); |  | ||||||
| 
 |  | ||||||
|                     b.OwnsOne("System.Collections.Generic.List<Foxnouns.Backend.Database.Models.Pronoun>", "Pronouns", b1 => |  | ||||||
|                         { |  | ||||||
|                             b1.Property<long>("MemberId") |  | ||||||
|                                 .HasColumnType("bigint"); |  | ||||||
| 
 |  | ||||||
|                             b1.Property<int>("Capacity") |  | ||||||
|                                 .HasColumnType("integer"); |  | ||||||
| 
 |  | ||||||
|                             b1.HasKey("MemberId"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToTable("members"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToJson("pronouns"); |  | ||||||
| 
 |  | ||||||
|                             b1.WithOwner() |  | ||||||
|                                 .HasForeignKey("MemberId") |  | ||||||
|                                 .HasConstraintName("fk_members_members_id"); |  | ||||||
|                         }); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Fields") |  | ||||||
|                         .IsRequired(); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Names") |  | ||||||
|                         .IsRequired(); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Pronouns") |  | ||||||
|                         .IsRequired(); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("User"); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.Token", b => |  | ||||||
|                 { |  | ||||||
|                     b.HasOne("Foxnouns.Backend.Database.Models.User", "User") |  | ||||||
|                         .WithMany() |  | ||||||
|                         .HasForeignKey("UserId") |  | ||||||
|                         .OnDelete(DeleteBehavior.Cascade) |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasConstraintName("fk_tokens_users_user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("User"); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.User", b => |  | ||||||
|                 { |  | ||||||
|                     b.OwnsOne("Foxnouns.Backend.Database.Models.User.Fields#List", "Fields", b1 => |  | ||||||
|                         { |  | ||||||
|                             b1.Property<long>("UserId") |  | ||||||
|                                 .HasColumnType("bigint"); |  | ||||||
| 
 |  | ||||||
|                             b1.Property<int>("Capacity") |  | ||||||
|                                 .HasColumnType("integer"); |  | ||||||
| 
 |  | ||||||
|                             b1.HasKey("UserId") |  | ||||||
|                                 .HasName("pk_users"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToTable("users"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToJson("fields"); |  | ||||||
| 
 |  | ||||||
|                             b1.WithOwner() |  | ||||||
|                                 .HasForeignKey("UserId") |  | ||||||
|                                 .HasConstraintName("fk_users_users_user_id"); |  | ||||||
|                         }); |  | ||||||
| 
 |  | ||||||
|                     b.OwnsOne("Foxnouns.Backend.Database.Models.User.Names#List", "Names", b1 => |  | ||||||
|                         { |  | ||||||
|                             b1.Property<long>("UserId") |  | ||||||
|                                 .HasColumnType("bigint"); |  | ||||||
| 
 |  | ||||||
|                             b1.Property<int>("Capacity") |  | ||||||
|                                 .HasColumnType("integer"); |  | ||||||
| 
 |  | ||||||
|                             b1.HasKey("UserId") |  | ||||||
|                                 .HasName("pk_users"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToTable("users"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToJson("names"); |  | ||||||
| 
 |  | ||||||
|                             b1.WithOwner() |  | ||||||
|                                 .HasForeignKey("UserId") |  | ||||||
|                                 .HasConstraintName("fk_users_users_user_id"); |  | ||||||
|                         }); |  | ||||||
| 
 |  | ||||||
|                     b.OwnsOne("Foxnouns.Backend.Database.Models.User.Pronouns#List", "Pronouns", b1 => |  | ||||||
|                         { |  | ||||||
|                             b1.Property<long>("UserId") |  | ||||||
|                                 .HasColumnType("bigint"); |  | ||||||
| 
 |  | ||||||
|                             b1.Property<int>("Capacity") |  | ||||||
|                                 .HasColumnType("integer"); |  | ||||||
| 
 |  | ||||||
|                             b1.HasKey("UserId") |  | ||||||
|                                 .HasName("pk_users"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToTable("users"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToJson("pronouns"); |  | ||||||
| 
 |  | ||||||
|                             b1.WithOwner() |  | ||||||
|                                 .HasForeignKey("UserId") |  | ||||||
|                                 .HasConstraintName("fk_users_users_user_id"); |  | ||||||
|                         }); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Fields") |  | ||||||
|                         .IsRequired(); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Names") |  | ||||||
|                         .IsRequired(); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Pronouns") |  | ||||||
|                         .IsRequired(); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.User", b => |  | ||||||
|                 { |  | ||||||
|                     b.Navigation("AuthMethods"); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Members"); |  | ||||||
|                 }); |  | ||||||
| #pragma warning restore 612, 618 |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  | @ -1,4 +1,5 @@ | ||||||
| using Microsoft.EntityFrameworkCore.Migrations; | using Microsoft.EntityFrameworkCore.Migrations; | ||||||
|  | using Microsoft.EntityFrameworkCore.Infrastructure; | ||||||
| using NodaTime; | using NodaTime; | ||||||
| 
 | 
 | ||||||
| #nullable disable | #nullable disable | ||||||
|  | @ -6,6 +7,8 @@ using NodaTime; | ||||||
| namespace Foxnouns.Backend.Database.Migrations | namespace Foxnouns.Backend.Database.Migrations | ||||||
| { | { | ||||||
|     /// <inheritdoc /> |     /// <inheritdoc /> | ||||||
|  |     [DbContext(typeof(DatabaseContext))] | ||||||
|  |     [Migration("20240527132444_Init")] | ||||||
|     public partial class Init : Migration |     public partial class Init : Migration | ||||||
|     { |     { | ||||||
|         /// <inheritdoc /> |         /// <inheritdoc /> | ||||||
|  |  | ||||||
|  | @ -1,470 +0,0 @@ | ||||||
| // <auto-generated /> |  | ||||||
| using Foxnouns.Backend.Database; |  | ||||||
| using Microsoft.EntityFrameworkCore; |  | ||||||
| using Microsoft.EntityFrameworkCore.Infrastructure; |  | ||||||
| using Microsoft.EntityFrameworkCore.Migrations; |  | ||||||
| using Microsoft.EntityFrameworkCore.Storage.ValueConversion; |  | ||||||
| using NodaTime; |  | ||||||
| using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; |  | ||||||
| 
 |  | ||||||
| #nullable disable |  | ||||||
| 
 |  | ||||||
| namespace Foxnouns.Backend.Database.Migrations |  | ||||||
| { |  | ||||||
|     [DbContext(typeof(DatabaseContext))] |  | ||||||
|     [Migration("20240528125310_AddApplications")] |  | ||||||
|     partial class AddApplications |  | ||||||
|     { |  | ||||||
|         /// <inheritdoc /> |  | ||||||
|         protected override void BuildTargetModel(ModelBuilder modelBuilder) |  | ||||||
|         { |  | ||||||
| #pragma warning disable 612, 618 |  | ||||||
|             modelBuilder |  | ||||||
|                 .HasAnnotation("ProductVersion", "8.0.5") |  | ||||||
|                 .HasAnnotation("Relational:MaxIdentifierLength", 63); |  | ||||||
| 
 |  | ||||||
|             NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.Application", b => |  | ||||||
|                 { |  | ||||||
|                     b.Property<long>("Id") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("ClientId") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("client_id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("ClientSecret") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("client_secret"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Name") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("name"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string[]>("RedirectUris") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text[]") |  | ||||||
|                         .HasColumnName("redirect_uris"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string[]>("Scopes") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text[]") |  | ||||||
|                         .HasColumnName("scopes"); |  | ||||||
| 
 |  | ||||||
|                     b.HasKey("Id") |  | ||||||
|                         .HasName("pk_applications"); |  | ||||||
| 
 |  | ||||||
|                     b.ToTable("applications", (string)null); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.AuthMethod", b => |  | ||||||
|                 { |  | ||||||
|                     b.Property<long>("Id") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<int>("AuthType") |  | ||||||
|                         .HasColumnType("integer") |  | ||||||
|                         .HasColumnName("auth_type"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<long?>("FediverseApplicationId") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("fediverse_application_id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("RemoteId") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("remote_id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("RemoteUsername") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("remote_username"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<long>("UserId") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.HasKey("Id") |  | ||||||
|                         .HasName("pk_auth_methods"); |  | ||||||
| 
 |  | ||||||
|                     b.HasIndex("FediverseApplicationId") |  | ||||||
|                         .HasDatabaseName("ix_auth_methods_fediverse_application_id"); |  | ||||||
| 
 |  | ||||||
|                     b.HasIndex("UserId") |  | ||||||
|                         .HasDatabaseName("ix_auth_methods_user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.ToTable("auth_methods", (string)null); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.FediverseApplication", b => |  | ||||||
|                 { |  | ||||||
|                     b.Property<long>("Id") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("ClientId") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("client_id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("ClientSecret") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("client_secret"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Domain") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("domain"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<int>("InstanceType") |  | ||||||
|                         .HasColumnType("integer") |  | ||||||
|                         .HasColumnName("instance_type"); |  | ||||||
| 
 |  | ||||||
|                     b.HasKey("Id") |  | ||||||
|                         .HasName("pk_fediverse_applications"); |  | ||||||
| 
 |  | ||||||
|                     b.ToTable("fediverse_applications", (string)null); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.Member", b => |  | ||||||
|                 { |  | ||||||
|                     b.Property<long>("Id") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Avatar") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("avatar"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Bio") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("bio"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("DisplayName") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("display_name"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string[]>("Links") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text[]") |  | ||||||
|                         .HasColumnName("links"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Name") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("name"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<bool>("Unlisted") |  | ||||||
|                         .HasColumnType("boolean") |  | ||||||
|                         .HasColumnName("unlisted"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<long>("UserId") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.HasKey("Id") |  | ||||||
|                         .HasName("pk_members"); |  | ||||||
| 
 |  | ||||||
|                     b.HasIndex("UserId", "Name") |  | ||||||
|                         .IsUnique() |  | ||||||
|                         .HasDatabaseName("ix_members_user_id_name"); |  | ||||||
| 
 |  | ||||||
|                     b.ToTable("members", (string)null); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.Token", b => |  | ||||||
|                 { |  | ||||||
|                     b.Property<long>("Id") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<long>("ApplicationId") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("application_id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<Instant>("ExpiresAt") |  | ||||||
|                         .HasColumnType("timestamp with time zone") |  | ||||||
|                         .HasColumnName("expires_at"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<byte[]>("Hash") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("bytea") |  | ||||||
|                         .HasColumnName("hash"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<bool>("ManuallyExpired") |  | ||||||
|                         .HasColumnType("boolean") |  | ||||||
|                         .HasColumnName("manually_expired"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string[]>("Scopes") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text[]") |  | ||||||
|                         .HasColumnName("scopes"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<long>("UserId") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.HasKey("Id") |  | ||||||
|                         .HasName("pk_tokens"); |  | ||||||
| 
 |  | ||||||
|                     b.HasIndex("ApplicationId") |  | ||||||
|                         .HasDatabaseName("ix_tokens_application_id"); |  | ||||||
| 
 |  | ||||||
|                     b.HasIndex("UserId") |  | ||||||
|                         .HasDatabaseName("ix_tokens_user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.ToTable("tokens", (string)null); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.User", b => |  | ||||||
|                 { |  | ||||||
|                     b.Property<long>("Id") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Avatar") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("avatar"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Bio") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("bio"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("DisplayName") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("display_name"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string[]>("Links") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text[]") |  | ||||||
|                         .HasColumnName("links"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("MemberTitle") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("member_title"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<int>("Role") |  | ||||||
|                         .HasColumnType("integer") |  | ||||||
|                         .HasColumnName("role"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Username") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("username"); |  | ||||||
| 
 |  | ||||||
|                     b.HasKey("Id") |  | ||||||
|                         .HasName("pk_users"); |  | ||||||
| 
 |  | ||||||
|                     b.HasIndex("Username") |  | ||||||
|                         .IsUnique() |  | ||||||
|                         .HasDatabaseName("ix_users_username"); |  | ||||||
| 
 |  | ||||||
|                     b.ToTable("users", (string)null); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.AuthMethod", b => |  | ||||||
|                 { |  | ||||||
|                     b.HasOne("Foxnouns.Backend.Database.Models.FediverseApplication", "FediverseApplication") |  | ||||||
|                         .WithMany() |  | ||||||
|                         .HasForeignKey("FediverseApplicationId") |  | ||||||
|                         .HasConstraintName("fk_auth_methods_fediverse_applications_fediverse_application_id"); |  | ||||||
| 
 |  | ||||||
|                     b.HasOne("Foxnouns.Backend.Database.Models.User", "User") |  | ||||||
|                         .WithMany("AuthMethods") |  | ||||||
|                         .HasForeignKey("UserId") |  | ||||||
|                         .OnDelete(DeleteBehavior.Cascade) |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasConstraintName("fk_auth_methods_users_user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("FediverseApplication"); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("User"); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.Member", b => |  | ||||||
|                 { |  | ||||||
|                     b.HasOne("Foxnouns.Backend.Database.Models.User", "User") |  | ||||||
|                         .WithMany("Members") |  | ||||||
|                         .HasForeignKey("UserId") |  | ||||||
|                         .OnDelete(DeleteBehavior.Cascade) |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasConstraintName("fk_members_users_user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.OwnsOne("System.Collections.Generic.List<Foxnouns.Backend.Database.Models.Field>", "Fields", b1 => |  | ||||||
|                         { |  | ||||||
|                             b1.Property<long>("MemberId") |  | ||||||
|                                 .HasColumnType("bigint"); |  | ||||||
| 
 |  | ||||||
|                             b1.Property<int>("Capacity") |  | ||||||
|                                 .HasColumnType("integer"); |  | ||||||
| 
 |  | ||||||
|                             b1.HasKey("MemberId"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToTable("members"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToJson("fields"); |  | ||||||
| 
 |  | ||||||
|                             b1.WithOwner() |  | ||||||
|                                 .HasForeignKey("MemberId") |  | ||||||
|                                 .HasConstraintName("fk_members_members_id"); |  | ||||||
|                         }); |  | ||||||
| 
 |  | ||||||
|                     b.OwnsOne("System.Collections.Generic.List<Foxnouns.Backend.Database.Models.FieldEntry>", "Names", b1 => |  | ||||||
|                         { |  | ||||||
|                             b1.Property<long>("MemberId") |  | ||||||
|                                 .HasColumnType("bigint"); |  | ||||||
| 
 |  | ||||||
|                             b1.Property<int>("Capacity") |  | ||||||
|                                 .HasColumnType("integer"); |  | ||||||
| 
 |  | ||||||
|                             b1.HasKey("MemberId"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToTable("members"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToJson("names"); |  | ||||||
| 
 |  | ||||||
|                             b1.WithOwner() |  | ||||||
|                                 .HasForeignKey("MemberId") |  | ||||||
|                                 .HasConstraintName("fk_members_members_id"); |  | ||||||
|                         }); |  | ||||||
| 
 |  | ||||||
|                     b.OwnsOne("System.Collections.Generic.List<Foxnouns.Backend.Database.Models.Pronoun>", "Pronouns", b1 => |  | ||||||
|                         { |  | ||||||
|                             b1.Property<long>("MemberId") |  | ||||||
|                                 .HasColumnType("bigint"); |  | ||||||
| 
 |  | ||||||
|                             b1.Property<int>("Capacity") |  | ||||||
|                                 .HasColumnType("integer"); |  | ||||||
| 
 |  | ||||||
|                             b1.HasKey("MemberId"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToTable("members"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToJson("pronouns"); |  | ||||||
| 
 |  | ||||||
|                             b1.WithOwner() |  | ||||||
|                                 .HasForeignKey("MemberId") |  | ||||||
|                                 .HasConstraintName("fk_members_members_id"); |  | ||||||
|                         }); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Fields") |  | ||||||
|                         .IsRequired(); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Names") |  | ||||||
|                         .IsRequired(); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Pronouns") |  | ||||||
|                         .IsRequired(); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("User"); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.Token", b => |  | ||||||
|                 { |  | ||||||
|                     b.HasOne("Foxnouns.Backend.Database.Models.Application", "Application") |  | ||||||
|                         .WithMany() |  | ||||||
|                         .HasForeignKey("ApplicationId") |  | ||||||
|                         .OnDelete(DeleteBehavior.Cascade) |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasConstraintName("fk_tokens_applications_application_id"); |  | ||||||
| 
 |  | ||||||
|                     b.HasOne("Foxnouns.Backend.Database.Models.User", "User") |  | ||||||
|                         .WithMany() |  | ||||||
|                         .HasForeignKey("UserId") |  | ||||||
|                         .OnDelete(DeleteBehavior.Cascade) |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasConstraintName("fk_tokens_users_user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Application"); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("User"); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.User", b => |  | ||||||
|                 { |  | ||||||
|                     b.OwnsOne("Foxnouns.Backend.Database.Models.User.Fields#List", "Fields", b1 => |  | ||||||
|                         { |  | ||||||
|                             b1.Property<long>("UserId") |  | ||||||
|                                 .HasColumnType("bigint"); |  | ||||||
| 
 |  | ||||||
|                             b1.Property<int>("Capacity") |  | ||||||
|                                 .HasColumnType("integer"); |  | ||||||
| 
 |  | ||||||
|                             b1.HasKey("UserId") |  | ||||||
|                                 .HasName("pk_users"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToTable("users"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToJson("fields"); |  | ||||||
| 
 |  | ||||||
|                             b1.WithOwner() |  | ||||||
|                                 .HasForeignKey("UserId") |  | ||||||
|                                 .HasConstraintName("fk_users_users_user_id"); |  | ||||||
|                         }); |  | ||||||
| 
 |  | ||||||
|                     b.OwnsOne("Foxnouns.Backend.Database.Models.User.Names#List", "Names", b1 => |  | ||||||
|                         { |  | ||||||
|                             b1.Property<long>("UserId") |  | ||||||
|                                 .HasColumnType("bigint"); |  | ||||||
| 
 |  | ||||||
|                             b1.Property<int>("Capacity") |  | ||||||
|                                 .HasColumnType("integer"); |  | ||||||
| 
 |  | ||||||
|                             b1.HasKey("UserId") |  | ||||||
|                                 .HasName("pk_users"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToTable("users"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToJson("names"); |  | ||||||
| 
 |  | ||||||
|                             b1.WithOwner() |  | ||||||
|                                 .HasForeignKey("UserId") |  | ||||||
|                                 .HasConstraintName("fk_users_users_user_id"); |  | ||||||
|                         }); |  | ||||||
| 
 |  | ||||||
|                     b.OwnsOne("Foxnouns.Backend.Database.Models.User.Pronouns#List", "Pronouns", b1 => |  | ||||||
|                         { |  | ||||||
|                             b1.Property<long>("UserId") |  | ||||||
|                                 .HasColumnType("bigint"); |  | ||||||
| 
 |  | ||||||
|                             b1.Property<int>("Capacity") |  | ||||||
|                                 .HasColumnType("integer"); |  | ||||||
| 
 |  | ||||||
|                             b1.HasKey("UserId") |  | ||||||
|                                 .HasName("pk_users"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToTable("users"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToJson("pronouns"); |  | ||||||
| 
 |  | ||||||
|                             b1.WithOwner() |  | ||||||
|                                 .HasForeignKey("UserId") |  | ||||||
|                                 .HasConstraintName("fk_users_users_user_id"); |  | ||||||
|                         }); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Fields") |  | ||||||
|                         .IsRequired(); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Names") |  | ||||||
|                         .IsRequired(); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Pronouns") |  | ||||||
|                         .IsRequired(); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.User", b => |  | ||||||
|                 { |  | ||||||
|                     b.Navigation("AuthMethods"); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Members"); |  | ||||||
|                 }); |  | ||||||
| #pragma warning restore 612, 618 |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  | @ -1,10 +1,13 @@ | ||||||
| using Microsoft.EntityFrameworkCore.Migrations; | using Microsoft.EntityFrameworkCore.Migrations; | ||||||
|  | using Microsoft.EntityFrameworkCore.Infrastructure; | ||||||
| 
 | 
 | ||||||
| #nullable disable | #nullable disable | ||||||
| 
 | 
 | ||||||
| namespace Foxnouns.Backend.Database.Migrations | namespace Foxnouns.Backend.Database.Migrations | ||||||
| { | { | ||||||
|     /// <inheritdoc /> |     /// <inheritdoc /> | ||||||
|  |     [DbContext(typeof(DatabaseContext))] | ||||||
|  |     [Migration("20240528125310_AddApplications")] | ||||||
|     public partial class AddApplications : Migration |     public partial class AddApplications : Migration | ||||||
|     { |     { | ||||||
|         /// <inheritdoc /> |         /// <inheritdoc /> | ||||||
|  |  | ||||||
|  | @ -1,474 +0,0 @@ | ||||||
| // <auto-generated /> |  | ||||||
| using Foxnouns.Backend.Database; |  | ||||||
| using Microsoft.EntityFrameworkCore; |  | ||||||
| using Microsoft.EntityFrameworkCore.Infrastructure; |  | ||||||
| using Microsoft.EntityFrameworkCore.Migrations; |  | ||||||
| using Microsoft.EntityFrameworkCore.Storage.ValueConversion; |  | ||||||
| using NodaTime; |  | ||||||
| using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; |  | ||||||
| 
 |  | ||||||
| #nullable disable |  | ||||||
| 
 |  | ||||||
| namespace Foxnouns.Backend.Database.Migrations |  | ||||||
| { |  | ||||||
|     [DbContext(typeof(DatabaseContext))] |  | ||||||
|     [Migration("20240528145744_AddListHidden")] |  | ||||||
|     partial class AddListHidden |  | ||||||
|     { |  | ||||||
|         /// <inheritdoc /> |  | ||||||
|         protected override void BuildTargetModel(ModelBuilder modelBuilder) |  | ||||||
|         { |  | ||||||
| #pragma warning disable 612, 618 |  | ||||||
|             modelBuilder |  | ||||||
|                 .HasAnnotation("ProductVersion", "8.0.5") |  | ||||||
|                 .HasAnnotation("Relational:MaxIdentifierLength", 63); |  | ||||||
| 
 |  | ||||||
|             NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.Application", b => |  | ||||||
|                 { |  | ||||||
|                     b.Property<long>("Id") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("ClientId") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("client_id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("ClientSecret") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("client_secret"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Name") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("name"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string[]>("RedirectUris") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text[]") |  | ||||||
|                         .HasColumnName("redirect_uris"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string[]>("Scopes") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text[]") |  | ||||||
|                         .HasColumnName("scopes"); |  | ||||||
| 
 |  | ||||||
|                     b.HasKey("Id") |  | ||||||
|                         .HasName("pk_applications"); |  | ||||||
| 
 |  | ||||||
|                     b.ToTable("applications", (string)null); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.AuthMethod", b => |  | ||||||
|                 { |  | ||||||
|                     b.Property<long>("Id") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<int>("AuthType") |  | ||||||
|                         .HasColumnType("integer") |  | ||||||
|                         .HasColumnName("auth_type"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<long?>("FediverseApplicationId") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("fediverse_application_id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("RemoteId") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("remote_id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("RemoteUsername") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("remote_username"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<long>("UserId") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.HasKey("Id") |  | ||||||
|                         .HasName("pk_auth_methods"); |  | ||||||
| 
 |  | ||||||
|                     b.HasIndex("FediverseApplicationId") |  | ||||||
|                         .HasDatabaseName("ix_auth_methods_fediverse_application_id"); |  | ||||||
| 
 |  | ||||||
|                     b.HasIndex("UserId") |  | ||||||
|                         .HasDatabaseName("ix_auth_methods_user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.ToTable("auth_methods", (string)null); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.FediverseApplication", b => |  | ||||||
|                 { |  | ||||||
|                     b.Property<long>("Id") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("ClientId") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("client_id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("ClientSecret") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("client_secret"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Domain") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("domain"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<int>("InstanceType") |  | ||||||
|                         .HasColumnType("integer") |  | ||||||
|                         .HasColumnName("instance_type"); |  | ||||||
| 
 |  | ||||||
|                     b.HasKey("Id") |  | ||||||
|                         .HasName("pk_fediverse_applications"); |  | ||||||
| 
 |  | ||||||
|                     b.ToTable("fediverse_applications", (string)null); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.Member", b => |  | ||||||
|                 { |  | ||||||
|                     b.Property<long>("Id") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Avatar") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("avatar"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Bio") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("bio"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("DisplayName") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("display_name"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string[]>("Links") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text[]") |  | ||||||
|                         .HasColumnName("links"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Name") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("name"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<bool>("Unlisted") |  | ||||||
|                         .HasColumnType("boolean") |  | ||||||
|                         .HasColumnName("unlisted"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<long>("UserId") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.HasKey("Id") |  | ||||||
|                         .HasName("pk_members"); |  | ||||||
| 
 |  | ||||||
|                     b.HasIndex("UserId", "Name") |  | ||||||
|                         .IsUnique() |  | ||||||
|                         .HasDatabaseName("ix_members_user_id_name"); |  | ||||||
| 
 |  | ||||||
|                     b.ToTable("members", (string)null); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.Token", b => |  | ||||||
|                 { |  | ||||||
|                     b.Property<long>("Id") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<long>("ApplicationId") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("application_id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<Instant>("ExpiresAt") |  | ||||||
|                         .HasColumnType("timestamp with time zone") |  | ||||||
|                         .HasColumnName("expires_at"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<byte[]>("Hash") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("bytea") |  | ||||||
|                         .HasColumnName("hash"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<bool>("ManuallyExpired") |  | ||||||
|                         .HasColumnType("boolean") |  | ||||||
|                         .HasColumnName("manually_expired"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string[]>("Scopes") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text[]") |  | ||||||
|                         .HasColumnName("scopes"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<long>("UserId") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.HasKey("Id") |  | ||||||
|                         .HasName("pk_tokens"); |  | ||||||
| 
 |  | ||||||
|                     b.HasIndex("ApplicationId") |  | ||||||
|                         .HasDatabaseName("ix_tokens_application_id"); |  | ||||||
| 
 |  | ||||||
|                     b.HasIndex("UserId") |  | ||||||
|                         .HasDatabaseName("ix_tokens_user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.ToTable("tokens", (string)null); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.User", b => |  | ||||||
|                 { |  | ||||||
|                     b.Property<long>("Id") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Avatar") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("avatar"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Bio") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("bio"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("DisplayName") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("display_name"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string[]>("Links") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text[]") |  | ||||||
|                         .HasColumnName("links"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<bool>("ListHidden") |  | ||||||
|                         .HasColumnType("boolean") |  | ||||||
|                         .HasColumnName("list_hidden"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("MemberTitle") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("member_title"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<int>("Role") |  | ||||||
|                         .HasColumnType("integer") |  | ||||||
|                         .HasColumnName("role"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Username") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("username"); |  | ||||||
| 
 |  | ||||||
|                     b.HasKey("Id") |  | ||||||
|                         .HasName("pk_users"); |  | ||||||
| 
 |  | ||||||
|                     b.HasIndex("Username") |  | ||||||
|                         .IsUnique() |  | ||||||
|                         .HasDatabaseName("ix_users_username"); |  | ||||||
| 
 |  | ||||||
|                     b.ToTable("users", (string)null); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.AuthMethod", b => |  | ||||||
|                 { |  | ||||||
|                     b.HasOne("Foxnouns.Backend.Database.Models.FediverseApplication", "FediverseApplication") |  | ||||||
|                         .WithMany() |  | ||||||
|                         .HasForeignKey("FediverseApplicationId") |  | ||||||
|                         .HasConstraintName("fk_auth_methods_fediverse_applications_fediverse_application_id"); |  | ||||||
| 
 |  | ||||||
|                     b.HasOne("Foxnouns.Backend.Database.Models.User", "User") |  | ||||||
|                         .WithMany("AuthMethods") |  | ||||||
|                         .HasForeignKey("UserId") |  | ||||||
|                         .OnDelete(DeleteBehavior.Cascade) |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasConstraintName("fk_auth_methods_users_user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("FediverseApplication"); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("User"); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.Member", b => |  | ||||||
|                 { |  | ||||||
|                     b.HasOne("Foxnouns.Backend.Database.Models.User", "User") |  | ||||||
|                         .WithMany("Members") |  | ||||||
|                         .HasForeignKey("UserId") |  | ||||||
|                         .OnDelete(DeleteBehavior.Cascade) |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasConstraintName("fk_members_users_user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.OwnsOne("System.Collections.Generic.List<Foxnouns.Backend.Database.Models.Field>", "Fields", b1 => |  | ||||||
|                         { |  | ||||||
|                             b1.Property<long>("MemberId") |  | ||||||
|                                 .HasColumnType("bigint"); |  | ||||||
| 
 |  | ||||||
|                             b1.Property<int>("Capacity") |  | ||||||
|                                 .HasColumnType("integer"); |  | ||||||
| 
 |  | ||||||
|                             b1.HasKey("MemberId"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToTable("members"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToJson("fields"); |  | ||||||
| 
 |  | ||||||
|                             b1.WithOwner() |  | ||||||
|                                 .HasForeignKey("MemberId") |  | ||||||
|                                 .HasConstraintName("fk_members_members_id"); |  | ||||||
|                         }); |  | ||||||
| 
 |  | ||||||
|                     b.OwnsOne("System.Collections.Generic.List<Foxnouns.Backend.Database.Models.FieldEntry>", "Names", b1 => |  | ||||||
|                         { |  | ||||||
|                             b1.Property<long>("MemberId") |  | ||||||
|                                 .HasColumnType("bigint"); |  | ||||||
| 
 |  | ||||||
|                             b1.Property<int>("Capacity") |  | ||||||
|                                 .HasColumnType("integer"); |  | ||||||
| 
 |  | ||||||
|                             b1.HasKey("MemberId"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToTable("members"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToJson("names"); |  | ||||||
| 
 |  | ||||||
|                             b1.WithOwner() |  | ||||||
|                                 .HasForeignKey("MemberId") |  | ||||||
|                                 .HasConstraintName("fk_members_members_id"); |  | ||||||
|                         }); |  | ||||||
| 
 |  | ||||||
|                     b.OwnsOne("System.Collections.Generic.List<Foxnouns.Backend.Database.Models.Pronoun>", "Pronouns", b1 => |  | ||||||
|                         { |  | ||||||
|                             b1.Property<long>("MemberId") |  | ||||||
|                                 .HasColumnType("bigint"); |  | ||||||
| 
 |  | ||||||
|                             b1.Property<int>("Capacity") |  | ||||||
|                                 .HasColumnType("integer"); |  | ||||||
| 
 |  | ||||||
|                             b1.HasKey("MemberId"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToTable("members"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToJson("pronouns"); |  | ||||||
| 
 |  | ||||||
|                             b1.WithOwner() |  | ||||||
|                                 .HasForeignKey("MemberId") |  | ||||||
|                                 .HasConstraintName("fk_members_members_id"); |  | ||||||
|                         }); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Fields") |  | ||||||
|                         .IsRequired(); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Names") |  | ||||||
|                         .IsRequired(); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Pronouns") |  | ||||||
|                         .IsRequired(); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("User"); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.Token", b => |  | ||||||
|                 { |  | ||||||
|                     b.HasOne("Foxnouns.Backend.Database.Models.Application", "Application") |  | ||||||
|                         .WithMany() |  | ||||||
|                         .HasForeignKey("ApplicationId") |  | ||||||
|                         .OnDelete(DeleteBehavior.Cascade) |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasConstraintName("fk_tokens_applications_application_id"); |  | ||||||
| 
 |  | ||||||
|                     b.HasOne("Foxnouns.Backend.Database.Models.User", "User") |  | ||||||
|                         .WithMany() |  | ||||||
|                         .HasForeignKey("UserId") |  | ||||||
|                         .OnDelete(DeleteBehavior.Cascade) |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasConstraintName("fk_tokens_users_user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Application"); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("User"); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.User", b => |  | ||||||
|                 { |  | ||||||
|                     b.OwnsOne("Foxnouns.Backend.Database.Models.User.Fields#List", "Fields", b1 => |  | ||||||
|                         { |  | ||||||
|                             b1.Property<long>("UserId") |  | ||||||
|                                 .HasColumnType("bigint"); |  | ||||||
| 
 |  | ||||||
|                             b1.Property<int>("Capacity") |  | ||||||
|                                 .HasColumnType("integer"); |  | ||||||
| 
 |  | ||||||
|                             b1.HasKey("UserId") |  | ||||||
|                                 .HasName("pk_users"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToTable("users"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToJson("fields"); |  | ||||||
| 
 |  | ||||||
|                             b1.WithOwner() |  | ||||||
|                                 .HasForeignKey("UserId") |  | ||||||
|                                 .HasConstraintName("fk_users_users_user_id"); |  | ||||||
|                         }); |  | ||||||
| 
 |  | ||||||
|                     b.OwnsOne("Foxnouns.Backend.Database.Models.User.Names#List", "Names", b1 => |  | ||||||
|                         { |  | ||||||
|                             b1.Property<long>("UserId") |  | ||||||
|                                 .HasColumnType("bigint"); |  | ||||||
| 
 |  | ||||||
|                             b1.Property<int>("Capacity") |  | ||||||
|                                 .HasColumnType("integer"); |  | ||||||
| 
 |  | ||||||
|                             b1.HasKey("UserId") |  | ||||||
|                                 .HasName("pk_users"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToTable("users"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToJson("names"); |  | ||||||
| 
 |  | ||||||
|                             b1.WithOwner() |  | ||||||
|                                 .HasForeignKey("UserId") |  | ||||||
|                                 .HasConstraintName("fk_users_users_user_id"); |  | ||||||
|                         }); |  | ||||||
| 
 |  | ||||||
|                     b.OwnsOne("Foxnouns.Backend.Database.Models.User.Pronouns#List", "Pronouns", b1 => |  | ||||||
|                         { |  | ||||||
|                             b1.Property<long>("UserId") |  | ||||||
|                                 .HasColumnType("bigint"); |  | ||||||
| 
 |  | ||||||
|                             b1.Property<int>("Capacity") |  | ||||||
|                                 .HasColumnType("integer"); |  | ||||||
| 
 |  | ||||||
|                             b1.HasKey("UserId") |  | ||||||
|                                 .HasName("pk_users"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToTable("users"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToJson("pronouns"); |  | ||||||
| 
 |  | ||||||
|                             b1.WithOwner() |  | ||||||
|                                 .HasForeignKey("UserId") |  | ||||||
|                                 .HasConstraintName("fk_users_users_user_id"); |  | ||||||
|                         }); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Fields") |  | ||||||
|                         .IsRequired(); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Names") |  | ||||||
|                         .IsRequired(); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Pronouns") |  | ||||||
|                         .IsRequired(); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.User", b => |  | ||||||
|                 { |  | ||||||
|                     b.Navigation("AuthMethods"); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Members"); |  | ||||||
|                 }); |  | ||||||
| #pragma warning restore 612, 618 |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  | @ -1,10 +1,13 @@ | ||||||
| using Microsoft.EntityFrameworkCore.Migrations; | using Microsoft.EntityFrameworkCore.Migrations; | ||||||
|  | using Microsoft.EntityFrameworkCore.Infrastructure; | ||||||
| 
 | 
 | ||||||
| #nullable disable | #nullable disable | ||||||
| 
 | 
 | ||||||
| namespace Foxnouns.Backend.Database.Migrations | namespace Foxnouns.Backend.Database.Migrations | ||||||
| { | { | ||||||
|     /// <inheritdoc /> |     /// <inheritdoc /> | ||||||
|  |     [DbContext(typeof(DatabaseContext))] | ||||||
|  |     [Migration("20240528145744_AddListHidden")] | ||||||
|     public partial class AddListHidden : Migration |     public partial class AddListHidden : Migration | ||||||
|     { |     { | ||||||
|         /// <inheritdoc /> |         /// <inheritdoc /> | ||||||
|  |  | ||||||
|  | @ -1,478 +0,0 @@ | ||||||
| // <auto-generated /> |  | ||||||
| using Foxnouns.Backend.Database; |  | ||||||
| using Microsoft.EntityFrameworkCore; |  | ||||||
| using Microsoft.EntityFrameworkCore.Infrastructure; |  | ||||||
| using Microsoft.EntityFrameworkCore.Migrations; |  | ||||||
| using Microsoft.EntityFrameworkCore.Storage.ValueConversion; |  | ||||||
| using NodaTime; |  | ||||||
| using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; |  | ||||||
| 
 |  | ||||||
| #nullable disable |  | ||||||
| 
 |  | ||||||
| namespace Foxnouns.Backend.Database.Migrations |  | ||||||
| { |  | ||||||
|     [DbContext(typeof(DatabaseContext))] |  | ||||||
|     [Migration("20240604142522_AddPassword")] |  | ||||||
|     partial class AddPassword |  | ||||||
|     { |  | ||||||
|         /// <inheritdoc /> |  | ||||||
|         protected override void BuildTargetModel(ModelBuilder modelBuilder) |  | ||||||
|         { |  | ||||||
| #pragma warning disable 612, 618 |  | ||||||
|             modelBuilder |  | ||||||
|                 .HasAnnotation("ProductVersion", "8.0.5") |  | ||||||
|                 .HasAnnotation("Relational:MaxIdentifierLength", 63); |  | ||||||
| 
 |  | ||||||
|             NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.Application", b => |  | ||||||
|                 { |  | ||||||
|                     b.Property<long>("Id") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("ClientId") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("client_id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("ClientSecret") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("client_secret"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Name") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("name"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string[]>("RedirectUris") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text[]") |  | ||||||
|                         .HasColumnName("redirect_uris"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string[]>("Scopes") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text[]") |  | ||||||
|                         .HasColumnName("scopes"); |  | ||||||
| 
 |  | ||||||
|                     b.HasKey("Id") |  | ||||||
|                         .HasName("pk_applications"); |  | ||||||
| 
 |  | ||||||
|                     b.ToTable("applications", (string)null); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.AuthMethod", b => |  | ||||||
|                 { |  | ||||||
|                     b.Property<long>("Id") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<int>("AuthType") |  | ||||||
|                         .HasColumnType("integer") |  | ||||||
|                         .HasColumnName("auth_type"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<long?>("FediverseApplicationId") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("fediverse_application_id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("RemoteId") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("remote_id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("RemoteUsername") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("remote_username"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<long>("UserId") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.HasKey("Id") |  | ||||||
|                         .HasName("pk_auth_methods"); |  | ||||||
| 
 |  | ||||||
|                     b.HasIndex("FediverseApplicationId") |  | ||||||
|                         .HasDatabaseName("ix_auth_methods_fediverse_application_id"); |  | ||||||
| 
 |  | ||||||
|                     b.HasIndex("UserId") |  | ||||||
|                         .HasDatabaseName("ix_auth_methods_user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.ToTable("auth_methods", (string)null); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.FediverseApplication", b => |  | ||||||
|                 { |  | ||||||
|                     b.Property<long>("Id") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("ClientId") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("client_id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("ClientSecret") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("client_secret"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Domain") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("domain"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<int>("InstanceType") |  | ||||||
|                         .HasColumnType("integer") |  | ||||||
|                         .HasColumnName("instance_type"); |  | ||||||
| 
 |  | ||||||
|                     b.HasKey("Id") |  | ||||||
|                         .HasName("pk_fediverse_applications"); |  | ||||||
| 
 |  | ||||||
|                     b.ToTable("fediverse_applications", (string)null); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.Member", b => |  | ||||||
|                 { |  | ||||||
|                     b.Property<long>("Id") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Avatar") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("avatar"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Bio") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("bio"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("DisplayName") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("display_name"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string[]>("Links") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text[]") |  | ||||||
|                         .HasColumnName("links"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Name") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("name"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<bool>("Unlisted") |  | ||||||
|                         .HasColumnType("boolean") |  | ||||||
|                         .HasColumnName("unlisted"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<long>("UserId") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.HasKey("Id") |  | ||||||
|                         .HasName("pk_members"); |  | ||||||
| 
 |  | ||||||
|                     b.HasIndex("UserId", "Name") |  | ||||||
|                         .IsUnique() |  | ||||||
|                         .HasDatabaseName("ix_members_user_id_name"); |  | ||||||
| 
 |  | ||||||
|                     b.ToTable("members", (string)null); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.Token", b => |  | ||||||
|                 { |  | ||||||
|                     b.Property<long>("Id") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<long>("ApplicationId") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("application_id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<Instant>("ExpiresAt") |  | ||||||
|                         .HasColumnType("timestamp with time zone") |  | ||||||
|                         .HasColumnName("expires_at"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<byte[]>("Hash") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("bytea") |  | ||||||
|                         .HasColumnName("hash"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<bool>("ManuallyExpired") |  | ||||||
|                         .HasColumnType("boolean") |  | ||||||
|                         .HasColumnName("manually_expired"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string[]>("Scopes") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text[]") |  | ||||||
|                         .HasColumnName("scopes"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<long>("UserId") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.HasKey("Id") |  | ||||||
|                         .HasName("pk_tokens"); |  | ||||||
| 
 |  | ||||||
|                     b.HasIndex("ApplicationId") |  | ||||||
|                         .HasDatabaseName("ix_tokens_application_id"); |  | ||||||
| 
 |  | ||||||
|                     b.HasIndex("UserId") |  | ||||||
|                         .HasDatabaseName("ix_tokens_user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.ToTable("tokens", (string)null); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.User", b => |  | ||||||
|                 { |  | ||||||
|                     b.Property<long>("Id") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Avatar") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("avatar"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Bio") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("bio"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("DisplayName") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("display_name"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string[]>("Links") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text[]") |  | ||||||
|                         .HasColumnName("links"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<bool>("ListHidden") |  | ||||||
|                         .HasColumnType("boolean") |  | ||||||
|                         .HasColumnName("list_hidden"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("MemberTitle") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("member_title"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Password") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("password"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<int>("Role") |  | ||||||
|                         .HasColumnType("integer") |  | ||||||
|                         .HasColumnName("role"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Username") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("username"); |  | ||||||
| 
 |  | ||||||
|                     b.HasKey("Id") |  | ||||||
|                         .HasName("pk_users"); |  | ||||||
| 
 |  | ||||||
|                     b.HasIndex("Username") |  | ||||||
|                         .IsUnique() |  | ||||||
|                         .HasDatabaseName("ix_users_username"); |  | ||||||
| 
 |  | ||||||
|                     b.ToTable("users", (string)null); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.AuthMethod", b => |  | ||||||
|                 { |  | ||||||
|                     b.HasOne("Foxnouns.Backend.Database.Models.FediverseApplication", "FediverseApplication") |  | ||||||
|                         .WithMany() |  | ||||||
|                         .HasForeignKey("FediverseApplicationId") |  | ||||||
|                         .HasConstraintName("fk_auth_methods_fediverse_applications_fediverse_application_id"); |  | ||||||
| 
 |  | ||||||
|                     b.HasOne("Foxnouns.Backend.Database.Models.User", "User") |  | ||||||
|                         .WithMany("AuthMethods") |  | ||||||
|                         .HasForeignKey("UserId") |  | ||||||
|                         .OnDelete(DeleteBehavior.Cascade) |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasConstraintName("fk_auth_methods_users_user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("FediverseApplication"); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("User"); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.Member", b => |  | ||||||
|                 { |  | ||||||
|                     b.HasOne("Foxnouns.Backend.Database.Models.User", "User") |  | ||||||
|                         .WithMany("Members") |  | ||||||
|                         .HasForeignKey("UserId") |  | ||||||
|                         .OnDelete(DeleteBehavior.Cascade) |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasConstraintName("fk_members_users_user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.OwnsOne("System.Collections.Generic.List<Foxnouns.Backend.Database.Models.Field>", "Fields", b1 => |  | ||||||
|                         { |  | ||||||
|                             b1.Property<long>("MemberId") |  | ||||||
|                                 .HasColumnType("bigint"); |  | ||||||
| 
 |  | ||||||
|                             b1.Property<int>("Capacity") |  | ||||||
|                                 .HasColumnType("integer"); |  | ||||||
| 
 |  | ||||||
|                             b1.HasKey("MemberId"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToTable("members"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToJson("fields"); |  | ||||||
| 
 |  | ||||||
|                             b1.WithOwner() |  | ||||||
|                                 .HasForeignKey("MemberId") |  | ||||||
|                                 .HasConstraintName("fk_members_members_id"); |  | ||||||
|                         }); |  | ||||||
| 
 |  | ||||||
|                     b.OwnsOne("System.Collections.Generic.List<Foxnouns.Backend.Database.Models.FieldEntry>", "Names", b1 => |  | ||||||
|                         { |  | ||||||
|                             b1.Property<long>("MemberId") |  | ||||||
|                                 .HasColumnType("bigint"); |  | ||||||
| 
 |  | ||||||
|                             b1.Property<int>("Capacity") |  | ||||||
|                                 .HasColumnType("integer"); |  | ||||||
| 
 |  | ||||||
|                             b1.HasKey("MemberId"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToTable("members"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToJson("names"); |  | ||||||
| 
 |  | ||||||
|                             b1.WithOwner() |  | ||||||
|                                 .HasForeignKey("MemberId") |  | ||||||
|                                 .HasConstraintName("fk_members_members_id"); |  | ||||||
|                         }); |  | ||||||
| 
 |  | ||||||
|                     b.OwnsOne("System.Collections.Generic.List<Foxnouns.Backend.Database.Models.Pronoun>", "Pronouns", b1 => |  | ||||||
|                         { |  | ||||||
|                             b1.Property<long>("MemberId") |  | ||||||
|                                 .HasColumnType("bigint"); |  | ||||||
| 
 |  | ||||||
|                             b1.Property<int>("Capacity") |  | ||||||
|                                 .HasColumnType("integer"); |  | ||||||
| 
 |  | ||||||
|                             b1.HasKey("MemberId"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToTable("members"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToJson("pronouns"); |  | ||||||
| 
 |  | ||||||
|                             b1.WithOwner() |  | ||||||
|                                 .HasForeignKey("MemberId") |  | ||||||
|                                 .HasConstraintName("fk_members_members_id"); |  | ||||||
|                         }); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Fields") |  | ||||||
|                         .IsRequired(); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Names") |  | ||||||
|                         .IsRequired(); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Pronouns") |  | ||||||
|                         .IsRequired(); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("User"); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.Token", b => |  | ||||||
|                 { |  | ||||||
|                     b.HasOne("Foxnouns.Backend.Database.Models.Application", "Application") |  | ||||||
|                         .WithMany() |  | ||||||
|                         .HasForeignKey("ApplicationId") |  | ||||||
|                         .OnDelete(DeleteBehavior.Cascade) |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasConstraintName("fk_tokens_applications_application_id"); |  | ||||||
| 
 |  | ||||||
|                     b.HasOne("Foxnouns.Backend.Database.Models.User", "User") |  | ||||||
|                         .WithMany() |  | ||||||
|                         .HasForeignKey("UserId") |  | ||||||
|                         .OnDelete(DeleteBehavior.Cascade) |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasConstraintName("fk_tokens_users_user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Application"); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("User"); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.User", b => |  | ||||||
|                 { |  | ||||||
|                     b.OwnsOne("Foxnouns.Backend.Database.Models.User.Fields#List", "Fields", b1 => |  | ||||||
|                         { |  | ||||||
|                             b1.Property<long>("UserId") |  | ||||||
|                                 .HasColumnType("bigint"); |  | ||||||
| 
 |  | ||||||
|                             b1.Property<int>("Capacity") |  | ||||||
|                                 .HasColumnType("integer"); |  | ||||||
| 
 |  | ||||||
|                             b1.HasKey("UserId") |  | ||||||
|                                 .HasName("pk_users"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToTable("users"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToJson("fields"); |  | ||||||
| 
 |  | ||||||
|                             b1.WithOwner() |  | ||||||
|                                 .HasForeignKey("UserId") |  | ||||||
|                                 .HasConstraintName("fk_users_users_user_id"); |  | ||||||
|                         }); |  | ||||||
| 
 |  | ||||||
|                     b.OwnsOne("Foxnouns.Backend.Database.Models.User.Names#List", "Names", b1 => |  | ||||||
|                         { |  | ||||||
|                             b1.Property<long>("UserId") |  | ||||||
|                                 .HasColumnType("bigint"); |  | ||||||
| 
 |  | ||||||
|                             b1.Property<int>("Capacity") |  | ||||||
|                                 .HasColumnType("integer"); |  | ||||||
| 
 |  | ||||||
|                             b1.HasKey("UserId") |  | ||||||
|                                 .HasName("pk_users"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToTable("users"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToJson("names"); |  | ||||||
| 
 |  | ||||||
|                             b1.WithOwner() |  | ||||||
|                                 .HasForeignKey("UserId") |  | ||||||
|                                 .HasConstraintName("fk_users_users_user_id"); |  | ||||||
|                         }); |  | ||||||
| 
 |  | ||||||
|                     b.OwnsOne("Foxnouns.Backend.Database.Models.User.Pronouns#List", "Pronouns", b1 => |  | ||||||
|                         { |  | ||||||
|                             b1.Property<long>("UserId") |  | ||||||
|                                 .HasColumnType("bigint"); |  | ||||||
| 
 |  | ||||||
|                             b1.Property<int>("Capacity") |  | ||||||
|                                 .HasColumnType("integer"); |  | ||||||
| 
 |  | ||||||
|                             b1.HasKey("UserId") |  | ||||||
|                                 .HasName("pk_users"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToTable("users"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToJson("pronouns"); |  | ||||||
| 
 |  | ||||||
|                             b1.WithOwner() |  | ||||||
|                                 .HasForeignKey("UserId") |  | ||||||
|                                 .HasConstraintName("fk_users_users_user_id"); |  | ||||||
|                         }); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Fields") |  | ||||||
|                         .IsRequired(); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Names") |  | ||||||
|                         .IsRequired(); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Pronouns") |  | ||||||
|                         .IsRequired(); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.User", b => |  | ||||||
|                 { |  | ||||||
|                     b.Navigation("AuthMethods"); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Members"); |  | ||||||
|                 }); |  | ||||||
| #pragma warning restore 612, 618 |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  | @ -1,10 +1,13 @@ | ||||||
| using Microsoft.EntityFrameworkCore.Migrations; | using Microsoft.EntityFrameworkCore.Migrations; | ||||||
|  | using Microsoft.EntityFrameworkCore.Infrastructure; | ||||||
| 
 | 
 | ||||||
| #nullable disable | #nullable disable | ||||||
| 
 | 
 | ||||||
| namespace Foxnouns.Backend.Database.Migrations | namespace Foxnouns.Backend.Database.Migrations | ||||||
| { | { | ||||||
|     /// <inheritdoc /> |     /// <inheritdoc /> | ||||||
|  |     [DbContext(typeof(DatabaseContext))] | ||||||
|  |     [Migration("20240604142522_AddPassword")] | ||||||
|     public partial class AddPassword : Migration |     public partial class AddPassword : Migration | ||||||
|     { |     { | ||||||
|         /// <inheritdoc /> |         /// <inheritdoc /> | ||||||
|  |  | ||||||
|  | @ -1,511 +0,0 @@ | ||||||
| // <auto-generated /> |  | ||||||
| using Foxnouns.Backend.Database; |  | ||||||
| using Microsoft.EntityFrameworkCore; |  | ||||||
| using Microsoft.EntityFrameworkCore.Infrastructure; |  | ||||||
| using Microsoft.EntityFrameworkCore.Migrations; |  | ||||||
| using Microsoft.EntityFrameworkCore.Storage.ValueConversion; |  | ||||||
| using NodaTime; |  | ||||||
| using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; |  | ||||||
| 
 |  | ||||||
| #nullable disable |  | ||||||
| 
 |  | ||||||
| namespace Foxnouns.Backend.Database.Migrations |  | ||||||
| { |  | ||||||
|     [DbContext(typeof(DatabaseContext))] |  | ||||||
|     [Migration("20240611225328_AddTemporaryKeyCache")] |  | ||||||
|     partial class AddTemporaryKeyCache |  | ||||||
|     { |  | ||||||
|         /// <inheritdoc /> |  | ||||||
|         protected override void BuildTargetModel(ModelBuilder modelBuilder) |  | ||||||
|         { |  | ||||||
| #pragma warning disable 612, 618 |  | ||||||
|             modelBuilder |  | ||||||
|                 .HasAnnotation("ProductVersion", "8.0.5") |  | ||||||
|                 .HasAnnotation("Relational:MaxIdentifierLength", 63); |  | ||||||
| 
 |  | ||||||
|             NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.Application", b => |  | ||||||
|                 { |  | ||||||
|                     b.Property<long>("Id") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("ClientId") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("client_id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("ClientSecret") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("client_secret"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Name") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("name"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string[]>("RedirectUris") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text[]") |  | ||||||
|                         .HasColumnName("redirect_uris"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string[]>("Scopes") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text[]") |  | ||||||
|                         .HasColumnName("scopes"); |  | ||||||
| 
 |  | ||||||
|                     b.HasKey("Id") |  | ||||||
|                         .HasName("pk_applications"); |  | ||||||
| 
 |  | ||||||
|                     b.ToTable("applications", (string)null); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.AuthMethod", b => |  | ||||||
|                 { |  | ||||||
|                     b.Property<long>("Id") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<int>("AuthType") |  | ||||||
|                         .HasColumnType("integer") |  | ||||||
|                         .HasColumnName("auth_type"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<long?>("FediverseApplicationId") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("fediverse_application_id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("RemoteId") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("remote_id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("RemoteUsername") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("remote_username"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<long>("UserId") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.HasKey("Id") |  | ||||||
|                         .HasName("pk_auth_methods"); |  | ||||||
| 
 |  | ||||||
|                     b.HasIndex("FediverseApplicationId") |  | ||||||
|                         .HasDatabaseName("ix_auth_methods_fediverse_application_id"); |  | ||||||
| 
 |  | ||||||
|                     b.HasIndex("UserId") |  | ||||||
|                         .HasDatabaseName("ix_auth_methods_user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.ToTable("auth_methods", (string)null); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.FediverseApplication", b => |  | ||||||
|                 { |  | ||||||
|                     b.Property<long>("Id") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("ClientId") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("client_id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("ClientSecret") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("client_secret"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Domain") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("domain"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<int>("InstanceType") |  | ||||||
|                         .HasColumnType("integer") |  | ||||||
|                         .HasColumnName("instance_type"); |  | ||||||
| 
 |  | ||||||
|                     b.HasKey("Id") |  | ||||||
|                         .HasName("pk_fediverse_applications"); |  | ||||||
| 
 |  | ||||||
|                     b.ToTable("fediverse_applications", (string)null); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.Member", b => |  | ||||||
|                 { |  | ||||||
|                     b.Property<long>("Id") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Avatar") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("avatar"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Bio") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("bio"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("DisplayName") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("display_name"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string[]>("Links") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text[]") |  | ||||||
|                         .HasColumnName("links"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Name") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("name"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<bool>("Unlisted") |  | ||||||
|                         .HasColumnType("boolean") |  | ||||||
|                         .HasColumnName("unlisted"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<long>("UserId") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.HasKey("Id") |  | ||||||
|                         .HasName("pk_members"); |  | ||||||
| 
 |  | ||||||
|                     b.HasIndex("UserId", "Name") |  | ||||||
|                         .IsUnique() |  | ||||||
|                         .HasDatabaseName("ix_members_user_id_name"); |  | ||||||
| 
 |  | ||||||
|                     b.ToTable("members", (string)null); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.TemporaryKey", b => |  | ||||||
|                 { |  | ||||||
|                     b.Property<long>("Id") |  | ||||||
|                         .ValueGeneratedOnAdd() |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("id"); |  | ||||||
| 
 |  | ||||||
|                     NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id")); |  | ||||||
| 
 |  | ||||||
|                     b.Property<Instant>("Expires") |  | ||||||
|                         .HasColumnType("timestamp with time zone") |  | ||||||
|                         .HasColumnName("expires"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Key") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("key"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Value") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("value"); |  | ||||||
| 
 |  | ||||||
|                     b.HasKey("Id") |  | ||||||
|                         .HasName("pk_temporary_keys"); |  | ||||||
| 
 |  | ||||||
|                     b.HasIndex("Key") |  | ||||||
|                         .IsUnique() |  | ||||||
|                         .HasDatabaseName("ix_temporary_keys_key"); |  | ||||||
| 
 |  | ||||||
|                     b.ToTable("temporary_keys", (string)null); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.Token", b => |  | ||||||
|                 { |  | ||||||
|                     b.Property<long>("Id") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<long>("ApplicationId") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("application_id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<Instant>("ExpiresAt") |  | ||||||
|                         .HasColumnType("timestamp with time zone") |  | ||||||
|                         .HasColumnName("expires_at"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<byte[]>("Hash") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("bytea") |  | ||||||
|                         .HasColumnName("hash"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<bool>("ManuallyExpired") |  | ||||||
|                         .HasColumnType("boolean") |  | ||||||
|                         .HasColumnName("manually_expired"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string[]>("Scopes") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text[]") |  | ||||||
|                         .HasColumnName("scopes"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<long>("UserId") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.HasKey("Id") |  | ||||||
|                         .HasName("pk_tokens"); |  | ||||||
| 
 |  | ||||||
|                     b.HasIndex("ApplicationId") |  | ||||||
|                         .HasDatabaseName("ix_tokens_application_id"); |  | ||||||
| 
 |  | ||||||
|                     b.HasIndex("UserId") |  | ||||||
|                         .HasDatabaseName("ix_tokens_user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.ToTable("tokens", (string)null); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.User", b => |  | ||||||
|                 { |  | ||||||
|                     b.Property<long>("Id") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Avatar") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("avatar"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Bio") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("bio"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("DisplayName") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("display_name"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string[]>("Links") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text[]") |  | ||||||
|                         .HasColumnName("links"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<bool>("ListHidden") |  | ||||||
|                         .HasColumnType("boolean") |  | ||||||
|                         .HasColumnName("list_hidden"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("MemberTitle") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("member_title"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Password") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("password"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<int>("Role") |  | ||||||
|                         .HasColumnType("integer") |  | ||||||
|                         .HasColumnName("role"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Username") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("username"); |  | ||||||
| 
 |  | ||||||
|                     b.HasKey("Id") |  | ||||||
|                         .HasName("pk_users"); |  | ||||||
| 
 |  | ||||||
|                     b.HasIndex("Username") |  | ||||||
|                         .IsUnique() |  | ||||||
|                         .HasDatabaseName("ix_users_username"); |  | ||||||
| 
 |  | ||||||
|                     b.ToTable("users", (string)null); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.AuthMethod", b => |  | ||||||
|                 { |  | ||||||
|                     b.HasOne("Foxnouns.Backend.Database.Models.FediverseApplication", "FediverseApplication") |  | ||||||
|                         .WithMany() |  | ||||||
|                         .HasForeignKey("FediverseApplicationId") |  | ||||||
|                         .HasConstraintName("fk_auth_methods_fediverse_applications_fediverse_application_id"); |  | ||||||
| 
 |  | ||||||
|                     b.HasOne("Foxnouns.Backend.Database.Models.User", "User") |  | ||||||
|                         .WithMany("AuthMethods") |  | ||||||
|                         .HasForeignKey("UserId") |  | ||||||
|                         .OnDelete(DeleteBehavior.Cascade) |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasConstraintName("fk_auth_methods_users_user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("FediverseApplication"); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("User"); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.Member", b => |  | ||||||
|                 { |  | ||||||
|                     b.HasOne("Foxnouns.Backend.Database.Models.User", "User") |  | ||||||
|                         .WithMany("Members") |  | ||||||
|                         .HasForeignKey("UserId") |  | ||||||
|                         .OnDelete(DeleteBehavior.Cascade) |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasConstraintName("fk_members_users_user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.OwnsOne("System.Collections.Generic.List<Foxnouns.Backend.Database.Models.Field>", "Fields", b1 => |  | ||||||
|                         { |  | ||||||
|                             b1.Property<long>("MemberId") |  | ||||||
|                                 .HasColumnType("bigint"); |  | ||||||
| 
 |  | ||||||
|                             b1.Property<int>("Capacity") |  | ||||||
|                                 .HasColumnType("integer"); |  | ||||||
| 
 |  | ||||||
|                             b1.HasKey("MemberId"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToTable("members"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToJson("fields"); |  | ||||||
| 
 |  | ||||||
|                             b1.WithOwner() |  | ||||||
|                                 .HasForeignKey("MemberId") |  | ||||||
|                                 .HasConstraintName("fk_members_members_id"); |  | ||||||
|                         }); |  | ||||||
| 
 |  | ||||||
|                     b.OwnsOne("System.Collections.Generic.List<Foxnouns.Backend.Database.Models.FieldEntry>", "Names", b1 => |  | ||||||
|                         { |  | ||||||
|                             b1.Property<long>("MemberId") |  | ||||||
|                                 .HasColumnType("bigint"); |  | ||||||
| 
 |  | ||||||
|                             b1.Property<int>("Capacity") |  | ||||||
|                                 .HasColumnType("integer"); |  | ||||||
| 
 |  | ||||||
|                             b1.HasKey("MemberId"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToTable("members"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToJson("names"); |  | ||||||
| 
 |  | ||||||
|                             b1.WithOwner() |  | ||||||
|                                 .HasForeignKey("MemberId") |  | ||||||
|                                 .HasConstraintName("fk_members_members_id"); |  | ||||||
|                         }); |  | ||||||
| 
 |  | ||||||
|                     b.OwnsOne("System.Collections.Generic.List<Foxnouns.Backend.Database.Models.Pronoun>", "Pronouns", b1 => |  | ||||||
|                         { |  | ||||||
|                             b1.Property<long>("MemberId") |  | ||||||
|                                 .HasColumnType("bigint"); |  | ||||||
| 
 |  | ||||||
|                             b1.Property<int>("Capacity") |  | ||||||
|                                 .HasColumnType("integer"); |  | ||||||
| 
 |  | ||||||
|                             b1.HasKey("MemberId"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToTable("members"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToJson("pronouns"); |  | ||||||
| 
 |  | ||||||
|                             b1.WithOwner() |  | ||||||
|                                 .HasForeignKey("MemberId") |  | ||||||
|                                 .HasConstraintName("fk_members_members_id"); |  | ||||||
|                         }); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Fields") |  | ||||||
|                         .IsRequired(); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Names") |  | ||||||
|                         .IsRequired(); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Pronouns") |  | ||||||
|                         .IsRequired(); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("User"); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.Token", b => |  | ||||||
|                 { |  | ||||||
|                     b.HasOne("Foxnouns.Backend.Database.Models.Application", "Application") |  | ||||||
|                         .WithMany() |  | ||||||
|                         .HasForeignKey("ApplicationId") |  | ||||||
|                         .OnDelete(DeleteBehavior.Cascade) |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasConstraintName("fk_tokens_applications_application_id"); |  | ||||||
| 
 |  | ||||||
|                     b.HasOne("Foxnouns.Backend.Database.Models.User", "User") |  | ||||||
|                         .WithMany() |  | ||||||
|                         .HasForeignKey("UserId") |  | ||||||
|                         .OnDelete(DeleteBehavior.Cascade) |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasConstraintName("fk_tokens_users_user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Application"); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("User"); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.User", b => |  | ||||||
|                 { |  | ||||||
|                     b.OwnsOne("Foxnouns.Backend.Database.Models.User.Fields#List", "Fields", b1 => |  | ||||||
|                         { |  | ||||||
|                             b1.Property<long>("UserId") |  | ||||||
|                                 .HasColumnType("bigint"); |  | ||||||
| 
 |  | ||||||
|                             b1.Property<int>("Capacity") |  | ||||||
|                                 .HasColumnType("integer"); |  | ||||||
| 
 |  | ||||||
|                             b1.HasKey("UserId") |  | ||||||
|                                 .HasName("pk_users"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToTable("users"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToJson("fields"); |  | ||||||
| 
 |  | ||||||
|                             b1.WithOwner() |  | ||||||
|                                 .HasForeignKey("UserId") |  | ||||||
|                                 .HasConstraintName("fk_users_users_user_id"); |  | ||||||
|                         }); |  | ||||||
| 
 |  | ||||||
|                     b.OwnsOne("Foxnouns.Backend.Database.Models.User.Names#List", "Names", b1 => |  | ||||||
|                         { |  | ||||||
|                             b1.Property<long>("UserId") |  | ||||||
|                                 .HasColumnType("bigint"); |  | ||||||
| 
 |  | ||||||
|                             b1.Property<int>("Capacity") |  | ||||||
|                                 .HasColumnType("integer"); |  | ||||||
| 
 |  | ||||||
|                             b1.HasKey("UserId") |  | ||||||
|                                 .HasName("pk_users"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToTable("users"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToJson("names"); |  | ||||||
| 
 |  | ||||||
|                             b1.WithOwner() |  | ||||||
|                                 .HasForeignKey("UserId") |  | ||||||
|                                 .HasConstraintName("fk_users_users_user_id"); |  | ||||||
|                         }); |  | ||||||
| 
 |  | ||||||
|                     b.OwnsOne("Foxnouns.Backend.Database.Models.User.Pronouns#List", "Pronouns", b1 => |  | ||||||
|                         { |  | ||||||
|                             b1.Property<long>("UserId") |  | ||||||
|                                 .HasColumnType("bigint"); |  | ||||||
| 
 |  | ||||||
|                             b1.Property<int>("Capacity") |  | ||||||
|                                 .HasColumnType("integer"); |  | ||||||
| 
 |  | ||||||
|                             b1.HasKey("UserId") |  | ||||||
|                                 .HasName("pk_users"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToTable("users"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToJson("pronouns"); |  | ||||||
| 
 |  | ||||||
|                             b1.WithOwner() |  | ||||||
|                                 .HasForeignKey("UserId") |  | ||||||
|                                 .HasConstraintName("fk_users_users_user_id"); |  | ||||||
|                         }); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Fields") |  | ||||||
|                         .IsRequired(); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Names") |  | ||||||
|                         .IsRequired(); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Pronouns") |  | ||||||
|                         .IsRequired(); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.User", b => |  | ||||||
|                 { |  | ||||||
|                     b.Navigation("AuthMethods"); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Members"); |  | ||||||
|                 }); |  | ||||||
| #pragma warning restore 612, 618 |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  | @ -1,4 +1,5 @@ | ||||||
| using Microsoft.EntityFrameworkCore.Migrations; | using Microsoft.EntityFrameworkCore.Migrations; | ||||||
|  | using Microsoft.EntityFrameworkCore.Infrastructure; | ||||||
| using NodaTime; | using NodaTime; | ||||||
| using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; | using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; | ||||||
| 
 | 
 | ||||||
|  | @ -7,6 +8,8 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; | ||||||
| namespace Foxnouns.Backend.Database.Migrations | namespace Foxnouns.Backend.Database.Migrations | ||||||
| { | { | ||||||
|     /// <inheritdoc /> |     /// <inheritdoc /> | ||||||
|  |     [DbContext(typeof(DatabaseContext))] | ||||||
|  |     [Migration("20240611225328_AddTemporaryKeyCache")] | ||||||
|     public partial class AddTemporaryKeyCache : Migration |     public partial class AddTemporaryKeyCache : Migration | ||||||
|     { |     { | ||||||
|         /// <inheritdoc /> |         /// <inheritdoc /> | ||||||
|  |  | ||||||
|  | @ -1,515 +0,0 @@ | ||||||
| // <auto-generated /> |  | ||||||
| using Foxnouns.Backend.Database; |  | ||||||
| using Microsoft.EntityFrameworkCore; |  | ||||||
| using Microsoft.EntityFrameworkCore.Infrastructure; |  | ||||||
| using Microsoft.EntityFrameworkCore.Migrations; |  | ||||||
| using Microsoft.EntityFrameworkCore.Storage.ValueConversion; |  | ||||||
| using NodaTime; |  | ||||||
| using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; |  | ||||||
| 
 |  | ||||||
| #nullable disable |  | ||||||
| 
 |  | ||||||
| namespace Foxnouns.Backend.Database.Migrations |  | ||||||
| { |  | ||||||
|     [DbContext(typeof(DatabaseContext))] |  | ||||||
|     [Migration("20240712233806_AddUserLastActive")] |  | ||||||
|     partial class AddUserLastActive |  | ||||||
|     { |  | ||||||
|         /// <inheritdoc /> |  | ||||||
|         protected override void BuildTargetModel(ModelBuilder modelBuilder) |  | ||||||
|         { |  | ||||||
| #pragma warning disable 612, 618 |  | ||||||
|             modelBuilder |  | ||||||
|                 .HasAnnotation("ProductVersion", "8.0.5") |  | ||||||
|                 .HasAnnotation("Relational:MaxIdentifierLength", 63); |  | ||||||
| 
 |  | ||||||
|             NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.Application", b => |  | ||||||
|                 { |  | ||||||
|                     b.Property<long>("Id") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("ClientId") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("client_id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("ClientSecret") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("client_secret"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Name") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("name"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string[]>("RedirectUris") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text[]") |  | ||||||
|                         .HasColumnName("redirect_uris"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string[]>("Scopes") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text[]") |  | ||||||
|                         .HasColumnName("scopes"); |  | ||||||
| 
 |  | ||||||
|                     b.HasKey("Id") |  | ||||||
|                         .HasName("pk_applications"); |  | ||||||
| 
 |  | ||||||
|                     b.ToTable("applications", (string)null); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.AuthMethod", b => |  | ||||||
|                 { |  | ||||||
|                     b.Property<long>("Id") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<int>("AuthType") |  | ||||||
|                         .HasColumnType("integer") |  | ||||||
|                         .HasColumnName("auth_type"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<long?>("FediverseApplicationId") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("fediverse_application_id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("RemoteId") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("remote_id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("RemoteUsername") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("remote_username"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<long>("UserId") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.HasKey("Id") |  | ||||||
|                         .HasName("pk_auth_methods"); |  | ||||||
| 
 |  | ||||||
|                     b.HasIndex("FediverseApplicationId") |  | ||||||
|                         .HasDatabaseName("ix_auth_methods_fediverse_application_id"); |  | ||||||
| 
 |  | ||||||
|                     b.HasIndex("UserId") |  | ||||||
|                         .HasDatabaseName("ix_auth_methods_user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.ToTable("auth_methods", (string)null); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.FediverseApplication", b => |  | ||||||
|                 { |  | ||||||
|                     b.Property<long>("Id") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("ClientId") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("client_id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("ClientSecret") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("client_secret"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Domain") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("domain"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<int>("InstanceType") |  | ||||||
|                         .HasColumnType("integer") |  | ||||||
|                         .HasColumnName("instance_type"); |  | ||||||
| 
 |  | ||||||
|                     b.HasKey("Id") |  | ||||||
|                         .HasName("pk_fediverse_applications"); |  | ||||||
| 
 |  | ||||||
|                     b.ToTable("fediverse_applications", (string)null); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.Member", b => |  | ||||||
|                 { |  | ||||||
|                     b.Property<long>("Id") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Avatar") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("avatar"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Bio") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("bio"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("DisplayName") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("display_name"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string[]>("Links") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text[]") |  | ||||||
|                         .HasColumnName("links"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Name") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("name"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<bool>("Unlisted") |  | ||||||
|                         .HasColumnType("boolean") |  | ||||||
|                         .HasColumnName("unlisted"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<long>("UserId") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.HasKey("Id") |  | ||||||
|                         .HasName("pk_members"); |  | ||||||
| 
 |  | ||||||
|                     b.HasIndex("UserId", "Name") |  | ||||||
|                         .IsUnique() |  | ||||||
|                         .HasDatabaseName("ix_members_user_id_name"); |  | ||||||
| 
 |  | ||||||
|                     b.ToTable("members", (string)null); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.TemporaryKey", b => |  | ||||||
|                 { |  | ||||||
|                     b.Property<long>("Id") |  | ||||||
|                         .ValueGeneratedOnAdd() |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("id"); |  | ||||||
| 
 |  | ||||||
|                     NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id")); |  | ||||||
| 
 |  | ||||||
|                     b.Property<Instant>("Expires") |  | ||||||
|                         .HasColumnType("timestamp with time zone") |  | ||||||
|                         .HasColumnName("expires"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Key") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("key"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Value") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("value"); |  | ||||||
| 
 |  | ||||||
|                     b.HasKey("Id") |  | ||||||
|                         .HasName("pk_temporary_keys"); |  | ||||||
| 
 |  | ||||||
|                     b.HasIndex("Key") |  | ||||||
|                         .IsUnique() |  | ||||||
|                         .HasDatabaseName("ix_temporary_keys_key"); |  | ||||||
| 
 |  | ||||||
|                     b.ToTable("temporary_keys", (string)null); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.Token", b => |  | ||||||
|                 { |  | ||||||
|                     b.Property<long>("Id") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<long>("ApplicationId") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("application_id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<Instant>("ExpiresAt") |  | ||||||
|                         .HasColumnType("timestamp with time zone") |  | ||||||
|                         .HasColumnName("expires_at"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<byte[]>("Hash") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("bytea") |  | ||||||
|                         .HasColumnName("hash"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<bool>("ManuallyExpired") |  | ||||||
|                         .HasColumnType("boolean") |  | ||||||
|                         .HasColumnName("manually_expired"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string[]>("Scopes") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text[]") |  | ||||||
|                         .HasColumnName("scopes"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<long>("UserId") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.HasKey("Id") |  | ||||||
|                         .HasName("pk_tokens"); |  | ||||||
| 
 |  | ||||||
|                     b.HasIndex("ApplicationId") |  | ||||||
|                         .HasDatabaseName("ix_tokens_application_id"); |  | ||||||
| 
 |  | ||||||
|                     b.HasIndex("UserId") |  | ||||||
|                         .HasDatabaseName("ix_tokens_user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.ToTable("tokens", (string)null); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.User", b => |  | ||||||
|                 { |  | ||||||
|                     b.Property<long>("Id") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Avatar") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("avatar"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Bio") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("bio"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("DisplayName") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("display_name"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<Instant>("LastActive") |  | ||||||
|                         .HasColumnType("timestamp with time zone") |  | ||||||
|                         .HasColumnName("last_active"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string[]>("Links") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text[]") |  | ||||||
|                         .HasColumnName("links"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<bool>("ListHidden") |  | ||||||
|                         .HasColumnType("boolean") |  | ||||||
|                         .HasColumnName("list_hidden"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("MemberTitle") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("member_title"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Password") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("password"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<int>("Role") |  | ||||||
|                         .HasColumnType("integer") |  | ||||||
|                         .HasColumnName("role"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Username") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("username"); |  | ||||||
| 
 |  | ||||||
|                     b.HasKey("Id") |  | ||||||
|                         .HasName("pk_users"); |  | ||||||
| 
 |  | ||||||
|                     b.HasIndex("Username") |  | ||||||
|                         .IsUnique() |  | ||||||
|                         .HasDatabaseName("ix_users_username"); |  | ||||||
| 
 |  | ||||||
|                     b.ToTable("users", (string)null); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.AuthMethod", b => |  | ||||||
|                 { |  | ||||||
|                     b.HasOne("Foxnouns.Backend.Database.Models.FediverseApplication", "FediverseApplication") |  | ||||||
|                         .WithMany() |  | ||||||
|                         .HasForeignKey("FediverseApplicationId") |  | ||||||
|                         .HasConstraintName("fk_auth_methods_fediverse_applications_fediverse_application_id"); |  | ||||||
| 
 |  | ||||||
|                     b.HasOne("Foxnouns.Backend.Database.Models.User", "User") |  | ||||||
|                         .WithMany("AuthMethods") |  | ||||||
|                         .HasForeignKey("UserId") |  | ||||||
|                         .OnDelete(DeleteBehavior.Cascade) |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasConstraintName("fk_auth_methods_users_user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("FediverseApplication"); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("User"); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.Member", b => |  | ||||||
|                 { |  | ||||||
|                     b.HasOne("Foxnouns.Backend.Database.Models.User", "User") |  | ||||||
|                         .WithMany("Members") |  | ||||||
|                         .HasForeignKey("UserId") |  | ||||||
|                         .OnDelete(DeleteBehavior.Cascade) |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasConstraintName("fk_members_users_user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.OwnsOne("System.Collections.Generic.List<Foxnouns.Backend.Database.Models.Field>", "Fields", b1 => |  | ||||||
|                         { |  | ||||||
|                             b1.Property<long>("MemberId") |  | ||||||
|                                 .HasColumnType("bigint"); |  | ||||||
| 
 |  | ||||||
|                             b1.Property<int>("Capacity") |  | ||||||
|                                 .HasColumnType("integer"); |  | ||||||
| 
 |  | ||||||
|                             b1.HasKey("MemberId"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToTable("members"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToJson("fields"); |  | ||||||
| 
 |  | ||||||
|                             b1.WithOwner() |  | ||||||
|                                 .HasForeignKey("MemberId") |  | ||||||
|                                 .HasConstraintName("fk_members_members_id"); |  | ||||||
|                         }); |  | ||||||
| 
 |  | ||||||
|                     b.OwnsOne("System.Collections.Generic.List<Foxnouns.Backend.Database.Models.FieldEntry>", "Names", b1 => |  | ||||||
|                         { |  | ||||||
|                             b1.Property<long>("MemberId") |  | ||||||
|                                 .HasColumnType("bigint"); |  | ||||||
| 
 |  | ||||||
|                             b1.Property<int>("Capacity") |  | ||||||
|                                 .HasColumnType("integer"); |  | ||||||
| 
 |  | ||||||
|                             b1.HasKey("MemberId"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToTable("members"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToJson("names"); |  | ||||||
| 
 |  | ||||||
|                             b1.WithOwner() |  | ||||||
|                                 .HasForeignKey("MemberId") |  | ||||||
|                                 .HasConstraintName("fk_members_members_id"); |  | ||||||
|                         }); |  | ||||||
| 
 |  | ||||||
|                     b.OwnsOne("System.Collections.Generic.List<Foxnouns.Backend.Database.Models.Pronoun>", "Pronouns", b1 => |  | ||||||
|                         { |  | ||||||
|                             b1.Property<long>("MemberId") |  | ||||||
|                                 .HasColumnType("bigint"); |  | ||||||
| 
 |  | ||||||
|                             b1.Property<int>("Capacity") |  | ||||||
|                                 .HasColumnType("integer"); |  | ||||||
| 
 |  | ||||||
|                             b1.HasKey("MemberId"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToTable("members"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToJson("pronouns"); |  | ||||||
| 
 |  | ||||||
|                             b1.WithOwner() |  | ||||||
|                                 .HasForeignKey("MemberId") |  | ||||||
|                                 .HasConstraintName("fk_members_members_id"); |  | ||||||
|                         }); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Fields") |  | ||||||
|                         .IsRequired(); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Names") |  | ||||||
|                         .IsRequired(); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Pronouns") |  | ||||||
|                         .IsRequired(); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("User"); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.Token", b => |  | ||||||
|                 { |  | ||||||
|                     b.HasOne("Foxnouns.Backend.Database.Models.Application", "Application") |  | ||||||
|                         .WithMany() |  | ||||||
|                         .HasForeignKey("ApplicationId") |  | ||||||
|                         .OnDelete(DeleteBehavior.Cascade) |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasConstraintName("fk_tokens_applications_application_id"); |  | ||||||
| 
 |  | ||||||
|                     b.HasOne("Foxnouns.Backend.Database.Models.User", "User") |  | ||||||
|                         .WithMany() |  | ||||||
|                         .HasForeignKey("UserId") |  | ||||||
|                         .OnDelete(DeleteBehavior.Cascade) |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasConstraintName("fk_tokens_users_user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Application"); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("User"); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.User", b => |  | ||||||
|                 { |  | ||||||
|                     b.OwnsOne("Foxnouns.Backend.Database.Models.User.Fields#List", "Fields", b1 => |  | ||||||
|                         { |  | ||||||
|                             b1.Property<long>("UserId") |  | ||||||
|                                 .HasColumnType("bigint"); |  | ||||||
| 
 |  | ||||||
|                             b1.Property<int>("Capacity") |  | ||||||
|                                 .HasColumnType("integer"); |  | ||||||
| 
 |  | ||||||
|                             b1.HasKey("UserId") |  | ||||||
|                                 .HasName("pk_users"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToTable("users"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToJson("fields"); |  | ||||||
| 
 |  | ||||||
|                             b1.WithOwner() |  | ||||||
|                                 .HasForeignKey("UserId") |  | ||||||
|                                 .HasConstraintName("fk_users_users_user_id"); |  | ||||||
|                         }); |  | ||||||
| 
 |  | ||||||
|                     b.OwnsOne("Foxnouns.Backend.Database.Models.User.Names#List", "Names", b1 => |  | ||||||
|                         { |  | ||||||
|                             b1.Property<long>("UserId") |  | ||||||
|                                 .HasColumnType("bigint"); |  | ||||||
| 
 |  | ||||||
|                             b1.Property<int>("Capacity") |  | ||||||
|                                 .HasColumnType("integer"); |  | ||||||
| 
 |  | ||||||
|                             b1.HasKey("UserId") |  | ||||||
|                                 .HasName("pk_users"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToTable("users"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToJson("names"); |  | ||||||
| 
 |  | ||||||
|                             b1.WithOwner() |  | ||||||
|                                 .HasForeignKey("UserId") |  | ||||||
|                                 .HasConstraintName("fk_users_users_user_id"); |  | ||||||
|                         }); |  | ||||||
| 
 |  | ||||||
|                     b.OwnsOne("Foxnouns.Backend.Database.Models.User.Pronouns#List", "Pronouns", b1 => |  | ||||||
|                         { |  | ||||||
|                             b1.Property<long>("UserId") |  | ||||||
|                                 .HasColumnType("bigint"); |  | ||||||
| 
 |  | ||||||
|                             b1.Property<int>("Capacity") |  | ||||||
|                                 .HasColumnType("integer"); |  | ||||||
| 
 |  | ||||||
|                             b1.HasKey("UserId") |  | ||||||
|                                 .HasName("pk_users"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToTable("users"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToJson("pronouns"); |  | ||||||
| 
 |  | ||||||
|                             b1.WithOwner() |  | ||||||
|                                 .HasForeignKey("UserId") |  | ||||||
|                                 .HasConstraintName("fk_users_users_user_id"); |  | ||||||
|                         }); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Fields") |  | ||||||
|                         .IsRequired(); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Names") |  | ||||||
|                         .IsRequired(); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Pronouns") |  | ||||||
|                         .IsRequired(); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.User", b => |  | ||||||
|                 { |  | ||||||
|                     b.Navigation("AuthMethods"); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Members"); |  | ||||||
|                 }); |  | ||||||
| #pragma warning restore 612, 618 |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  | @ -1,4 +1,5 @@ | ||||||
| using Microsoft.EntityFrameworkCore.Migrations; | using Microsoft.EntityFrameworkCore.Migrations; | ||||||
|  | using Microsoft.EntityFrameworkCore.Infrastructure; | ||||||
| using NodaTime; | using NodaTime; | ||||||
| 
 | 
 | ||||||
| #nullable disable | #nullable disable | ||||||
|  | @ -6,6 +7,8 @@ using NodaTime; | ||||||
| namespace Foxnouns.Backend.Database.Migrations | namespace Foxnouns.Backend.Database.Migrations | ||||||
| { | { | ||||||
|     /// <inheritdoc /> |     /// <inheritdoc /> | ||||||
|  |     [DbContext(typeof(DatabaseContext))] | ||||||
|  |     [Migration("20240712233806_AddUserLastActive")] | ||||||
|     public partial class AddUserLastActive : Migration |     public partial class AddUserLastActive : Migration | ||||||
|     { |     { | ||||||
|         /// <inheritdoc /> |         /// <inheritdoc /> | ||||||
|  |  | ||||||
|  | @ -1,528 +0,0 @@ | ||||||
| // <auto-generated /> |  | ||||||
| using System; |  | ||||||
| using Foxnouns.Backend.Database; |  | ||||||
| using Microsoft.EntityFrameworkCore; |  | ||||||
| using Microsoft.EntityFrameworkCore.Infrastructure; |  | ||||||
| using Microsoft.EntityFrameworkCore.Migrations; |  | ||||||
| using Microsoft.EntityFrameworkCore.Storage.ValueConversion; |  | ||||||
| using NodaTime; |  | ||||||
| using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; |  | ||||||
| 
 |  | ||||||
| #nullable disable |  | ||||||
| 
 |  | ||||||
| namespace Foxnouns.Backend.Database.Migrations |  | ||||||
| { |  | ||||||
|     [DbContext(typeof(DatabaseContext))] |  | ||||||
|     [Migration("20240713000719_AddDeleted")] |  | ||||||
|     partial class AddDeleted |  | ||||||
|     { |  | ||||||
|         /// <inheritdoc /> |  | ||||||
|         protected override void BuildTargetModel(ModelBuilder modelBuilder) |  | ||||||
|         { |  | ||||||
| #pragma warning disable 612, 618 |  | ||||||
|             modelBuilder |  | ||||||
|                 .HasAnnotation("ProductVersion", "8.0.5") |  | ||||||
|                 .HasAnnotation("Relational:MaxIdentifierLength", 63); |  | ||||||
| 
 |  | ||||||
|             NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.Application", b => |  | ||||||
|                 { |  | ||||||
|                     b.Property<long>("Id") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("ClientId") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("client_id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("ClientSecret") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("client_secret"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Name") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("name"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string[]>("RedirectUris") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text[]") |  | ||||||
|                         .HasColumnName("redirect_uris"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string[]>("Scopes") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text[]") |  | ||||||
|                         .HasColumnName("scopes"); |  | ||||||
| 
 |  | ||||||
|                     b.HasKey("Id") |  | ||||||
|                         .HasName("pk_applications"); |  | ||||||
| 
 |  | ||||||
|                     b.ToTable("applications", (string)null); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.AuthMethod", b => |  | ||||||
|                 { |  | ||||||
|                     b.Property<long>("Id") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<int>("AuthType") |  | ||||||
|                         .HasColumnType("integer") |  | ||||||
|                         .HasColumnName("auth_type"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<long?>("FediverseApplicationId") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("fediverse_application_id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("RemoteId") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("remote_id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("RemoteUsername") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("remote_username"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<long>("UserId") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.HasKey("Id") |  | ||||||
|                         .HasName("pk_auth_methods"); |  | ||||||
| 
 |  | ||||||
|                     b.HasIndex("FediverseApplicationId") |  | ||||||
|                         .HasDatabaseName("ix_auth_methods_fediverse_application_id"); |  | ||||||
| 
 |  | ||||||
|                     b.HasIndex("UserId") |  | ||||||
|                         .HasDatabaseName("ix_auth_methods_user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.ToTable("auth_methods", (string)null); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.FediverseApplication", b => |  | ||||||
|                 { |  | ||||||
|                     b.Property<long>("Id") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("ClientId") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("client_id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("ClientSecret") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("client_secret"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Domain") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("domain"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<int>("InstanceType") |  | ||||||
|                         .HasColumnType("integer") |  | ||||||
|                         .HasColumnName("instance_type"); |  | ||||||
| 
 |  | ||||||
|                     b.HasKey("Id") |  | ||||||
|                         .HasName("pk_fediverse_applications"); |  | ||||||
| 
 |  | ||||||
|                     b.ToTable("fediverse_applications", (string)null); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.Member", b => |  | ||||||
|                 { |  | ||||||
|                     b.Property<long>("Id") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Avatar") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("avatar"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Bio") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("bio"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("DisplayName") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("display_name"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string[]>("Links") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text[]") |  | ||||||
|                         .HasColumnName("links"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Name") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("name"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<bool>("Unlisted") |  | ||||||
|                         .HasColumnType("boolean") |  | ||||||
|                         .HasColumnName("unlisted"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<long>("UserId") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.HasKey("Id") |  | ||||||
|                         .HasName("pk_members"); |  | ||||||
| 
 |  | ||||||
|                     b.HasIndex("UserId", "Name") |  | ||||||
|                         .IsUnique() |  | ||||||
|                         .HasDatabaseName("ix_members_user_id_name"); |  | ||||||
| 
 |  | ||||||
|                     b.ToTable("members", (string)null); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.TemporaryKey", b => |  | ||||||
|                 { |  | ||||||
|                     b.Property<long>("Id") |  | ||||||
|                         .ValueGeneratedOnAdd() |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("id"); |  | ||||||
| 
 |  | ||||||
|                     NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id")); |  | ||||||
| 
 |  | ||||||
|                     b.Property<Instant>("Expires") |  | ||||||
|                         .HasColumnType("timestamp with time zone") |  | ||||||
|                         .HasColumnName("expires"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Key") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("key"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Value") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("value"); |  | ||||||
| 
 |  | ||||||
|                     b.HasKey("Id") |  | ||||||
|                         .HasName("pk_temporary_keys"); |  | ||||||
| 
 |  | ||||||
|                     b.HasIndex("Key") |  | ||||||
|                         .IsUnique() |  | ||||||
|                         .HasDatabaseName("ix_temporary_keys_key"); |  | ||||||
| 
 |  | ||||||
|                     b.ToTable("temporary_keys", (string)null); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.Token", b => |  | ||||||
|                 { |  | ||||||
|                     b.Property<long>("Id") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<long>("ApplicationId") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("application_id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<Instant>("ExpiresAt") |  | ||||||
|                         .HasColumnType("timestamp with time zone") |  | ||||||
|                         .HasColumnName("expires_at"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<byte[]>("Hash") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("bytea") |  | ||||||
|                         .HasColumnName("hash"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<bool>("ManuallyExpired") |  | ||||||
|                         .HasColumnType("boolean") |  | ||||||
|                         .HasColumnName("manually_expired"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string[]>("Scopes") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text[]") |  | ||||||
|                         .HasColumnName("scopes"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<long>("UserId") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.HasKey("Id") |  | ||||||
|                         .HasName("pk_tokens"); |  | ||||||
| 
 |  | ||||||
|                     b.HasIndex("ApplicationId") |  | ||||||
|                         .HasDatabaseName("ix_tokens_application_id"); |  | ||||||
| 
 |  | ||||||
|                     b.HasIndex("UserId") |  | ||||||
|                         .HasDatabaseName("ix_tokens_user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.ToTable("tokens", (string)null); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.User", b => |  | ||||||
|                 { |  | ||||||
|                     b.Property<long>("Id") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Avatar") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("avatar"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Bio") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("bio"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<bool>("Deleted") |  | ||||||
|                         .HasColumnType("boolean") |  | ||||||
|                         .HasColumnName("deleted"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<Instant?>("DeletedAt") |  | ||||||
|                         .HasColumnType("timestamp with time zone") |  | ||||||
|                         .HasColumnName("deleted_at"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<long?>("DeletedBy") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("deleted_by"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("DisplayName") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("display_name"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<Instant>("LastActive") |  | ||||||
|                         .HasColumnType("timestamp with time zone") |  | ||||||
|                         .HasColumnName("last_active"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string[]>("Links") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text[]") |  | ||||||
|                         .HasColumnName("links"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<bool>("ListHidden") |  | ||||||
|                         .HasColumnType("boolean") |  | ||||||
|                         .HasColumnName("list_hidden"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("MemberTitle") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("member_title"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Password") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("password"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<int>("Role") |  | ||||||
|                         .HasColumnType("integer") |  | ||||||
|                         .HasColumnName("role"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Username") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("username"); |  | ||||||
| 
 |  | ||||||
|                     b.HasKey("Id") |  | ||||||
|                         .HasName("pk_users"); |  | ||||||
| 
 |  | ||||||
|                     b.HasIndex("Username") |  | ||||||
|                         .IsUnique() |  | ||||||
|                         .HasDatabaseName("ix_users_username"); |  | ||||||
| 
 |  | ||||||
|                     b.ToTable("users", (string)null); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.AuthMethod", b => |  | ||||||
|                 { |  | ||||||
|                     b.HasOne("Foxnouns.Backend.Database.Models.FediverseApplication", "FediverseApplication") |  | ||||||
|                         .WithMany() |  | ||||||
|                         .HasForeignKey("FediverseApplicationId") |  | ||||||
|                         .HasConstraintName("fk_auth_methods_fediverse_applications_fediverse_application_id"); |  | ||||||
| 
 |  | ||||||
|                     b.HasOne("Foxnouns.Backend.Database.Models.User", "User") |  | ||||||
|                         .WithMany("AuthMethods") |  | ||||||
|                         .HasForeignKey("UserId") |  | ||||||
|                         .OnDelete(DeleteBehavior.Cascade) |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasConstraintName("fk_auth_methods_users_user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("FediverseApplication"); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("User"); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.Member", b => |  | ||||||
|                 { |  | ||||||
|                     b.HasOne("Foxnouns.Backend.Database.Models.User", "User") |  | ||||||
|                         .WithMany("Members") |  | ||||||
|                         .HasForeignKey("UserId") |  | ||||||
|                         .OnDelete(DeleteBehavior.Cascade) |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasConstraintName("fk_members_users_user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.OwnsOne("System.Collections.Generic.List<Foxnouns.Backend.Database.Models.Field>", "Fields", b1 => |  | ||||||
|                         { |  | ||||||
|                             b1.Property<long>("MemberId") |  | ||||||
|                                 .HasColumnType("bigint"); |  | ||||||
| 
 |  | ||||||
|                             b1.Property<int>("Capacity") |  | ||||||
|                                 .HasColumnType("integer"); |  | ||||||
| 
 |  | ||||||
|                             b1.HasKey("MemberId"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToTable("members"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToJson("fields"); |  | ||||||
| 
 |  | ||||||
|                             b1.WithOwner() |  | ||||||
|                                 .HasForeignKey("MemberId") |  | ||||||
|                                 .HasConstraintName("fk_members_members_id"); |  | ||||||
|                         }); |  | ||||||
| 
 |  | ||||||
|                     b.OwnsOne("System.Collections.Generic.List<Foxnouns.Backend.Database.Models.FieldEntry>", "Names", b1 => |  | ||||||
|                         { |  | ||||||
|                             b1.Property<long>("MemberId") |  | ||||||
|                                 .HasColumnType("bigint"); |  | ||||||
| 
 |  | ||||||
|                             b1.Property<int>("Capacity") |  | ||||||
|                                 .HasColumnType("integer"); |  | ||||||
| 
 |  | ||||||
|                             b1.HasKey("MemberId"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToTable("members"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToJson("names"); |  | ||||||
| 
 |  | ||||||
|                             b1.WithOwner() |  | ||||||
|                                 .HasForeignKey("MemberId") |  | ||||||
|                                 .HasConstraintName("fk_members_members_id"); |  | ||||||
|                         }); |  | ||||||
| 
 |  | ||||||
|                     b.OwnsOne("System.Collections.Generic.List<Foxnouns.Backend.Database.Models.Pronoun>", "Pronouns", b1 => |  | ||||||
|                         { |  | ||||||
|                             b1.Property<long>("MemberId") |  | ||||||
|                                 .HasColumnType("bigint"); |  | ||||||
| 
 |  | ||||||
|                             b1.Property<int>("Capacity") |  | ||||||
|                                 .HasColumnType("integer"); |  | ||||||
| 
 |  | ||||||
|                             b1.HasKey("MemberId"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToTable("members"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToJson("pronouns"); |  | ||||||
| 
 |  | ||||||
|                             b1.WithOwner() |  | ||||||
|                                 .HasForeignKey("MemberId") |  | ||||||
|                                 .HasConstraintName("fk_members_members_id"); |  | ||||||
|                         }); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Fields") |  | ||||||
|                         .IsRequired(); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Names") |  | ||||||
|                         .IsRequired(); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Pronouns") |  | ||||||
|                         .IsRequired(); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("User"); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.Token", b => |  | ||||||
|                 { |  | ||||||
|                     b.HasOne("Foxnouns.Backend.Database.Models.Application", "Application") |  | ||||||
|                         .WithMany() |  | ||||||
|                         .HasForeignKey("ApplicationId") |  | ||||||
|                         .OnDelete(DeleteBehavior.Cascade) |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasConstraintName("fk_tokens_applications_application_id"); |  | ||||||
| 
 |  | ||||||
|                     b.HasOne("Foxnouns.Backend.Database.Models.User", "User") |  | ||||||
|                         .WithMany() |  | ||||||
|                         .HasForeignKey("UserId") |  | ||||||
|                         .OnDelete(DeleteBehavior.Cascade) |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasConstraintName("fk_tokens_users_user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Application"); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("User"); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.User", b => |  | ||||||
|                 { |  | ||||||
|                     b.OwnsOne("Foxnouns.Backend.Database.Models.User.Fields#List", "Fields", b1 => |  | ||||||
|                         { |  | ||||||
|                             b1.Property<long>("UserId") |  | ||||||
|                                 .HasColumnType("bigint"); |  | ||||||
| 
 |  | ||||||
|                             b1.Property<int>("Capacity") |  | ||||||
|                                 .HasColumnType("integer"); |  | ||||||
| 
 |  | ||||||
|                             b1.HasKey("UserId") |  | ||||||
|                                 .HasName("pk_users"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToTable("users"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToJson("fields"); |  | ||||||
| 
 |  | ||||||
|                             b1.WithOwner() |  | ||||||
|                                 .HasForeignKey("UserId") |  | ||||||
|                                 .HasConstraintName("fk_users_users_user_id"); |  | ||||||
|                         }); |  | ||||||
| 
 |  | ||||||
|                     b.OwnsOne("Foxnouns.Backend.Database.Models.User.Names#List", "Names", b1 => |  | ||||||
|                         { |  | ||||||
|                             b1.Property<long>("UserId") |  | ||||||
|                                 .HasColumnType("bigint"); |  | ||||||
| 
 |  | ||||||
|                             b1.Property<int>("Capacity") |  | ||||||
|                                 .HasColumnType("integer"); |  | ||||||
| 
 |  | ||||||
|                             b1.HasKey("UserId") |  | ||||||
|                                 .HasName("pk_users"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToTable("users"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToJson("names"); |  | ||||||
| 
 |  | ||||||
|                             b1.WithOwner() |  | ||||||
|                                 .HasForeignKey("UserId") |  | ||||||
|                                 .HasConstraintName("fk_users_users_user_id"); |  | ||||||
|                         }); |  | ||||||
| 
 |  | ||||||
|                     b.OwnsOne("Foxnouns.Backend.Database.Models.User.Pronouns#List", "Pronouns", b1 => |  | ||||||
|                         { |  | ||||||
|                             b1.Property<long>("UserId") |  | ||||||
|                                 .HasColumnType("bigint"); |  | ||||||
| 
 |  | ||||||
|                             b1.Property<int>("Capacity") |  | ||||||
|                                 .HasColumnType("integer"); |  | ||||||
| 
 |  | ||||||
|                             b1.HasKey("UserId") |  | ||||||
|                                 .HasName("pk_users"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToTable("users"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToJson("pronouns"); |  | ||||||
| 
 |  | ||||||
|                             b1.WithOwner() |  | ||||||
|                                 .HasForeignKey("UserId") |  | ||||||
|                                 .HasConstraintName("fk_users_users_user_id"); |  | ||||||
|                         }); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Fields") |  | ||||||
|                         .IsRequired(); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Names") |  | ||||||
|                         .IsRequired(); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Pronouns") |  | ||||||
|                         .IsRequired(); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.User", b => |  | ||||||
|                 { |  | ||||||
|                     b.Navigation("AuthMethods"); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Members"); |  | ||||||
|                 }); |  | ||||||
| #pragma warning restore 612, 618 |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  | @ -1,4 +1,5 @@ | ||||||
| using Microsoft.EntityFrameworkCore.Migrations; | using Microsoft.EntityFrameworkCore.Migrations; | ||||||
|  | using Microsoft.EntityFrameworkCore.Infrastructure; | ||||||
| using NodaTime; | using NodaTime; | ||||||
| 
 | 
 | ||||||
| #nullable disable | #nullable disable | ||||||
|  | @ -6,6 +7,8 @@ using NodaTime; | ||||||
| namespace Foxnouns.Backend.Database.Migrations | namespace Foxnouns.Backend.Database.Migrations | ||||||
| { | { | ||||||
|     /// <inheritdoc /> |     /// <inheritdoc /> | ||||||
|  |     [DbContext(typeof(DatabaseContext))] | ||||||
|  |     [Migration("20240713000719_AddDeleted")] | ||||||
|     public partial class AddDeleted : Migration |     public partial class AddDeleted : Migration | ||||||
|     { |     { | ||||||
|         /// <inheritdoc /> |         /// <inheritdoc /> | ||||||
|  |  | ||||||
|  | @ -1,535 +0,0 @@ | ||||||
| // <auto-generated /> |  | ||||||
| using System; |  | ||||||
| using System.Collections.Generic; |  | ||||||
| using Foxnouns.Backend.Database; |  | ||||||
| using Foxnouns.Backend.Database.Models; |  | ||||||
| using Microsoft.EntityFrameworkCore; |  | ||||||
| using Microsoft.EntityFrameworkCore.Infrastructure; |  | ||||||
| using Microsoft.EntityFrameworkCore.Migrations; |  | ||||||
| using Microsoft.EntityFrameworkCore.Storage.ValueConversion; |  | ||||||
| using NodaTime; |  | ||||||
| using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; |  | ||||||
| 
 |  | ||||||
| #nullable disable |  | ||||||
| 
 |  | ||||||
| namespace Foxnouns.Backend.Database.Migrations |  | ||||||
| { |  | ||||||
|     [DbContext(typeof(DatabaseContext))] |  | ||||||
|     [Migration("20240821210355_AddCustomPreferences")] |  | ||||||
|     partial class AddCustomPreferences |  | ||||||
|     { |  | ||||||
|         /// <inheritdoc /> |  | ||||||
|         protected override void BuildTargetModel(ModelBuilder modelBuilder) |  | ||||||
|         { |  | ||||||
| #pragma warning disable 612, 618 |  | ||||||
|             modelBuilder |  | ||||||
|                 .HasAnnotation("ProductVersion", "8.0.7") |  | ||||||
|                 .HasAnnotation("Relational:MaxIdentifierLength", 63); |  | ||||||
| 
 |  | ||||||
|             NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.Application", b => |  | ||||||
|                 { |  | ||||||
|                     b.Property<long>("Id") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("ClientId") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("client_id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("ClientSecret") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("client_secret"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Name") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("name"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string[]>("RedirectUris") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text[]") |  | ||||||
|                         .HasColumnName("redirect_uris"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string[]>("Scopes") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text[]") |  | ||||||
|                         .HasColumnName("scopes"); |  | ||||||
| 
 |  | ||||||
|                     b.HasKey("Id") |  | ||||||
|                         .HasName("pk_applications"); |  | ||||||
| 
 |  | ||||||
|                     b.ToTable("applications", (string)null); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.AuthMethod", b => |  | ||||||
|                 { |  | ||||||
|                     b.Property<long>("Id") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<int>("AuthType") |  | ||||||
|                         .HasColumnType("integer") |  | ||||||
|                         .HasColumnName("auth_type"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<long?>("FediverseApplicationId") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("fediverse_application_id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("RemoteId") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("remote_id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("RemoteUsername") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("remote_username"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<long>("UserId") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.HasKey("Id") |  | ||||||
|                         .HasName("pk_auth_methods"); |  | ||||||
| 
 |  | ||||||
|                     b.HasIndex("FediverseApplicationId") |  | ||||||
|                         .HasDatabaseName("ix_auth_methods_fediverse_application_id"); |  | ||||||
| 
 |  | ||||||
|                     b.HasIndex("UserId") |  | ||||||
|                         .HasDatabaseName("ix_auth_methods_user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.ToTable("auth_methods", (string)null); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.FediverseApplication", b => |  | ||||||
|                 { |  | ||||||
|                     b.Property<long>("Id") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("ClientId") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("client_id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("ClientSecret") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("client_secret"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Domain") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("domain"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<int>("InstanceType") |  | ||||||
|                         .HasColumnType("integer") |  | ||||||
|                         .HasColumnName("instance_type"); |  | ||||||
| 
 |  | ||||||
|                     b.HasKey("Id") |  | ||||||
|                         .HasName("pk_fediverse_applications"); |  | ||||||
| 
 |  | ||||||
|                     b.ToTable("fediverse_applications", (string)null); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.Member", b => |  | ||||||
|                 { |  | ||||||
|                     b.Property<long>("Id") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Avatar") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("avatar"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Bio") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("bio"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("DisplayName") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("display_name"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string[]>("Links") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text[]") |  | ||||||
|                         .HasColumnName("links"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Name") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("name"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<bool>("Unlisted") |  | ||||||
|                         .HasColumnType("boolean") |  | ||||||
|                         .HasColumnName("unlisted"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<long>("UserId") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.HasKey("Id") |  | ||||||
|                         .HasName("pk_members"); |  | ||||||
| 
 |  | ||||||
|                     b.HasIndex("UserId", "Name") |  | ||||||
|                         .IsUnique() |  | ||||||
|                         .HasDatabaseName("ix_members_user_id_name"); |  | ||||||
| 
 |  | ||||||
|                     b.ToTable("members", (string)null); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.TemporaryKey", b => |  | ||||||
|                 { |  | ||||||
|                     b.Property<long>("Id") |  | ||||||
|                         .ValueGeneratedOnAdd() |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("id"); |  | ||||||
| 
 |  | ||||||
|                     NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id")); |  | ||||||
| 
 |  | ||||||
|                     b.Property<Instant>("Expires") |  | ||||||
|                         .HasColumnType("timestamp with time zone") |  | ||||||
|                         .HasColumnName("expires"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Key") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("key"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Value") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("value"); |  | ||||||
| 
 |  | ||||||
|                     b.HasKey("Id") |  | ||||||
|                         .HasName("pk_temporary_keys"); |  | ||||||
| 
 |  | ||||||
|                     b.HasIndex("Key") |  | ||||||
|                         .IsUnique() |  | ||||||
|                         .HasDatabaseName("ix_temporary_keys_key"); |  | ||||||
| 
 |  | ||||||
|                     b.ToTable("temporary_keys", (string)null); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.Token", b => |  | ||||||
|                 { |  | ||||||
|                     b.Property<long>("Id") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<long>("ApplicationId") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("application_id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<Instant>("ExpiresAt") |  | ||||||
|                         .HasColumnType("timestamp with time zone") |  | ||||||
|                         .HasColumnName("expires_at"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<byte[]>("Hash") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("bytea") |  | ||||||
|                         .HasColumnName("hash"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<bool>("ManuallyExpired") |  | ||||||
|                         .HasColumnType("boolean") |  | ||||||
|                         .HasColumnName("manually_expired"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string[]>("Scopes") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text[]") |  | ||||||
|                         .HasColumnName("scopes"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<long>("UserId") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.HasKey("Id") |  | ||||||
|                         .HasName("pk_tokens"); |  | ||||||
| 
 |  | ||||||
|                     b.HasIndex("ApplicationId") |  | ||||||
|                         .HasDatabaseName("ix_tokens_application_id"); |  | ||||||
| 
 |  | ||||||
|                     b.HasIndex("UserId") |  | ||||||
|                         .HasDatabaseName("ix_tokens_user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.ToTable("tokens", (string)null); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.User", b => |  | ||||||
|                 { |  | ||||||
|                     b.Property<long>("Id") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Avatar") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("avatar"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Bio") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("bio"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<Dictionary<Guid, User.CustomPreference>>("CustomPreferences") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("jsonb") |  | ||||||
|                         .HasColumnName("custom_preferences"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<bool>("Deleted") |  | ||||||
|                         .HasColumnType("boolean") |  | ||||||
|                         .HasColumnName("deleted"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<Instant?>("DeletedAt") |  | ||||||
|                         .HasColumnType("timestamp with time zone") |  | ||||||
|                         .HasColumnName("deleted_at"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<long?>("DeletedBy") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("deleted_by"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("DisplayName") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("display_name"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<Instant>("LastActive") |  | ||||||
|                         .HasColumnType("timestamp with time zone") |  | ||||||
|                         .HasColumnName("last_active"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string[]>("Links") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text[]") |  | ||||||
|                         .HasColumnName("links"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<bool>("ListHidden") |  | ||||||
|                         .HasColumnType("boolean") |  | ||||||
|                         .HasColumnName("list_hidden"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("MemberTitle") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("member_title"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Password") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("password"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<int>("Role") |  | ||||||
|                         .HasColumnType("integer") |  | ||||||
|                         .HasColumnName("role"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Username") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("username"); |  | ||||||
| 
 |  | ||||||
|                     b.HasKey("Id") |  | ||||||
|                         .HasName("pk_users"); |  | ||||||
| 
 |  | ||||||
|                     b.HasIndex("Username") |  | ||||||
|                         .IsUnique() |  | ||||||
|                         .HasDatabaseName("ix_users_username"); |  | ||||||
| 
 |  | ||||||
|                     b.ToTable("users", (string)null); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.AuthMethod", b => |  | ||||||
|                 { |  | ||||||
|                     b.HasOne("Foxnouns.Backend.Database.Models.FediverseApplication", "FediverseApplication") |  | ||||||
|                         .WithMany() |  | ||||||
|                         .HasForeignKey("FediverseApplicationId") |  | ||||||
|                         .HasConstraintName("fk_auth_methods_fediverse_applications_fediverse_application_id"); |  | ||||||
| 
 |  | ||||||
|                     b.HasOne("Foxnouns.Backend.Database.Models.User", "User") |  | ||||||
|                         .WithMany("AuthMethods") |  | ||||||
|                         .HasForeignKey("UserId") |  | ||||||
|                         .OnDelete(DeleteBehavior.Cascade) |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasConstraintName("fk_auth_methods_users_user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("FediverseApplication"); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("User"); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.Member", b => |  | ||||||
|                 { |  | ||||||
|                     b.HasOne("Foxnouns.Backend.Database.Models.User", "User") |  | ||||||
|                         .WithMany("Members") |  | ||||||
|                         .HasForeignKey("UserId") |  | ||||||
|                         .OnDelete(DeleteBehavior.Cascade) |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasConstraintName("fk_members_users_user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.OwnsOne("System.Collections.Generic.List<Foxnouns.Backend.Database.Models.Field>", "Fields", b1 => |  | ||||||
|                         { |  | ||||||
|                             b1.Property<long>("MemberId") |  | ||||||
|                                 .HasColumnType("bigint"); |  | ||||||
| 
 |  | ||||||
|                             b1.Property<int>("Capacity") |  | ||||||
|                                 .HasColumnType("integer"); |  | ||||||
| 
 |  | ||||||
|                             b1.HasKey("MemberId"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToTable("members"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToJson("fields"); |  | ||||||
| 
 |  | ||||||
|                             b1.WithOwner() |  | ||||||
|                                 .HasForeignKey("MemberId") |  | ||||||
|                                 .HasConstraintName("fk_members_members_id"); |  | ||||||
|                         }); |  | ||||||
| 
 |  | ||||||
|                     b.OwnsOne("System.Collections.Generic.List<Foxnouns.Backend.Database.Models.FieldEntry>", "Names", b1 => |  | ||||||
|                         { |  | ||||||
|                             b1.Property<long>("MemberId") |  | ||||||
|                                 .HasColumnType("bigint"); |  | ||||||
| 
 |  | ||||||
|                             b1.Property<int>("Capacity") |  | ||||||
|                                 .HasColumnType("integer"); |  | ||||||
| 
 |  | ||||||
|                             b1.HasKey("MemberId"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToTable("members"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToJson("names"); |  | ||||||
| 
 |  | ||||||
|                             b1.WithOwner() |  | ||||||
|                                 .HasForeignKey("MemberId") |  | ||||||
|                                 .HasConstraintName("fk_members_members_id"); |  | ||||||
|                         }); |  | ||||||
| 
 |  | ||||||
|                     b.OwnsOne("System.Collections.Generic.List<Foxnouns.Backend.Database.Models.Pronoun>", "Pronouns", b1 => |  | ||||||
|                         { |  | ||||||
|                             b1.Property<long>("MemberId") |  | ||||||
|                                 .HasColumnType("bigint"); |  | ||||||
| 
 |  | ||||||
|                             b1.Property<int>("Capacity") |  | ||||||
|                                 .HasColumnType("integer"); |  | ||||||
| 
 |  | ||||||
|                             b1.HasKey("MemberId"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToTable("members"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToJson("pronouns"); |  | ||||||
| 
 |  | ||||||
|                             b1.WithOwner() |  | ||||||
|                                 .HasForeignKey("MemberId") |  | ||||||
|                                 .HasConstraintName("fk_members_members_id"); |  | ||||||
|                         }); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Fields") |  | ||||||
|                         .IsRequired(); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Names") |  | ||||||
|                         .IsRequired(); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Pronouns") |  | ||||||
|                         .IsRequired(); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("User"); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.Token", b => |  | ||||||
|                 { |  | ||||||
|                     b.HasOne("Foxnouns.Backend.Database.Models.Application", "Application") |  | ||||||
|                         .WithMany() |  | ||||||
|                         .HasForeignKey("ApplicationId") |  | ||||||
|                         .OnDelete(DeleteBehavior.Cascade) |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasConstraintName("fk_tokens_applications_application_id"); |  | ||||||
| 
 |  | ||||||
|                     b.HasOne("Foxnouns.Backend.Database.Models.User", "User") |  | ||||||
|                         .WithMany() |  | ||||||
|                         .HasForeignKey("UserId") |  | ||||||
|                         .OnDelete(DeleteBehavior.Cascade) |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasConstraintName("fk_tokens_users_user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Application"); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("User"); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.User", b => |  | ||||||
|                 { |  | ||||||
|                     b.OwnsOne("Foxnouns.Backend.Database.Models.User.Fields#List", "Fields", b1 => |  | ||||||
|                         { |  | ||||||
|                             b1.Property<long>("UserId") |  | ||||||
|                                 .HasColumnType("bigint"); |  | ||||||
| 
 |  | ||||||
|                             b1.Property<int>("Capacity") |  | ||||||
|                                 .HasColumnType("integer"); |  | ||||||
| 
 |  | ||||||
|                             b1.HasKey("UserId") |  | ||||||
|                                 .HasName("pk_users"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToTable("users"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToJson("fields"); |  | ||||||
| 
 |  | ||||||
|                             b1.WithOwner() |  | ||||||
|                                 .HasForeignKey("UserId") |  | ||||||
|                                 .HasConstraintName("fk_users_users_user_id"); |  | ||||||
|                         }); |  | ||||||
| 
 |  | ||||||
|                     b.OwnsOne("Foxnouns.Backend.Database.Models.User.Names#List", "Names", b1 => |  | ||||||
|                         { |  | ||||||
|                             b1.Property<long>("UserId") |  | ||||||
|                                 .HasColumnType("bigint"); |  | ||||||
| 
 |  | ||||||
|                             b1.Property<int>("Capacity") |  | ||||||
|                                 .HasColumnType("integer"); |  | ||||||
| 
 |  | ||||||
|                             b1.HasKey("UserId") |  | ||||||
|                                 .HasName("pk_users"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToTable("users"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToJson("names"); |  | ||||||
| 
 |  | ||||||
|                             b1.WithOwner() |  | ||||||
|                                 .HasForeignKey("UserId") |  | ||||||
|                                 .HasConstraintName("fk_users_users_user_id"); |  | ||||||
|                         }); |  | ||||||
| 
 |  | ||||||
|                     b.OwnsOne("Foxnouns.Backend.Database.Models.User.Pronouns#List", "Pronouns", b1 => |  | ||||||
|                         { |  | ||||||
|                             b1.Property<long>("UserId") |  | ||||||
|                                 .HasColumnType("bigint"); |  | ||||||
| 
 |  | ||||||
|                             b1.Property<int>("Capacity") |  | ||||||
|                                 .HasColumnType("integer"); |  | ||||||
| 
 |  | ||||||
|                             b1.HasKey("UserId") |  | ||||||
|                                 .HasName("pk_users"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToTable("users"); |  | ||||||
| 
 |  | ||||||
|                             b1.ToJson("pronouns"); |  | ||||||
| 
 |  | ||||||
|                             b1.WithOwner() |  | ||||||
|                                 .HasForeignKey("UserId") |  | ||||||
|                                 .HasConstraintName("fk_users_users_user_id"); |  | ||||||
|                         }); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Fields") |  | ||||||
|                         .IsRequired(); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Names") |  | ||||||
|                         .IsRequired(); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Pronouns") |  | ||||||
|                         .IsRequired(); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.User", b => |  | ||||||
|                 { |  | ||||||
|                     b.Navigation("AuthMethods"); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Members"); |  | ||||||
|                 }); |  | ||||||
| #pragma warning restore 612, 618 |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  | @ -1,4 +1,5 @@ | ||||||
| using System; | using System; | ||||||
|  | using Microsoft.EntityFrameworkCore.Infrastructure; | ||||||
| using System.Collections.Generic; | using System.Collections.Generic; | ||||||
| using Foxnouns.Backend.Database.Models; | using Foxnouns.Backend.Database.Models; | ||||||
| using Microsoft.EntityFrameworkCore.Migrations; | using Microsoft.EntityFrameworkCore.Migrations; | ||||||
|  | @ -8,6 +9,8 @@ using Microsoft.EntityFrameworkCore.Migrations; | ||||||
| namespace Foxnouns.Backend.Database.Migrations | namespace Foxnouns.Backend.Database.Migrations | ||||||
| { | { | ||||||
|     /// <inheritdoc /> |     /// <inheritdoc /> | ||||||
|  |     [DbContext(typeof(DatabaseContext))] | ||||||
|  |     [Migration("20240821210355_AddCustomPreferences")] | ||||||
|     public partial class AddCustomPreferences : Migration |     public partial class AddCustomPreferences : Migration | ||||||
|     { |     { | ||||||
|         /// <inheritdoc /> |         /// <inheritdoc /> | ||||||
|  |  | ||||||
|  | @ -1,432 +0,0 @@ | ||||||
| // <auto-generated /> |  | ||||||
| using System; |  | ||||||
| using System.Collections.Generic; |  | ||||||
| using Foxnouns.Backend.Database; |  | ||||||
| using Foxnouns.Backend.Database.Models; |  | ||||||
| using Microsoft.EntityFrameworkCore; |  | ||||||
| using Microsoft.EntityFrameworkCore.Infrastructure; |  | ||||||
| using Microsoft.EntityFrameworkCore.Migrations; |  | ||||||
| using Microsoft.EntityFrameworkCore.Storage.ValueConversion; |  | ||||||
| using NodaTime; |  | ||||||
| using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; |  | ||||||
| 
 |  | ||||||
| #nullable disable |  | ||||||
| 
 |  | ||||||
| namespace Foxnouns.Backend.Database.Migrations |  | ||||||
| { |  | ||||||
|     [DbContext(typeof(DatabaseContext))] |  | ||||||
|     [Migration("20240905191709_AddUserSettings")] |  | ||||||
|     partial class AddUserSettings |  | ||||||
|     { |  | ||||||
|         /// <inheritdoc /> |  | ||||||
|         protected override void BuildTargetModel(ModelBuilder modelBuilder) |  | ||||||
|         { |  | ||||||
| #pragma warning disable 612, 618 |  | ||||||
|             modelBuilder |  | ||||||
|                 .HasAnnotation("ProductVersion", "8.0.7") |  | ||||||
|                 .HasAnnotation("Relational:MaxIdentifierLength", 63); |  | ||||||
| 
 |  | ||||||
|             NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.Application", b => |  | ||||||
|                 { |  | ||||||
|                     b.Property<long>("Id") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("ClientId") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("client_id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("ClientSecret") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("client_secret"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Name") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("name"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string[]>("RedirectUris") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text[]") |  | ||||||
|                         .HasColumnName("redirect_uris"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string[]>("Scopes") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text[]") |  | ||||||
|                         .HasColumnName("scopes"); |  | ||||||
| 
 |  | ||||||
|                     b.HasKey("Id") |  | ||||||
|                         .HasName("pk_applications"); |  | ||||||
| 
 |  | ||||||
|                     b.ToTable("applications", (string)null); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.AuthMethod", b => |  | ||||||
|                 { |  | ||||||
|                     b.Property<long>("Id") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<int>("AuthType") |  | ||||||
|                         .HasColumnType("integer") |  | ||||||
|                         .HasColumnName("auth_type"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<long?>("FediverseApplicationId") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("fediverse_application_id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("RemoteId") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("remote_id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("RemoteUsername") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("remote_username"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<long>("UserId") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.HasKey("Id") |  | ||||||
|                         .HasName("pk_auth_methods"); |  | ||||||
| 
 |  | ||||||
|                     b.HasIndex("FediverseApplicationId") |  | ||||||
|                         .HasDatabaseName("ix_auth_methods_fediverse_application_id"); |  | ||||||
| 
 |  | ||||||
|                     b.HasIndex("UserId") |  | ||||||
|                         .HasDatabaseName("ix_auth_methods_user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.ToTable("auth_methods", (string)null); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.FediverseApplication", b => |  | ||||||
|                 { |  | ||||||
|                     b.Property<long>("Id") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("ClientId") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("client_id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("ClientSecret") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("client_secret"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Domain") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("domain"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<int>("InstanceType") |  | ||||||
|                         .HasColumnType("integer") |  | ||||||
|                         .HasColumnName("instance_type"); |  | ||||||
| 
 |  | ||||||
|                     b.HasKey("Id") |  | ||||||
|                         .HasName("pk_fediverse_applications"); |  | ||||||
| 
 |  | ||||||
|                     b.ToTable("fediverse_applications", (string)null); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.Member", b => |  | ||||||
|                 { |  | ||||||
|                     b.Property<long>("Id") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Avatar") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("avatar"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Bio") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("bio"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("DisplayName") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("display_name"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<List<Field>>("Fields") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("jsonb") |  | ||||||
|                         .HasColumnName("fields"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string[]>("Links") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text[]") |  | ||||||
|                         .HasColumnName("links"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Name") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("name"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<List<FieldEntry>>("Names") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("jsonb") |  | ||||||
|                         .HasColumnName("names"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<List<Pronoun>>("Pronouns") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("jsonb") |  | ||||||
|                         .HasColumnName("pronouns"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<bool>("Unlisted") |  | ||||||
|                         .HasColumnType("boolean") |  | ||||||
|                         .HasColumnName("unlisted"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<long>("UserId") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.HasKey("Id") |  | ||||||
|                         .HasName("pk_members"); |  | ||||||
| 
 |  | ||||||
|                     b.HasIndex("UserId", "Name") |  | ||||||
|                         .IsUnique() |  | ||||||
|                         .HasDatabaseName("ix_members_user_id_name"); |  | ||||||
| 
 |  | ||||||
|                     b.ToTable("members", (string)null); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.TemporaryKey", b => |  | ||||||
|                 { |  | ||||||
|                     b.Property<long>("Id") |  | ||||||
|                         .ValueGeneratedOnAdd() |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("id"); |  | ||||||
| 
 |  | ||||||
|                     NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id")); |  | ||||||
| 
 |  | ||||||
|                     b.Property<Instant>("Expires") |  | ||||||
|                         .HasColumnType("timestamp with time zone") |  | ||||||
|                         .HasColumnName("expires"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Key") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("key"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Value") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("value"); |  | ||||||
| 
 |  | ||||||
|                     b.HasKey("Id") |  | ||||||
|                         .HasName("pk_temporary_keys"); |  | ||||||
| 
 |  | ||||||
|                     b.HasIndex("Key") |  | ||||||
|                         .IsUnique() |  | ||||||
|                         .HasDatabaseName("ix_temporary_keys_key"); |  | ||||||
| 
 |  | ||||||
|                     b.ToTable("temporary_keys", (string)null); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.Token", b => |  | ||||||
|                 { |  | ||||||
|                     b.Property<long>("Id") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<long>("ApplicationId") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("application_id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<Instant>("ExpiresAt") |  | ||||||
|                         .HasColumnType("timestamp with time zone") |  | ||||||
|                         .HasColumnName("expires_at"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<byte[]>("Hash") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("bytea") |  | ||||||
|                         .HasColumnName("hash"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<bool>("ManuallyExpired") |  | ||||||
|                         .HasColumnType("boolean") |  | ||||||
|                         .HasColumnName("manually_expired"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string[]>("Scopes") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text[]") |  | ||||||
|                         .HasColumnName("scopes"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<long>("UserId") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.HasKey("Id") |  | ||||||
|                         .HasName("pk_tokens"); |  | ||||||
| 
 |  | ||||||
|                     b.HasIndex("ApplicationId") |  | ||||||
|                         .HasDatabaseName("ix_tokens_application_id"); |  | ||||||
| 
 |  | ||||||
|                     b.HasIndex("UserId") |  | ||||||
|                         .HasDatabaseName("ix_tokens_user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.ToTable("tokens", (string)null); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.User", b => |  | ||||||
|                 { |  | ||||||
|                     b.Property<long>("Id") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("id"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Avatar") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("avatar"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Bio") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("bio"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<Dictionary<Snowflake, User.CustomPreference>>("CustomPreferences") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("jsonb") |  | ||||||
|                         .HasColumnName("custom_preferences"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<bool>("Deleted") |  | ||||||
|                         .HasColumnType("boolean") |  | ||||||
|                         .HasColumnName("deleted"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<Instant?>("DeletedAt") |  | ||||||
|                         .HasColumnType("timestamp with time zone") |  | ||||||
|                         .HasColumnName("deleted_at"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<long?>("DeletedBy") |  | ||||||
|                         .HasColumnType("bigint") |  | ||||||
|                         .HasColumnName("deleted_by"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("DisplayName") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("display_name"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<List<Field>>("Fields") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("jsonb") |  | ||||||
|                         .HasColumnName("fields"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<Instant>("LastActive") |  | ||||||
|                         .HasColumnType("timestamp with time zone") |  | ||||||
|                         .HasColumnName("last_active"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string[]>("Links") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text[]") |  | ||||||
|                         .HasColumnName("links"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<bool>("ListHidden") |  | ||||||
|                         .HasColumnType("boolean") |  | ||||||
|                         .HasColumnName("list_hidden"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("MemberTitle") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("member_title"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<List<FieldEntry>>("Names") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("jsonb") |  | ||||||
|                         .HasColumnName("names"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Password") |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("password"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<List<Pronoun>>("Pronouns") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("jsonb") |  | ||||||
|                         .HasColumnName("pronouns"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<int>("Role") |  | ||||||
|                         .HasColumnType("integer") |  | ||||||
|                         .HasColumnName("role"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<UserSettings>("Settings") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("jsonb") |  | ||||||
|                         .HasColumnName("settings"); |  | ||||||
| 
 |  | ||||||
|                     b.Property<string>("Username") |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasColumnType("text") |  | ||||||
|                         .HasColumnName("username"); |  | ||||||
| 
 |  | ||||||
|                     b.HasKey("Id") |  | ||||||
|                         .HasName("pk_users"); |  | ||||||
| 
 |  | ||||||
|                     b.HasIndex("Username") |  | ||||||
|                         .IsUnique() |  | ||||||
|                         .HasDatabaseName("ix_users_username"); |  | ||||||
| 
 |  | ||||||
|                     b.ToTable("users", (string)null); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.AuthMethod", b => |  | ||||||
|                 { |  | ||||||
|                     b.HasOne("Foxnouns.Backend.Database.Models.FediverseApplication", "FediverseApplication") |  | ||||||
|                         .WithMany() |  | ||||||
|                         .HasForeignKey("FediverseApplicationId") |  | ||||||
|                         .HasConstraintName("fk_auth_methods_fediverse_applications_fediverse_application_id"); |  | ||||||
| 
 |  | ||||||
|                     b.HasOne("Foxnouns.Backend.Database.Models.User", "User") |  | ||||||
|                         .WithMany("AuthMethods") |  | ||||||
|                         .HasForeignKey("UserId") |  | ||||||
|                         .OnDelete(DeleteBehavior.Cascade) |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasConstraintName("fk_auth_methods_users_user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("FediverseApplication"); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("User"); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.Member", b => |  | ||||||
|                 { |  | ||||||
|                     b.HasOne("Foxnouns.Backend.Database.Models.User", "User") |  | ||||||
|                         .WithMany("Members") |  | ||||||
|                         .HasForeignKey("UserId") |  | ||||||
|                         .OnDelete(DeleteBehavior.Cascade) |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasConstraintName("fk_members_users_user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("User"); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.Token", b => |  | ||||||
|                 { |  | ||||||
|                     b.HasOne("Foxnouns.Backend.Database.Models.Application", "Application") |  | ||||||
|                         .WithMany() |  | ||||||
|                         .HasForeignKey("ApplicationId") |  | ||||||
|                         .OnDelete(DeleteBehavior.Cascade) |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasConstraintName("fk_tokens_applications_application_id"); |  | ||||||
| 
 |  | ||||||
|                     b.HasOne("Foxnouns.Backend.Database.Models.User", "User") |  | ||||||
|                         .WithMany() |  | ||||||
|                         .HasForeignKey("UserId") |  | ||||||
|                         .OnDelete(DeleteBehavior.Cascade) |  | ||||||
|                         .IsRequired() |  | ||||||
|                         .HasConstraintName("fk_tokens_users_user_id"); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Application"); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("User"); |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|             modelBuilder.Entity("Foxnouns.Backend.Database.Models.User", b => |  | ||||||
|                 { |  | ||||||
|                     b.Navigation("AuthMethods"); |  | ||||||
| 
 |  | ||||||
|                     b.Navigation("Members"); |  | ||||||
|                 }); |  | ||||||
| #pragma warning restore 612, 618 |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  | @ -1,4 +1,5 @@ | ||||||
| using Foxnouns.Backend.Database.Models; | using Foxnouns.Backend.Database.Models; | ||||||
|  | using Microsoft.EntityFrameworkCore.Infrastructure; | ||||||
| using Microsoft.EntityFrameworkCore.Migrations; | using Microsoft.EntityFrameworkCore.Migrations; | ||||||
| 
 | 
 | ||||||
| #nullable disable | #nullable disable | ||||||
|  | @ -6,6 +7,8 @@ using Microsoft.EntityFrameworkCore.Migrations; | ||||||
| namespace Foxnouns.Backend.Database.Migrations | namespace Foxnouns.Backend.Database.Migrations | ||||||
| { | { | ||||||
|     /// <inheritdoc /> |     /// <inheritdoc /> | ||||||
|  |     [DbContext(typeof(DatabaseContext))] | ||||||
|  |     [Migration("20240905191709_AddUserSettings")] | ||||||
|     public partial class AddUserSettings : Migration |     public partial class AddUserSettings : Migration | ||||||
|     { |     { | ||||||
|         /// <inheritdoc /> |         /// <inheritdoc /> | ||||||
|  |  | ||||||
							
								
								
									
										101
									
								
								Foxnouns.Backend/Database/Migrations/20240926124950_AddSids.cs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										101
									
								
								Foxnouns.Backend/Database/Migrations/20240926124950_AddSids.cs
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,101 @@ | ||||||
|  | using Microsoft.EntityFrameworkCore.Migrations; | ||||||
|  | using Microsoft.EntityFrameworkCore.Infrastructure; | ||||||
|  | using NodaTime; | ||||||
|  | 
 | ||||||
|  | #nullable disable | ||||||
|  | 
 | ||||||
|  | namespace Foxnouns.Backend.Database.Migrations | ||||||
|  | { | ||||||
|  |     /// <inheritdoc /> | ||||||
|  |     [DbContext(typeof(DatabaseContext))] | ||||||
|  |     [Migration("20240926124950_AddSids")] | ||||||
|  |     public partial class AddSids : Migration | ||||||
|  |     { | ||||||
|  |         /// <inheritdoc /> | ||||||
|  |         protected override void Up(MigrationBuilder migrationBuilder) | ||||||
|  |         { | ||||||
|  |             migrationBuilder.AddColumn<string>( | ||||||
|  |                 name: "sid", | ||||||
|  |                 table: "users", | ||||||
|  |                 type: "text", | ||||||
|  |                 nullable: true); | ||||||
|  | 
 | ||||||
|  |             migrationBuilder.AddColumn<Instant>( | ||||||
|  |                 name: "last_sid_reroll", | ||||||
|  |                 table: "users", | ||||||
|  |                 type: "timestamp with time zone", | ||||||
|  |                 nullable: false, | ||||||
|  |                 defaultValueSql: "now() - '1 hour'::interval"); | ||||||
|  | 
 | ||||||
|  |             migrationBuilder.AddColumn<string>( | ||||||
|  |                 name: "sid", | ||||||
|  |                 table: "members", | ||||||
|  |                 type: "text", | ||||||
|  |                 nullable: true); | ||||||
|  | 
 | ||||||
|  |             migrationBuilder.CreateIndex( | ||||||
|  |                 name: "ix_users_sid", | ||||||
|  |                 table: "users", | ||||||
|  |                 column: "sid", | ||||||
|  |                 unique: true); | ||||||
|  | 
 | ||||||
|  |             migrationBuilder.CreateIndex( | ||||||
|  |                 name: "ix_members_sid", | ||||||
|  |                 table: "members", | ||||||
|  |                 column: "sid", | ||||||
|  |                 unique: true); | ||||||
|  | 
 | ||||||
|  |             migrationBuilder.Sql(@"create function generate_sid(len int) returns text as $$
 | ||||||
|  |     select string_agg(substr('abcdefghijklmnopqrstuvwxyz', ceil(random() * 26)::integer, 1), '') from generate_series(1, len) | ||||||
|  | $$ language sql volatile; | ||||||
|  | ");
 | ||||||
|  |             migrationBuilder.Sql(@"create function find_free_user_sid() returns text as $$
 | ||||||
|  | declare new_sid text; | ||||||
|  | begin | ||||||
|  |     loop | ||||||
|  |         new_sid := generate_sid(5); | ||||||
|  |         if not exists (select 1 from users where sid = new_sid) then return new_sid; end if; | ||||||
|  |     end loop; | ||||||
|  | end | ||||||
|  | $$ language plpgsql volatile; | ||||||
|  | ");
 | ||||||
|  |             migrationBuilder.Sql(@"create function find_free_member_sid() returns text as $$
 | ||||||
|  | declare new_sid text; | ||||||
|  | begin | ||||||
|  |     loop | ||||||
|  |         new_sid := generate_sid(6); | ||||||
|  |         if not exists (select 1 from members where sid = new_sid) then return new_sid; end if; | ||||||
|  |     end loop; | ||||||
|  | end | ||||||
|  | $$ language plpgsql volatile;");
 | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         /// <inheritdoc /> | ||||||
|  |         protected override void Down(MigrationBuilder migrationBuilder) | ||||||
|  |         { | ||||||
|  |             migrationBuilder.Sql("drop function find_free_member_sid;"); | ||||||
|  |             migrationBuilder.Sql("drop function find_free_user_sid;"); | ||||||
|  |             migrationBuilder.Sql("drop function generate_sid;"); | ||||||
|  | 
 | ||||||
|  |             migrationBuilder.DropIndex( | ||||||
|  |                 name: "ix_users_sid", | ||||||
|  |                 table: "users"); | ||||||
|  | 
 | ||||||
|  |             migrationBuilder.DropIndex( | ||||||
|  |                 name: "ix_members_sid", | ||||||
|  |                 table: "members"); | ||||||
|  | 
 | ||||||
|  |             migrationBuilder.DropColumn( | ||||||
|  |                 name: "sid", | ||||||
|  |                 table: "users"); | ||||||
|  | 
 | ||||||
|  |             migrationBuilder.DropColumn( | ||||||
|  |                 name: "last_sid_reroll", | ||||||
|  |                 table: "users"); | ||||||
|  | 
 | ||||||
|  |             migrationBuilder.DropColumn( | ||||||
|  |                 name: "sid", | ||||||
|  |                 table: "members"); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -0,0 +1,60 @@ | ||||||
|  | using Microsoft.EntityFrameworkCore.Migrations; | ||||||
|  | using Microsoft.EntityFrameworkCore.Infrastructure; | ||||||
|  | using NodaTime; | ||||||
|  | 
 | ||||||
|  | #nullable disable | ||||||
|  | 
 | ||||||
|  | namespace Foxnouns.Backend.Database.Migrations | ||||||
|  | { | ||||||
|  |     /// <inheritdoc /> | ||||||
|  |     [DbContext(typeof(DatabaseContext))] | ||||||
|  |     [Migration("20240926130208_NonNullableSids")] | ||||||
|  |     public partial class NonNullableSids : Migration | ||||||
|  |     { | ||||||
|  |         /// <inheritdoc /> | ||||||
|  |         protected override void Up(MigrationBuilder migrationBuilder) | ||||||
|  |         { | ||||||
|  |             migrationBuilder.AlterColumn<string>( | ||||||
|  |                 name: "sid", | ||||||
|  |                 table: "users", | ||||||
|  |                 type: "text", | ||||||
|  |                 nullable: false, | ||||||
|  |                 defaultValueSql: "find_free_user_sid()", | ||||||
|  |                 oldClrType: typeof(string), | ||||||
|  |                 oldType: "text", | ||||||
|  |                 oldNullable: true); | ||||||
|  | 
 | ||||||
|  |             migrationBuilder.AlterColumn<string>( | ||||||
|  |                 name: "sid", | ||||||
|  |                 table: "members", | ||||||
|  |                 type: "text", | ||||||
|  |                 nullable: false, | ||||||
|  |                 defaultValueSql: "find_free_member_sid()", | ||||||
|  |                 oldClrType: typeof(string), | ||||||
|  |                 oldType: "text", | ||||||
|  |                 oldNullable: true); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         /// <inheritdoc /> | ||||||
|  |         protected override void Down(MigrationBuilder migrationBuilder) | ||||||
|  |         { | ||||||
|  |             migrationBuilder.AlterColumn<string>( | ||||||
|  |                 name: "sid", | ||||||
|  |                 table: "users", | ||||||
|  |                 type: "text", | ||||||
|  |                 nullable: true, | ||||||
|  |                 oldClrType: typeof(string), | ||||||
|  |                 oldType: "text", | ||||||
|  |                 oldDefaultValueSql: "find_free_user_sid()"); | ||||||
|  | 
 | ||||||
|  |             migrationBuilder.AlterColumn<string>( | ||||||
|  |                 name: "sid", | ||||||
|  |                 table: "members", | ||||||
|  |                 type: "text", | ||||||
|  |                 nullable: true, | ||||||
|  |                 oldClrType: typeof(string), | ||||||
|  |                 oldType: "text", | ||||||
|  |                 oldDefaultValueSql: "find_free_member_sid()"); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -175,6 +175,13 @@ namespace Foxnouns.Backend.Database.Migrations | ||||||
|                         .HasColumnType("jsonb") |                         .HasColumnType("jsonb") | ||||||
|                         .HasColumnName("pronouns"); |                         .HasColumnName("pronouns"); | ||||||
| 
 | 
 | ||||||
|  |                     b.Property<string>("Sid") | ||||||
|  |                         .IsRequired() | ||||||
|  |                         .ValueGeneratedOnAdd() | ||||||
|  |                         .HasColumnType("text") | ||||||
|  |                         .HasColumnName("sid") | ||||||
|  |                         .HasDefaultValueSql("find_free_member_sid()"); | ||||||
|  | 
 | ||||||
|                     b.Property<bool>("Unlisted") |                     b.Property<bool>("Unlisted") | ||||||
|                         .HasColumnType("boolean") |                         .HasColumnType("boolean") | ||||||
|                         .HasColumnName("unlisted"); |                         .HasColumnName("unlisted"); | ||||||
|  | @ -186,6 +193,10 @@ namespace Foxnouns.Backend.Database.Migrations | ||||||
|                     b.HasKey("Id") |                     b.HasKey("Id") | ||||||
|                         .HasName("pk_members"); |                         .HasName("pk_members"); | ||||||
| 
 | 
 | ||||||
|  |                     b.HasIndex("Sid") | ||||||
|  |                         .IsUnique() | ||||||
|  |                         .HasDatabaseName("ix_members_sid"); | ||||||
|  | 
 | ||||||
|                     b.HasIndex("UserId", "Name") |                     b.HasIndex("UserId", "Name") | ||||||
|                         .IsUnique() |                         .IsUnique() | ||||||
|                         .HasDatabaseName("ix_members_user_id_name"); |                         .HasDatabaseName("ix_members_user_id_name"); | ||||||
|  | @ -314,6 +325,10 @@ namespace Foxnouns.Backend.Database.Migrations | ||||||
|                         .HasColumnType("timestamp with time zone") |                         .HasColumnType("timestamp with time zone") | ||||||
|                         .HasColumnName("last_active"); |                         .HasColumnName("last_active"); | ||||||
| 
 | 
 | ||||||
|  |                     b.Property<Instant>("LastSidReroll") | ||||||
|  |                         .HasColumnType("timestamp with time zone") | ||||||
|  |                         .HasColumnName("last_sid_reroll"); | ||||||
|  | 
 | ||||||
|                     b.Property<string[]>("Links") |                     b.Property<string[]>("Links") | ||||||
|                         .IsRequired() |                         .IsRequired() | ||||||
|                         .HasColumnType("text[]") |                         .HasColumnType("text[]") | ||||||
|  | @ -350,6 +365,13 @@ namespace Foxnouns.Backend.Database.Migrations | ||||||
|                         .HasColumnType("jsonb") |                         .HasColumnType("jsonb") | ||||||
|                         .HasColumnName("settings"); |                         .HasColumnName("settings"); | ||||||
| 
 | 
 | ||||||
|  |                     b.Property<string>("Sid") | ||||||
|  |                         .IsRequired() | ||||||
|  |                         .ValueGeneratedOnAdd() | ||||||
|  |                         .HasColumnType("text") | ||||||
|  |                         .HasColumnName("sid") | ||||||
|  |                         .HasDefaultValueSql("find_free_user_sid()"); | ||||||
|  | 
 | ||||||
|                     b.Property<string>("Username") |                     b.Property<string>("Username") | ||||||
|                         .IsRequired() |                         .IsRequired() | ||||||
|                         .HasColumnType("text") |                         .HasColumnType("text") | ||||||
|  | @ -358,6 +380,10 @@ namespace Foxnouns.Backend.Database.Migrations | ||||||
|                     b.HasKey("Id") |                     b.HasKey("Id") | ||||||
|                         .HasName("pk_users"); |                         .HasName("pk_users"); | ||||||
| 
 | 
 | ||||||
|  |                     b.HasIndex("Sid") | ||||||
|  |                         .IsUnique() | ||||||
|  |                         .HasDatabaseName("ix_users_sid"); | ||||||
|  | 
 | ||||||
|                     b.HasIndex("Username") |                     b.HasIndex("Username") | ||||||
|                         .IsUnique() |                         .IsUnique() | ||||||
|                         .HasDatabaseName("ix_users_username"); |                         .HasDatabaseName("ix_users_username"); | ||||||
|  |  | ||||||
|  | @ -3,6 +3,7 @@ namespace Foxnouns.Backend.Database.Models; | ||||||
| public class Member : BaseModel | public class Member : BaseModel | ||||||
| { | { | ||||||
|     public required string Name { get; set; } |     public required string Name { get; set; } | ||||||
|  |     public string Sid { get; set; } = string.Empty; | ||||||
|     public string? DisplayName { get; set; } |     public string? DisplayName { get; set; } | ||||||
|     public string? Bio { get; set; } |     public string? Bio { get; set; } | ||||||
|     public string? Avatar { get; set; } |     public string? Avatar { get; set; } | ||||||
|  |  | ||||||
|  | @ -8,6 +8,7 @@ namespace Foxnouns.Backend.Database.Models; | ||||||
| public class User : BaseModel | public class User : BaseModel | ||||||
| { | { | ||||||
|     public required string Username { get; set; } |     public required string Username { get; set; } | ||||||
|  |     public string Sid { get; set; } = string.Empty; | ||||||
|     public string? DisplayName { get; set; } |     public string? DisplayName { get; set; } | ||||||
|     public string? Bio { get; set; } |     public string? Bio { get; set; } | ||||||
|     public string? MemberTitle { get; set; } |     public string? MemberTitle { get; set; } | ||||||
|  | @ -28,6 +29,7 @@ public class User : BaseModel | ||||||
|     public UserSettings Settings { get; set; } = new(); |     public UserSettings Settings { get; set; } = new(); | ||||||
| 
 | 
 | ||||||
|     public required Instant LastActive { get; set; } |     public required Instant LastActive { get; set; } | ||||||
|  |     public Instant LastSidReroll { get; set; } | ||||||
| 
 | 
 | ||||||
|     public bool Deleted { get; set; } |     public bool Deleted { get; set; } | ||||||
|     public Instant? DeletedAt { get; set; } |     public Instant? DeletedAt { get; set; } | ||||||
|  |  | ||||||
							
								
								
									
										30
									
								
								Foxnouns.Backend/Database/prune-designer-cs-files.sh
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								Foxnouns.Backend/Database/prune-designer-cs-files.sh
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,30 @@ | ||||||
|  | #!/bin/bash | ||||||
|  | set -e | ||||||
|  | 
 | ||||||
|  | # Original script by zotan for Iceshrimp.NET | ||||||
|  | # Source: https://iceshrimp.dev/iceshrimp/Iceshrimp.NET/src/commit/7c93dcf79dda54fc1a4ea9772e3f80874e6bcefb/Iceshrimp.Backend/Core/Database/prune-designer-cs-files.sh | ||||||
|  | 
 | ||||||
|  | if [[ $(uname) == "Darwin" ]]; then | ||||||
|  | 	SED="gsed" | ||||||
|  | else | ||||||
|  | 	SED="sed" | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | import="using Microsoft.EntityFrameworkCore.Infrastructure;" | ||||||
|  | dbc="    [DbContext(typeof(DatabaseContext))]" | ||||||
|  | 
 | ||||||
|  | for file in $(find "$(dirname $0)/Migrations" -name '*.Designer.cs'); do | ||||||
|  | 	echo "$file" | ||||||
|  | 	csfile="${file%.Designer.cs}.cs" | ||||||
|  | 	if [[ ! -f $csfile ]]; then | ||||||
|  | 		echo "$csfile doesn't exist, exiting" | ||||||
|  | 		exit 1 | ||||||
|  | 	fi | ||||||
|  | 	lineno=$($SED -n '/^{/=' "$csfile") | ||||||
|  | 	((lineno+=2)) | ||||||
|  | 	migr=$(grep "\[Migration" "$file") | ||||||
|  | 	$SED -i "${lineno}i \\$migr" "$csfile" | ||||||
|  | 	$SED -i "${lineno}i \\$dbc" "$csfile" | ||||||
|  | 	$SED -i "2i $import" "$csfile" | ||||||
|  | 	rm "$file" | ||||||
|  | done | ||||||
|  | @ -29,15 +29,15 @@ public class MemberRendererService(DatabaseContext db, Config config) | ||||||
|         var renderUnlisted = token?.UserId == member.UserId && token.HasScope("user.read_hidden"); |         var renderUnlisted = token?.UserId == member.UserId && token.HasScope("user.read_hidden"); | ||||||
| 
 | 
 | ||||||
|         return new MemberResponse( |         return new MemberResponse( | ||||||
|             member.Id, member.Name, member.DisplayName, member.Bio, |             member.Id, member.Sid, member.Name, member.DisplayName, member.Bio, | ||||||
|             AvatarUrlFor(member), member.Links, member.Names, member.Pronouns, member.Fields, |             AvatarUrlFor(member), member.Links, member.Names, member.Pronouns, member.Fields, | ||||||
|             RenderPartialUser(member.User), renderUnlisted ? member.Unlisted : null); |             RenderPartialUser(member.User), renderUnlisted ? member.Unlisted : null); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     private UserRendererService.PartialUser RenderPartialUser(User user) => |     private UserRendererService.PartialUser RenderPartialUser(User user) => | ||||||
|         new(user.Id, user.Username, user.DisplayName, AvatarUrlFor(user), user.CustomPreferences); |         new(user.Id, user.Sid, user.Username, user.DisplayName, AvatarUrlFor(user), user.CustomPreferences); | ||||||
| 
 | 
 | ||||||
|     public PartialMember RenderPartialMember(Member member, bool renderUnlisted = false) => new(member.Id, member.Name, |     public PartialMember RenderPartialMember(Member member, bool renderUnlisted = false) => new(member.Id, member.Sid, member.Name, | ||||||
|         member.DisplayName, member.Bio, AvatarUrlFor(member), member.Names, member.Pronouns, |         member.DisplayName, member.Bio, AvatarUrlFor(member), member.Names, member.Pronouns, | ||||||
|         renderUnlisted ? member.Unlisted : null); |         renderUnlisted ? member.Unlisted : null); | ||||||
| 
 | 
 | ||||||
|  | @ -49,6 +49,7 @@ public class MemberRendererService(DatabaseContext db, Config config) | ||||||
| 
 | 
 | ||||||
|     public record PartialMember( |     public record PartialMember( | ||||||
|         Snowflake Id, |         Snowflake Id, | ||||||
|  |         string Sid, | ||||||
|         string Name, |         string Name, | ||||||
|         string? DisplayName, |         string? DisplayName, | ||||||
|         string? Bio, |         string? Bio, | ||||||
|  | @ -60,6 +61,7 @@ public class MemberRendererService(DatabaseContext db, Config config) | ||||||
| 
 | 
 | ||||||
|     public record MemberResponse( |     public record MemberResponse( | ||||||
|         Snowflake Id, |         Snowflake Id, | ||||||
|  |         string Sid, | ||||||
|         string Name, |         string Name, | ||||||
|         string? DisplayName, |         string? DisplayName, | ||||||
|         string? Bio, |         string? Bio, | ||||||
|  |  | ||||||
|  | @ -37,7 +37,8 @@ public class UserRendererService(DatabaseContext db, MemberRendererService membe | ||||||
|             : []; |             : []; | ||||||
| 
 | 
 | ||||||
|         return new UserResponse( |         return new UserResponse( | ||||||
|             user.Id, user.Username, user.DisplayName, user.Bio, user.MemberTitle, AvatarUrlFor(user), user.Links, |             user.Id, user.Sid, user.Username, user.DisplayName, user.Bio, user.MemberTitle, AvatarUrlFor(user), | ||||||
|  |             user.Links, | ||||||
|             user.Names, user.Pronouns, user.Fields, user.CustomPreferences, |             user.Names, user.Pronouns, user.Fields, user.CustomPreferences, | ||||||
|             renderMembers ? members.Select(m => memberRenderer.RenderPartialMember(m, tokenHidden)) : null, |             renderMembers ? members.Select(m => memberRenderer.RenderPartialMember(m, tokenHidden)) : null, | ||||||
|             renderAuthMethods |             renderAuthMethods | ||||||
|  | @ -47,18 +48,20 @@ public class UserRendererService(DatabaseContext db, MemberRendererService membe | ||||||
|                 )) |                 )) | ||||||
|                 : null, |                 : null, | ||||||
|             tokenHidden ? user.ListHidden : null, |             tokenHidden ? user.ListHidden : null, | ||||||
|             tokenHidden ? user.LastActive : null |             tokenHidden ? user.LastActive : null, | ||||||
|  |             tokenHidden ? user.LastSidReroll : null | ||||||
|         ); |         ); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public PartialUser RenderPartialUser(User user) => |     public PartialUser RenderPartialUser(User user) => | ||||||
|         new(user.Id, user.Username, user.DisplayName, AvatarUrlFor(user), user.CustomPreferences); |         new(user.Id, user.Sid, user.Username, user.DisplayName, AvatarUrlFor(user), user.CustomPreferences); | ||||||
| 
 | 
 | ||||||
|     private string? AvatarUrlFor(User user) => |     private string? AvatarUrlFor(User user) => | ||||||
|         user.Avatar != null ? $"{config.MediaBaseUrl}/users/{user.Id}/avatars/{user.Avatar}.webp" : null; |         user.Avatar != null ? $"{config.MediaBaseUrl}/users/{user.Id}/avatars/{user.Avatar}.webp" : null; | ||||||
| 
 | 
 | ||||||
|     public record UserResponse( |     public record UserResponse( | ||||||
|         Snowflake Id, |         Snowflake Id, | ||||||
|  |         string Sid, | ||||||
|         string Username, |         string Username, | ||||||
|         string? DisplayName, |         string? DisplayName, | ||||||
|         string? Bio, |         string? Bio, | ||||||
|  | @ -76,7 +79,9 @@ public class UserRendererService(DatabaseContext db, MemberRendererService membe | ||||||
|         [property: JsonProperty(NullValueHandling = NullValueHandling.Ignore)] |         [property: JsonProperty(NullValueHandling = NullValueHandling.Ignore)] | ||||||
|         bool? MemberListHidden, |         bool? MemberListHidden, | ||||||
|         [property: JsonProperty(NullValueHandling = NullValueHandling.Ignore)] |         [property: JsonProperty(NullValueHandling = NullValueHandling.Ignore)] | ||||||
|         Instant? LastActive |         Instant? LastActive, | ||||||
|  |         [property: JsonProperty(NullValueHandling = NullValueHandling.Ignore)] | ||||||
|  |         Instant? LastSidReroll | ||||||
|     ); |     ); | ||||||
| 
 | 
 | ||||||
|     public record AuthenticationMethodResponse( |     public record AuthenticationMethodResponse( | ||||||
|  | @ -92,6 +97,7 @@ public class UserRendererService(DatabaseContext db, MemberRendererService membe | ||||||
| 
 | 
 | ||||||
|     public record PartialUser( |     public record PartialUser( | ||||||
|         Snowflake Id, |         Snowflake Id, | ||||||
|  |         string Sid, | ||||||
|         string Username, |         string Username, | ||||||
|         string? DisplayName, |         string? DisplayName, | ||||||
|         string? AvatarUrl, |         string? AvatarUrl, | ||||||
|  |  | ||||||
|  | @ -99,8 +99,6 @@ export function ErrorBoundary() { | ||||||
| 	const error: any = useRouteError(); | 	const error: any = useRouteError(); | ||||||
| 	const { t } = useTranslation(); | 	const { t } = useTranslation(); | ||||||
| 
 | 
 | ||||||
| 	console.log(error); |  | ||||||
| 
 |  | ||||||
| 	const errorElem = | 	const errorElem = | ||||||
| 		"code" in error && "message" in error ? ( | 		"code" in error && "message" in error ? ( | ||||||
| 			<ApiErrorElem error={error as ApiError} /> | 			<ApiErrorElem error={error as ApiError} /> | ||||||
|  |  | ||||||
|  | @ -35,8 +35,6 @@ export const loader = async ({ request, params }: LoaderFunctionArgs) => { | ||||||
| 		memberPage = 0; | 		memberPage = 0; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	console.log(JSON.stringify(members)); |  | ||||||
| 
 |  | ||||||
| 	return json({ user, members, currentPage: memberPage, pageCount }); | 	return json({ user, members, currentPage: memberPage, pageCount }); | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -53,8 +53,6 @@ export const action = async ({ request }: ActionFunctionArgs) => { | ||||||
| 	const email = body.get("email") as string | null; | 	const email = body.get("email") as string | null; | ||||||
| 	const password = body.get("password") as string | null; | 	const password = body.get("password") as string | null; | ||||||
| 
 | 
 | ||||||
| 	console.log(email, password); |  | ||||||
| 
 |  | ||||||
| 	try { | 	try { | ||||||
| 		const resp = await serverRequest<AuthResponse>("POST", "/auth/email/login", { | 		const resp = await serverRequest<AuthResponse>("POST", "/auth/email/login", { | ||||||
| 			body: { email, password }, | 			body: { email, password }, | ||||||
|  |  | ||||||
							
								
								
									
										35
									
								
								README.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								README.md
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,35 @@ | ||||||
|  | # Foxnouns.NET | ||||||
|  | 
 | ||||||
|  | Rewrite of pronouns.cc's codebase in C#, using Remix for the frontend. | ||||||
|  | Still very work-in-progress, but a large portion of the backend is functional. | ||||||
|  | 
 | ||||||
|  | ## License | ||||||
|  | 
 | ||||||
|  |     Copyright (C) 2024  sam <u1f320> | ||||||
|  | 
 | ||||||
|  |     This program is free software: you can redistribute it and/or modify | ||||||
|  |     it under the terms of the GNU Affero General Public License as published | ||||||
|  |     by the Free Software Foundation, either version 3 of the License, or | ||||||
|  |     (at your option) any later version. | ||||||
|  | 
 | ||||||
|  |     This program is distributed in the hope that it will be useful, | ||||||
|  |     but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  |     GNU Affero General Public License for more details. | ||||||
|  | 
 | ||||||
|  |     You should have received a copy of the GNU Affero General Public License | ||||||
|  |     along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||||
|  | 
 | ||||||
|  | ## Acknowledgements | ||||||
|  | 
 | ||||||
|  | Codebases I've used for inspiration/figuring things out: | ||||||
|  | 
 | ||||||
|  | - [Iceshrimp.NET](https://iceshrimp.dev/iceshrimp/Iceshrimp.NET) | ||||||
|  | - [PluralKit](https://github.com/PluralKit/PluralKit) | ||||||
|  | 
 | ||||||
|  | Code taken entirely or almost entirely from external sources: | ||||||
|  | 
 | ||||||
|  | - The functions in the `AddSids` migration, | ||||||
|  |   taken from [PluralKit](https://github.com/PluralKit/PluralKit/blob/32a6e97342acc3b35e6f9e7b4dd169e21d888770/PluralKit.Core/Database/Functions/functions.sql) | ||||||
|  | - `Foxnouns.Backend/Database/prune-designer-cs-files.sh`, | ||||||
|  |   taken from [Iceshrimp.NET](https://iceshrimp.dev/iceshrimp/Iceshrimp.NET/src/commit/7c93dcf79dda54fc1a4ea9772e3f80874e6bcefb/Iceshrimp.Backend/Core/Database/prune-designer-cs-files.sh) | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue