MCPcopy Index your code
hub / github.com/CapSoftware/Cap / sendFirstViewEmail

Function sendFirstViewEmail

apps/web/lib/Notification.ts:410–492  ·  view source on GitHub ↗
(
	params:
		| { videoId: string; viewerName: string; isAnonymous: true }
		| { videoId: string; viewerUserId: string; isAnonymous: false },
)

Source from the content-addressed store, hash-verified

408}
409
410export async function sendFirstViewEmail(
411 params:
412 | { videoId: string; viewerName: string; isAnonymous: true }
413 | { videoId: string; viewerUserId: string; isAnonymous: false },
414) {
415 try {
416 const database = db();
417
418 const videoWithOwner = await database
419 .select({
420 firstViewEmailSentAt: videos.firstViewEmailSentAt,
421 videoName: videos.name,
422 ownerId: videos.ownerId,
423 ownerEmail: users.email,
424 preferences: users.preferences,
425 })
426 .from(videos)
427 .innerJoin(users, eq(users.id, videos.ownerId))
428 .where(eq(videos.id, Video.VideoId.make(params.videoId)))
429 .limit(1)
430 .then((rows) => {
431 const row = rows[0];
432 if (!row || row.firstViewEmailSentAt) return null;
433 return row;
434 });
435
436 if (!videoWithOwner?.ownerEmail) return;
437
438 if (!params.isAnonymous && params.viewerUserId === videoWithOwner.ownerId)
439 return;
440
441 const preferences = videoWithOwner.preferences as UserPreferences;
442 if (params.isAnonymous) {
443 if (preferences?.notifications?.pauseAnonViews) return;
444 } else {
445 if (preferences?.notifications?.pauseViews) return;
446 }
447
448 const [result] = await database
449 .update(videos)
450 .set({ firstViewEmailSentAt: new Date() })
451 .where(
452 and(
453 eq(videos.id, Video.VideoId.make(params.videoId)),
454 isNull(videos.firstViewEmailSentAt),
455 ),
456 );
457
458 if (result.affectedRows === 0) return;
459
460 let viewerName: string;
461 if (params.isAnonymous) {
462 viewerName = params.viewerName;
463 } else {
464 const [viewer] = await database
465 .select({ name: users.name, email: users.email })
466 .from(users)
467 .where(eq(users.id, User.UserId.make(params.viewerUserId)))

Callers 1

POSTFunction · 0.90

Calls 6

dbFunction · 0.90
serverEnvFunction · 0.90
sendEmailFunction · 0.90
FirstViewFunction · 0.90
notificationSettingsUrlFunction · 0.85
updateMethod · 0.80

Tested by

no test coverage detected