You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

204 lines
8.1 KiB

6 years ago
pragma solidity >=0.5.6 <0.6.0;
7 years ago
6 years ago
import "./Posting.sol";
7 years ago
contract Forum {
6 years ago
Posting posting;
constructor(address addr) public {
posting = Posting(addr);
posting.setForumContractAddress();
}
7 years ago
7 years ago
//----------------------------------------USER----------------------------------------
7 years ago
struct User {
6 years ago
string username; // TODO: set an upper bound instead of arbitrary string
OrbitDB orbitdb;
7 years ago
uint[] topicIDs; // IDs of the topics the user created
uint[] postIDs; // IDs of the posts the user created
uint timestamp;
bool signedUp; // Helper variable for hasUserSignedUp()
7 years ago
}
mapping (address => User) users;
mapping (string => address) userAddresses;
event UserSignedUp(string username, address userAddress);
event UsernameUpdated(string newName, string oldName,address userAddress);
7 years ago
6 years ago
function signUp(string memory username, string memory orbitIdentityId,
string memory orbitIdentityPublicKey, string memory orbitIdentityPrivateKey,
string memory orbitId, string memory orbitPublicKey, string memory orbitPrivateKey,
string memory orbitTopicsDB, string memory orbitPostsDB) public returns (bool) {
require (!hasUserSignedUp(msg.sender), "User has already signed up.");
require(!isUserNameTaken(username), "Username is already taken.");
users[msg.sender] = User(username,
6 years ago
OrbitDB(orbitIdentityId, orbitIdentityPublicKey, orbitIdentityPrivateKey,
orbitId, orbitPublicKey, orbitPrivateKey, orbitTopicsDB, orbitPostsDB),
new uint[](0), new uint[](0), block.timestamp, true);
userAddresses[username] = msg.sender;
emit UserSignedUp(username, msg.sender);
7 years ago
return true;
}
6 years ago
function updateUsername(string memory newUsername) public returns (bool) {
require (hasUserSignedUp(msg.sender), "User hasn't signed up yet.");
require(!isUserNameTaken(newUsername), "Username is already taken.");
string memory oldUsername = getUsername(msg.sender);
delete userAddresses[users[msg.sender].username];
users[msg.sender].username = newUsername;
userAddresses[newUsername] = msg.sender;
emit UsernameUpdated(newUsername, oldUsername, msg.sender);
return true;
7 years ago
}
6 years ago
function getUsername(address userAddress) public view returns (string memory) {
require (hasUserSignedUp(userAddress), "User hasn't signed up yet.");
return users[userAddress].username;
7 years ago
}
6 years ago
function getUserAddress(string memory username) public view returns (address) {
return userAddresses[username];
7 years ago
}
function hasUserSignedUp(address userAddress) public view returns (bool) {
return users[userAddress].signedUp;
7 years ago
}
6 years ago
function isUserNameTaken(string memory username) public view returns (bool) {
if (getUserAddress(username)!=address(0))
7 years ago
return true;
return false;
}
6 years ago
function getUserTopics(address userAddress) public view returns (uint[] memory) {
require (hasUserSignedUp(userAddress), "User hasn't signed up yet.");
return users[userAddress].topicIDs;
}
function getUserPosts(address userAddress) public view returns (uint[] memory) {
require (hasUserSignedUp(userAddress), "User hasn't signed up yet.");
return users[userAddress].postIDs;
}
function getUserDateOfRegister(address userAddress) public view returns (uint) {
require (hasUserSignedUp(userAddress), "User hasn't signed up yet.");
return users[userAddress].timestamp;
}
6 years ago
//----------------------------------------OrbitDB----------------------------------------
6 years ago
// TODO: set upper bounds to strings (instead of being of arbitrary length)
// TODO: not sure if topicsDB//postsDB are actually needed
6 years ago
struct OrbitDB {
6 years ago
string identityId;
string identityPublicKey;
string identityPrivateKey;
string orbitId;
string orbitPublicKey;
string orbitPrivateKey;
string topicsDB;
6 years ago
string postsDB;
}
6 years ago
function getOrbitIdentityId(address userAddress) public view returns (string memory) {
require (hasUserSignedUp(userAddress), "User hasn't signed up.");
return users[userAddress].orbitdb.identityId;
}
6 years ago
6 years ago
function getOrbitIdentityPublicKey(address userAddress) public view returns (string memory) {
6 years ago
require (hasUserSignedUp(userAddress), "User hasn't signed up.");
6 years ago
return users[userAddress].orbitdb.identityPublicKey;
6 years ago
}
6 years ago
function getOrbitIdentityPrivateKey(address userAddress) public view returns (string memory) {
6 years ago
require (hasUserSignedUp(userAddress), "User hasn't signed up.");
6 years ago
return users[userAddress].orbitdb.identityPrivateKey;
6 years ago
}
6 years ago
function getOrbitDBId(address userAddress) public view returns (string memory) {
6 years ago
require (hasUserSignedUp(userAddress), "User hasn't signed up.");
6 years ago
return users[userAddress].orbitdb.orbitId;
6 years ago
}
function getOrbitPublicKey(address userAddress) public view returns (string memory) {
require (hasUserSignedUp(userAddress), "User hasn't signed up.");
6 years ago
return users[userAddress].orbitdb.orbitPublicKey;
6 years ago
}
//TODO: encrypt using Metamask in the future
function getOrbitPrivateKey(address userAddress) public view returns (string memory) {
require (hasUserSignedUp(userAddress), "User hasn't signed up.");
6 years ago
return users[userAddress].orbitdb.orbitPrivateKey;
6 years ago
}
6 years ago
function getOrbitTopicsDB(address userAddress) public view returns (string memory) {
require (hasUserSignedUp(userAddress), "User hasn't signed up.");
return users[userAddress].orbitdb.topicsDB;
}
function getOrbitPostsDB(address userAddress) public view returns (string memory) {
require (hasUserSignedUp(userAddress), "User hasn't signed up.");
return users[userAddress].orbitdb.postsDB;
}
function getOrbitIdentityInfo(address userAddress) public view returns (string memory, string memory, string memory) {
6 years ago
require (hasUserSignedUp(userAddress), "User hasn't signed up.");
return (
6 years ago
users[userAddress].orbitdb.identityId,
users[userAddress].orbitdb.identityPublicKey,
users[userAddress].orbitdb.identityPrivateKey
6 years ago
);
}
6 years ago
function getOrbitDBInfo(address userAddress) public view returns (string memory, string memory,
string memory, string memory, string memory) {
require (hasUserSignedUp(userAddress), "User hasn't signed up.");
return (
6 years ago
users[userAddress].orbitdb.orbitId,
users[userAddress].orbitdb.orbitPublicKey,
users[userAddress].orbitdb.orbitPrivateKey,
users[userAddress].orbitdb.topicsDB,
users[userAddress].orbitdb.postsDB
6 years ago
);
}
6 years ago
6 years ago
//----POSTING-----
6 years ago
function createTopic() public returns (uint, uint) {
require(hasUserSignedUp(msg.sender)); // Only registered users can create topics
6 years ago
(uint topicID, uint postID) = posting.createTopic(msg.sender);
6 years ago
users[msg.sender].topicIDs.push(topicID);
users[msg.sender].postIDs.push(postID);
return (topicID, postID);
}
function createPost(uint topicID) public returns (uint) {
require(hasUserSignedUp(msg.sender)); // Only registered users can create posts
6 years ago
uint postID = posting.createPost(topicID, msg.sender);
6 years ago
users[msg.sender].postIDs.push(postID);
return postID;
}
function getTopic(uint topicID) public view returns (string memory, address, string memory, uint, uint[] memory) {
6 years ago
(address author, uint timestamp, uint[] memory postIDs) = posting.getTopicInfo(topicID);
return (getOrbitTopicsDB(author),
author,
users[author].username,
timestamp,
postIDs
6 years ago
);
}
function getPost(uint postID) public view returns (string memory, address, string memory, uint, uint) {
6 years ago
(address author, uint timestamp, uint topicID) = posting.getPostInfo(postID);
return (getOrbitPostsDB(author),
author,
users[author].username,
timestamp,
topicID
6 years ago
);
}
6 years ago
6 years ago
}