Files
speckle-server/packages/server/modules/activitystream/services/summary.ts
T
2024-09-18 09:21:02 +02:00

70 lines
2.0 KiB
TypeScript

import {
getActivityFactory,
getActiveUserStreamsFactory
} from '@/modules/activitystream/repositories'
import { StreamScopeActivity } from '@/modules/activitystream/helpers/types'
import {
NotificationPublisher,
NotificationType
} from '@/modules/notifications/helpers/types'
import { StreamRecord, UserRecord } from '@/modules/core/helpers/types'
import { getUser } from '@/modules/core/repositories/users'
import { getStream } from '@/modules/core/services/streams'
import { db } from '@/db/knex'
import { GetActiveUserStreams } from '@/modules/activitystream/domain/operations'
export type StreamActivitySummary = {
stream: StreamRecord | null
activity: StreamScopeActivity[]
}
export type ActivitySummary = {
user: UserRecord
streamActivities: StreamActivitySummary[]
}
export const createActivitySummary = async (
userId: string,
streamIds: string[],
start: Date,
end: Date
): Promise<ActivitySummary | null> => {
const streamActivities = (
await Promise.all(
streamIds.map(async (streamId) => {
return {
stream: (await getStream({ streamId, userId })) ?? null,
activity: await getActivityFactory({ db })(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 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
}
})
)
)
}