nulla/lib/nulla/models/user.ex
2025-06-13 15:10:17 +02:00

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