forked from IBC-Media/CEP-Assignment
-
Notifications
You must be signed in to change notification settings - Fork 0
/
lib.rs
115 lines (83 loc) · 2.87 KB
/
lib.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#![cfg_attr(not(feature = "std"), no_std)]
// we need to build a group of user
// Only sudo is able to add the user
// Only sudo is able to remove the user.
// Clubmember -> alice, bob,
pub use pallet::*;
#[cfg(test)]
mod mock;
#[cfg(test)]
mod tests;
#[frame_support::pallet]
pub mod pallet {
use frame_support::inherent::Vec;
use frame_support::pallet_prelude::*;
use frame_system::pallet_prelude::*;
#[pallet::config]
pub trait Config: frame_system::Config {
/// Because this pallet emits events, it depends on the runtime's definition of an event.
type Event: From<Event<Self>> + IsType<<Self as frame_system::Config>::Event>;
}
#[pallet::pallet]
#[pallet::generate_store(pub(super) trait Store)]
#[pallet::without_storage_info]
pub struct Pallet<T>(_);
#[pallet::storage]
#[pallet::getter(fn clubmember)]
pub type ClubMembers<T: Config> = StorageValue<_, Vec<T::AccountId>, ValueQuery>;
#[pallet::event]
#[pallet::generate_deposit(pub(super) fn deposit_event)]
pub enum Event<T: Config> {
// The member is add in the club.
MemberAdded,
// The member is removed from the club.
MemberRemoved,
}
// Error inform users that something went wrong.
#[pallet::error]
pub enum Error<T> {
/// Already a member
AlreadyMember,
/// Not a member
NotMember,
/// If a member try to remove some other member
CannotRemoveOtherMember,
}
#[pallet::call]
impl<T: Config> Pallet<T> {
// Add a member in the club.
#[pallet::weight(10_000)]
pub fn add_member(origin: OriginFor<T>, who: T::AccountId) -> DispatchResult {
ensure_root(origin.clone())?;
let mut club_members = ClubMembers::<T>::get();
let location = club_members.binary_search(&who).err().ok_or(Error::<T>::AlreadyMember)?;
club_members.insert(location, who.clone());
ClubMembers::<T>::put(&club_members);
Self::deposit_event(Event::MemberAdded);
Ok(())
}
// Remove a member from the club.
#[pallet::weight(10_000)]
pub fn remove_member(origin: OriginFor<T>, who: T::AccountId) -> DispatchResult {
ensure_root(origin.clone())?;
let mut club_members = ClubMembers::<T>::get();
let location = club_members.binary_search(&who).ok().ok_or(Error::<T>::NotMember)?;
club_members.remove(location);
ClubMembers::<T>::put(&club_members);
Self::deposit_event(Event::MemberRemoved);
Ok(())
}
#[pallet::weight(10_000)]
pub fn remove_member_by_yourself(origin: OriginFor<T>, who: T::AccountId) -> DispatchResult {
// check origin should be signed.
let check_account = ensure_signed(origin.clone())?;
ensure!(who == check_account, Error::<T>::CannotRemoveOtherMember);
let mut club_members = ClubMembers::<T>::get();
let location = club_members.binary_search(&who).ok().ok_or(Error::<T>::NotMember)?;
club_members.remove(location);
ClubMembers::<T>::put(&club_members);
Self::deposit_event(Event::MemberRemoved);
Ok(())
}
}
}