Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings
This repository was archived by the owner on Nov 8, 2022. It is now read-only.

Commit483140f

Browse files
committed
action-based role control system
1 parentfba92a3 commit483140f

File tree

11 files changed

+267
-23
lines changed

11 files changed

+267
-23
lines changed

‎.gitignore‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,4 @@ erl_crash.dump
1717
docker/engine-config.json
1818
_tuts/
1919
.agignore
20+
docs/draft.ex

‎docs/draft.ex‎

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,14 @@
22
# Statistics
33
# |___ UserHeatMap
44

5-
65
mixphx.gen.contextStatistics UserContributesuser_contributesuser_id:references:users date:datecount:integer
6+
7+
%{
8+
"js":%{
9+
"post-article-delete":true,
10+
"post-article-edit":true,
11+
"post-tag-edit":true,
12+
"post-tag-create":true,
13+
"post-tag-delete":true,
14+
}
15+
}

‎lib/helper/utils.ex‎

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,23 @@ defmodule Helper.Utils do
3434
map|>Enum.reduce(%{},fn{key,val},acc->Map.put(acc,to_string(key),val)end)
3535
end
3636

37+
defdeep_merge(left,right)do
38+
Map.merge(left,right,&deep_resolve/3)
39+
end
40+
41+
# Key exists in both maps, and both values are maps as well.
42+
# These can be merged recursively.
43+
defpdeep_resolve(_key,left=%{},right=%{})do
44+
deep_merge(left,right)
45+
end
46+
47+
# Key exists in both maps, but at least one of the values is
48+
# NOT a map. We fall back to standard merge behavior, preferring
49+
# the value on the right.
50+
defpdeep_resolve(_key,_left,right)do
51+
right
52+
end
53+
3754
# graphql treat id as string
3855
defpnot_found_formater(queryable,id)whenis_integer(id)oris_binary(id)do
3956
modal_sortname=queryable|>to_string|>String.split(".")|>List.last()

‎lib/mastani_server/accounts/user.ex‎

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -10,26 +10,6 @@ defmodule MastaniServer.Accounts.User do
1010
field(:bio,:string)
1111
field(:from_github,:boolean)
1212
has_one(:github_profile,GithubUser)
13-
# [use Middleware] Analysis.Post...
14-
# [use Middleware] Logger.userActivity
15-
# TODO ? 在 logger/history/timeMachine 中间件中调用 Analysis
16-
# [use Middleware] Analysis.UserHeatmap
17-
# Logger context
18-
# |___ User
19-
# |___ Post-timeline
20-
# |___ Jobs
21-
# |___ Tuts
22-
#
23-
# Statistics
24-
# |___ UserHeatMap
25-
# |___ Post
26-
# |___ Jobs
27-
# |___ Tuts
28-
#
29-
# post schema
30-
# |___ ...
31-
# |___ ...
32-
# |___ timeline / timemachine --> only record CURD, Tag, ..
3313

3414
timestamps(type::utc_datetime)
3515
end

‎lib/mastani_server/cms/cms.ex‎

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ defmodule MastaniServer.CMS do
66
"""
77
importMastaniServer.CMSMisc
88
importEcto.Query,warn:false
9-
importHelper.Utils,only:[done:1,done:2]
9+
importHelper.Utils,only:[done:1,done:2,deep_merge:2]
1010

1111
aliasMastaniServer.CMS.{Author,Tag,Community,PostComment,PostFavorite,PostStar}
1212
aliasMastaniServer.{Repo,Accounts}
@@ -285,4 +285,60 @@ defmodule MastaniServer.CMS do
285285
defphandle_existing_author({:error,changeset})do
286286
ORM.find_by(Author,user_id:changeset.data.user_id)
287287
end
288+
289+
aliasMastaniServer.CMS.Passport
290+
291+
# TODO passport should be public utils
292+
@doc"""
293+
insert or update a user's passport in CMS context
294+
"""
295+
defstamp_passport(%Accounts.User{}=user,rules)do
296+
caseORM.find_by(Passport,user_id:user.id)do
297+
{:ok,passport}->
298+
passport
299+
|>Ecto.Changeset.change(rules:deep_merge(passport.rules,rules))
300+
|>Repo.update()
301+
302+
{:error,_}->
303+
%Passport{user_id:user.id,rules:rules}
304+
|>Passport.changeset(%{})
305+
|>Repo.insert()
306+
end
307+
end
308+
309+
deferase_passport(%Accounts.User{}=user,rules)whenis_list(rules)do
310+
with{:ok,passport}<-ORM.find_by(Passport,user_id:user.id)do
311+
casepop_in(passport.rules,rules)do
312+
{nil,_}->
313+
{:error,"#{rules} not found"}
314+
315+
{_,lefts}->
316+
passport
317+
|>Ecto.Changeset.change(rules:lefts)
318+
|>Repo.update()
319+
end
320+
end
321+
end
322+
323+
@doc"""
324+
return a user's passport in CMS context
325+
"""
326+
defget_passport(%Accounts.User{}=user)do
327+
Passport|>ORM.find_by(user_id:user.id)
328+
end
329+
330+
# def list_passports do
331+
332+
# end
333+
334+
# def list_passports(community) do
335+
336+
# end
337+
338+
deflist_passports(community,key)do
339+
Passport
340+
|>where([p],fragment("(?->?->>?)::boolean = ?",p.rules,^community,^key,true))
341+
|>Repo.all()
342+
|>done
343+
end
288344
end

‎lib/mastani_server/cms/passport.ex‎

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
defmoduleMastaniServer.CMS.Passportdo
2+
useEcto.Schema
3+
importEcto.Changeset
4+
5+
schema"cms_passports"do
6+
field(:rules,:map)
7+
field(:user_id,:id)
8+
9+
timestamps(type::utc_datetime)
10+
end
11+
12+
@docfalse
13+
defchangeset(passport,attrs)do
14+
passport
15+
|>cast(attrs,[:rules,:user_id])
16+
|>validate_required([:rules,:user_id])
17+
|>unique_constraint(:user_id)
18+
|>foreign_key_constraint(:user_id)
19+
end
20+
end

‎lib/mastani_server_web/middleware/see_me.ex‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ defmodule MastaniServerWeb.Middleware.SeeMe do
66
@behaviourAbsinthe.Middleware
77

88
defcall(res,_)do
9-
IO.inspect"see me"
9+
IO.inspect("see me")
1010
res
1111
end
1212
end
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
defmoduleMastaniServer.Repo.Migrations.CreateCmsPassportsdo
2+
useEcto.Migration
3+
4+
defchangedo
5+
createtable(:cms_passports)do
6+
add(:roles,:map)
7+
add(:user_id,references(:users,on_delete::nothing))
8+
9+
timestamps()
10+
end
11+
12+
create(unique_index(:cms_passports,[:user_id]))
13+
end
14+
end
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
defmoduleMastaniServer.Repo.Migrations.RenameCmspassportRolesdo
2+
useEcto.Migration
3+
4+
defchangedo
5+
rename(table(:cms_passports),:roles,to::rules)
6+
end
7+
end

‎test/helper/utils_test.exs‎

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
defmoduleMastaniServer.Test.Helper.UtilsTestdo
2+
useMastaniServerWeb.ConnCase,async:true
3+
4+
aliasHelper.Utils
5+
6+
describe"[deep merge]"do
7+
test'one level of maps without conflict'do
8+
result=Utils.deep_merge(%{a:1},%{b:2})
9+
assertresult==%{a:1,b:2}
10+
end
11+
12+
test'two levels of maps without conflict'do
13+
result=Utils.deep_merge(%{a:%{b:1}},%{a:%{c:3}})
14+
assertresult==%{a:%{b:1,c:3}}
15+
end
16+
17+
test'three levels of maps without conflict'do
18+
result=Utils.deep_merge(%{a:%{b:%{c:1}}},%{a:%{b:%{d:2}}})
19+
assertresult==%{a:%{b:%{c:1,d:2}}}
20+
end
21+
22+
test'non-map value in left'do
23+
result=Utils.deep_merge(%{a:1},%{a:%{b:2}})
24+
assertresult==%{a:%{b:2}}
25+
end
26+
27+
test'non-map value in right'do
28+
result=Utils.deep_merge(%{a:%{b:1}},%{a:2})
29+
assertresult==%{a:2}
30+
end
31+
32+
test'non-map value in both'do
33+
result=Utils.deep_merge(%{a:1},%{a:2})
34+
assertresult==%{a:2}
35+
end
36+
end
37+
end

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp