78 lines
1.8 KiB
Elixir
78 lines
1.8 KiB
Elixir
defmodule Nulla.Models.User do
|
|
use Ecto.Schema
|
|
import Ecto.Changeset
|
|
import Ecto.Query
|
|
alias Nulla.Repo
|
|
alias Nulla.Snowflake
|
|
alias Nulla.Models.User
|
|
alias Nulla.Models.Actor
|
|
alias Nulla.Models.Session
|
|
|
|
@primary_key {:id, :integer, autogenerate: false}
|
|
schema "users" do
|
|
field :email, :string
|
|
field :password, :string
|
|
field :privateKeyPem, :string
|
|
field :last_active_at, :utc_datetime
|
|
|
|
belongs_to :actor, Actor, define_field: false, foreign_key: :id, type: :integer
|
|
has_many :user_sessions, Session
|
|
|
|
timestamps(type: :utc_datetime)
|
|
end
|
|
|
|
@doc false
|
|
def changeset(user, attrs) do
|
|
user
|
|
|> cast(attrs, [
|
|
:email,
|
|
:password,
|
|
:privateKeyPem,
|
|
:last_active_at,
|
|
:actor_id
|
|
])
|
|
|> validate_required([
|
|
:email,
|
|
:password,
|
|
:privateKeyPem,
|
|
:last_active_at,
|
|
:actor_id
|
|
])
|
|
end
|
|
|
|
def create_user(attrs) when is_map(attrs) do
|
|
%__MODULE__{}
|
|
|> changeset(attrs)
|
|
|> 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)
|
|
|
|
def get_user_by_username_and_domain(username, domain) do
|
|
from(u in User,
|
|
where: u.username == ^username and u.domain == ^domain
|
|
)
|
|
|> Repo.one()
|
|
end
|
|
|
|
def get_total_users_count(domain) do
|
|
Repo.aggregate(from(u in User, where: u.domain == ^domain), :count, :id)
|
|
end
|
|
|
|
def get_active_users_count(domain, days) do
|
|
cutoff = DateTime.add(DateTime.utc_now(), -days * 86400, :second)
|
|
|
|
from(u in User,
|
|
where: u.domain == ^domain and u.last_active_at > ^cutoff
|
|
)
|
|
|> Repo.aggregate(:count, :id)
|
|
end
|
|
|
|
def update_last_active(user) do
|
|
user
|
|
|> Ecto.Changeset.change(last_active_at: DateTime.utc_now())
|
|
|> Repo.update()
|
|
end
|
|
end
|