Skip to content

Commit bcc7346

Browse files
committed
add like service & model
1 parent 0fee0ac commit bcc7346

File tree

6 files changed

+130
-13
lines changed

6 files changed

+130
-13
lines changed

blog/models/like.model.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
"use strict";
2+
3+
let mongoose = require("mongoose");
4+
let Schema = mongoose.Schema;
5+
6+
let LikeSchema = new Schema({
7+
user: {
8+
type: Schema.Types.ObjectId,
9+
ref: "User",
10+
required: "Please fill in a user ID",
11+
},
12+
post: {
13+
type: Schema.Types.ObjectId,
14+
ref: "Post",
15+
required: "Please fill in a post ID",
16+
}
17+
}, {
18+
timestamps: true
19+
});
20+
21+
// Add index
22+
LikeSchema.index({user: 1, post: 1}, {unique: true});
23+
24+
module.exports = mongoose.model("Like", LikeSchema);

blog/models/post.model.js

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,6 @@ let PostSchema = new Schema({
1616
coverPhoto: {
1717
type: String
1818
},
19-
likes: {
20-
type: Number,
21-
default: 0
22-
},
2319
author: {
2420
type: Schema.Types.ObjectId,
2521
ref: "User",

blog/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
"ioredis": "3.1.1",
2121
"lodash": "4.17.4",
2222
"moleculer": "0.8.2",
23-
"moleculer-db": "0.4.1",
23+
"moleculer-db": "0.4.5",
2424
"moleculer-db-adapter-mongoose": "0.3.1",
2525
"moleculer-fake": "1.0.4",
2626
"moleculer-repl": "0.1.3",

blog/services/likes.service.js

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
"use strict";
2+
3+
const _ = require("lodash");
4+
const DbService = require("moleculer-db");
5+
const MongooseAdapter = require("moleculer-db-adapter-mongoose");
6+
const Like = require("../models/like.model");
7+
const Fakerator = require("fakerator");
8+
const fake = new Fakerator();
9+
10+
module.exports = {
11+
name: "likes",
12+
mixins: DbService,
13+
adapter: new MongooseAdapter(process.env.MONGO_URI || "mongodb://localhost/moleculer-blog"),
14+
model: Like,
15+
16+
settings: {
17+
fields: ["user", "post"],
18+
populates: {
19+
"user": {
20+
action: "users.get",
21+
params: {
22+
fields: ["_id", "username", "fullName", "avatar"]
23+
}
24+
}
25+
}
26+
},
27+
28+
methods: {
29+
seedDB() {
30+
this.logger.info("Seed Likes DB...");
31+
32+
return this.Promise.all([
33+
this.broker.call("users.find"),
34+
this.broker.call("posts.find")
35+
]).then(([users, posts]) => {
36+
if (users.length == 0 || posts.length == 0) {
37+
this.logger.info("Waiting for `users` & 'posts' seed...");
38+
setTimeout(this.seedDB, 1000);
39+
return;
40+
}
41+
42+
let promises = [];
43+
44+
users.forEach(user => {
45+
_.times(fake.random.number(8, 15), () => {
46+
let p = this.adapter.insert({
47+
user: user._id,
48+
post: fake.random.arrayElement(posts)._id
49+
}).catch(err => {
50+
// Skip unique index error
51+
});
52+
promises.push(p);
53+
});
54+
});
55+
56+
return this.Promise.all(promises)
57+
.then(() => this.count())
58+
.then(count => console.log(`Generated ${count} likes!`));
59+
60+
}).catch(err => {
61+
if (err.name == "ServiceNotFoundError") {
62+
this.logger.info("Waiting for `users` & `posts` service...");
63+
setTimeout(this.seedDB, 1000);
64+
return;
65+
} else
66+
return Promise.reject(err);
67+
});
68+
}
69+
},
70+
71+
afterConnected() {
72+
return this.count().then(count => {
73+
if (count == 0) {
74+
this.seedDB();
75+
}
76+
});
77+
}
78+
79+
};

blog/services/posts.service.js

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,19 +14,38 @@ module.exports = {
1414
model: Post,
1515

1616
settings: {
17-
fields: ["_id", "title", "content", "author", "likes", "category", "coverPhoto", "createdAt"],
17+
fields: ["_id", "title", "content", "author", "likes", "likers", "category", "coverPhoto", "createdAt"],
1818
populates: {
1919
"author": {
2020
action: "users.get",
2121
params: {
2222
fields: ["_id", "username", "fullName", "avatar"]
2323
}
24+
},
25+
likes(ids, docs, rule, ctx) {
26+
return this.Promise.all(docs.map(doc => ctx.call("likes.count", { query: { post: doc._id } }).then(count => doc.likes = count)));
27+
},
28+
"likers": {
29+
action: "likes.findByPost",
30+
params: {
31+
populate: ["user"],
32+
limit: 5
33+
}
2434
}
2535
},
2636
pageSize: 5
2737
},
2838

2939
actions: {
40+
41+
like(ctx) {
42+
43+
},
44+
45+
unlike(ctx) {
46+
47+
}
48+
3049
},
3150

3251
methods: {
@@ -49,7 +68,6 @@ module.exports = {
4968
content: fake.times(fake.lorem.paragraph, 10).join("\r\n"),
5069
category: fake.random.arrayElement(["General", "Tech", "Social", "News"]),
5170
author: fake.random.arrayElement(authors)._id,
52-
likes: fake.random.number(100),
5371
coverPhoto: fake.random.number(1, 20) + ".jpg",
5472
createdAt: fakePost.created
5573
});

blog/services/www.service.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ module.exports = {
4141

4242
return Promise.resolve({ page })
4343
.then(data => {
44-
return this.broker.call("posts.list", { page, pageSize, populate: ["author"] }).then(res => {
44+
return this.broker.call("posts.list", { page, pageSize, populate: ["author", "likes"] }).then(res => {
4545
data.posts = res.rows;
4646
data.totalPages = res.totalPages;
4747
return data;
@@ -60,7 +60,7 @@ module.exports = {
6060

6161
return Promise.resolve({ page })
6262
.then(data => {
63-
return this.broker.call("posts.list", { query: { category }, page, pageSize, populate: ["author"] }).then(res => {
63+
return this.broker.call("posts.list", { query: { category }, page, pageSize, populate: ["author", "likes"] }).then(res => {
6464
data.posts = res.rows;
6565
data.totalPages = res.totalPages;
6666
return data;
@@ -81,7 +81,7 @@ module.exports = {
8181

8282
return Promise.resolve({ page })
8383
.then(data => {
84-
return this.broker.call("posts.list", { query: { author }, page, pageSize, populate: ["author"] }).then(res => {
84+
return this.broker.call("posts.list", { query: { author }, page, pageSize, populate: ["author", "likes"] }).then(res => {
8585
data.posts = res.rows;
8686
data.totalPages = res.totalPages;
8787
return data;
@@ -102,7 +102,7 @@ module.exports = {
102102

103103
return Promise.resolve({ page })
104104
.then(data => {
105-
return this.broker.call("posts.list", { search, page, pageSize, populate: ["author"] }).then(res => {
105+
return this.broker.call("posts.list", { search, page, pageSize, populate: ["author", "likes"] }).then(res => {
106106
data.query = search;
107107
data.posts = res.rows;
108108
data.totalPages = res.totalPages;
@@ -121,7 +121,7 @@ module.exports = {
121121
return this.handleErr(res)(this.Promise.reject(new MoleculerError("Invalid POST ID", 404, "INVALID_POST_ID", { id: req.params.id })));
122122

123123
return Promise.resolve({ })
124-
.then(data => this.broker.call("posts.get", { id, populate: ["author"] }).then(post => {
124+
.then(data => this.broker.call("posts.get", { id, populate: ["author", "likes"] }).then(post => {
125125
if (!post)
126126
return this.Promise.reject(new MoleculerError("Post not found", 404, "NOT_FOUND_POST", { id: req.params.id }));
127127

@@ -136,7 +136,7 @@ module.exports = {
136136
},
137137

138138
appendAdditionalData(data) {
139-
return this.broker.call("posts.find", { limit: 5, sort: "-likes" }).then(posts => {
139+
return this.broker.call("posts.find", { limit: 5, sort: "-createdAt" }).then(posts => {
140140
data.bestOfPosts = posts;
141141
return data;
142142
});

0 commit comments

Comments
 (0)