Skip to content
This repository was archived by the owner on Nov 8, 2022. It is now read-only.

Commit a69b3b7

Browse files
committed
Merge branch 'repo-enhance' into dev
2 parents 98001e5 + f2ca568 commit a69b3b7

File tree

3 files changed

+247
-0
lines changed

3 files changed

+247
-0
lines changed

lib/mastani_server_web/schema.ex

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ defmodule MastaniServerWeb.Schema do
3535
import_types(CMS.Mutations.Post)
3636
import_types(CMS.Mutations.Job)
3737
import_types(CMS.Mutations.Video)
38+
import_types(CMS.Mutations.Repo)
3839
import_types(CMS.Mutations.Comment)
3940

4041
query do
@@ -57,6 +58,8 @@ defmodule MastaniServerWeb.Schema do
5758
import_fields(:cms_post_mutations)
5859
import_fields(:cms_job_mutations)
5960
import_fields(:cms_video_mutations)
61+
import_fields(:cms_repo_mutations)
62+
6063
import_fields(:cms_comment_mutations)
6164
end
6265

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
defmodule MastaniServerWeb.Schema.CMS.Mutations.Repo do
2+
@moduledoc """
3+
CMS mutations for job
4+
"""
5+
use Helper.GqlSchemaSuite
6+
7+
object :cms_repo_mutations do
8+
@desc "create a user"
9+
field :create_repo, :repo do
10+
arg(:repo_name, non_null(:string))
11+
arg(:desc, non_null(:string))
12+
arg(:readme, non_null(:string))
13+
arg(:language, non_null(:string))
14+
arg(:repo_link, non_null(:string))
15+
arg(:producer, non_null(:string))
16+
arg(:producer_link, non_null(:string))
17+
18+
arg(:repo_star_count, non_null(:integer))
19+
arg(:repo_fork_count, non_null(:integer))
20+
arg(:repo_watch_count, non_null(:integer))
21+
22+
middleware(M.Authorize, :login)
23+
resolve(&R.CMS.create_content/3)
24+
end
25+
26+
@desc "pin a repo"
27+
field :pin_repo, :repo do
28+
arg(:id, non_null(:id))
29+
arg(:type, :repo_type, default_value: :repo)
30+
arg(:community_id, non_null(:id))
31+
32+
middleware(M.Authorize, :login)
33+
middleware(M.PassportLoader, source: :community)
34+
middleware(M.Passport, claim: "cms->c?->repo.pin")
35+
resolve(&R.CMS.pin_content/3)
36+
end
37+
38+
@desc "unpin a repo"
39+
field :undo_pin_repo, :repo do
40+
arg(:id, non_null(:id))
41+
arg(:type, :repo_type, default_value: :repo)
42+
arg(:community_id, non_null(:id))
43+
44+
middleware(M.Authorize, :login)
45+
middleware(M.PassportLoader, source: :community)
46+
middleware(M.Passport, claim: "cms->c?->repo.undo_pin")
47+
resolve(&R.CMS.undo_pin_content/3)
48+
end
49+
50+
@desc "trash a repo, not delete"
51+
field :trash_repo, :repo do
52+
arg(:id, non_null(:id))
53+
arg(:type, :repo_type, default_value: :repo)
54+
arg(:community_id, non_null(:id))
55+
56+
middleware(M.Authorize, :login)
57+
middleware(M.PassportLoader, source: :community)
58+
middleware(M.Passport, claim: "cms->c?->repo.trash")
59+
60+
resolve(&R.CMS.trash_content/3)
61+
end
62+
63+
@desc "trash a repo, not delete"
64+
field :undo_trash_repo, :repo do
65+
arg(:id, non_null(:id))
66+
arg(:type, :repo_type, default_value: :repo)
67+
arg(:community_id, non_null(:id))
68+
69+
middleware(M.Authorize, :login)
70+
middleware(M.PassportLoader, source: :community)
71+
middleware(M.Passport, claim: "cms->c?->repo.undo_trash")
72+
73+
resolve(&R.CMS.undo_trash_content/3)
74+
end
75+
76+
@desc "delete a repo"
77+
field :delete_repo, :repo do
78+
arg(:id, non_null(:id))
79+
80+
middleware(M.Authorize, :login)
81+
middleware(M.PassportLoader, source: :repo)
82+
middleware(M.Passport, claim: "owner;cms->c?->repo.delete")
83+
84+
resolve(&R.CMS.delete_content/3)
85+
end
86+
87+
@desc "update a cms/repo"
88+
field :update_repo, :repo do
89+
arg(:repo_name, non_null(:string))
90+
arg(:desc, non_null(:string))
91+
arg(:readme, non_null(:string))
92+
arg(:language, non_null(:string))
93+
arg(:repo_link, non_null(:string))
94+
arg(:producer, non_null(:string))
95+
arg(:producer_link, non_null(:string))
96+
97+
arg(:repo_star_count, non_null(:integer))
98+
arg(:repo_fork_count, non_null(:integer))
99+
arg(:repo_watch_count, non_null(:integer))
100+
101+
middleware(M.Authorize, :login)
102+
middleware(M.PassportLoader, source: :repo)
103+
middleware(M.Passport, claim: "owner;cms->c?->repo.edit")
104+
105+
resolve(&R.CMS.update_content/3)
106+
end
107+
end
108+
end
Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
defmodule MastaniServer.Test.Mutation.RepoFlag do
2+
use MastaniServer.TestTools
3+
4+
alias MastaniServer.CMS
5+
6+
setup do
7+
{:ok, user} = db_insert(:user)
8+
{:ok, community} = db_insert(:community)
9+
10+
{:ok, repo} = CMS.create_content(community, :repo, mock_attrs(:repo), user)
11+
12+
guest_conn = simu_conn(:guest)
13+
user_conn = simu_conn(:user)
14+
owner_conn = simu_conn(:user, user)
15+
16+
{:ok, ~m(user_conn guest_conn owner_conn community repo)a}
17+
end
18+
19+
describe "[mutation repo flag curd]" do
20+
@query """
21+
mutation($id: ID!, $communityId: ID!){
22+
trashRepo(id: $id, communityId: $communityId) {
23+
id
24+
trash
25+
}
26+
}
27+
"""
28+
test "auth user can trash repo", ~m(community repo)a do
29+
variables = %{id: repo.id, communityId: community.id}
30+
31+
passport_rules = %{community.raw => %{"repo.trash" => true}}
32+
rule_conn = simu_conn(:user, cms: passport_rules)
33+
34+
updated = rule_conn |> mutation_result(@query, variables, "trashRepo")
35+
36+
assert updated["id"] == to_string(repo.id)
37+
assert updated["trash"] == true
38+
end
39+
40+
test "unauth user trash repo fails", ~m(user_conn guest_conn repo community)a do
41+
variables = %{id: repo.id, communityId: community.id}
42+
rule_conn = simu_conn(:user, cms: %{"what.ever" => true})
43+
44+
assert user_conn |> mutation_get_error?(@query, variables, ecode(:passport))
45+
assert guest_conn |> mutation_get_error?(@query, variables, ecode(:account_login))
46+
assert rule_conn |> mutation_get_error?(@query, variables, ecode(:passport))
47+
end
48+
49+
@query """
50+
mutation($id: ID!, $communityId: ID!){
51+
undoTrashRepo(id: $id, communityId: $communityId) {
52+
id
53+
trash
54+
}
55+
}
56+
"""
57+
test "auth user can undo trash repo", ~m(community repo)a do
58+
variables = %{id: repo.id, communityId: community.id}
59+
60+
{:ok, _} = CMS.set_community_flags(repo, community.id, %{trash: true})
61+
62+
passport_rules = %{community.raw => %{"repo.undo_trash" => true}}
63+
rule_conn = simu_conn(:user, cms: passport_rules)
64+
65+
updated = rule_conn |> mutation_result(@query, variables, "undoTrashRepo")
66+
67+
assert updated["id"] == to_string(repo.id)
68+
assert updated["trash"] == false
69+
end
70+
71+
test "unauth user undo trash repo fails", ~m(user_conn guest_conn community repo)a do
72+
variables = %{id: repo.id, communityId: community.id}
73+
rule_conn = simu_conn(:user, cms: %{"what.ever" => true})
74+
75+
assert user_conn |> mutation_get_error?(@query, variables, ecode(:passport))
76+
assert guest_conn |> mutation_get_error?(@query, variables, ecode(:account_login))
77+
assert rule_conn |> mutation_get_error?(@query, variables, ecode(:passport))
78+
end
79+
80+
@query """
81+
mutation($id: ID!, $communityId: ID!){
82+
pinRepo(id: $id, communityId: $communityId) {
83+
id
84+
}
85+
}
86+
"""
87+
test "auth user can pin repo", ~m(community repo)a do
88+
variables = %{id: repo.id, communityId: community.id}
89+
90+
passport_rules = %{community.raw => %{"repo.pin" => true}}
91+
rule_conn = simu_conn(:user, cms: passport_rules)
92+
93+
updated = rule_conn |> mutation_result(@query, variables, "pinRepo")
94+
95+
assert updated["id"] == to_string(repo.id)
96+
end
97+
98+
test "unauth user pin repo fails", ~m(user_conn guest_conn community repo)a do
99+
variables = %{id: repo.id, communityId: community.id}
100+
rule_conn = simu_conn(:user, cms: %{"what.ever" => true})
101+
102+
assert user_conn |> mutation_get_error?(@query, variables, ecode(:passport))
103+
assert guest_conn |> mutation_get_error?(@query, variables, ecode(:account_login))
104+
assert rule_conn |> mutation_get_error?(@query, variables, ecode(:passport))
105+
end
106+
107+
@query """
108+
mutation($id: ID!, $communityId: ID!){
109+
undoPinRepo(id: $id, communityId: $communityId) {
110+
id
111+
pin
112+
}
113+
}
114+
"""
115+
test "auth user can undo pin repo", ~m(community repo)a do
116+
variables = %{id: repo.id, communityId: community.id}
117+
118+
passport_rules = %{community.raw => %{"repo.undo_pin" => true}}
119+
rule_conn = simu_conn(:user, cms: passport_rules)
120+
121+
updated = rule_conn |> mutation_result(@query, variables, "undoPinRepo")
122+
123+
assert updated["id"] == to_string(repo.id)
124+
assert updated["pin"] == false
125+
end
126+
127+
test "unauth user undo pin repo fails", ~m(user_conn guest_conn community repo)a do
128+
variables = %{id: repo.id, communityId: community.id}
129+
rule_conn = simu_conn(:user, cms: %{"what.ever" => true})
130+
131+
assert user_conn |> mutation_get_error?(@query, variables, ecode(:passport))
132+
assert guest_conn |> mutation_get_error?(@query, variables, ecode(:account_login))
133+
assert rule_conn |> mutation_get_error?(@query, variables, ecode(:passport))
134+
end
135+
end
136+
end

0 commit comments

Comments
 (0)