Files
speckle-server/packages/server/modules/activitystream/services/summary.ts
T
2024-10-09 10:39:00 +03:00

73 lines
1.8 KiB
TypeScript

import {
NotificationPublisher,
NotificationType
} from '@/modules/notifications/helpers/types'
import { getUser } from '@/modules/core/repositories/users'
import {
CreateActivitySummary,
GetActiveUserStreams,
GetActivity
} from '@/modules/activitystream/domain/operations'
import { GetStream } from '@/modules/core/domain/streams/operations'
export const createActivitySummaryFactory =
({
getStream,
getActivity
}: {
getStream: GetStream
getActivity: GetActivity
}): CreateActivitySummary =>
async ({
userId,
streamIds,
start,
end
}: {
userId: string
streamIds: string[]
start: Date
end: Date
}) => {
const streamActivities = (
await Promise.all(
streamIds.map(async (streamId) => {
return {
stream: (await getStream({ streamId, userId })) ?? null,
activity: await getActivity(streamId, start, end, null) //userId is null for now, to not filter out any activity
}
})
)
).filter((sa) => sa.activity.length)
const user = await getUser(userId)
if (!user) return null
return {
user,
streamActivities
}
}
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
}
})
)
)
}