From 5ed60239a6f08fa4364c2a0c27d66684fbe8ecc9 Mon Sep 17 00:00:00 2001 From: Anthony Bui Date: Sat, 3 Oct 2020 16:15:20 +0200 Subject: [PATCH] added CoordinatorPosition schemas, migrations, seeds as well as API for fetching --- ...133_create_coordinator_positions_table.exs | 12 ++ priv/repo/seeds.exs | 118 ++++++++++++++++++ .../coordinator_position_controller.ex | 12 ++ web/models/coordinator_position.ex | 21 ++++ web/router.ex | 2 + web/views/coordinator_position_view.ex | 16 +++ 6 files changed, 181 insertions(+) create mode 100644 priv/repo/migrations/20201003122133_create_coordinator_positions_table.exs create mode 100644 web/controllers/coordinator_position_controller.ex create mode 100644 web/models/coordinator_position.ex create mode 100644 web/views/coordinator_position_view.ex diff --git a/priv/repo/migrations/20201003122133_create_coordinator_positions_table.exs b/priv/repo/migrations/20201003122133_create_coordinator_positions_table.exs new file mode 100644 index 00000000..9fd23691 --- /dev/null +++ b/priv/repo/migrations/20201003122133_create_coordinator_positions_table.exs @@ -0,0 +1,12 @@ +defmodule Nexpo.Repo.Migrations.CreateCoordinatorPositionsTables do + use Ecto.Migration + + def change do + create table(:coordinator_positions) do + add(:type, :string) + add(:position, :string) + + timestamps() + end + end +end diff --git a/priv/repo/seeds.exs b/priv/repo/seeds.exs index b6e75836..ed31e461 100644 --- a/priv/repo/seeds.exs +++ b/priv/repo/seeds.exs @@ -491,3 +491,121 @@ EventInfo.build_assoc!(event_info1, 1) EventInfo.build_assoc!(event_info2, 2) EventInfo.build_assoc!(event_info3, 3) EventInfo.build_assoc!(event_info4, 4) + +# Create some coordinator_positions +alias Nexpo.CoordinatorPosition + +Repo.insert!(%CoordinatorPosition{ + type: "Business & Relations", + position: "Student Sessions Coordinator", +}) + +Repo.insert!(%CoordinatorPosition{ + type: "Business & Relations", + position: "Career Room Coordinator", +}) + +Repo.insert!(%CoordinatorPosition{ + type: "Fair & Logistics", + position: "Logistics Coordinator", +}) + +Repo.insert!(%CoordinatorPosition{ + type: "Fair & Logistics", + position: "Shuttle Service Coordinator", +}) + +Repo.insert!(%CoordinatorPosition{ + type: "Fair & Logistics", + position: "Lunch Coordinator", +}) + +Repo.insert!(%CoordinatorPosition{ + type: "Fair & Logistics", + position: "Lounge Coordinator", +}) + +Repo.insert!(%CoordinatorPosition{ + type: "Fair & Logistics", + position: "Interior Coordinator", +}) + +Repo.insert!(%CoordinatorPosition{ + type: "Fair & Logistics", + position: "Premises Coordinator", +}) + +Repo.insert!(%CoordinatorPosition{ + type: "Fair & Logistics", + position: "Power Supply & Network Coordinator", +}) + +Repo.insert!(%CoordinatorPosition{ + type: "Marketing & Public Relations", + position: "Info Desk Coordinator", +}) + +Repo.insert!(%CoordinatorPosition{ + type: "Marketing & Public Relations", + position: "Market Research Coordinator", +}) + +Repo.insert!(%CoordinatorPosition{ + type: "Marketing & Public Relations", + position: "Web Page Coordinator", +}) + +Repo.insert!(%CoordinatorPosition{ + type: "Marketing & Public Relations", + position: "PR Coordinator", +}) + +Repo.insert!(%CoordinatorPosition{ + type: "Marketing & Public Relations", + position: "Art Coordinator", +}) + +Repo.insert!(%CoordinatorPosition{ + type: "Marketing & Public Relations", + position: "Photo Coordinator", +}) + +Repo.insert!(%CoordinatorPosition{ + type: "Marketing & Public Relations", + position: "Film Coordinator", +}) + +Repo.insert!(%CoordinatorPosition{ + type: "Event & Recruitment", + position: "Event Coordinator", +}) + +Repo.insert!(%CoordinatorPosition{ + type: "Event & Recruitment", + position: "Recruitment & Internal Events Coordinator", +}) + +Repo.insert!(%CoordinatorPosition{ + type: "Event & Recruitment", + position: "Banquet Entertainment Coordinator", +}) + +Repo.insert!(%CoordinatorPosition{ + type: "Event & Recruitment", + position: "Banquet Decor Coordinator", +}) + +Repo.insert!(%CoordinatorPosition{ + type: "Event & Recruitment", + position: "Banquet Technique Coordinator", +}) + +Repo.insert!(%CoordinatorPosition{ + type: "IT Group", + position: "UX Coordinator", +}) + +Repo.insert!(%CoordinatorPosition{ + type: "IT Group", + position: "IT Developer", +}) \ No newline at end of file diff --git a/web/controllers/coordinator_position_controller.ex b/web/controllers/coordinator_position_controller.ex new file mode 100644 index 00000000..28cf3365 --- /dev/null +++ b/web/controllers/coordinator_position_controller.ex @@ -0,0 +1,12 @@ +defmodule Nexpo.CoordinatorPositionController do + use Nexpo.Web, :controller + + alias Nexpo.CoordinatorPosition + + def index(conn, %{}) do + positions = Repo.all(CoordinatorPosition) + + render(conn, "index.json", positions: positions) + end + +end diff --git a/web/models/coordinator_position.ex b/web/models/coordinator_position.ex new file mode 100644 index 00000000..cec8c08f --- /dev/null +++ b/web/models/coordinator_position.ex @@ -0,0 +1,21 @@ +defmodule Nexpo.CoordinatorPosition do + use Nexpo.Web, :model + + alias Nexpo.Repo + alias Nexpo.CoordinatorPosition + + schema "coordinator_positions" do + field(:type, :string) + field(:position, :string) + + timestamps() + end + + def changeset(struct, params \\ %{}) do + struct + |> cast(params, [:type, :position]) + |> validate_required([:type, :position]) + |> unique_constraint(:position, message: "Position already exists") + end + +end \ No newline at end of file diff --git a/web/router.ex b/web/router.ex index 3fdc4f4a..fbc9af9e 100644 --- a/web/router.ex +++ b/web/router.ex @@ -103,5 +103,7 @@ defmodule Nexpo.Router do post("/password/forgot", UserController, :forgot_password_init) get("/password/forgot/:key", UserController, :forgot_password_verification) post("/password/new/:key", UserController, :replace_forgotten_password) + + resources("/coordinator_positions", CoordinatorPositionController, only: [:index]) end end diff --git a/web/views/coordinator_position_view.ex b/web/views/coordinator_position_view.ex new file mode 100644 index 00000000..10afcde8 --- /dev/null +++ b/web/views/coordinator_position_view.ex @@ -0,0 +1,16 @@ +defmodule Nexpo.CoordinatorPositionView do + use Nexpo.Web, :view + + def render("index.json", %{positions: positions}) do + %{data: render_many(positions, Nexpo.CoordinatorPositionView, "position.json", as: :position)} + end + + def render("position.json", %{position: position}) do + base = [ + :type, + :position + ] + + Nexpo.Support.View.render_object(position, base) + end +end