@@ -9,9 +9,10 @@ defmodule CodeCorps.Project do
99 import CodeCorps.Helpers.Slug
1010 import CodeCorps.Helpers.URL , only: [ prefix_url: 2 ]
1111 import CodeCorps.Validators.SlugValidator
12+ import Ecto.Query , only: [ where: 3 ]
1213
14+ alias CodeCorps . { Category , Repo , Skill , TaskList }
1315 alias CodeCorps.Services.MarkdownRendererService
14- alias CodeCorps.TaskList
1516
1617 alias Ecto.Changeset
1718
@@ -42,10 +43,11 @@ defmodule CodeCorps.Project do
4243 has_many :task_lists , CodeCorps.TaskList
4344 has_many :tasks , CodeCorps.Task
4445
45- has_many :categories , through: [ :project_categories , :category ]
46- has_many :skills , through: [ :project_skills , :skill ]
4746 has_many :stripe_connect_subscriptions , through: [ :stripe_connect_plan , :stripe_connect_subscriptions ]
4847
48+ many_to_many :categories , CodeCorps.Category , join_through: CodeCorps.ProjectCategory
49+ many_to_many :skills , CodeCorps.Skill , join_through: CodeCorps.ProjectSkill
50+
4951 timestamps ( )
5052 end
5153
@@ -54,7 +56,7 @@ defmodule CodeCorps.Project do
5456 |> cast ( params , [ :title , :description , :long_description_markdown , :cloudinary_public_id , :default_color , :website ] )
5557 |> prefix_url ( :website )
5658 |> validate_format ( :website , CodeCorps.Helpers.URL . valid_format ( ) )
57- |> validate_required ( :title )
59+ |> validate_required ( [ :title ] )
5860 |> generate_slug ( :title , :slug )
5961 |> validate_slug ( :slug )
6062 |> unique_constraint ( :slug , name: :index_projects_on_slug )
@@ -71,12 +73,45 @@ defmodule CodeCorps.Project do
7173 struct
7274 |> changeset ( params )
7375 |> cast ( params , [ :organization_id ] )
76+ |> validate_required ( [ :cloudinary_public_id , :description ] )
77+ |> associate_categories ( params )
78+ |> validate_length ( :categories , min: 1 )
79+ |> associate_skills ( params )
80+ |> validate_length ( :skills , min: 1 )
7481 |> put_assoc ( :task_lists , TaskList . default_task_lists ( ) )
7582 |> put_member_assoc ( )
7683 |> generate_icon_color ( :default_color )
7784 |> assoc_constraint ( :organization )
7885 end
7986
87+ defp associate_categories ( changeset , % { "categories_ids" => ids } ) when is_list ( ids ) when length ( ids ) > 0 do
88+ categories = ids |> Enum . map ( & String . to_integer / 1 ) |> find_categories ( )
89+ changeset |> put_assoc ( :categories , categories )
90+ end
91+ defp associate_categories ( changeset , _ ) do
92+ changeset |> put_assoc ( :categories , [ ] )
93+ end
94+
95+ defp find_categories ( ids ) do
96+ Category
97+ |> where ( [ object ] , object . id in ^ ids )
98+ |> Repo . all ( )
99+ end
100+
101+ defp associate_skills ( changeset , % { "skills_ids" => ids } ) when is_list ( ids ) when length ( ids ) > 0 do
102+ skills = ids |> Enum . map ( & String . to_integer / 1 ) |> find_skills ( )
103+ changeset |> put_assoc ( :skills , skills )
104+ end
105+ defp associate_skills ( changeset , _ ) do
106+ changeset |> put_assoc ( :skills , [ ] )
107+ end
108+
109+ defp find_skills ( ids ) do
110+ Skill
111+ |> where ( [ object ] , object . id in ^ ids )
112+ |> Repo . all ( )
113+ end
114+
80115 @ doc """
81116 Builds a changeset for updating a project.
82117 """
0 commit comments