Skip to content

Commit

Permalink
add is_participants checker in contract
Browse files Browse the repository at this point in the history
  • Loading branch information
od41 committed Mar 10, 2024
1 parent a99b4ca commit 2f98073
Show file tree
Hide file tree
Showing 12 changed files with 287 additions and 54 deletions.
2 changes: 1 addition & 1 deletion contracts/deployments/chatroom/chatroom.contract

Large diffs are not rendered by default.

220 changes: 180 additions & 40 deletions contracts/deployments/chatroom/chatroom.json

Large diffs are not rendered by default.

Binary file modified contracts/deployments/chatroom/chatroom.wasm
Binary file not shown.
21 changes: 21 additions & 0 deletions contracts/src/chatroom/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,17 @@ mod chatroom {
use ink::prelude::vec::Vec;
use ink::storage::Mapping;

#[derive(Debug, Clone, PartialEq, scale::Encode, scale::Decode)]
#[cfg_attr(
feature = "std",
derive(scale_info::TypeInfo, ink::storage::traits::StorageLayout)
)]
pub struct Message {
sender: AccountId,
content: String,
sent_timestamp: Timestamp,
}

#[derive(Debug, Clone, PartialEq, scale::Encode, scale::Decode)]
#[cfg_attr(
feature = "std",
Expand All @@ -22,6 +33,7 @@ mod chatroom {
pub struct Chatroom {
chatrooms: Mapping<AccountId, Room>,
participants: Mapping<AccountId, Vec<AccountId>>,
messages: Mapping<AccountId, Vec<Message>>,
}

impl Chatroom {
Expand All @@ -31,6 +43,7 @@ mod chatroom {
Self {
chatrooms: Mapping::new(),
participants: Mapping::new(),
messages: Mapping::new(),
}
}

Expand Down Expand Up @@ -65,6 +78,14 @@ mod chatroom {
}
}

#[ink(message)]
pub fn is_a_participant(&self, chatroom_id: AccountId, participant_id: AccountId) -> bool {
match self.participants.get(chatroom_id) {
Some(parts) => parts.contains(&participant_id),
None => false, // participant_id is not a member
}
}

#[ink(message)]
pub fn invite(&mut self, chatroom_id: AccountId, participant: AccountId) {
let chatroom = self.get_chatroom(chatroom_id.clone()).unwrap();
Expand Down
14 changes: 14 additions & 0 deletions contracts/typed-contracts/build-extrinsic/chatroom.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,20 @@ export default class Methods {
return buildSubmittableExtrinsic( this.__apiPromise, this.__nativeContract, "getChatroom", [chatroomId], __options);
}

/**
* isAParticipant
*
* @param { ArgumentTypes.AccountId } chatroomId,
* @param { ArgumentTypes.AccountId } participantId,
*/
"isAParticipant" (
chatroomId: ArgumentTypes.AccountId,
participantId: ArgumentTypes.AccountId,
__options: GasLimit,
){
return buildSubmittableExtrinsic( this.__apiPromise, this.__nativeContract, "isAParticipant", [chatroomId, participantId], __options);
}

/**
* invite
*
Expand Down
4 changes: 2 additions & 2 deletions contracts/typed-contracts/contract-info/chatroom.ts

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion contracts/typed-contracts/data/chatroom.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
{
"0": {"name":"AccountId","body":"string | number[]","isResult":false,"isPrimitive":true,"isConvertable":false},"1": {"name":"Array","body":{"0":{"name":"number","isResult":false,"isPrimitive":true,"isConvertable":false}},"isResult":false,"isPrimitive":false,"isConvertable":false},"2": {"name":"number","isResult":false,"isPrimitive":true,"isConvertable":false},"3": {"name":"Array","body":{"0":{"name":"string","isResult":false,"isPrimitive":true,"isConvertable":false}},"isResult":false,"isPrimitive":false,"isConvertable":false},"4": {"name":"string","isResult":false,"isPrimitive":true,"isConvertable":false},"5": {"name":"number","isResult":false,"isPrimitive":true,"isConvertable":false},"7": {"name":"Result<null, LangError","body":{"ok":{"name":"null","isResult":false,"isPrimitive":true,"isConvertable":false},"err":{"name":"LangError","body":{"CouldNotReadInput":null},"isResult":false,"isPrimitive":false,"isConvertable":false}},"isResult":true,"isPrimitive":false,"isConvertable":false},"8": {"name":"null","isResult":false,"isPrimitive":true,"isConvertable":false},"9": {"name":"LangError","body":{"CouldNotReadInput":null},"isResult":false,"isPrimitive":false,"isConvertable":false},"10": {"name":"Result<AccountId, LangError","body":{"ok":{"name":"AccountId","body":"string | number[]","isResult":false,"isPrimitive":true,"isConvertable":false},"err":{"name":"LangError","body":{"CouldNotReadInput":null},"isResult":false,"isPrimitive":false,"isConvertable":false}},"isResult":true,"isPrimitive":false,"isConvertable":false},"11": {"name":"Result<Option, LangError","body":{"ok":{"name":"Option","body":{"0":{"name":"Room","body":{"owner":{"name":"AccountId","body":"string | number[]","isResult":false,"isPrimitive":true,"isConvertable":false},"messages":{"name":"Array","body":{"0":{"name":"string","isResult":false,"isPrimitive":true,"isConvertable":false}},"isResult":false,"isPrimitive":false,"isConvertable":false},"timeout":{"name":"number","isResult":false,"isPrimitive":true,"isConvertable":false}},"isResult":false,"isPrimitive":false,"isConvertable":false},"1":{"name":"null","isResult":false,"isPrimitive":true,"isConvertable":false}},"isResult":false,"isPrimitive":false,"isConvertable":false},"err":{"name":"LangError","body":{"CouldNotReadInput":null},"isResult":false,"isPrimitive":false,"isConvertable":false}},"isResult":true,"isPrimitive":false,"isConvertable":false},"12": {"name":"Option","body":{"0":{"name":"Room","body":{"owner":{"name":"AccountId","body":"string | number[]","isResult":false,"isPrimitive":true,"isConvertable":false},"messages":{"name":"Array","body":{"0":{"name":"string","isResult":false,"isPrimitive":true,"isConvertable":false}},"isResult":false,"isPrimitive":false,"isConvertable":false},"timeout":{"name":"number","isResult":false,"isPrimitive":true,"isConvertable":false}},"isResult":false,"isPrimitive":false,"isConvertable":false},"1":{"name":"null","isResult":false,"isPrimitive":true,"isConvertable":false}},"isResult":false,"isPrimitive":false,"isConvertable":false},"13": {"name":"Room","body":{"owner":{"name":"AccountId","body":"string | number[]","isResult":false,"isPrimitive":true,"isConvertable":false},"messages":{"name":"Array","body":{"0":{"name":"string","isResult":false,"isPrimitive":true,"isConvertable":false}},"isResult":false,"isPrimitive":false,"isConvertable":false},"timeout":{"name":"number","isResult":false,"isPrimitive":true,"isConvertable":false}},"isResult":false,"isPrimitive":false,"isConvertable":false},"14": {"name":"Result<Array, LangError","body":{"ok":{"name":"Array","body":{"0":{"name":"string","isResult":false,"isPrimitive":true,"isConvertable":false}},"isResult":false,"isPrimitive":false,"isConvertable":false},"err":{"name":"LangError","body":{"CouldNotReadInput":null},"isResult":false,"isPrimitive":false,"isConvertable":false}},"isResult":true,"isPrimitive":false,"isConvertable":false}
"0": {"name":"AccountId","body":"string | number[]","isResult":false,"isPrimitive":true,"isConvertable":false},"1": {"name":"Array","body":{"0":{"name":"number","isResult":false,"isPrimitive":true,"isConvertable":false}},"isResult":false,"isPrimitive":false,"isConvertable":false},"2": {"name":"number","isResult":false,"isPrimitive":true,"isConvertable":false},"3": {"name":"Array","body":{"0":{"name":"string","isResult":false,"isPrimitive":true,"isConvertable":false}},"isResult":false,"isPrimitive":false,"isConvertable":false},"4": {"name":"string","isResult":false,"isPrimitive":true,"isConvertable":false},"5": {"name":"number","isResult":false,"isPrimitive":true,"isConvertable":false},"8": {"name":"Message","body":{"sender":{"name":"AccountId","body":"string | number[]","isResult":false,"isPrimitive":true,"isConvertable":false},"content":{"name":"string","isResult":false,"isPrimitive":true,"isConvertable":false},"sentTimestamp":{"name":"number","isResult":false,"isPrimitive":true,"isConvertable":false}},"isResult":false,"isPrimitive":false,"isConvertable":false},"9": {"name":"Result<null, LangError","body":{"ok":{"name":"null","isResult":false,"isPrimitive":true,"isConvertable":false},"err":{"name":"LangError","body":{"CouldNotReadInput":null},"isResult":false,"isPrimitive":false,"isConvertable":false}},"isResult":true,"isPrimitive":false,"isConvertable":false},"10": {"name":"null","isResult":false,"isPrimitive":true,"isConvertable":false},"11": {"name":"LangError","body":{"CouldNotReadInput":null},"isResult":false,"isPrimitive":false,"isConvertable":false},"12": {"name":"Result<AccountId, LangError","body":{"ok":{"name":"AccountId","body":"string | number[]","isResult":false,"isPrimitive":true,"isConvertable":false},"err":{"name":"LangError","body":{"CouldNotReadInput":null},"isResult":false,"isPrimitive":false,"isConvertable":false}},"isResult":true,"isPrimitive":false,"isConvertable":false},"13": {"name":"Result<Option, LangError","body":{"ok":{"name":"Option","body":{"0":{"name":"Room","body":{"owner":{"name":"AccountId","body":"string | number[]","isResult":false,"isPrimitive":true,"isConvertable":false},"messages":{"name":"Array","body":{"0":{"name":"string","isResult":false,"isPrimitive":true,"isConvertable":false}},"isResult":false,"isPrimitive":false,"isConvertable":false},"timeout":{"name":"number","isResult":false,"isPrimitive":true,"isConvertable":false}},"isResult":false,"isPrimitive":false,"isConvertable":false},"1":{"name":"null","isResult":false,"isPrimitive":true,"isConvertable":false}},"isResult":false,"isPrimitive":false,"isConvertable":false},"err":{"name":"LangError","body":{"CouldNotReadInput":null},"isResult":false,"isPrimitive":false,"isConvertable":false}},"isResult":true,"isPrimitive":false,"isConvertable":false},"14": {"name":"Option","body":{"0":{"name":"Room","body":{"owner":{"name":"AccountId","body":"string | number[]","isResult":false,"isPrimitive":true,"isConvertable":false},"messages":{"name":"Array","body":{"0":{"name":"string","isResult":false,"isPrimitive":true,"isConvertable":false}},"isResult":false,"isPrimitive":false,"isConvertable":false},"timeout":{"name":"number","isResult":false,"isPrimitive":true,"isConvertable":false}},"isResult":false,"isPrimitive":false,"isConvertable":false},"1":{"name":"null","isResult":false,"isPrimitive":true,"isConvertable":false}},"isResult":false,"isPrimitive":false,"isConvertable":false},"15": {"name":"Room","body":{"owner":{"name":"AccountId","body":"string | number[]","isResult":false,"isPrimitive":true,"isConvertable":false},"messages":{"name":"Array","body":{"0":{"name":"string","isResult":false,"isPrimitive":true,"isConvertable":false}},"isResult":false,"isPrimitive":false,"isConvertable":false},"timeout":{"name":"number","isResult":false,"isPrimitive":true,"isConvertable":false}},"isResult":false,"isPrimitive":false,"isConvertable":false},"16": {"name":"Result<boolean, LangError","body":{"ok":{"name":"boolean","isResult":false,"isPrimitive":true,"isConvertable":false},"err":{"name":"LangError","body":{"CouldNotReadInput":null},"isResult":false,"isPrimitive":false,"isConvertable":false}},"isResult":true,"isPrimitive":false,"isConvertable":false},"17": {"name":"boolean","isResult":false,"isPrimitive":true,"isConvertable":false},"18": {"name":"Result<Array, LangError","body":{"ok":{"name":"Array","body":{"0":{"name":"string","isResult":false,"isPrimitive":true,"isConvertable":false}},"isResult":false,"isPrimitive":false,"isConvertable":false},"err":{"name":"LangError","body":{"CouldNotReadInput":null},"isResult":false,"isPrimitive":false,"isConvertable":false}},"isResult":true,"isPrimitive":false,"isConvertable":false}
}
19 changes: 17 additions & 2 deletions contracts/typed-contracts/mixed-methods/chatroom.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,22 @@ export default class Methods {
chatroomId: ArgumentTypes.AccountId,
__options: GasLimit,
): Promise< QueryReturnType< Result<ReturnTypes.Room | null, ReturnTypes.LangError> > >{
return queryOkJSON( this.__apiPromise, this.__nativeContract, this.__callerAddress, "getChatroom", [chatroomId], __options, (result) => { return handleReturnType(result, getTypeDescription(11, DATA_TYPE_DESCRIPTIONS)); });
return queryOkJSON( this.__apiPromise, this.__nativeContract, this.__callerAddress, "getChatroom", [chatroomId], __options, (result) => { return handleReturnType(result, getTypeDescription(13, DATA_TYPE_DESCRIPTIONS)); });
}

/**
* isAParticipant
*
* @param { ArgumentTypes.AccountId } chatroomId,
* @param { ArgumentTypes.AccountId } participantId,
* @returns { Result<boolean, ReturnTypes.LangError> }
*/
"isAParticipant" (
chatroomId: ArgumentTypes.AccountId,
participantId: ArgumentTypes.AccountId,
__options: GasLimit,
): Promise< QueryReturnType< Result<boolean, ReturnTypes.LangError> > >{
return queryOkJSON( this.__apiPromise, this.__nativeContract, this.__callerAddress, "isAParticipant", [chatroomId, participantId], __options, (result) => { return handleReturnType(result, getTypeDescription(16, DATA_TYPE_DESCRIPTIONS)); });
}

/**
Expand Down Expand Up @@ -107,7 +122,7 @@ export default class Methods {
chatroomId: ArgumentTypes.AccountId,
__options: GasLimit,
): Promise< QueryReturnType< Result<Array<string>, ReturnTypes.LangError> > >{
return queryOkJSON( this.__apiPromise, this.__nativeContract, this.__callerAddress, "getMessages", [chatroomId], __options, (result) => { return handleReturnType(result, getTypeDescription(14, DATA_TYPE_DESCRIPTIONS)); });
return queryOkJSON( this.__apiPromise, this.__nativeContract, this.__callerAddress, "getMessages", [chatroomId], __options, (result) => { return handleReturnType(result, getTypeDescription(18, DATA_TYPE_DESCRIPTIONS)); });
}

/**
Expand Down
31 changes: 23 additions & 8 deletions contracts/typed-contracts/query/chatroom.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ export default class Methods {
"createChatroom" (
__options ? : GasLimit,
): Promise< QueryReturnType< Result<ReturnTypes.AccountId, ReturnTypes.LangError> > >{
return queryOkJSON( this.__apiPromise, this.__nativeContract, this.__callerAddress, "createChatroom", [], __options , (result) => { return handleReturnType(result, getTypeDescription(10, DATA_TYPE_DESCRIPTIONS)); });
return queryOkJSON( this.__apiPromise, this.__nativeContract, this.__callerAddress, "createChatroom", [], __options , (result) => { return handleReturnType(result, getTypeDescription(12, DATA_TYPE_DESCRIPTIONS)); });
}

/**
Expand All @@ -50,7 +50,22 @@ export default class Methods {
chatroomId: ArgumentTypes.AccountId,
__options ? : GasLimit,
): Promise< QueryReturnType< Result<ReturnTypes.Room | null, ReturnTypes.LangError> > >{
return queryOkJSON( this.__apiPromise, this.__nativeContract, this.__callerAddress, "getChatroom", [chatroomId], __options , (result) => { return handleReturnType(result, getTypeDescription(11, DATA_TYPE_DESCRIPTIONS)); });
return queryOkJSON( this.__apiPromise, this.__nativeContract, this.__callerAddress, "getChatroom", [chatroomId], __options , (result) => { return handleReturnType(result, getTypeDescription(13, DATA_TYPE_DESCRIPTIONS)); });
}

/**
* isAParticipant
*
* @param { ArgumentTypes.AccountId } chatroomId,
* @param { ArgumentTypes.AccountId } participantId,
* @returns { Result<boolean, ReturnTypes.LangError> }
*/
"isAParticipant" (
chatroomId: ArgumentTypes.AccountId,
participantId: ArgumentTypes.AccountId,
__options ? : GasLimit,
): Promise< QueryReturnType< Result<boolean, ReturnTypes.LangError> > >{
return queryOkJSON( this.__apiPromise, this.__nativeContract, this.__callerAddress, "isAParticipant", [chatroomId, participantId], __options , (result) => { return handleReturnType(result, getTypeDescription(16, DATA_TYPE_DESCRIPTIONS)); });
}

/**
Expand All @@ -65,7 +80,7 @@ export default class Methods {
participant: ArgumentTypes.AccountId,
__options ? : GasLimit,
): Promise< QueryReturnType< Result<null, ReturnTypes.LangError> > >{
return queryOkJSON( this.__apiPromise, this.__nativeContract, this.__callerAddress, "invite", [chatroomId, participant], __options , (result) => { return handleReturnType(result, getTypeDescription(7, DATA_TYPE_DESCRIPTIONS)); });
return queryOkJSON( this.__apiPromise, this.__nativeContract, this.__callerAddress, "invite", [chatroomId, participant], __options , (result) => { return handleReturnType(result, getTypeDescription(9, DATA_TYPE_DESCRIPTIONS)); });
}

/**
Expand All @@ -80,7 +95,7 @@ export default class Methods {
message: string,
__options ? : GasLimit,
): Promise< QueryReturnType< Result<null, ReturnTypes.LangError> > >{
return queryOkJSON( this.__apiPromise, this.__nativeContract, this.__callerAddress, "sendMessage", [chatroomId, message], __options , (result) => { return handleReturnType(result, getTypeDescription(7, DATA_TYPE_DESCRIPTIONS)); });
return queryOkJSON( this.__apiPromise, this.__nativeContract, this.__callerAddress, "sendMessage", [chatroomId, message], __options , (result) => { return handleReturnType(result, getTypeDescription(9, DATA_TYPE_DESCRIPTIONS)); });
}

/**
Expand All @@ -93,7 +108,7 @@ export default class Methods {
chatroomId: ArgumentTypes.AccountId,
__options ? : GasLimit,
): Promise< QueryReturnType< Result<Array<string>, ReturnTypes.LangError> > >{
return queryOkJSON( this.__apiPromise, this.__nativeContract, this.__callerAddress, "getMessages", [chatroomId], __options , (result) => { return handleReturnType(result, getTypeDescription(14, DATA_TYPE_DESCRIPTIONS)); });
return queryOkJSON( this.__apiPromise, this.__nativeContract, this.__callerAddress, "getMessages", [chatroomId], __options , (result) => { return handleReturnType(result, getTypeDescription(18, DATA_TYPE_DESCRIPTIONS)); });
}

/**
Expand All @@ -106,7 +121,7 @@ export default class Methods {
chatroomId: ArgumentTypes.AccountId,
__options ? : GasLimit,
): Promise< QueryReturnType< Result<null, ReturnTypes.LangError> > >{
return queryOkJSON( this.__apiPromise, this.__nativeContract, this.__callerAddress, "deleteChatroom", [chatroomId], __options , (result) => { return handleReturnType(result, getTypeDescription(7, DATA_TYPE_DESCRIPTIONS)); });
return queryOkJSON( this.__apiPromise, this.__nativeContract, this.__callerAddress, "deleteChatroom", [chatroomId], __options , (result) => { return handleReturnType(result, getTypeDescription(9, DATA_TYPE_DESCRIPTIONS)); });
}

/**
Expand All @@ -121,7 +136,7 @@ export default class Methods {
timeout: (number | string | BN),
__options ? : GasLimit,
): Promise< QueryReturnType< Result<null, ReturnTypes.LangError> > >{
return queryOkJSON( this.__apiPromise, this.__nativeContract, this.__callerAddress, "setTimeout", [chatroomId, timeout], __options , (result) => { return handleReturnType(result, getTypeDescription(7, DATA_TYPE_DESCRIPTIONS)); });
return queryOkJSON( this.__apiPromise, this.__nativeContract, this.__callerAddress, "setTimeout", [chatroomId, timeout], __options , (result) => { return handleReturnType(result, getTypeDescription(9, DATA_TYPE_DESCRIPTIONS)); });
}

/**
Expand All @@ -134,7 +149,7 @@ export default class Methods {
chatroomId: ArgumentTypes.AccountId,
__options ? : GasLimit,
): Promise< QueryReturnType< Result<null, ReturnTypes.LangError> > >{
return queryOkJSON( this.__apiPromise, this.__nativeContract, this.__callerAddress, "checkTimeout", [chatroomId], __options , (result) => { return handleReturnType(result, getTypeDescription(7, DATA_TYPE_DESCRIPTIONS)); });
return queryOkJSON( this.__apiPromise, this.__nativeContract, this.__callerAddress, "checkTimeout", [chatroomId], __options , (result) => { return handleReturnType(result, getTypeDescription(9, DATA_TYPE_DESCRIPTIONS)); });
}

}
16 changes: 16 additions & 0 deletions contracts/typed-contracts/tx-sign-and-send/chatroom.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,22 @@ export default class Methods {
}, [chatroomId], __options);
}

/**
* isAParticipant
*
* @param { ArgumentTypes.AccountId } chatroomId,
* @param { ArgumentTypes.AccountId } participantId,
*/
"isAParticipant" (
chatroomId: ArgumentTypes.AccountId,
participantId: ArgumentTypes.AccountId,
__options ? : GasLimit,
){
return txSignAndSend( this.__apiPromise, this.__nativeContract, this.__keyringPair, "isAParticipant", (events: EventRecord) => {
return decodeEvents(events, this.__nativeContract, EVENT_DATA_TYPE_DESCRIPTIONS);
}, [chatroomId, participantId], __options);
}

/**
* invite
*
Expand Down
6 changes: 6 additions & 0 deletions contracts/typed-contracts/types-arguments/chatroom.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,12 @@ import type BN from 'bn.js';

export type AccountId = string | number[]

export type Message = {
sender: AccountId,
content: string,
sentTimestamp: (number | string | BN)
}

export enum LangError {
couldNotReadInput = 'CouldNotReadInput'
}
Expand Down
6 changes: 6 additions & 0 deletions contracts/typed-contracts/types-returns/chatroom.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,12 @@ import type {ReturnNumber} from '@727-ventures/typechain-types';

export type AccountId = string | number[]

export type Message = {
sender: AccountId,
content: string,
sentTimestamp: number
}

export enum LangError {
couldNotReadInput = 'CouldNotReadInput'
}
Expand Down

0 comments on commit 2f98073

Please sign in to comment.