94 lines
2.1 KiB
Elixir
94 lines
2.1 KiB
Elixir
defmodule Nulla.Models.User do
|
|
use Ecto.Schema
|
|
import Ecto.Changeset
|
|
alias Nulla.Repo
|
|
alias Nulla.Snowflake
|
|
alias Nulla.Models.User
|
|
|
|
@primary_key {:id, :integer, autogenerate: false}
|
|
schema "users" do
|
|
field :username, :string
|
|
field :email, :string
|
|
field :password, :string
|
|
field :is_moderator, :boolean, default: false
|
|
field :realname, :string
|
|
field :bio, :string
|
|
field :location, :string
|
|
field :birthday, :date
|
|
field :fields, :map
|
|
field :tags, {:array, :string}
|
|
field :follow_approval, :boolean, default: false
|
|
field :is_bot, :boolean, default: false
|
|
field :is_discoverable, :boolean, default: true
|
|
field :is_indexable, :boolean, default: true
|
|
field :is_memorial, :boolean, default: false
|
|
field :private_key, :string
|
|
field :public_key, :string
|
|
field :avatar, :string
|
|
field :banner, :string
|
|
|
|
has_many :user_sessions, Nulla.Models.Session
|
|
has_many :notes, Nulla.Models.Note
|
|
has_many :media_attachments, through: [:notes, :media_attachments]
|
|
|
|
timestamps(type: :utc_datetime)
|
|
end
|
|
|
|
@doc false
|
|
def changeset(user, attrs) do
|
|
user
|
|
|> cast(attrs, [
|
|
:username,
|
|
:email,
|
|
:password,
|
|
:is_moderator,
|
|
:realname,
|
|
:bio,
|
|
:location,
|
|
:birthday,
|
|
:fields,
|
|
:follow_approval,
|
|
:is_bot,
|
|
:is_discoverable,
|
|
:is_indexable,
|
|
:is_memorial,
|
|
:private_key,
|
|
:public_key,
|
|
:avatar,
|
|
:banner
|
|
])
|
|
|> validate_required([
|
|
:username,
|
|
:email,
|
|
:password,
|
|
:is_moderator,
|
|
:realname,
|
|
:bio,
|
|
:location,
|
|
:birthday,
|
|
:fields,
|
|
:follow_approval,
|
|
:is_bot,
|
|
:is_discoverable,
|
|
:is_indexable,
|
|
:is_memorial,
|
|
:private_key,
|
|
:public_key,
|
|
:avatar,
|
|
:banner
|
|
])
|
|
end
|
|
|
|
def create_user(attrs) do
|
|
id = Snowflake.next_id()
|
|
|
|
%User{}
|
|
|> User.changeset(attrs)
|
|
|> Ecto.Changeset.put_change(:id, id)
|
|
|> Repo.insert()
|
|
end
|
|
|
|
def get_user_by_username(username), do: Repo.get_by(User, username: username)
|
|
|
|
def get_user_by_username!(username), do: Repo.get_by!(User, username: username)
|
|
end
|