Skip to content

Commit

Permalink
update
Browse files Browse the repository at this point in the history
  • Loading branch information
xiaoyuanxun committed Nov 22, 2023
1 parent 268ac31 commit 595cdd5
Show file tree
Hide file tree
Showing 21 changed files with 817 additions and 434 deletions.
32 changes: 30 additions & 2 deletions dfx.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,39 @@
},
"post": {
"type": "motoko",
"main": "src/post/main.mo"
"main": "src/post/post.mo"
},
"rootPost": {
"type": "motoko",
"main": "src/post/rootPost.mo"
},
"feed": {
"type": "motoko",
"main": "src/feed/main.mo"
"main": "src/feed/feed.mo"
},
"rootFeed": {
"type": "motoko",
"main": "src/feed/rootFeed.mo"
},
"bucket": {
"type": "motoko",
"main": "src/post/bucket.mo"
},
"rootFetch": {
"type": "motoko",
"main": "src/fetch/rootFetch.mo"
},
"postFetch": {
"type": "motoko",
"main": "src/fetch/postFetch.mo"
},
"commentFetch": {
"type": "motoko",
"main": "src/fetch/commentFetch.mo"
},
"likeFetch": {
"type": "motoko",
"main": "src/fetch/likeFetch.mo"
}
},
"defaults": {
Expand Down
150 changes: 96 additions & 54 deletions src/feed/database.mo
Original file line number Diff line number Diff line change
Expand Up @@ -22,62 +22,104 @@ module {
type Like = Types.Like;

var postIndex: Nat = 0;
let postMap = TrieMap.TrieMap<Nat, Post>(Nat.equal, Hash.hash);
let postMap = TrieMap.TrieMap<Nat, Post>(Nat.equal, Hash.hash); // postIndex -> Post

private func _getPostId(bucket: Principal, user: Principal, index: Nat): Text {
Principal.toText(bucket) # "#" # Principal.toText(user) # "#" # Nat.toText(index)
};

// 发帖
public func createPost(user: UserId, title: Text, content: Text, time: Time) {
postMap.put(postIndex, {
public func createPost(user: UserId, title: Text, content: Text, time: Time, bucket: Principal): PostImmutable {
let post: Post = {
postId = _getPostId(bucket, user, postIndex);
index = postIndex;
user = user;
repost = [];
title = title;
content = content;
var like = [];
var likeIndex = 0;
var comment = [];
var commentIndex = 0;
createdAt = time;
});
postIndex += 1;
};

postMap.put(postIndex, post);

_convertPostToImmutable(post)
};

// 删帖
public func deletePost(postIndex: Nat) {
postMap.delete(postIndex);
private func _convertPostToImmutable(post: Post): PostImmutable {
{
postId = post.postId;
index = post.index;
user = post.user;
repost = post.repost;
title = post.title;
content = post.content;
like = post.like;
comment = post.comment;
commentIndex = post.commentIndex;
createdAt = post.createdAt;
}
};

// public func getPost(postIndex: Nat): ?PostImmutable {
// switch(postMap.get(postIndex)) {
// case(null) {};
// case(?post) {
// return ?{
// index = post.index;
// user = post.user;
// title = post.title;
// content = post.content;
// like = post.like;
// likeNumber = Array.size(post.like);
// comment = post.comment;
// commentNumber = Array.size(post.comment);
// commentIndex = post.commentIndex;
// createdAt = post.createdAt;
// }
// };
// };
// null
// };

// 查询所有帖子
public func getPosts(): [PostImmutable] {
var ans: [PostImmutable] = [];
for(post in postMap.vals()) {
ans := Array.append<PostImmutable>(ans, [{
index = post.index;
user = post.user;
title = post.title;
content = post.content;
like = post.like;
comment = post.comment;
commentIndex = post.commentIndex;
createdAt = post.createdAt;
}]);
};
ans
};
// public func getPosts(): [PostImmutable] {
// var ans: [PostImmutable] = [];
// for(post in postMap.vals()) {
// ans := Array.append<PostImmutable>(ans, [{
// index = post.index;
// user = post.user;
// title = post.title;
// content = post.content;
// like = post.like;
// likeNumber = Array.size(post.like);
// comment = post.comment;
// commentNumber = Array.size(post.comment);
// commentIndex = post.commentIndex;
// createdAt = post.createdAt;
// }]);
// };
// ans
// };

// 评论
public func createComment(commentUser: UserId, postIndex: Nat, content: Text, createdAt: Time) {
switch(postMap.get(postIndex)) {
case(null) {};
case(?post) {
post.comment := Array.append(post.comment, [{
index = post.commentIndex;
user = commentUser;
content = content;
createdAt = createdAt;
}]);
post.commentIndex += 1;
};
};
};
// public func createComment(commentUser: UserId, postIndex: Nat, content: Text, createdAt: Time): ?Nat {
// switch(postMap.get(postIndex)) {
// case(null) { return null;};
// case(?post) {
// post.comment := Array.append(post.comment, [{
// index = post.commentIndex;
// user = commentUser;
// content = content;
// createdAt = createdAt;
// }]);
// post.commentIndex += 1;
// return ?(post.commentIndex - 1);
// };
// };
// };

// 删评
public func deleteComment(commentUser: UserId, postIndex: Nat, commentIndex: Nat) {
Expand Down Expand Up @@ -108,21 +150,21 @@ module {
};

// 点赞
public func createLike(likeUser: UserId, postIndex: Nat, createdAt: Time) {
switch(postMap.get(postIndex)) {
case(null) {};
case(?post) {
for(like in post.like.vals()) {
// 已经点赞过
if(like.user == likeUser) { return;};
};
post.like := Array.append<Like>(post.like, [{
user = likeUser;
createdAt = createdAt;
}]);
};
}
};
// public func createLike(likeUser: UserId, postIndex: Nat, createdAt: Time) {
// switch(postMap.get(postIndex)) {
// case(null) {};
// case(?post) {
// for(like in post.like.vals()) {
// // 已经点赞过
// if(like.user == likeUser) { return;};
// };
// post.like := Array.append<Like>(post.like, [{
// user = likeUser;
// createdAt = createdAt;
// }]);
// };
// }
// };

// 取点
public func deleteLike(likeUser: UserId, postIndex: Nat) {
Expand Down
142 changes: 142 additions & 0 deletions src/feed/feed.mo
Original file line number Diff line number Diff line change
@@ -0,0 +1,142 @@
import Database "./database";
import Types "./types";
import Principal "mo:base/Principal";
import TrieMap "mo:base/TrieMap";
import Array "mo:base/Array";
import Order "mo:base/Order";
import Time "mo:base/Time";
import Debug "mo:base/Debug";
import Option "mo:base/Option";
import Bucket "../post/bucket";

actor class Feed(
_owner: Principal,
rootPostCanister: Principal,
userCanister: Principal
) = this {

stable var owner = _owner;

public query func getOwner(): async Principal { owner };

public shared({caller}) func updateOwner(newOwner: Principal): async () {
assert(caller == owner);
owner := newOwner;
};

public query({caller}) func whoami(): async Principal { caller };

// Bucket

type RootPostActor = Types.RootPostActor;
stable var bucket: ?Principal = null;
let rootPostActor: RootPostActor = actor(Principal.toText(rootPostCanister));

// 更新当前 feed 去存储的 bucket canister
public shared func checkAvailableBucket(): async Bool {
switch((await rootPostActor.getAvailableBucket())) {
case(null) { return false; };
case(?bucketInfo) {
bucket := ?bucketInfo.canisterId;
return true;
};
};
};

// Post

type Time = Types.Time;
type UserId = Types.UserId;
type BucketActor = Types.BucketActor;

let postDirectory: Database.PostDirectory = Database.PostDirectory();

public shared({caller}) func createPost(title: Text, content: Text): async Bool {
assert(caller == owner and bucket != null);
let _bucket = Option.unwrap(bucket);
let post: PostImmutable = postDirectory.createPost(caller, title, content, Time.now(), _bucket);

// 将帖子内容发送给公共区的 Bucket
let bucketActor: BucketActor = actor(Principal.toText(_bucket));
ignore bucketActor.storeFeed(post);

// 把发帖人、帖子 ID 、用户 C 、D(followers)发送给 Fetch
true
};

// public query func getPost(postIndex: Nat): async ?PostImmutable {
// postDirectory.getPost(postIndex)
// };

// public query func getPosts(): async [PostImmutable] {
// postDirectory.getPosts()
// };

// public shared({caller}) func createComment(commentUser: UserId, postIndex: Nat, content: Text): async ?Nat {
// assert(caller == postCanister or caller == owner);
// let commentIndex = postDirectory.createComment(commentUser, postIndex, content, Time.now());
// await sendFeed();
// commentIndex
// };

// public shared({caller}) func deleteComment(commentUser: UserId, postIndex: Nat, commentIndex: Nat): async () {
// assert(caller == rootPostCanister);
// postDirectory.deleteComment(commentUser, postIndex, commentIndex);
// await sendFeed();
// };

// public shared({caller}) func createLike(likeUser: UserId, postIndex: Nat): async () {
// assert(caller == postCanister);
// postDirectory.createLike(likeUser, postIndex, Time.now());
// await sendFeed();
// };

// public shared({caller}) func deleteLike(likeUser: UserId, postIndex: Nat) {
// assert(caller == rootPostCanister);
// postDirectory.deleteLike(likeUser, postIndex);
// await sendFeed();
// };

// Feed

type PostImmutable = Types.PostImmutable;
type FeedActor = Types.FeedActor;
type UserActor = Types.UserActor;

// let postActor: PostActor = actor(Principal.toText(rootPostCanister));
let feedMap = TrieMap.TrieMap<Principal, [PostImmutable]>(Principal.equal, Principal.hash);

// public shared({caller}) func sendFeed(): async () {
// assert(caller == owner or caller == Principal.fromActor(this));
// let userActor: UserActor = actor(Principal.toText(userCanister));
// Debug.print("userCanister : " # Principal.toText(userCanister));
// let followersList = await userActor.getFollowersList(owner);
// for(user in followersList.vals()) {
// let feedActor: FeedActor = actor(Principal.toText(user));
// await feedActor.receiveFeed();
// };
// await postActor.receiveFeed();
// };

public shared({caller}) func receiveFeed(): async () {
let feedActor: FeedActor = actor(Principal.toText(caller));
let posts = await feedActor.getPosts();
feedMap.put(caller, posts);
};

public query({caller}) func getFeed(): async [PostImmutable] {
var ans: [PostImmutable] = [];
for(posts in feedMap.vals()) {
ans := Array.append<PostImmutable>(ans, posts);
};
Array.sort(
ans,
func (x: PostImmutable, y: PostImmutable): Order.Order {
if(x.createdAt > y.createdAt) return #less
else if(x.createdAt < y.createdAt) return #greater
else return #equal
}
)
};

}
Loading

0 comments on commit 595cdd5

Please sign in to comment.