Skip to content

Commit 61deb0f

Browse files
joshsmithbegedin
authored andcommitted
Add GithubIssueAssignee
1 parent 898e4af commit 61deb0f

7 files changed

Lines changed: 177 additions & 2 deletions

File tree

lib/code_corps/model/github_issue.ex

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ defmodule CodeCorps.GithubIssue do
2525
belongs_to :github_user, CodeCorps.GithubUser
2626

2727
has_many :github_comments, CodeCorps.GithubComment
28+
has_many :github_issue_assignees, CodeCorps.GithubIssueAssignee
2829
has_one :task, CodeCorps.Task
2930

3031
timestamps()
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
defmodule CodeCorps.GithubIssueAssignee do
2+
use Ecto.Schema
3+
import Ecto.Changeset
4+
5+
6+
schema "github_issue_assignees" do
7+
belongs_to :github_issue, CodeCorps.GithubIssue
8+
belongs_to :github_user, CodeCorps.GithubUser
9+
10+
timestamps()
11+
end
12+
13+
@doc false
14+
def changeset(struct, attrs) do
15+
struct
16+
|> cast(attrs, [:github_issue_id, :github_user_id])
17+
|> validate_required([:github_issue_id, :github_user_id])
18+
|> assoc_constraint(:github_issue)
19+
|> assoc_constraint(:github_user)
20+
|> unique_constraint(:github_user, name: :github_issue_assignees_github_issue_id_github_user_id_index)
21+
end
22+
end

lib/code_corps/policy/github_repo.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ defmodule CodeCorps.Policy.GithubRepo do
44
"""
55
import CodeCorps.Policy.Helpers, only: [get_project: 1, administered_by?: 2]
66

7-
alias CodeCorps.{GithubAppInstallation, GithubRepo, User}
7+
alias CodeCorps.{GithubRepo, User}
88

99
def update?(%User{} = user, %GithubRepo{project_id: nil}, %{"project_id" => _} = params) do
1010
params |> get_project |> administered_by?(user)
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
defmodule CodeCorps.Repo.Migrations.CreateGithubIssueAssignees do
2+
use Ecto.Migration
3+
4+
def change do
5+
create table(:github_issue_assignees) do
6+
add :github_issue_id, references(:github_issues, on_delete: :nothing)
7+
add :github_user_id, references(:github_users, on_delete: :nothing)
8+
9+
timestamps()
10+
end
11+
12+
create index(:github_issue_assignees, [:github_issue_id])
13+
create index(:github_issue_assignees, [:github_user_id])
14+
create unique_index(:github_issue_assignees, [:github_issue_id, :github_user_id])
15+
end
16+
end

priv/repo/structure.sql

Lines changed: 85 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,38 @@ CREATE SEQUENCE github_events_id_seq
309309
ALTER SEQUENCE github_events_id_seq OWNED BY github_events.id;
310310

311311

312+
--
313+
-- Name: github_issue_assignees; Type: TABLE; Schema: public; Owner: -
314+
--
315+
316+
CREATE TABLE github_issue_assignees (
317+
id bigint NOT NULL,
318+
github_issue_id bigint,
319+
github_user_id bigint,
320+
inserted_at timestamp without time zone NOT NULL,
321+
updated_at timestamp without time zone NOT NULL
322+
);
323+
324+
325+
--
326+
-- Name: github_issue_assignees_id_seq; Type: SEQUENCE; Schema: public; Owner: -
327+
--
328+
329+
CREATE SEQUENCE github_issue_assignees_id_seq
330+
START WITH 1
331+
INCREMENT BY 1
332+
NO MINVALUE
333+
NO MAXVALUE
334+
CACHE 1;
335+
336+
337+
--
338+
-- Name: github_issue_assignees_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
339+
--
340+
341+
ALTER SEQUENCE github_issue_assignees_id_seq OWNED BY github_issue_assignees.id;
342+
343+
312344
--
313345
-- Name: github_issues; Type: TABLE; Schema: public; Owner: -
314346
--
@@ -1788,6 +1820,13 @@ ALTER TABLE ONLY github_comments ALTER COLUMN id SET DEFAULT nextval('github_com
17881820
ALTER TABLE ONLY github_events ALTER COLUMN id SET DEFAULT nextval('github_events_id_seq'::regclass);
17891821

17901822

1823+
--
1824+
-- Name: github_issue_assignees id; Type: DEFAULT; Schema: public; Owner: -
1825+
--
1826+
1827+
ALTER TABLE ONLY github_issue_assignees ALTER COLUMN id SET DEFAULT nextval('github_issue_assignees_id_seq'::regclass);
1828+
1829+
17911830
--
17921831
-- Name: github_issues id; Type: DEFAULT; Schema: public; Owner: -
17931832
--
@@ -2096,6 +2135,14 @@ ALTER TABLE ONLY github_events
20962135
ADD CONSTRAINT github_events_pkey PRIMARY KEY (id);
20972136

20982137

2138+
--
2139+
-- Name: github_issue_assignees github_issue_assignees_pkey; Type: CONSTRAINT; Schema: public; Owner: -
2140+
--
2141+
2142+
ALTER TABLE ONLY github_issue_assignees
2143+
ADD CONSTRAINT github_issue_assignees_pkey PRIMARY KEY (id);
2144+
2145+
20992146
--
21002147
-- Name: github_issues github_issues_pkey; Type: CONSTRAINT; Schema: public; Owner: -
21012148
--
@@ -2456,6 +2503,27 @@ CREATE UNIQUE INDEX github_events_github_delivery_id_index ON github_events USIN
24562503
CREATE INDEX github_events_status_index ON github_events USING btree (status);
24572504

24582505

2506+
--
2507+
-- Name: github_issue_assignees_github_issue_id_github_user_id_index; Type: INDEX; Schema: public; Owner: -
2508+
--
2509+
2510+
CREATE UNIQUE INDEX github_issue_assignees_github_issue_id_github_user_id_index ON github_issue_assignees USING btree (github_issue_id, github_user_id);
2511+
2512+
2513+
--
2514+
-- Name: github_issue_assignees_github_issue_id_index; Type: INDEX; Schema: public; Owner: -
2515+
--
2516+
2517+
CREATE INDEX github_issue_assignees_github_issue_id_index ON github_issue_assignees USING btree (github_issue_id);
2518+
2519+
2520+
--
2521+
-- Name: github_issue_assignees_github_user_id_index; Type: INDEX; Schema: public; Owner: -
2522+
--
2523+
2524+
CREATE INDEX github_issue_assignees_github_user_id_index ON github_issue_assignees USING btree (github_user_id);
2525+
2526+
24592527
--
24602528
-- Name: github_issues_github_id_index; Type: INDEX; Schema: public; Owner: -
24612529
--
@@ -3341,6 +3409,22 @@ ALTER TABLE ONLY github_comments
33413409
ADD CONSTRAINT github_comments_github_user_id_fkey FOREIGN KEY (github_user_id) REFERENCES github_users(id);
33423410

33433411

3412+
--
3413+
-- Name: github_issue_assignees github_issue_assignees_github_issue_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
3414+
--
3415+
3416+
ALTER TABLE ONLY github_issue_assignees
3417+
ADD CONSTRAINT github_issue_assignees_github_issue_id_fkey FOREIGN KEY (github_issue_id) REFERENCES github_issues(id);
3418+
3419+
3420+
--
3421+
-- Name: github_issue_assignees github_issue_assignees_github_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
3422+
--
3423+
3424+
ALTER TABLE ONLY github_issue_assignees
3425+
ADD CONSTRAINT github_issue_assignees_github_user_id_fkey FOREIGN KEY (github_user_id) REFERENCES github_users(id);
3426+
3427+
33443428
--
33453429
-- Name: github_issues github_issues_github_pull_request_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
33463430
--
@@ -3801,5 +3885,5 @@ ALTER TABLE ONLY users
38013885
-- PostgreSQL database dump complete
38023886
--
38033887

3804-
INSERT INTO "schema_migrations" (version) VALUES (20160723215749), (20160804000000), (20160804001111), (20160805132301), (20160805203929), (20160808143454), (20160809214736), (20160810124357), (20160815125009), (20160815143002), (20160816020347), (20160816034021), (20160817220118), (20160818000944), (20160818132546), (20160820113856), (20160820164905), (20160822002438), (20160822004056), (20160822011624), (20160822020401), (20160822044612), (20160830081224), (20160830224802), (20160911233738), (20160912002705), (20160912145957), (20160918003206), (20160928232404), (20161003185918), (20161019090945), (20161019110737), (20161020144622), (20161021131026), (20161031001615), (20161121005339), (20161121014050), (20161121043941), (20161121045709), (20161122015942), (20161123081114), (20161123150943), (20161124085742), (20161125200620), (20161126045705), (20161127054559), (20161205024856), (20161207112519), (20161209192504), (20161212005641), (20161214005935), (20161215052051), (20161216051447), (20161218005913), (20161219160401), (20161219163909), (20161220141753), (20161221085759), (20161226213600), (20161231063614), (20170102130055), (20170102181053), (20170104113708), (20170104212623), (20170104235423), (20170106013143), (20170115035159), (20170115230549), (20170121014100), (20170131234029), (20170201014901), (20170201025454), (20170201035458), (20170201183258), (20170220032224), (20170224233516), (20170226050552), (20170228085250), (20170308214128), (20170308220713), (20170308222552), (20170313130611), (20170318032449), (20170318082740), (20170324194827), (20170424215355), (20170501225441), (20170505224222), (20170526095401), (20170602000208), (20170622205732), (20170626231059), (20170628092119), (20170628213609), (20170629183404), (20170630140136), (20170706132431), (20170707213648), (20170711122252), (20170717092127), (20170725060612), (20170727052644), (20170731130121), (20170814131722), (20170913114958), (20170921014405), (20170925214512), (20170925230419), (20170926134646), (20170927100300), (20170928234412), (20171003134956), (20171003225853), (20171006063358), (20171006161407), (20171012215106), (20171012221231), (20171016125229), (20171016125516), (20171016223356), (20171016235656), (20171017235433), (20171019191035), (20171025184225), (20171026010933), (20171027061833), (20171028011642), (20171028173508), (20171030182857), (20171031232023), (20171031234356), (20171101023309), (20171104013543), (20171106045740), (20171106050209), (20171106103153), (20171106200036), (20171109231538), (20171110001134), (20171114010851), (20171114033357), (20171114225214), (20171114225713), (20171114232534), (20171115201624), (20171115225358);
3888+
INSERT INTO "schema_migrations" (version) VALUES (20160723215749), (20160804000000), (20160804001111), (20160805132301), (20160805203929), (20160808143454), (20160809214736), (20160810124357), (20160815125009), (20160815143002), (20160816020347), (20160816034021), (20160817220118), (20160818000944), (20160818132546), (20160820113856), (20160820164905), (20160822002438), (20160822004056), (20160822011624), (20160822020401), (20160822044612), (20160830081224), (20160830224802), (20160911233738), (20160912002705), (20160912145957), (20160918003206), (20160928232404), (20161003185918), (20161019090945), (20161019110737), (20161020144622), (20161021131026), (20161031001615), (20161121005339), (20161121014050), (20161121043941), (20161121045709), (20161122015942), (20161123081114), (20161123150943), (20161124085742), (20161125200620), (20161126045705), (20161127054559), (20161205024856), (20161207112519), (20161209192504), (20161212005641), (20161214005935), (20161215052051), (20161216051447), (20161218005913), (20161219160401), (20161219163909), (20161220141753), (20161221085759), (20161226213600), (20161231063614), (20170102130055), (20170102181053), (20170104113708), (20170104212623), (20170104235423), (20170106013143), (20170115035159), (20170115230549), (20170121014100), (20170131234029), (20170201014901), (20170201025454), (20170201035458), (20170201183258), (20170220032224), (20170224233516), (20170226050552), (20170228085250), (20170308214128), (20170308220713), (20170308222552), (20170313130611), (20170318032449), (20170318082740), (20170324194827), (20170424215355), (20170501225441), (20170505224222), (20170526095401), (20170602000208), (20170622205732), (20170626231059), (20170628092119), (20170628213609), (20170629183404), (20170630140136), (20170706132431), (20170707213648), (20170711122252), (20170717092127), (20170725060612), (20170727052644), (20170731130121), (20170814131722), (20170913114958), (20170921014405), (20170925214512), (20170925230419), (20170926134646), (20170927100300), (20170928234412), (20171003134956), (20171003225853), (20171006063358), (20171006161407), (20171012215106), (20171012221231), (20171016125229), (20171016125516), (20171016223356), (20171016235656), (20171017235433), (20171019191035), (20171025184225), (20171026010933), (20171027061833), (20171028011642), (20171028173508), (20171030182857), (20171031232023), (20171031234356), (20171101023309), (20171104013543), (20171106045740), (20171106050209), (20171106103153), (20171106200036), (20171109231538), (20171110001134), (20171114010851), (20171114033357), (20171114225214), (20171114225713), (20171114232534), (20171115201624), (20171115225358), (20171119004204);
38053889

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
defmodule CodeCorps.GithubIssueAssigneeTest do
2+
@moduledoc false
3+
4+
use CodeCorps.ModelCase
5+
6+
alias CodeCorps.GithubIssueAssignee
7+
8+
describe "changeset/2" do
9+
@required_attrs ~w(github_issue_id github_user_id)
10+
11+
test "requires #{@required_attrs}" do
12+
changeset = GithubIssueAssignee.changeset(%GithubIssueAssignee{}, %{})
13+
14+
assert_validation_triggered(changeset, :github_issue_id, :required)
15+
assert_validation_triggered(changeset, :github_user_id, :required)
16+
end
17+
18+
test "ensures associated GithubIssue record exists" do
19+
github_user = insert(:github_user)
20+
changeset = GithubIssueAssignee.changeset(%GithubIssueAssignee{}, %{github_issue_id: -1, github_user_id: github_user.id})
21+
22+
{:error, response_changeset} = Repo.insert(changeset)
23+
assert_error_message(response_changeset, :github_issue, "does not exist")
24+
end
25+
26+
test "ensures associated GithubUser record exists" do
27+
github_issue = insert(:github_issue)
28+
changeset = GithubIssueAssignee.changeset(%GithubIssueAssignee{}, %{github_issue_id: github_issue.id, github_user_id: -1})
29+
30+
{:error, response_changeset} = Repo.insert(changeset)
31+
assert_error_message(response_changeset, :github_user, "does not exist")
32+
end
33+
34+
test "ensures uniqueness of GithubUser/GithubIssue combination" do
35+
github_issue = insert(:github_issue)
36+
github_user = insert(:github_user)
37+
insert(:github_issue_assignee, github_issue: github_issue, github_user: github_user)
38+
39+
changeset = GithubIssueAssignee.changeset(%GithubIssueAssignee{}, %{github_issue_id: github_issue.id, github_user_id: github_user.id})
40+
41+
{:error, response_changeset} = Repo.insert(changeset)
42+
assert_error_message(response_changeset, :github_user, "has already been taken")
43+
end
44+
end
45+
end

test/support/factories.ex

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,13 @@ defmodule CodeCorps.Factories do
6767
}
6868
end
6969

70+
def github_issue_assignee_factory do
71+
%CodeCorps.GithubIssueAssignee{
72+
github_issue: build(:github_issue),
73+
github_user: build(:github_user)
74+
}
75+
end
76+
7077
def github_pull_request_factory do
7178
%CodeCorps.GithubPullRequest{
7279
body: "Here's a change!",

0 commit comments

Comments
 (0)