pragma solidity >=0.4.3 <0.6.0; contract MeetingContract { address owner; uint16 private numMeeting; Meeting[] private meetings; constructor () public { owner = msg.sender; } function createMeeting(string memory _description) public onlyOwner fieldCantBeEmpty(_description) returns (uint16) { require(numMeeting + 1 > numMeeting, "reached maximum number of meetings"); meetings.length = numMeeting + 1; meetings[numMeeting] = Meeting({description:_description, amountMembers:0}); numMeeting += 1; return numMeeting; } function registerMemberToMeeting(string memory _passport, uint16 _meetingId) public fieldCantBeEmpty(_passport) checkMeetingId(_meetingId) returns (bool){ require(numMeeting + 1 > numMeeting, "no meeting places"); require(checkMemberRegistration(_passport, _meetingId) == false, "this user is already registered"); bytes32 passportHash = getHash(_passport); Meeting storage meeting = meetings[_meetingId]; meeting.members[meeting.amountMembers] = Member(passportHash); meeting.amountMembers += 1; return true; } function checkMemberRegistration(string memory _passport, uint16 _meetingId) public view fieldCantBeEmpty(_passport) checkMeetingId(_meetingId) returns (bool){ bytes32 passportHash = getHash(_passport); return checkMemberOnMeetingByPasportHash(passportHash, _meetingId); } function checkMemberOnMeetingByPasportHash(bytes32 _passportHash, uint16 _meetingId) private view returns (bool){ for(uint16 i=0; i<meetings[_meetingId].amountMembers; i++){ if(meetings[_meetingId].members[i].passportHash == _passportHash) return true; } return false; } function getMeetingDescriptionById(uint16 _meetingId) public view checkMeetingId(_meetingId) returns (string memory){ return meetings[_meetingId].description; } function getHash(string memory _data) pure private returns(bytes32){ return keccak256(abi.encodePacked(_data)); } modifier onlyOwner(){ require(msg.sender == owner, "access denied"); _; } modifier fieldCantBeEmpty(string memory _field){ require(bytes(_field).length > 0, "string fields into args can't be empty"); _; } modifier checkMeetingId(uint16 _meetingId){ require(_meetingId < numMeeting, "incorrect meetingId"); _; } struct Meeting{ string description; mapping(uint16 => Member) members; uint16 amountMembers; } struct Member{ bytes32 passportHash; } }
0.4.26