@@ -8,18 +8,19 @@ defmodule Mobilizon.Actors.Member do
|
||||
import Ecto.Changeset
|
||||
|
||||
alias Mobilizon.Actors.{Actor, MemberRole}
|
||||
alias Mobilizon.Actors.Member.Metadata
|
||||
alias Mobilizon.Web.Endpoint
|
||||
|
||||
@type t :: %__MODULE__{
|
||||
role: MemberRole.t(),
|
||||
parent: Actor.t(),
|
||||
actor: Actor.t()
|
||||
actor: Actor.t(),
|
||||
metadata: Metadata.t()
|
||||
}
|
||||
|
||||
@required_attrs [:parent_id, :actor_id, :url]
|
||||
@optional_attrs [:role, :invited_by_id]
|
||||
@attrs @required_attrs ++ @optional_attrs
|
||||
@metadata_attrs []
|
||||
|
||||
@primary_key {:id, :binary_id, autogenerate: true}
|
||||
schema "members" do
|
||||
@@ -27,9 +28,7 @@ defmodule Mobilizon.Actors.Member do
|
||||
field(:url, :string)
|
||||
field(:member_since, :utc_datetime)
|
||||
|
||||
embeds_one :metadata, Metadata, on_replace: :delete do
|
||||
# TODO : Use this space to put notes when someone is invited / requested to join
|
||||
end
|
||||
embeds_one(:metadata, Metadata, on_replace: :delete)
|
||||
|
||||
belongs_to(:invited_by, Actor)
|
||||
belongs_to(:parent, Actor)
|
||||
@@ -63,7 +62,7 @@ defmodule Mobilizon.Actors.Member do
|
||||
def changeset(%__MODULE__{} = member, attrs) do
|
||||
member
|
||||
|> cast(attrs, @attrs)
|
||||
|> cast_embed(:metadata, with: &metadata_changeset/2)
|
||||
|> cast_embed(:metadata)
|
||||
|> ensure_url()
|
||||
|> update_member_since()
|
||||
|> validate_required(@required_attrs)
|
||||
@@ -72,11 +71,6 @@ defmodule Mobilizon.Actors.Member do
|
||||
|> unique_constraint(:url, name: :members_url_index)
|
||||
end
|
||||
|
||||
defp metadata_changeset(schema, params) do
|
||||
schema
|
||||
|> cast(params, @metadata_attrs)
|
||||
end
|
||||
|
||||
# If there's a blank URL that's because we're doing the first insert
|
||||
@spec ensure_url(Ecto.Changeset.t()) :: Ecto.Changeset.t()
|
||||
defp ensure_url(%Ecto.Changeset{data: %__MODULE__{url: nil}} = changeset) do
|
||||
|
||||
27
lib/mobilizon/actors/member/metadata.ex
Normal file
27
lib/mobilizon/actors/member/metadata.ex
Normal file
@@ -0,0 +1,27 @@
|
||||
defmodule Mobilizon.Actors.Member.Metadata do
|
||||
@moduledoc """
|
||||
Represents metadata on a membership
|
||||
"""
|
||||
|
||||
use Ecto.Schema
|
||||
import Ecto.Changeset
|
||||
|
||||
@type t :: %__MODULE__{}
|
||||
|
||||
@required_attrs []
|
||||
|
||||
@optional_attrs []
|
||||
|
||||
@attrs @required_attrs ++ @optional_attrs
|
||||
|
||||
embedded_schema do
|
||||
# TODO : Use this space to put notes when someone is invited / requested to join
|
||||
end
|
||||
|
||||
@doc false
|
||||
@spec changeset(t | Ecto.Schema.t(), map) :: Ecto.Changeset.t()
|
||||
def changeset(schema, params) do
|
||||
schema
|
||||
|> cast(params, @attrs)
|
||||
end
|
||||
end
|
||||
@@ -5,7 +5,7 @@ defmodule Mobilizon.Medias.Media do
|
||||
|
||||
use Ecto.Schema
|
||||
|
||||
import Ecto.Changeset, only: [cast: 3, cast_embed: 2, cast_embed: 3]
|
||||
import Ecto.Changeset, only: [cast: 3, cast_embed: 2]
|
||||
|
||||
alias Mobilizon.Actors.Actor
|
||||
alias Mobilizon.Discussions.Comment
|
||||
@@ -20,16 +20,12 @@ defmodule Mobilizon.Medias.Media do
|
||||
actor: Actor.t()
|
||||
}
|
||||
|
||||
@metadata_attrs [:height, :width, :blurhash]
|
||||
@attrs [:actor_id]
|
||||
|
||||
schema "medias" do
|
||||
embeds_one(:file, File, on_replace: :update)
|
||||
|
||||
embeds_one :metadata, Metadata, on_replace: :update do
|
||||
field(:height, :integer)
|
||||
field(:width, :integer)
|
||||
field(:blurhash, :string)
|
||||
end
|
||||
embeds_one(:metadata, Metadata, on_replace: :update)
|
||||
|
||||
belongs_to(:actor, Actor)
|
||||
has_many(:event_picture, Event, foreign_key: :picture_id)
|
||||
@@ -45,15 +41,8 @@ defmodule Mobilizon.Medias.Media do
|
||||
@spec changeset(t | Ecto.Schema.t(), map) :: Ecto.Changeset.t()
|
||||
def changeset(%__MODULE__{} = media, attrs) do
|
||||
media
|
||||
|> cast(attrs, [:actor_id])
|
||||
|> cast(attrs, @attrs)
|
||||
|> cast_embed(:file)
|
||||
|> cast_embed(:metadata, with: &metadata_changeset/2)
|
||||
end
|
||||
|
||||
@doc false
|
||||
@spec metadata_changeset(Metadata.t(), map) :: Ecto.Changeset.t()
|
||||
def metadata_changeset(metadata, attrs) do
|
||||
metadata
|
||||
|> cast(attrs, @metadata_attrs)
|
||||
|> cast_embed(:metadata)
|
||||
end
|
||||
end
|
||||
|
||||
38
lib/mobilizon/medias/media/metadata.ex
Normal file
38
lib/mobilizon/medias/media/metadata.ex
Normal file
@@ -0,0 +1,38 @@
|
||||
defmodule Mobilizon.Medias.Media.Metadata do
|
||||
@moduledoc """
|
||||
Represents a media metadata
|
||||
"""
|
||||
|
||||
use Ecto.Schema
|
||||
import Ecto.Changeset
|
||||
|
||||
@type t :: %__MODULE__{
|
||||
width: non_neg_integer(),
|
||||
height: non_neg_integer(),
|
||||
blurhash: String.t()
|
||||
}
|
||||
|
||||
@required_attrs []
|
||||
|
||||
@optional_attrs [
|
||||
:width,
|
||||
:height,
|
||||
:blurhash
|
||||
]
|
||||
|
||||
@attrs @required_attrs ++ @optional_attrs
|
||||
|
||||
@primary_key false
|
||||
embedded_schema do
|
||||
field(:height, :integer)
|
||||
field(:width, :integer)
|
||||
field(:blurhash, :string)
|
||||
end
|
||||
|
||||
@doc false
|
||||
@spec changeset(t | Ecto.Schema.t(), map) :: Ecto.Changeset.t()
|
||||
def changeset(schema, params) do
|
||||
schema
|
||||
|> cast(params, @attrs)
|
||||
end
|
||||
end
|
||||
@@ -10,6 +10,7 @@ defmodule Mobilizon.Resources.Resource do
|
||||
import EctoEnum
|
||||
defenum(TypeEnum, folder: 0, link: 1, picture: 20, pad: 30, calc: 40, visio: 50)
|
||||
alias Mobilizon.Actors.Actor
|
||||
alias Mobilizon.Resources.Resource.Metadata
|
||||
|
||||
@type t :: %__MODULE__{
|
||||
title: String.t(),
|
||||
@@ -17,7 +18,7 @@ defmodule Mobilizon.Resources.Resource do
|
||||
url: String.t(),
|
||||
resource_url: String.t(),
|
||||
type: atom(),
|
||||
metadata: Mobilizon.Resources.Resource.Metadata.t(),
|
||||
metadata: Metadata.t(),
|
||||
children: list(__MODULE__),
|
||||
parent: __MODULE__,
|
||||
actor: Actor.t(),
|
||||
@@ -37,20 +38,7 @@ defmodule Mobilizon.Resources.Resource do
|
||||
field(:local, :boolean, default: true)
|
||||
field(:published_at, :utc_datetime)
|
||||
|
||||
embeds_one :metadata, Metadata, on_replace: :delete do
|
||||
field(:type, :string)
|
||||
field(:title, :string)
|
||||
field(:description, :string)
|
||||
field(:image_remote_url, :string)
|
||||
field(:width, :integer)
|
||||
field(:height, :integer)
|
||||
field(:author_name, :string)
|
||||
field(:author_url, :string)
|
||||
field(:provider_name, :string)
|
||||
field(:provider_url, :string)
|
||||
field(:html, :string)
|
||||
field(:favicon_url, :string)
|
||||
end
|
||||
embeds_one(:metadata, Metadata, on_replace: :delete)
|
||||
|
||||
has_many(:children, __MODULE__, foreign_key: :parent_id)
|
||||
belongs_to(:parent, __MODULE__, type: :binary_id)
|
||||
@@ -63,27 +51,13 @@ defmodule Mobilizon.Resources.Resource do
|
||||
@required_attrs [:title, :url, :actor_id, :creator_id, :type, :path, :published_at]
|
||||
@optional_attrs [:summary, :parent_id, :resource_url, :local]
|
||||
@attrs @required_attrs ++ @optional_attrs
|
||||
@metadata_attrs [
|
||||
:type,
|
||||
:title,
|
||||
:description,
|
||||
:image_remote_url,
|
||||
:width,
|
||||
:height,
|
||||
:author_name,
|
||||
:author_url,
|
||||
:provider_name,
|
||||
:provider_url,
|
||||
:html,
|
||||
:favicon_url
|
||||
]
|
||||
|
||||
@doc false
|
||||
@spec changeset(t | Ecto.Schema.t(), map) :: Ecto.Changeset.t()
|
||||
def changeset(resource, attrs) do
|
||||
resource
|
||||
|> cast(attrs, @attrs)
|
||||
|> cast_embed(:metadata, with: &metadata_changeset/2)
|
||||
|> cast_embed(:metadata)
|
||||
|> ensure_url(:resource)
|
||||
|> maybe_add_published_at()
|
||||
|> validate_resource_or_folder()
|
||||
@@ -91,11 +65,6 @@ defmodule Mobilizon.Resources.Resource do
|
||||
|> unique_constraint(:url, name: :resource_url_index)
|
||||
end
|
||||
|
||||
defp metadata_changeset(schema, params) do
|
||||
schema
|
||||
|> cast(params, @metadata_attrs)
|
||||
end
|
||||
|
||||
@spec validate_resource_or_folder(Changeset.t()) :: Changeset.t()
|
||||
defp validate_resource_or_folder(%Changeset{} = changeset) do
|
||||
with {status, type} when status in [:changes, :data] <- fetch_field(changeset, :type),
|
||||
|
||||
64
lib/mobilizon/resources/resource/metadata.ex
Normal file
64
lib/mobilizon/resources/resource/metadata.ex
Normal file
@@ -0,0 +1,64 @@
|
||||
defmodule Mobilizon.Resources.Resource.Metadata do
|
||||
@moduledoc """
|
||||
Represents a resource metadata
|
||||
"""
|
||||
|
||||
use Ecto.Schema
|
||||
import Ecto.Changeset
|
||||
|
||||
@type t :: %__MODULE__{
|
||||
type: String.t(),
|
||||
title: String.t(),
|
||||
image_remote_url: String.t(),
|
||||
width: non_neg_integer(),
|
||||
height: non_neg_integer(),
|
||||
author_name: String.t(),
|
||||
author_url: String.t(),
|
||||
provider_name: String.t(),
|
||||
provider_url: String.t(),
|
||||
html: String.t(),
|
||||
favicon_url: String.t()
|
||||
}
|
||||
|
||||
@required_attrs []
|
||||
|
||||
@optional_attrs [
|
||||
:type,
|
||||
:title,
|
||||
:description,
|
||||
:image_remote_url,
|
||||
:width,
|
||||
:height,
|
||||
:author_name,
|
||||
:author_url,
|
||||
:provider_name,
|
||||
:provider_url,
|
||||
:html,
|
||||
:favicon_url
|
||||
]
|
||||
|
||||
@attrs @required_attrs ++ @optional_attrs
|
||||
|
||||
@primary_key false
|
||||
embedded_schema do
|
||||
field(:type, :string)
|
||||
field(:title, :string)
|
||||
field(:description, :string)
|
||||
field(:image_remote_url, :string)
|
||||
field(:width, :integer)
|
||||
field(:height, :integer)
|
||||
field(:author_name, :string)
|
||||
field(:author_url, :string)
|
||||
field(:provider_name, :string)
|
||||
field(:provider_url, :string)
|
||||
field(:html, :string)
|
||||
field(:favicon_url, :string)
|
||||
end
|
||||
|
||||
@doc false
|
||||
@spec changeset(t | Ecto.Schema.t(), map) :: Ecto.Changeset.t()
|
||||
def changeset(schema, params) do
|
||||
schema
|
||||
|> cast(params, @attrs)
|
||||
end
|
||||
end
|
||||
@@ -6,6 +6,7 @@ defmodule Mobilizon.Users.Setting do
|
||||
use Ecto.Schema
|
||||
import Ecto.Changeset
|
||||
alias Mobilizon.Users.{NotificationPendingNotificationDelay, User}
|
||||
alias Mobilizon.Users.Setting.Location
|
||||
|
||||
@type t :: %__MODULE__{
|
||||
timezone: String.t(),
|
||||
@@ -40,8 +41,6 @@ defmodule Mobilizon.Users.Setting do
|
||||
|
||||
@attrs @required_attrs ++ @optional_attrs
|
||||
|
||||
@location_attrs [:name, :range, :geohash]
|
||||
|
||||
@primary_key {:user_id, :id, autogenerate: false}
|
||||
schema "user_settings" do
|
||||
field(:timezone, :string)
|
||||
@@ -60,11 +59,7 @@ defmodule Mobilizon.Users.Setting do
|
||||
field(:group_notifications, NotificationPendingNotificationDelay, default: :one_day)
|
||||
field(:last_notification_sent, :utc_datetime)
|
||||
|
||||
embeds_one :location, Location, on_replace: :update, primary_key: false do
|
||||
field(:name, :string)
|
||||
field(:range, :integer)
|
||||
field(:geohash, :string)
|
||||
end
|
||||
embeds_one(:location, Location, on_replace: :update)
|
||||
|
||||
belongs_to(:user, User, primary_key: true, type: :id, foreign_key: :id, define_field: false)
|
||||
|
||||
@@ -76,13 +71,7 @@ defmodule Mobilizon.Users.Setting do
|
||||
def changeset(setting, attrs) do
|
||||
setting
|
||||
|> cast(attrs, @attrs)
|
||||
|> cast_embed(:location, with: &location_changeset/2)
|
||||
|> cast_embed(:location)
|
||||
|> validate_required(@required_attrs)
|
||||
end
|
||||
|
||||
@spec location_changeset(location, map) :: Ecto.Changeset.t()
|
||||
def location_changeset(schema, params) do
|
||||
schema
|
||||
|> cast(params, @location_attrs)
|
||||
end
|
||||
end
|
||||
|
||||
38
lib/mobilizon/users/setting/location.ex
Normal file
38
lib/mobilizon/users/setting/location.ex
Normal file
@@ -0,0 +1,38 @@
|
||||
defmodule Mobilizon.Users.Setting.Location do
|
||||
@moduledoc """
|
||||
Represents user location information
|
||||
"""
|
||||
|
||||
use Ecto.Schema
|
||||
import Ecto.Changeset
|
||||
|
||||
@type t :: %__MODULE__{
|
||||
name: String.t(),
|
||||
range: non_neg_integer(),
|
||||
geohash: String.t()
|
||||
}
|
||||
|
||||
@required_attrs []
|
||||
|
||||
@optional_attrs [
|
||||
:name,
|
||||
:range,
|
||||
:geohash
|
||||
]
|
||||
|
||||
@attrs @required_attrs ++ @optional_attrs
|
||||
|
||||
@primary_key false
|
||||
embedded_schema do
|
||||
field(:name, :string)
|
||||
field(:range, :integer)
|
||||
field(:geohash, :string)
|
||||
end
|
||||
|
||||
@doc false
|
||||
@spec changeset(t | Ecto.Schema.t(), map) :: Ecto.Changeset.t()
|
||||
def changeset(schema, params) do
|
||||
schema
|
||||
|> cast(params, @attrs)
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user