69 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Elixir
		
	
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Elixir
		
	
	
	
	
	
defmodule Sukaato.User do
 | 
						|
  use Ecto.Schema
 | 
						|
  import Ecto.Changeset
 | 
						|
  # import Sukaato.Vschemas
 | 
						|
  import Sukaato.CustomValidators
 | 
						|
 | 
						|
  schema "users" do
 | 
						|
    field :name, :string
 | 
						|
    field :password, :string
 | 
						|
    field :username, :string
 | 
						|
    field :email, :string
 | 
						|
    field :dob, :date
 | 
						|
    field :gender_type, Ecto.Enum, values: [:trans, :cis, :nb]
 | 
						|
    field :gender_id, Ecto.Enum, values: [:fem, :masc, :combined, :fluid, :none]
 | 
						|
    field :bio, :string
 | 
						|
    field :affil, {:array, :map}
 | 
						|
    field :perms, {:array, :integer}
 | 
						|
    field :user_token, :string
 | 
						|
    field :pub_keys, :map
 | 
						|
    field :totp_enabled, :boolean, default: false
 | 
						|
    field :totp_active, :boolean, default: true
 | 
						|
    field :totp_secret, :string
 | 
						|
    field :ltotp, :utc_datetime
 | 
						|
    field :fido_enabled, :boolean, default: false
 | 
						|
    field :fido_active, :boolean, default: false
 | 
						|
    field :fido_priority, :integer
 | 
						|
    field :fido_creds, {:array, :string}
 | 
						|
    field :fido_keys, {:array, :map}
 | 
						|
 | 
						|
    timestamps(type: :utc_datetime)
 | 
						|
  end
 | 
						|
 | 
						|
  @doc false
 | 
						|
  def changeset(user, attrs) do
 | 
						|
    user
 | 
						|
    |> cast(attrs, [
 | 
						|
      :name,
 | 
						|
      :username,
 | 
						|
      :password,
 | 
						|
      :email,
 | 
						|
      :dob,
 | 
						|
      :gender_type,
 | 
						|
      :gender_id,
 | 
						|
      :bio,
 | 
						|
      :affil,
 | 
						|
      :perms,
 | 
						|
      :user_token,
 | 
						|
      :pub_keys,
 | 
						|
      :totp_enabled,
 | 
						|
      :totp_active,
 | 
						|
      :totp_secret,
 | 
						|
      :ltotp,
 | 
						|
      :fido_enabled,
 | 
						|
      :fido_active,
 | 
						|
      :fido_priority,
 | 
						|
      :fido_creds,
 | 
						|
      :fido_keys
 | 
						|
    ])
 | 
						|
    |> validate_required([:username, :password, :email, :perms])
 | 
						|
    |> validate_length(:perms, is: 6)
 | 
						|
    |> validate_format(:email, ~r/@/)
 | 
						|
    |> validate_map_format(:perms, Sukaato.Vschemas.perms)
 | 
						|
    |> validate_map_format(:affil, Sukaato.Vschemas.affil)
 | 
						|
    |> validate_map_format(:pub_keys, Sukaato.Vschemas.pub_keys)
 | 
						|
    |> encrypt_password(:password)
 | 
						|
    |> unique_constraint(:username)
 | 
						|
  end
 | 
						|
end
 |