pragma solidity ^0.8.17;
contract MicroBlog {
address admin;
bool is_running = true;
string app_name;
uint256 blog_id;
uint256 blog_count;
uint256[] id_array;
mapping(uint256 => bool) has_id;
mapping(uint256 => Blog) blogs;
event AddBlog(uint256 id, string log);
event DeleteBlog(uint256 id, string log);
struct Blog {
uint256 time;
address owner;
string content;
}
constructor() payable {
admin = msg.sender;
}
function setAppName(string memory _name) external {
app_name = _name;
}
function addBlog(string memory _content) public isRunning {
blog_id++;
id_array.push(blog_id);
has_id[blog_id] = true;
blogs[blog_id] = Blog(block.timestamp, msg.sender, _content);
emit AddBlog(blog_id, _content);
blog_count++;
}
function delBlogById(uint256 _id) public canAccess(_id) {
if (has_id[_id]) {
delete blogs[_id];
delete has_id[_id];
blog_count--;
emit DeleteBlog(_id, blogs[_id].content);
}
}
function getBlogById(uint256 id) public view returns (Blog memory) {
return blogs[id];
}
function getBlogByAddress(address _address)
public
view
returns (Blog[] memory)
{
uint256 _user_count;
for (uint256 i = 0; i < id_array.length; i++) {
if (has_id[id_array[i]]) {
if (blogs[id_array[i]].owner == _address) {
_user_count++;
}
}
}
uint256 index;
Blog[] memory _blogs = new BlogUnsupported embed;
for (uint256 i = 0; i < id_array.length; i++) {
if (has_id[id_array[i]]) {
if (blogs[id_array[i]].owner == msg.sender) {
_blogs[index] = blogs[id_array[i]];
index++;
}
}
}
return _blogs;
}
function getBlogIds() public view returns (uint256[] memory) {
uint256[] memory _result = new uint256Unsupported embed;
uint256 index;
for (uint256 i = 0; i < id_array.length; i++) {
if (has_id[id_array[i]]) {
_result[index] = id_array[i];
index++;
}
}
return _result;
}
function getBlogCount() public view returns (uint256) {
return blog_count;
}
function setIsRunning(bool _running) public isAdmin {
is_running = _running;
}
function changeOwner(address _newOwner) external {
admin = _newOwner;
}
function withdraw(uint256 _amount) public payable isAdmin {
payable(admin).transfer(_amount);
}
function withdrawAll() public payable isAdmin {
payable(admin).transfer(address(this).balance);
}
function destruct() public isAdmin {
selfdestruct(payable(admin));
}
modifier isAdmin() {
require(msg.sender == admin, "must be admin!");
_;
}
modifier isRunning() {
require(is_running, "contract is stopped!");
_;
}
modifier canAccess(uint256 _id) {
require(
msg.sender == admin || msg.sender == blogs[_id].owner,
"permission denied!"
);
_;
}
}