Aller au contenu principal

15-1 Migrations Identity

Les migrations suivantes pour créer les tables requises par Identity doivent être exécutées:

  • application_users
  • application_roles
  • application_roles_users
info

Le nom de modèle suggéré par Identity est ApplicationUser et ApplicationRole. Les tables sont donc nommées en conséquence, mais techniquement rien n'empêcherait d'utiliser un nom différent.

Je vous "donne" ces migrations. En effet, si nous utilisions Entity Framework, le tout serait créé automatiquement pour nous et on ne ferait qu'utiliser la librairie. On utilise une implémentation un peu personnalisée dans le cadre du cours pour fonctionner avec Dapper et Postgres et c'est pourquoi je vous donne les migrations.

attention

Dans le cadre de votre projet, si vous utilisez autre chose que Prenom ou Nom pour identifier le nom de votre utilisateur (NomComplet par exemple), vous devrez changer les migrations et les repositories.

Support PostgreSQL pour les GUID / UUID

Identity s'appuie sur une clé primaire de type GUID / UUID pour la table utilisateurs. PostgreSQL supporte ce type de colonne, mais il faut activer une extension.

En effet, bien que le tout soit supporté, le support n'est pas activé par défaut. Il faut installer l'extension Postgres uuid-ossp.

  1. Créez une nouvelle migration de base AjouterExtensionUuidOssp
    Snowfall.Data/Migrations/202502232119_AjouterExtensionUuidOssp.cs
    using FluentMigrator;

    namespace Snowfall.Data.Migrations;

    [Migration(202502232119)]
    public class AjouterExtensionUuidOssp : Migration
    {
    public override void Up()
    {
    throw new NotImplementedException();
    }

    public override void Down()
    {
    throw new NotImplementedException();
    }
    }
  2. Pour activer une extension Postgres, il faut exécuter du SQL brute. Il n'y a pas de dialecte FluentMigrator pour cela. Pour exécuter du SQL brut, il est possible d'utiliser Execute.Sql.
    public class AjouterExtensionUuidOssp : Migration
    {
    public override void Up()
    {
    Execute.Sql(
    """
    CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
    """
    );
    }

    public override void Down()
    {
    Execute.Sql(
    """
    DROP EXTENSION IF EXISTS "uuid-ossp"
    """
    );
    }
    }

C'est tout, l'extension sera ajoutée lors de la prochaine migration!

Migration ApplicationUsers

La migration pour ApplicationUsers permettra de créer la table qui contiendra les utilisateurs.

Snowfall.Data/Migrations/202502232131_CreerApplicationUsers.cs
[Migration(202502232131)]
public class CreerApplicationUsers : Migration
{
public override void Up()
{
Create.Table("application_users")
.WithColumn("id").AsString(255).PrimaryKey()
.WithDefault(SystemMethods.NewGuid)
.WithColumn("username").AsString(255)
.WithColumn("normalized_username").AsString(255)
.WithColumn("email").AsString(255)
.WithColumn("normalized_email").AsString(255)
.WithColumn("email_confirmed").AsBoolean()
.WithColumn("password_hash").AsString(255)
.WithColumn("prenom").AsString(255)
.WithColumn("nom").AsString(255);

Create.Index("index_application_users_normalized_user_name")
.OnTable("application_users")
.OnColumn("normalized_username");
Create.Index("index_application_users_normalized_email")
.OnTable("application_users")
.OnColumn("normalized_username");
}

public override void Down()
{
Delete.Table("application_users");
}
}

Migration ApplicationRoles

Snowfall.Data/Migrations/202502232133_CreerApplicationRoles.cs
[Migration(202502232133)]
public class CreerApplicationRoles : Migration
{
public override void Up()
{
Create.Table("application_roles")
.WithColumn("id").AsInt64().PrimaryKey().Identity()
.WithColumn("name").AsString(255)
.WithColumn("normalized_name").AsString(255);

Create.Index("index_application_roles_normalized_name")
.OnTable("application_roles")
.OnColumn("normalized_name");
}

public override void Down()
{
Delete.Table("application_roles");
}
}

Migration ApplicationRolesUsers

info

Cette table fait l'association entre les utilisateurs et les rôles (m:n)

Snowfall.Data/Migrations/202502232138_CreerApplicationUsersRoles.cs
[Migration(202502232138)]
public class CreerApplicationUsersRoles : Migration
{
public override void Up()
{
Create.Table("application_roles_users")
.WithColumn("role_id").AsInt64().PrimaryKey()
.WithColumn("user_id").AsString(255).PrimaryKey();

Create.ForeignKey()
.FromTable("application_roles_users").ForeignColumn("role_id")
.ToTable("application_roles").PrimaryColumn("id")
.OnDelete(Rule.Cascade);

Create.ForeignKey()
.FromTable("application_roles_users").ForeignColumn("user_id")
.ToTable("application_users").PrimaryColumn("id")
.OnDelete(Rule.Cascade);
}

public override void Down()
{
Delete.ForeignKey()
.FromTable("application_roles_users").ForeignColumn("user_id")
.ToTable("application_users").PrimaryColumn("id");
Delete.ForeignKey()
.FromTable("application_roles_users").ForeignColumn("role_id")
.ToTable("application_roles").PrimaryColumn("id");

Delete.Table("application_roles_users");

}
}