@@ -6,7 +6,7 @@ defmodule MastaniServer.CMS do
6
6
"""
7
7
import MastaniServer.CMSMisc
8
8
import Ecto.Query , warn: false
9
- import Helper.Utils , only: [ done: 1 , done: 2 ]
9
+ import Helper.Utils , only: [ done: 1 , done: 2 , deep_merge: 2 ]
10
10
11
11
alias MastaniServer.CMS . { Author , Tag , Community , PostComment , PostFavorite , PostStar }
12
12
alias MastaniServer . { Repo , Accounts }
@@ -285,4 +285,60 @@ defmodule MastaniServer.CMS do
285
285
defp handle_existing_author ( { :error , changeset } ) do
286
286
ORM . find_by ( Author , user_id: changeset . data . user_id )
287
287
end
288
+
289
+ alias MastaniServer.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
+ def stamp_passport ( % Accounts.User { } = user , rules ) do
296
+ case ORM . 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
+ def erase_passport ( % Accounts.User { } = user , rules ) when is_list ( rules ) do
310
+ with { :ok , passport } <- ORM . find_by ( Passport , user_id: user . id ) do
311
+ case pop_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
+ def get_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
+ def list_passports ( community , key ) do
339
+ Passport
340
+ |> where ( [ p ] , fragment ( "(?->?->>?)::boolean = ?" , p . rules , ^ community , ^ key , true ) )
341
+ |> Repo . all ( )
342
+ |> done
343
+ end
288
344
end