Fix front-end, allow events to be created by a group, allow to get sessions from an event
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
This commit is contained in:
@@ -18,7 +18,7 @@ defmodule Eventos.Accounts.Account do
|
||||
field :uri, :string
|
||||
field :url, :string
|
||||
field :username, :string
|
||||
has_many :organized_events, Event, [foreign_key: :organizer_id]
|
||||
has_many :organized_events, Event, [foreign_key: :organizer_account_id]
|
||||
many_to_many :groups, Group, join_through: Member
|
||||
has_many :group_request, Request
|
||||
has_one :user, User
|
||||
|
||||
@@ -35,6 +35,7 @@ defmodule Eventos.Events.Event do
|
||||
alias Eventos.Events.{Event, Participant, Request, Tag, Category, Session, Track}
|
||||
alias Eventos.Events.Event.TitleSlug
|
||||
alias Eventos.Accounts.Account
|
||||
alias Eventos.Groups.Group
|
||||
|
||||
schema "events" do
|
||||
field :begins_on, Timex.Ecto.DateTimeWithTimezone
|
||||
@@ -49,7 +50,8 @@ defmodule Eventos.Events.Event do
|
||||
field :thumbnail, :string
|
||||
field :large_image, :string
|
||||
field :publish_at, Timex.Ecto.DateTimeWithTimezone
|
||||
belongs_to :organizer, Account, [foreign_key: :organizer_id]
|
||||
belongs_to :organizer_account, Account, [foreign_key: :organizer_account_id]
|
||||
belongs_to :organizer_group, Group, [foreign_key: :organizer_group_id]
|
||||
many_to_many :tags, Tag, join_through: "events_tags"
|
||||
belongs_to :category, Category
|
||||
many_to_many :participants, Account, join_through: Participant
|
||||
@@ -63,9 +65,9 @@ defmodule Eventos.Events.Event do
|
||||
@doc false
|
||||
def changeset(%Event{} = event, attrs) do
|
||||
event
|
||||
|> cast(attrs, [:title, :description, :begins_on, :ends_on, :organizer_id, :category_id, :state, :geom, :status, :public, :thumbnail, :large_image, :publish_at])
|
||||
|> cast(attrs, [:title, :description, :begins_on, :ends_on, :organizer_account_id, :organizer_group_id, :category_id, :state, :geom, :status, :public, :thumbnail, :large_image, :publish_at])
|
||||
|> cast_assoc(:tags)
|
||||
|> validate_required([:title, :description, :begins_on, :ends_on, :organizer_id, :category_id])
|
||||
|> validate_required([:title, :description, :begins_on, :ends_on, :organizer_account_id, :category_id])
|
||||
|> TitleSlug.maybe_generate_slug()
|
||||
|> TitleSlug.unique_constraint()
|
||||
end
|
||||
|
||||
@@ -7,6 +7,7 @@ defmodule Eventos.Events do
|
||||
alias Eventos.Repo
|
||||
|
||||
alias Eventos.Events.Event
|
||||
alias Eventos.Accounts.Account
|
||||
|
||||
@doc """
|
||||
Returns the list of events.
|
||||
@@ -37,6 +38,14 @@ defmodule Eventos.Events do
|
||||
"""
|
||||
def get_event!(id), do: Repo.get!(Event, id)
|
||||
|
||||
@doc """
|
||||
Gets a single event, with all associations loaded.
|
||||
"""
|
||||
def get_event_full!(id) do
|
||||
event = Repo.get!(Event, id)
|
||||
Repo.preload(event, [:organizer_account, :organizer_group, :category, :sessions, :tracks, :tags, :participants])
|
||||
end
|
||||
|
||||
@doc """
|
||||
Creates a event.
|
||||
|
||||
@@ -407,6 +416,10 @@ defmodule Eventos.Events do
|
||||
Repo.all(Request)
|
||||
end
|
||||
|
||||
def list_requests_for_account(%Account{} = account) do
|
||||
Repo.all(from r in Request, where: r.account_id == ^account.id)
|
||||
end
|
||||
|
||||
@doc """
|
||||
Gets a single request.
|
||||
|
||||
@@ -503,6 +516,20 @@ defmodule Eventos.Events do
|
||||
Repo.all(Session)
|
||||
end
|
||||
|
||||
@doc """
|
||||
Returns the list of sessions for an event
|
||||
"""
|
||||
def list_sessions_for_event(event_id) do
|
||||
Repo.all(from s in Session, where: s.event_id == ^event_id)
|
||||
end
|
||||
|
||||
@doc """
|
||||
Returns the list of sessions for a track
|
||||
"""
|
||||
def list_sessions_for_track(track_id) do
|
||||
Repo.all(from s in Session, where: s.track_id == ^track_id)
|
||||
end
|
||||
|
||||
@doc """
|
||||
Gets a single session.
|
||||
|
||||
|
||||
@@ -32,6 +32,7 @@ defmodule Eventos.Groups.Group do
|
||||
"""
|
||||
use Ecto.Schema
|
||||
import Ecto.Changeset
|
||||
alias Eventos.Events.Event
|
||||
alias Eventos.Groups.{Group, Member, Request}
|
||||
alias Eventos.Accounts.Account
|
||||
alias Eventos.Groups.Group.TitleSlug
|
||||
@@ -43,7 +44,8 @@ defmodule Eventos.Groups.Group do
|
||||
field :slug, TitleSlug.Type
|
||||
field :uri, :string
|
||||
field :url, :string
|
||||
many_to_many :accounts, Account, join_through: Member
|
||||
many_to_many :members, Account, join_through: Member
|
||||
has_many :organized_events, Event, [foreign_key: :organizer_group_id]
|
||||
has_many :requests, Request
|
||||
|
||||
timestamps()
|
||||
|
||||
@@ -37,6 +37,14 @@ defmodule Eventos.Groups do
|
||||
"""
|
||||
def get_group!(id), do: Repo.get!(Group, id)
|
||||
|
||||
@doc """
|
||||
Gets a single group, with all associations loaded.
|
||||
"""
|
||||
def get_group_full!(id) do
|
||||
group = Repo.get!(Group, id)
|
||||
Repo.preload(group, [:members, :organized_events])
|
||||
end
|
||||
|
||||
@doc """
|
||||
Creates a group.
|
||||
|
||||
|
||||
@@ -20,12 +20,12 @@ defmodule EventosWeb.EventController do
|
||||
conn
|
||||
|> put_status(:created)
|
||||
|> put_resp_header("location", event_path(conn, :show, event))
|
||||
|> render("show.json", event: event)
|
||||
|> render("show_simple.json", event: event)
|
||||
end
|
||||
end
|
||||
|
||||
def show(conn, %{"id" => id}) do
|
||||
event = Events.get_event!(id)
|
||||
event = Events.get_event_full!(id)
|
||||
render(conn, "show.json", event: event)
|
||||
end
|
||||
|
||||
@@ -40,7 +40,7 @@ defmodule EventosWeb.EventController do
|
||||
event = Events.get_event!(id)
|
||||
|
||||
with {:ok, %Event{} = event} <- Events.update_event(event, event_params) do
|
||||
render(conn, "show.json", event: event)
|
||||
render(conn, "show_simple.json", event: event)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
52
lib/eventos_web/controllers/event_request_controller.ex
Normal file
52
lib/eventos_web/controllers/event_request_controller.ex
Normal file
@@ -0,0 +1,52 @@
|
||||
defmodule EventosWeb.EventRequestController do
|
||||
@moduledoc """
|
||||
Controller for Event requests
|
||||
"""
|
||||
use EventosWeb, :controller
|
||||
|
||||
alias Eventos.Events
|
||||
alias Eventos.Events.{Event, Request}
|
||||
|
||||
action_fallback EventosWeb.FallbackController
|
||||
|
||||
def index_for_user(conn, _params) do
|
||||
account = Guardian.Plug.current_resource(conn).account
|
||||
requests = Events.list_requests_for_account(account)
|
||||
render(conn, "index.json", requests: requests)
|
||||
end
|
||||
|
||||
def create(conn, %{"request" => request_params}) do
|
||||
request_params = Map.put(request_params, "account_id", Guardian.Plug.current_resource(conn).account.id)
|
||||
with {:ok, %Request{} = request} <- Events.create_request(request_params) do
|
||||
conn
|
||||
|> put_status(:created)
|
||||
|> put_resp_header("location", event_request_path(conn, :show, request))
|
||||
|> render("show.json", request: request)
|
||||
end
|
||||
end
|
||||
|
||||
def create_for_event(conn, %{"request" => request_params, "id" => event_id}) do
|
||||
request_params = Map.put(request_params, "event_id", event_id)
|
||||
create(conn, request_params)
|
||||
end
|
||||
|
||||
def show(conn, %{"id" => id}) do
|
||||
request = Events.get_request!(id)
|
||||
render(conn, "show.json", request: request)
|
||||
end
|
||||
|
||||
def update(conn, %{"id" => id, "request" => request_params}) do
|
||||
request = Events.get_request!(id)
|
||||
|
||||
with {:ok, %Request{} = request} <- Events.update_request(request, request_params) do
|
||||
render(conn, "show.json", request: request)
|
||||
end
|
||||
end
|
||||
|
||||
def delete(conn, %{"id" => id}) do
|
||||
request = Events.get_request!(id)
|
||||
with {:ok, %Request{}} <- Events.delete_request(request) do
|
||||
send_resp(conn, :no_content, "")
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -15,16 +15,18 @@ defmodule EventosWeb.GroupController do
|
||||
end
|
||||
|
||||
def create(conn, %{"group" => group_params}) do
|
||||
group_params = Map.put(group_params, "uri", "h")
|
||||
group_params = Map.put(group_params, "url", "h")
|
||||
with {:ok, %Group{} = group} <- Groups.create_group(group_params) do
|
||||
conn
|
||||
|> put_status(:created)
|
||||
|> put_resp_header("location", group_path(conn, :show, group))
|
||||
|> render("show.json", group: group)
|
||||
|> render("show_simple.json", group: group)
|
||||
end
|
||||
end
|
||||
|
||||
def show(conn, %{"id" => id}) do
|
||||
group = Groups.get_group!(id)
|
||||
group = Groups.get_group_full!(id)
|
||||
render(conn, "show.json", group: group)
|
||||
end
|
||||
|
||||
@@ -32,7 +34,7 @@ defmodule EventosWeb.GroupController do
|
||||
group = Groups.get_group!(id)
|
||||
|
||||
with {:ok, %Group{} = group} <- Groups.update_group(group, group_params) do
|
||||
render(conn, "show.json", group: group)
|
||||
render(conn, "show_simple.json", group: group)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -28,6 +28,16 @@ defmodule EventosWeb.SessionController do
|
||||
render(conn, "show.json", session: session)
|
||||
end
|
||||
|
||||
def show_sessions_for_event(conn, %{"id" => event_id}) do
|
||||
sessions = Events.list_sessions_for_event(event_id)
|
||||
render(conn, "index.json", sessions: sessions)
|
||||
end
|
||||
|
||||
def show_sessions_for_track(conn, %{"id" => track}) do
|
||||
sessions = Events.list_sessions_for_track(track)
|
||||
render(conn, "index.json", sessions: sessions)
|
||||
end
|
||||
|
||||
def update(conn, %{"id" => id, "session" => session_params}) do
|
||||
session = Events.get_session!(id)
|
||||
|
||||
|
||||
@@ -28,6 +28,9 @@ defmodule EventosWeb.Router do
|
||||
post "/login", UserSessionController, :sign_in
|
||||
resources "/groups", GroupController, only: [:index, :show]
|
||||
resources "/events", EventController, only: [:index, :show]
|
||||
get "/events/:id/ics", EventController, :export_to_ics
|
||||
get "/events/:id/tracks", TrackController, :show_tracks_for_event
|
||||
get "/events/:id/sessions", SessionController, :show_sessions_for_event
|
||||
resources "/accounts", AccountController, only: [:index, :show]
|
||||
resources "/tags", TagController, only: [:index, :show]
|
||||
resources "/categories", CategoryController, only: [:index, :show]
|
||||
@@ -44,16 +47,18 @@ defmodule EventosWeb.Router do
|
||||
resources "/users", UserController, except: [:new, :edit, :show]
|
||||
resources "/accounts", AccountController, except: [:new, :edit]
|
||||
resources "/events", EventController
|
||||
get "/events/:id/ics", EventController, :export_to_ics
|
||||
post "/events/:id/request", EventRequestController, :create_for_event
|
||||
resources "/participant", ParticipantController
|
||||
resources "/requests", EventRequestController
|
||||
resources "/groups", GroupController, except: [:index, :show]
|
||||
post "/groups/:id/request", GroupRequestController, :create_for_group
|
||||
resources "/members", MemberController
|
||||
resources "/requests", GroupRequestController
|
||||
resources "/sessions", SessionController, except: [:index, :show]
|
||||
resources "/tracks", TrackController, except: [:index, :show]
|
||||
get "/tracks/:id/sessions", SessionController, :show_sessions_for_track
|
||||
resources "/categories", CategoryController
|
||||
resources "/tags", TagController
|
||||
resources "/event_accounts", EventAccountsController
|
||||
resources "/event_requests", EventRequestController
|
||||
resources "/groups", GroupController, except: [:index]
|
||||
resources "/group_accounts", GroupAccountController
|
||||
resources "/group_requests", GroupRequestController
|
||||
resources "/sessions", SessionController, except: [:new, :edit]
|
||||
resources "/tracks", TrackController, except: [:new, :edit]
|
||||
end
|
||||
|
||||
scope "/", EventosWeb do
|
||||
|
||||
@@ -3,23 +3,27 @@ defmodule EventosWeb.AccountView do
|
||||
View for Accounts
|
||||
"""
|
||||
use EventosWeb, :view
|
||||
alias EventosWeb.AccountView
|
||||
alias EventosWeb.{AccountView, EventView}
|
||||
|
||||
def render("index.json", %{accounts: accounts}) do
|
||||
%{data: render_many(accounts, AccountView, "account_for_user.json")}
|
||||
%{data: render_many(accounts, AccountView, "acccount_basic.json")}
|
||||
end
|
||||
|
||||
def render("show.json", %{account: account}) do
|
||||
%{data: render_one(account, AccountView, "account.json")}
|
||||
end
|
||||
|
||||
def render("account_for_user.json", %{account: account}) do
|
||||
def render("show_basic.json", %{account: account}) do
|
||||
%{data: render_one(account, AccountView, "account_basic.json")}
|
||||
end
|
||||
|
||||
def render("acccount_basic.json", %{account: account}) do
|
||||
%{id: account.id,
|
||||
username: account.username,
|
||||
domain: account.domain,
|
||||
display_name: account.display_name,
|
||||
description: account.description,
|
||||
public_key: account.public_key,
|
||||
# public_key: account.public_key,
|
||||
suspended: account.suspended,
|
||||
uri: account.uri,
|
||||
url: account.url,
|
||||
@@ -32,11 +36,11 @@ defmodule EventosWeb.AccountView do
|
||||
domain: account.domain,
|
||||
display_name: account.display_name,
|
||||
description: account.description,
|
||||
public_key: account.public_key,
|
||||
# public_key: account.public_key,
|
||||
suspended: account.suspended,
|
||||
uri: account.uri,
|
||||
url: account.url,
|
||||
organized_events: account.organized_events
|
||||
organized_events: render_many(account.organized_events, EventView, "event_simple.json")
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
@@ -3,21 +3,38 @@ defmodule EventosWeb.EventView do
|
||||
View for Events
|
||||
"""
|
||||
use EventosWeb, :view
|
||||
alias EventosWeb.EventView
|
||||
alias EventosWeb.{EventView, AccountView, GroupView}
|
||||
|
||||
def render("index.json", %{events: events}) do
|
||||
%{data: render_many(events, EventView, "event.json")}
|
||||
%{data: render_many(events, EventView, "event_simple.json")}
|
||||
end
|
||||
|
||||
def render("show_simple.json", %{event: event}) do
|
||||
%{data: render_one(event, EventView, "event_simple.json")}
|
||||
end
|
||||
|
||||
def render("show.json", %{event: event}) do
|
||||
%{data: render_one(event, EventView, "event.json")}
|
||||
end
|
||||
|
||||
def render("event_simple.json", %{event: event}) do
|
||||
%{id: event.id,
|
||||
title: event.title,
|
||||
description: event.description,
|
||||
begins_on: event.begins_on,
|
||||
ends_on: event.ends_on,
|
||||
}
|
||||
end
|
||||
|
||||
def render("event.json", %{event: event}) do
|
||||
%{id: event.id,
|
||||
title: event.title,
|
||||
description: event.description,
|
||||
begins_on: event.begins_on,
|
||||
ends_on: event.ends_on}
|
||||
ends_on: event.ends_on,
|
||||
organizer: render_one(event.organizer_account, AccountView, "acccount_basic.json"),
|
||||
group: render_one(event.organizer_group, GroupView, "group_basic.json"),
|
||||
participants: render_many(event.participants, AccountView, "show_basic.json"),
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
@@ -3,22 +3,39 @@ defmodule EventosWeb.GroupView do
|
||||
View for Groups
|
||||
"""
|
||||
use EventosWeb, :view
|
||||
alias EventosWeb.GroupView
|
||||
alias EventosWeb.{GroupView, AccountView}
|
||||
|
||||
def render("index.json", %{groups: groups}) do
|
||||
%{data: render_many(groups, GroupView, "group.json")}
|
||||
%{data: render_many(groups, GroupView, "group_simple.json")}
|
||||
end
|
||||
|
||||
def render("show.json", %{group: group}) do
|
||||
%{data: render_one(group, GroupView, "group.json")}
|
||||
end
|
||||
|
||||
def render("show_simple.json", %{group: group}) do
|
||||
%{data: render_one(group, GroupView, "group_simple.json")}
|
||||
end
|
||||
|
||||
def render("group_simple.json", %{group: group}) do
|
||||
%{id: group.id,
|
||||
title: group.title,
|
||||
description: group.description,
|
||||
suspended: group.suspended,
|
||||
url: group.url,
|
||||
uri: group.uri
|
||||
}
|
||||
end
|
||||
|
||||
def render("group.json", %{group: group}) do
|
||||
%{id: group.id,
|
||||
title: group.title,
|
||||
description: group.description,
|
||||
suspended: group.suspended,
|
||||
url: group.url,
|
||||
uri: group.uri}
|
||||
uri: group.uri,
|
||||
members: render_many(group.members, AccountView, "acccount_basic.json"),
|
||||
events: render_many(group.organized_events, EventView, "event_simple.json")
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
@@ -28,7 +28,7 @@ defmodule EventosWeb.UserView do
|
||||
def render("user_simple.json", %{user: user}) do
|
||||
%{id: user.id,
|
||||
role: user.role,
|
||||
account: render_one(user.account, AccountView, "account_for_user.json")
|
||||
account: render_one(user.account, AccountView, "acccount_basic.json")
|
||||
}
|
||||
end
|
||||
|
||||
|
||||
Reference in New Issue
Block a user