153 lines
3.2 KiB
JavaScript
153 lines
3.2 KiB
JavaScript
"use strict";
|
|
|
|
const { MoleculerClientError } = require("moleculer").Errors;
|
|
const DbService = require("../mixins/db.mixin");
|
|
|
|
module.exports = {
|
|
name: "follows",
|
|
mixins: [DbService("follows")],
|
|
|
|
/**
|
|
* Default settings
|
|
*/
|
|
settings: {
|
|
|
|
},
|
|
|
|
/**
|
|
* Actions
|
|
*/
|
|
actions: {
|
|
|
|
/**
|
|
* Create a new following record
|
|
*
|
|
* @actions
|
|
*
|
|
* @param {String} user - Follower username
|
|
* @param {String} follow - Followee username
|
|
* @returns {Object} Created following record
|
|
*/
|
|
add: {
|
|
params: {
|
|
user: { type: "string" },
|
|
follow: { type: "string" },
|
|
},
|
|
handler(ctx) {
|
|
const { follow, user } = ctx.params;
|
|
return this.findByFollowAndUser(follow, user)
|
|
.then(item => {
|
|
if (item)
|
|
return this.Promise.reject(new MoleculerClientError("User has already followed"));
|
|
|
|
return this.adapter.insert({ follow, user, createdAt: new Date() })
|
|
.then(json => this.entityChanged("created", json, ctx).then(() => json));
|
|
});
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Check the given 'follow' user is followed by 'user' user.
|
|
*
|
|
* @actions
|
|
*
|
|
* @param {String} user - Follower username
|
|
* @param {String} follow - Followee username
|
|
* @returns {Boolean}
|
|
*/
|
|
has: {
|
|
cache: {
|
|
keys: ["article", "user"]
|
|
},
|
|
params: {
|
|
user: { type: "string" },
|
|
follow: { type: "string" },
|
|
},
|
|
handler(ctx) {
|
|
return this.findByFollowAndUser(ctx.params.follow, ctx.params.user)
|
|
.then(item => !!item);
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Count of following.
|
|
*
|
|
* @actions
|
|
*
|
|
* @param {String?} user - Follower username
|
|
* @param {String?} follow - Followee username
|
|
* @returns {Number}
|
|
*/
|
|
count: {
|
|
cache: {
|
|
keys: ["article", "user"]
|
|
},
|
|
params: {
|
|
follow: { type: "string", optional: true },
|
|
user: { type: "string", optional: true },
|
|
},
|
|
handler(ctx) {
|
|
let query = {};
|
|
if (ctx.params.follow)
|
|
query = { follow: ctx.params.follow };
|
|
|
|
if (ctx.params.user)
|
|
query = { user: ctx.params.user };
|
|
|
|
return this.adapter.count({ query });
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Delete a following record
|
|
*
|
|
* @actions
|
|
*
|
|
* @param {String} user - Follower username
|
|
* @param {String} follow - Followee username
|
|
* @returns {Number} Count of removed records
|
|
*/
|
|
delete: {
|
|
params: {
|
|
user: { type: "string" },
|
|
follow: { type: "string" },
|
|
},
|
|
handler(ctx) {
|
|
const { follow, user } = ctx.params;
|
|
return this.findByFollowAndUser(follow, user)
|
|
.then(item => {
|
|
if (!item)
|
|
return this.Promise.reject(new MoleculerClientError("User has not followed yet"));
|
|
|
|
return this.adapter.removeById(item._id)
|
|
.then(json => this.entityChanged("removed", json, ctx).then(() => json));
|
|
});
|
|
}
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Methods
|
|
*/
|
|
methods: {
|
|
/**
|
|
* Find the first following record by 'follow' or 'user'
|
|
* @param {String} follow - Followee username
|
|
* @param {String} user - Follower username
|
|
*/
|
|
findByFollowAndUser(follow, user) {
|
|
return this.adapter.findOne({ follow, user });
|
|
},
|
|
},
|
|
|
|
events: {
|
|
"cache.clean.follows"() {
|
|
if (this.broker.cacher)
|
|
this.broker.cacher.clean(`${this.name}.*`);
|
|
},
|
|
"cache.clean.users"() {
|
|
if (this.broker.cacher)
|
|
this.broker.cacher.clean(`${this.name}.*`);
|
|
}
|
|
}
|
|
}; |