1 defmodule Pleroma.Akkoma.FrontendSettingsProfile do
11 schema "user_frontend_setting_profiles" do
12 belongs_to(:user, Pleroma.User, primary_key: true, type: FlakeId.Ecto.CompatType)
13 field(:frontend_name, :string, primary_key: true)
14 field(:profile_name, :string, primary_key: true)
15 field(:settings, :map)
16 field(:version, :integer)
20 def changeset(%__MODULE__{} = struct, attrs) do
22 |> cast(attrs, [:user_id, :frontend_name, :profile_name, :settings, :version])
23 |> validate_required([:user_id, :frontend_name, :profile_name, :settings, :version])
24 |> validate_length(:frontend_name, min: 1, max: 255)
25 |> validate_length(:profile_name, min: 1, max: 255)
26 |> validate_version(struct)
27 |> validate_number(:version, greater_than: 0)
28 |> validate_settings_length(Config.get([:instance, :max_frontend_settings_json_chars]))
31 def create_or_update(%User{} = user, frontend_name, profile_name, settings, version) do
33 case get_by_user_and_frontend_name_and_profile_name(user, frontend_name, profile_name) do
37 %__MODULE__{} = profile ->
44 frontend_name: frontend_name,
45 profile_name: profile_name,
49 |> Repo.insert_or_update()
52 def get_all_by_user_and_frontend_name(%User{id: user_id}, frontend_name) do
54 from(p in __MODULE__, where: p.user_id == ^user_id and p.frontend_name == ^frontend_name)
58 def get_by_user_and_frontend_name_and_profile_name(
66 p.user_id == ^user_id and p.frontend_name == ^frontend_name and
67 p.profile_name == ^profile_name
72 def delete_profile(profile) do
76 defp validate_settings_length(
77 %Ecto.Changeset{changes: %{settings: settings}} = changeset,
80 settings_json = Jason.encode!(settings)
82 if String.length(settings_json) > max_length do
83 add_error(changeset, :settings, "is too long")
89 defp validate_version(changeset, %{version: nil}), do: changeset
91 defp validate_version(%Ecto.Changeset{changes: %{version: version}} = changeset, %{
94 if version != prev_version + 1 do
95 add_error(changeset, :version, "must be incremented by 1")