Current section
Files
Jump to
Current section
Files
lib/authx_ex/migrations.ex
defmodule AuthShield.Migrations do
@moduledoc false
use Ecto.Migration
def up do
create_user()
create_password_credential()
create_pin_credential()
create_totp_credential()
create_permission()
create_role()
create_role_permition()
create_user_role()
create_session()
end
def down do
drop_user()
drop_password_credential()
drop_pin_credential()
drop_totp_credential()
drop_permission()
drop_role()
drop_role_permition()
drop_user_role()
drop_session()
end
# CREATING TABLES
defp create_user do
create_if_not_exists table(:users, primary_key: false) do
add(:id, :uuid, primary_key: true)
add(:first_name, :string, null: false)
add(:last_name, :string)
add(:email, :string, null: false)
add(:is_active, :boolean, null: false, default: false)
timestamps()
end
create_if_not_exists(unique_index(:users, [:email]))
end
defp create_password_credential do
create_if_not_exists table(:password_credentials, primary_key: false) do
add(:id, :uuid, primary_key: true)
add(:password_hash, :string, null: false)
add(:user_id, references(:users, type: :uuid), null: false)
timestamps()
end
create_if_not_exists(unique_index(:password_credentials, [:user_id]))
end
defp create_pin_credential do
create_if_not_exists table(:pin_credentials, primary_key: false) do
add(:id, :uuid, primary_key: true)
add(:pin_hash, :string, null: false)
add(:user_id, references(:users, type: :uuid), null: false)
timestamps()
end
create(unique_index(:pin_credentials, [:user_id]))
end
defp create_totp_credential do
create_if_not_exists table(:totp_credentials, primary_key: false) do
add(:id, :uuid, primary_key: true)
add(:secret, :string, null: false)
add(:issuer, :string, null: false)
add(:digits, :integer, null: false, default: 6)
add(:period, :integer, null: false, default: 30)
add(:qrcode_base64, :text, null: false)
add(:user_id, references(:users, type: :uuid), null: false)
timestamps()
end
create_if_not_exists(unique_index(:totp_credentials, [:user_id]))
end
defp create_permission do
create_if_not_exists table(:permissions, primary_key: false) do
add(:id, :uuid, primary_key: true)
add(:name, :string, null: false)
add(:description, :text)
timestamps()
end
create_if_not_exists(unique_index(:permissions, [:name]))
end
defp create_role do
create_if_not_exists table(:roles, primary_key: false) do
add(:id, :uuid, primary_key: true)
add(:name, :string, null: false)
add(:description, :text)
timestamps()
end
create_if_not_exists(unique_index(:roles, [:name]))
end
defp create_role_permition do
create_if_not_exists table(:roles_permissions, primary_key: false) do
add(:role_id, references(:roles, type: :uuid, on_delete: :delete_all), primary_key: true)
add(:permission_id, references(:permissions, type: :uuid, on_delete: :delete_all),
primary_key: true
)
timestamps()
end
create_if_not_exists(index(:roles_permissions, [:role_id]))
create_if_not_exists(index(:roles_permissions, [:permission_id]))
create_if_not_exists(
unique_index(:roles_permissions, [:role_id, :permission_id],
name: :role_id_permission_id_unique_index
)
)
end
defp create_user_role do
create_if_not_exists table(:users_roles, primary_key: false) do
add(:user_id, references(:users, type: :uuid, on_delete: :delete_all), primary_key: true)
add(:role_id, references(:roles, type: :uuid, on_delete: :delete_all), primary_key: true)
timestamps()
end
create_if_not_exists(index(:users_roles, [:user_id]))
create_if_not_exists(index(:users_roles, [:role_id]))
create_if_not_exists(
unique_index(:users_roles, [:user_id, :role_id], name: :user_id_role_id_unique_index)
)
end
defp create_session do
create_if_not_exists table(:sessions, primary_key: false) do
add(:id, :uuid, primary_key: true)
add(:remote_ip, :string)
add(:user_agent, :string)
add(:expiration, :naive_datetime, null: false)
add(:login_at, :naive_datetime, null: false)
add(:logout_at, :naive_datetime)
add(:user_id, references(:users, type: :uuid), null: false)
timestamps()
end
create_if_not_exists(index(:sessions, [:user_id]))
end
# DROPING TABLES
defp drop_user, do: drop_if_exists(table(:users))
defp drop_password_credential, do: drop_if_exists(table(:password_credentials))
defp drop_pin_credential, do: drop_if_exists(table(:pin_credentials))
defp drop_totp_credential, do: drop_if_exists(table(:totp_credentials))
defp drop_permission, do: drop_if_exists(table(:permissions))
defp drop_role, do: drop_if_exists(table(:roles))
defp drop_role_permition, do: drop_if_exists(table(:roles_permissions))
defp drop_user_role, do: drop_if_exists(table(:users_roles))
defp drop_session, do: drop_if_exists(table(:sessions))
end