Update nodeinfo

This commit is contained in:
Mirai Kumiko 2025-06-14 18:50:54 +02:00
parent fd15cc089b
commit 49ac2bbe6f
Signed by: miraikumiko
GPG key ID: 3F178B1B5E0CB278
3 changed files with 40 additions and 7 deletions

View file

@ -1,6 +1,7 @@
defmodule Nulla.Models.User do defmodule Nulla.Models.User do
use Ecto.Schema use Ecto.Schema
import Ecto.Changeset import Ecto.Changeset
import Ecto.Query
alias Nulla.Repo alias Nulla.Repo
alias Nulla.Snowflake alias Nulla.Snowflake
alias Nulla.Models.User alias Nulla.Models.User
@ -8,6 +9,7 @@ defmodule Nulla.Models.User do
@primary_key {:id, :integer, autogenerate: false} @primary_key {:id, :integer, autogenerate: false}
schema "users" do schema "users" do
field :username, :string field :username, :string
field :domain, :string
field :email, :string field :email, :string
field :password, :string field :password, :string
field :is_moderator, :boolean, default: false field :is_moderator, :boolean, default: false
@ -15,7 +17,7 @@ defmodule Nulla.Models.User do
field :bio, :string field :bio, :string
field :location, :string field :location, :string
field :birthday, :date field :birthday, :date
field :fields, :map field :fields, {:array, :map}
field :tags, {:array, :string} field :tags, {:array, :string}
field :follow_approval, :boolean, default: false field :follow_approval, :boolean, default: false
field :is_bot, :boolean, default: false field :is_bot, :boolean, default: false
@ -26,6 +28,7 @@ defmodule Nulla.Models.User do
field :public_key, :string field :public_key, :string
field :avatar, :string field :avatar, :string
field :banner, :string field :banner, :string
field :last_active_at, :utc_datetime
has_many :user_sessions, Nulla.Models.Session has_many :user_sessions, Nulla.Models.Session
has_many :notes, Nulla.Models.Note has_many :notes, Nulla.Models.Note
@ -39,6 +42,7 @@ defmodule Nulla.Models.User do
user user
|> cast(attrs, [ |> cast(attrs, [
:username, :username,
:domain,
:email, :email,
:password, :password,
:is_moderator, :is_moderator,
@ -55,10 +59,12 @@ defmodule Nulla.Models.User do
:private_key, :private_key,
:public_key, :public_key,
:avatar, :avatar,
:banner :banner,
:last_active_at
]) ])
|> validate_required([ |> validate_required([
:username, :username,
:domain,
:email, :email,
:password, :password,
:is_moderator, :is_moderator,
@ -75,7 +81,8 @@ defmodule Nulla.Models.User do
:private_key, :private_key,
:public_key, :public_key,
:avatar, :avatar,
:banner :banner,
:last_active_at
]) ])
end end
@ -91,4 +98,23 @@ defmodule Nulla.Models.User do
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!(username), do: Repo.get_by!(User, username: username) def get_user_by_username!(username), do: Repo.get_by!(User, username: username)
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 end

View file

@ -14,11 +14,16 @@ defmodule NullaWeb.NodeinfoController do
def show(conn, _params) do def show(conn, _params) do
version = Application.spec(:nulla, :vsn) |> to_string() version = Application.spec(:nulla, :vsn) |> to_string()
instance_settings = InstanceSettings.get_instance_settings!()
domain = instance_settings.domain
total = User.get_total_users_count(domain)
month = User.get_active_users_count(domain, 30)
halfyear = User.get_active_users_count(domain, 180)
users = %{ users = %{
total: 0, total: total,
month: 0, month: month,
halfyear: 0 halfyear: halfyear
} }
instance_settings = InstanceSettings.get_instance_settings!() instance_settings = InstanceSettings.get_instance_settings!()

View file

@ -5,6 +5,7 @@ defmodule Nulla.Repo.Migrations.CreateUsers do
create table(:users, primary_key: false) do create table(:users, primary_key: false) do
add :id, :bigint, primary_key: true add :id, :bigint, primary_key: true
add :username, :string, null: false, unique: true add :username, :string, null: false, unique: true
add :domain, :string, null: false
add :email, :string add :email, :string
add :password, :string add :password, :string
add :is_moderator, :boolean, default: false, null: false add :is_moderator, :boolean, default: false, null: false
@ -12,7 +13,7 @@ defmodule Nulla.Repo.Migrations.CreateUsers do
add :bio, :text add :bio, :text
add :location, :string add :location, :string
add :birthday, :date add :birthday, :date
add :fields, :map add :fields, :jsonb, default: "[]", null: false
add :tags, {:array, :string} add :tags, {:array, :string}
add :follow_approval, :boolean, default: false, null: false add :follow_approval, :boolean, default: false, null: false
add :is_bot, :boolean, default: false, null: false add :is_bot, :boolean, default: false, null: false
@ -23,6 +24,7 @@ defmodule Nulla.Repo.Migrations.CreateUsers do
add :public_key, :string, null: false add :public_key, :string, null: false
add :avatar, :string add :avatar, :string
add :banner, :string add :banner, :string
add :last_active_at, :utc_datetime
timestamps(type: :utc_datetime) timestamps(type: :utc_datetime)
end end