1
1
'app.paisley.members
2
- ;; Deploy with
2
+ ;; Deploy with something like:
3
3
;; (deploy
4
4
;; '[(set-controller <governance-controller>
5
5
;; (def operator <operator-backend-account>)
10
10
11
11
(import convex.trust :as trust)
12
12
13
- ;; Governance controller. Use controller if set, otherwise *caller* for testing purposes
13
+ ;; Governance controller. Use controller if set, otherwise default to *caller* for testing purposes
14
14
(def governor (or *controller* *caller*))
15
15
16
16
;; Members counter
28
28
29
29
(defn get-metadata
30
30
^{:callable true
31
- :doc {:description "GEts metadata for a member, or nil if does not exist."
31
+ :doc {:description "Gets metadata for a member, or nil if does not exist."
32
32
:signature [{:params []}]}}
33
33
34
34
([member-id]
35
35
(get members member-id)))
36
36
37
37
(defn create-member
38
38
^{:callable true
39
- :doc {:description "Creates a new member account. Must be caller by operator. Returns ID."
40
- :signature [{:params []}]}}
41
- ([]
39
+ :doc {:description "Creates a new member account. Must be caller by operator, providing member Convex account . Returns ID."
40
+ :signature [{:params [account ]}]}}
41
+ ([acct ]
42
42
(or (trust/trusted? operator *caller*) (fail :TRUST "Not a membership operator"))
43
43
(let [id mcount]
44
44
(set! mcount (inc id))
45
- (set! members (assoc members id {:created *timestamp*}))
45
+ (set! members (assoc members id {:created *timestamp*
46
+ :updated *timestamp*
47
+ :accounts #{acct}}))
46
48
id)))
49
+
50
+ (defn update-member
51
+ ^{:callable true
52
+ :doc {:description "Updates a new member account. Must be caller by operator, providing member Convex account. Returns updated metadata."
53
+ :signature [{:params [id data]}]}}
54
+ ([id data]
55
+ (or (trust/trusted? operator *caller*) (fail :TRUST "Not a membership operator"))
56
+ (let [md (or (get members id) (fail :STATE "Member ID does not exist"))
57
+ new-data (merge md data)
58
+ new-data (assoc new-data :updated *timestamp*)]
59
+ (set! members (assoc members id new-data)))))
47
60
48
61
49
- ;; Create members personal token
62
+ ;; Create personal token for a member
50
63
;; Requires:
51
64
;; 1. Member ID exists
52
65
;; 2. Offer of at least 1 CVM
53
66
;;
54
67
;; Returns personal token asset ID (new or existing)
55
68
;; Call with (call @app.paisley.members 1000000000 (create-pt id)
56
- (defn ^:callable create-pt [member-id]
69
+ (defn create-pt
70
+ ^{:callable true
71
+ :doc {:description "Creates a new personal token for a member. Returns CAD29 Token ID."
72
+ :signature [{:params [member-id]}]}}
73
+ [member-id]
57
74
(accept 1000000000)
58
75
(when-not (get members member-id) (fail :STATE (str "Member does not exist: " member-id)))
59
76
(if-let [ptid (get pts member-id)] (return ptid)) ;; return token if already exists
60
- (let [id (call pt-actor (create))
77
+ (let [id (call pt-actor (create [*address* member id] ))
61
78
ptid [pt-actor id]]
62
79
(set! pts (assoc pts member-id ptid))
63
- ptid))
80
+ ptid))
81
+
82
+
83
+ ;; Member trust monitor implementation
84
+ (defn ^:callable check-trusted? [subject action object]
85
+ (let [md (get-metadata *scope*)
86
+ accts (get md :accounts)]
87
+ (cond
88
+ (not md) false
89
+ (contains-key? accts subject))))
90
+
91
+
0 commit comments