Merge pull request #3143 from specklesystems/alessandro/web-943-send-activity-notification

Activitystream IoC 2 sendActivityNotification
This commit is contained in:
Alessandro Magionami
2024-09-27 10:44:24 +02:00
committed by GitHub
4 changed files with 46 additions and 40 deletions
@@ -1,5 +1,4 @@
import { Optional, SpeckleModule } from '@/modules/shared/helpers/typeHelper'
import { sendActivityNotifications } from '@/modules/activitystream/services/summary'
import { initializeEventListener } from '@/modules/activitystream/services/eventListener'
import { publishNotification } from '@/modules/notifications/services/publication'
import { scheduleExecution } from '@/modules/core/services/taskScheduler'
@@ -8,6 +7,9 @@ import { weeklyEmailDigestEnabled } from '@/modules/shared/helpers/envHelper'
import { getEventBus } from '@/modules/shared/services/eventBus'
import { handleServerInvitesActivitiesFactory } from '@/modules/activitystream/services/serverInvitesActivity'
import { getStream } from '@/modules/core/repositories/streams'
import { sendActivityNotificationsFactory } from '@/modules/activitystream/services/summary'
import { getActiveUserStreamsFactory } from '@/modules/activitystream/repositories'
import { db } from '@/db/knex'
let scheduledTask: ReturnType<typeof scheduleExecution> | null = null
let quitEventListeners: Optional<ReturnType<typeof initializeEventListeners>> =
@@ -44,7 +46,10 @@ const scheduleWeeklyActivityNotifications = () => {
const end = now
const start = new Date(end.getTime())
start.setDate(start.getDate() - numberOfDays)
await sendActivityNotifications(start, end, publishNotification)
await sendActivityNotificationsFactory({
publishNotification,
getActiveUserStreams: getActiveUserStreamsFactory({ db })
})(start, end)
},
10 * 60 * 1000
)
@@ -1,7 +1,4 @@
import {
getActivityFactory,
getActiveUserStreamsFactory
} from '@/modules/activitystream/repositories'
import { getActivityFactory } from '@/modules/activitystream/repositories'
import { StreamScopeActivity } from '@/modules/activitystream/helpers/types'
import {
NotificationPublisher,
@@ -47,23 +44,26 @@ export const createActivitySummary = async (
}
}
export const sendActivityNotifications = async (
start: Date,
end: Date,
notificationPublisher: NotificationPublisher,
userActiveStreamsLookup: GetActiveUserStreams = getActiveUserStreamsFactory({ db })
): Promise<void> => {
const activeUserStreams = await userActiveStreamsLookup(start, end)
await Promise.all(
activeUserStreams.map((userStreams) =>
notificationPublisher(NotificationType.ActivityDigest, {
targetUserId: userStreams.userId,
data: {
streamIds: userStreams.streamIds,
start,
end
}
})
export const sendActivityNotificationsFactory =
({
publishNotification,
getActiveUserStreams
}: {
publishNotification: NotificationPublisher
getActiveUserStreams: GetActiveUserStreams
}) =>
async (start: Date, end: Date): Promise<void> => {
const activeUserStreams = await getActiveUserStreams(start, end)
await Promise.all(
activeUserStreams.map((userStreams) =>
publishNotification(NotificationType.ActivityDigest, {
targetUserId: userStreams.userId,
data: {
streamIds: userStreams.streamIds,
start,
end
}
})
)
)
)
}
}
@@ -3,7 +3,7 @@ import { BasicTestUser, createTestUsers } from '@/test/authHelper'
import { StreamActivity, Users } from '@/modules/core/dbSchema'
import {
createActivitySummary,
sendActivityNotifications
sendActivityNotificationsFactory
} from '@/modules/activitystream/services/summary'
import { expect } from 'chai'
import { createStream, deleteStream } from '@/modules/core/services/streams'
@@ -140,12 +140,10 @@ describe('Activity summary @activity', () => {
describe('send activity notifications', () => {
it('sends no notifications if there are no active streams', async () => {
const notificationPublisher = new FakeNotificationPublisher()
await sendActivityNotifications(
new Date(),
new Date(),
notificationPublisher.publish.bind(notificationPublisher),
async () => []
)
await sendActivityNotificationsFactory({
publishNotification: notificationPublisher.publish.bind(notificationPublisher),
getActiveUserStreams: async () => []
})(new Date(), new Date())
expect(notificationPublisher.notifications.length).to.equal(0)
})
@@ -156,12 +154,10 @@ describe('Activity summary @activity', () => {
{ userId: 'boo', streamIds: ['tic', 'tac', 'toe'] }
]
const notificationPublisher = new FakeNotificationPublisher()
await sendActivityNotifications(
new Date(),
new Date(),
notificationPublisher.publish.bind(notificationPublisher),
async () => userStreams
)
await sendActivityNotificationsFactory({
publishNotification: notificationPublisher.publish.bind(notificationPublisher),
getActiveUserStreams: async () => userStreams
})(new Date(), new Date())
expect(
notificationPublisher.notifications
@@ -1,8 +1,10 @@
import { CommandModule } from 'yargs'
import { initializeQueue } from '@/modules/notifications/services/queue'
import { sendActivityNotifications } from '@/modules/activitystream/services/summary'
import { publishNotification } from '@/modules/notifications/services/publication'
import { cliLogger } from '@/logging/logging'
import { sendActivityNotificationsFactory } from '@/modules/activitystream/services/summary'
import { getActiveUserStreamsFactory } from '@/modules/activitystream/repositories'
import { db } from '@/db/knex'
const command: CommandModule = {
command: 'send [days]',
@@ -21,7 +23,10 @@ const command: CommandModule = {
const end = new Date()
const start = new Date(end.getTime())
start.setDate(start.getDate() - numberOfDays)
await sendActivityNotifications(start, end, publishNotification)
await sendActivityNotificationsFactory({
publishNotification,
getActiveUserStreams: getActiveUserStreamsFactory({ db })
})(start, end)
cliLogger.info('Sent activity notifications')
}
}