5 changed files with 295 additions and 12 deletions
@ -0,0 +1,27 @@ |
|||||
|
// user-subscription.js
|
||||
|
// Copyright (C) 2022 DTP Technologies, LLC
|
||||
|
// License: Apache-2.0
|
||||
|
|
||||
|
'use strict'; |
||||
|
|
||||
|
const mongoose = require('mongoose'); |
||||
|
const Schema = mongoose.Schema; |
||||
|
|
||||
|
const SubscriptionSchema = new Schema({ |
||||
|
client: { type: Schema.ObjectId, required: true, ref: 'OAuth2Client' }, |
||||
|
emitterId: { type: Schema.ObjectId }, |
||||
|
}); |
||||
|
|
||||
|
SubscriptionSchema.index({ |
||||
|
client: 1, |
||||
|
emitterId: 1, |
||||
|
}, { |
||||
|
name: 'subscription_client_emitter', |
||||
|
}); |
||||
|
|
||||
|
const UserSubscriptionSchema = new Schema({ |
||||
|
user: { type: Schema.ObjectId, required: true, unique: true, ref: 'User' }, |
||||
|
subscriptions: { type: [SubscriptionSchema] }, |
||||
|
}); |
||||
|
|
||||
|
module.exports = mongoose.model('UserSubscription', UserSubscriptionSchema); |
@ -0,0 +1,105 @@ |
|||||
|
// hive.js
|
||||
|
// Copyright (C) 2022 DTP Technologies, LLC
|
||||
|
// License: Apache-2.0
|
||||
|
|
||||
|
'use strict'; |
||||
|
|
||||
|
const mongoose = require('mongoose'); |
||||
|
|
||||
|
const UserSubscription = mongoose.model('UserSubscription'); |
||||
|
|
||||
|
const slug = require('slug'); |
||||
|
|
||||
|
const { SiteService, SiteError } = require('../../lib/site-lib'); |
||||
|
|
||||
|
class HiveService extends SiteService { |
||||
|
|
||||
|
constructor (dtp) { |
||||
|
super(dtp, module.exports); |
||||
|
} |
||||
|
|
||||
|
async subscribe (user, client, emitterId) { |
||||
|
await UserSubscription.updateOne( |
||||
|
{ user: user._id }, |
||||
|
{ |
||||
|
$addToSet: { |
||||
|
subscriptions: { |
||||
|
client: client._id, |
||||
|
emitterId, |
||||
|
}, |
||||
|
}, |
||||
|
}, |
||||
|
{ |
||||
|
upsert: true, |
||||
|
}, |
||||
|
); |
||||
|
} |
||||
|
|
||||
|
async unsubscribe (user, subscription) { |
||||
|
await UserSubscription.updateOne( |
||||
|
{ user: user._id }, |
||||
|
{ $pull: { subscriptions: subscription } }, |
||||
|
); |
||||
|
} |
||||
|
|
||||
|
extractHashtags (content) { |
||||
|
const hashtags = content |
||||
|
.split(/ \r\n/g) |
||||
|
.filter((tag) => tag[0] === '#') |
||||
|
.map((tag) => slug(tag.slice(1))) |
||||
|
; |
||||
|
return hashtags; |
||||
|
} |
||||
|
|
||||
|
extractLinks (content) { |
||||
|
let links = content |
||||
|
.split(/( |\r|\n)/g) |
||||
|
.filter((tag) => { |
||||
|
const test = tag.trim().toLowerCase(); |
||||
|
return test.startsWith('http://') || test.startsWith('https://'); |
||||
|
}); |
||||
|
|
||||
|
return links; |
||||
|
} |
||||
|
|
||||
|
async resolveLink (author, url) { |
||||
|
const jobData = { |
||||
|
authorType: author.type, |
||||
|
author: author._id, |
||||
|
url, |
||||
|
}; |
||||
|
this.log.info('creating job to resolve link', { jobData }); |
||||
|
await this.resolver.add('resolve-link', jobData); |
||||
|
} |
||||
|
|
||||
|
async processKaleidoscopeEvent (event) { |
||||
|
const { |
||||
|
userNotification: userNotificationService, |
||||
|
oauth2: oauth2Service, |
||||
|
} = this.dtp.services; |
||||
|
|
||||
|
const client = await oauth2Service.getClientByDomainKey(event.source.site.domainKey); |
||||
|
if (!client) { |
||||
|
throw new SiteError(403, 'Unknown client domain key'); |
||||
|
} |
||||
|
|
||||
|
await UserSubscription |
||||
|
.find({ |
||||
|
'subscriptions.client': client._id, |
||||
|
'subscriptions.emitterId': event.source.emitter._id, |
||||
|
}) |
||||
|
.select('-subscriptions') |
||||
|
.cursor() |
||||
|
.eachAsync(async (subscription) => { |
||||
|
await userNotificationService.create(subscription.user, event); |
||||
|
}, 3); |
||||
|
|
||||
|
this.emit('kaleidoscope:event', event, client); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
module.exports = { |
||||
|
slug: 'hive', |
||||
|
name: 'hive', |
||||
|
create: (dtp) => { return new HiveService(dtp); }, |
||||
|
}; |
Loading…
Reference in new issue