user administration

This commit is contained in:
roman
2026-06-11 19:33:03 +02:00
parent 639baafe4a
commit 31800eceda
12 changed files with 1031 additions and 9 deletions
@@ -0,0 +1,243 @@
// <auto-generated />
using System;
using CalendarReminder.Api.Data;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
#nullable disable
namespace CalendarReminder.Api.Migrations
{
[DbContext(typeof(AppDbContext))]
[Migration("20260611172823_AddFamilyAndAdminFields")]
partial class AddFamilyAndAdminFields
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "9.0.0")
.HasAnnotation("Relational:MaxIdentifierLength", 64);
MySqlModelBuilderExtensions.AutoIncrementColumns(modelBuilder);
modelBuilder.Entity("CalendarReminder.Domain.Entities.Family", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property<int>("Id"));
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(100)
.HasColumnType("varchar(100)");
b.HasKey("Id");
b.HasIndex("Name")
.IsUnique();
b.ToTable("Families");
});
modelBuilder.Entity("CalendarReminder.Domain.Entities.PasswordResetToken", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property<int>("Id"));
b.Property<string>("Code")
.IsRequired()
.HasColumnType("longtext");
b.Property<string>("Email")
.IsRequired()
.HasColumnType("longtext");
b.Property<DateTime>("ExpiresAt")
.HasColumnType("datetime(6)");
b.Property<bool>("Used")
.HasColumnType("tinyint(1)");
b.HasKey("Id");
b.ToTable("PasswordResetTokens");
});
modelBuilder.Entity("CalendarReminder.Domain.Entities.Reminder", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property<int>("Id"));
b.Property<DateTime>("CreatedAt")
.HasColumnType("datetime(6)");
b.Property<string>("Description")
.HasMaxLength(1000)
.HasColumnType("varchar(1000)");
b.Property<bool>("IsCompleted")
.HasColumnType("tinyint(1)");
b.Property<bool>("NotificationSent")
.HasColumnType("tinyint(1)");
b.Property<DateTime>("ReminderDate")
.HasColumnType("datetime(6)");
b.Property<string>("Title")
.IsRequired()
.HasMaxLength(200)
.HasColumnType("varchar(200)");
b.Property<int>("UserId")
.HasColumnType("int");
b.HasKey("Id");
b.HasIndex("UserId");
b.ToTable("Reminders");
});
modelBuilder.Entity("CalendarReminder.Domain.Entities.ReminderShare", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property<int>("Id"));
b.Property<int>("ReminderId")
.HasColumnType("int");
b.Property<int>("SharedWithUserId")
.HasColumnType("int");
b.HasKey("Id");
b.HasIndex("SharedWithUserId");
b.HasIndex("ReminderId", "SharedWithUserId")
.IsUnique();
b.ToTable("ReminderShares");
});
modelBuilder.Entity("CalendarReminder.Domain.Entities.User", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property<int>("Id"));
b.Property<DateTime>("CreatedAt")
.HasColumnType("datetime(6)");
b.Property<string>("Email")
.IsRequired()
.HasMaxLength(200)
.HasColumnType("varchar(200)");
b.Property<int?>("FamilyId")
.HasColumnType("int");
b.Property<bool>("IsAdmin")
.HasColumnType("tinyint(1)");
b.Property<bool>("MustChangePassword")
.HasColumnType("tinyint(1)");
b.Property<string>("PasswordHash")
.IsRequired()
.HasColumnType("longtext");
b.Property<string>("Username")
.IsRequired()
.HasMaxLength(100)
.HasColumnType("varchar(100)");
b.HasKey("Id");
b.HasIndex("Email")
.IsUnique();
b.HasIndex("FamilyId");
b.HasIndex("Username")
.IsUnique();
b.ToTable("Users");
});
modelBuilder.Entity("CalendarReminder.Domain.Entities.Reminder", b =>
{
b.HasOne("CalendarReminder.Domain.Entities.User", "User")
.WithMany("Reminders")
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("User");
});
modelBuilder.Entity("CalendarReminder.Domain.Entities.ReminderShare", b =>
{
b.HasOne("CalendarReminder.Domain.Entities.Reminder", "Reminder")
.WithMany("Shares")
.HasForeignKey("ReminderId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("CalendarReminder.Domain.Entities.User", "SharedWithUser")
.WithMany()
.HasForeignKey("SharedWithUserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Reminder");
b.Navigation("SharedWithUser");
});
modelBuilder.Entity("CalendarReminder.Domain.Entities.User", b =>
{
b.HasOne("CalendarReminder.Domain.Entities.Family", "Family")
.WithMany("Users")
.HasForeignKey("FamilyId")
.OnDelete(DeleteBehavior.SetNull);
b.Navigation("Family");
});
modelBuilder.Entity("CalendarReminder.Domain.Entities.Family", b =>
{
b.Navigation("Users");
});
modelBuilder.Entity("CalendarReminder.Domain.Entities.Reminder", b =>
{
b.Navigation("Shares");
});
modelBuilder.Entity("CalendarReminder.Domain.Entities.User", b =>
{
b.Navigation("Reminders");
});
#pragma warning restore 612, 618
}
}
}
@@ -0,0 +1,96 @@
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace CalendarReminder.Api.Migrations
{
/// <inheritdoc />
public partial class AddFamilyAndAdminFields : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<int>(
name: "FamilyId",
table: "Users",
type: "int",
nullable: true);
migrationBuilder.AddColumn<bool>(
name: "IsAdmin",
table: "Users",
type: "tinyint(1)",
nullable: false,
defaultValue: false);
migrationBuilder.AddColumn<bool>(
name: "MustChangePassword",
table: "Users",
type: "tinyint(1)",
nullable: false,
defaultValue: false);
migrationBuilder.CreateTable(
name: "Families",
columns: table => new
{
Id = table.Column<int>(type: "int", nullable: false)
.Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn),
Name = table.Column<string>(type: "varchar(100)", maxLength: 100, nullable: false)
.Annotation("MySql:CharSet", "utf8mb4")
},
constraints: table =>
{
table.PrimaryKey("PK_Families", x => x.Id);
})
.Annotation("MySql:CharSet", "utf8mb4");
migrationBuilder.CreateIndex(
name: "IX_Users_FamilyId",
table: "Users",
column: "FamilyId");
migrationBuilder.CreateIndex(
name: "IX_Families_Name",
table: "Families",
column: "Name",
unique: true);
migrationBuilder.AddForeignKey(
name: "FK_Users_Families_FamilyId",
table: "Users",
column: "FamilyId",
principalTable: "Families",
principalColumn: "Id",
onDelete: ReferentialAction.SetNull);
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_Users_Families_FamilyId",
table: "Users");
migrationBuilder.DropTable(
name: "Families");
migrationBuilder.DropIndex(
name: "IX_Users_FamilyId",
table: "Users");
migrationBuilder.DropColumn(
name: "FamilyId",
table: "Users");
migrationBuilder.DropColumn(
name: "IsAdmin",
table: "Users");
migrationBuilder.DropColumn(
name: "MustChangePassword",
table: "Users");
}
}
}
@@ -22,6 +22,27 @@ namespace CalendarReminder.Api.Migrations
MySqlModelBuilderExtensions.AutoIncrementColumns(modelBuilder);
modelBuilder.Entity("CalendarReminder.Domain.Entities.Family", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property<int>("Id"));
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(100)
.HasColumnType("varchar(100)");
b.HasKey("Id");
b.HasIndex("Name")
.IsUnique();
b.ToTable("Families");
});
modelBuilder.Entity("CalendarReminder.Domain.Entities.PasswordResetToken", b =>
{
b.Property<int>("Id")
@@ -128,6 +149,15 @@ namespace CalendarReminder.Api.Migrations
.HasMaxLength(200)
.HasColumnType("varchar(200)");
b.Property<int?>("FamilyId")
.HasColumnType("int");
b.Property<bool>("IsAdmin")
.HasColumnType("tinyint(1)");
b.Property<bool>("MustChangePassword")
.HasColumnType("tinyint(1)");
b.Property<string>("PasswordHash")
.IsRequired()
.HasColumnType("longtext");
@@ -142,6 +172,8 @@ namespace CalendarReminder.Api.Migrations
b.HasIndex("Email")
.IsUnique();
b.HasIndex("FamilyId");
b.HasIndex("Username")
.IsUnique();
@@ -178,6 +210,21 @@ namespace CalendarReminder.Api.Migrations
b.Navigation("SharedWithUser");
});
modelBuilder.Entity("CalendarReminder.Domain.Entities.User", b =>
{
b.HasOne("CalendarReminder.Domain.Entities.Family", "Family")
.WithMany("Users")
.HasForeignKey("FamilyId")
.OnDelete(DeleteBehavior.SetNull);
b.Navigation("Family");
});
modelBuilder.Entity("CalendarReminder.Domain.Entities.Family", b =>
{
b.Navigation("Users");
});
modelBuilder.Entity("CalendarReminder.Domain.Entities.Reminder", b =>
{
b.Navigation("Shares");