move push notification calls to their own file
This commit is contained in:
		
							parent
							
								
									f27cd2d6dd
								
							
						
					
					
						commit
						683e06bab4
					
				| @ -9,13 +9,14 @@ import { | ||||
|   DONT_LIKE_THIS_COST, COMMENT_DEPTH_LIMIT, COMMENT_TYPE_QUERY, | ||||
|   ANON_COMMENT_FEE, ANON_USER_ID, ANON_POST_FEE, ANON_ITEM_SPAM_INTERVAL, POLL_COST | ||||
| } from '../../lib/constants' | ||||
| import { msatsToSats, numWithUnits } from '../../lib/format' | ||||
| import { msatsToSats } from '../../lib/format' | ||||
| import { parse } from 'tldts' | ||||
| import uu from 'url-unshort' | ||||
| import { advSchema, amountSchema, bountySchema, commentSchema, discussionSchema, jobSchema, linkSchema, pollSchema, ssValidate } from '../../lib/validate' | ||||
| import { sendUserNotification } from '../webPush' | ||||
| import { proxyImages } from './imgproxy' | ||||
| import { defaultCommentSort } from '../../lib/item' | ||||
| import { notifyItemParents, notifyUserSubscribers, notifyZapped } from '../../lib/push-notifications' | ||||
| 
 | ||||
| export async function commentFilterClause (me, models) { | ||||
|   let clause = ` AND ("Item"."weightedVotes" - "Item"."weightedDownVotes" > -${ITEM_FILTER_THRESHOLD}` | ||||
| @ -646,25 +647,9 @@ export default { | ||||
|       if (id) { | ||||
|         return await updateItem(parent, { id, ...item }, { me, models }) | ||||
|       } else { | ||||
|         const rItem = await createItem(parent, item, { me, models, lnd, hash, hmac }) | ||||
| 
 | ||||
|         const notify = async () => { | ||||
|           const user = await models.user.findUnique({ where: { id: me?.id || ANON_USER_ID } }) | ||||
|           const parents = await models.$queryRawUnsafe( | ||||
|             'SELECT DISTINCT p."userId" FROM "Item" i JOIN "Item" p ON p.path @> i.path WHERE i.id = $1 and p."userId" <> $2', | ||||
|             Number(item.parentId), Number(user.id)) | ||||
|           Promise.allSettled( | ||||
|             parents.map(({ userId }) => sendUserNotification(userId, { | ||||
|               title: `@${user.name} replied to you`, | ||||
|               body: item.text, | ||||
|               item: rItem, | ||||
|               tag: 'REPLY' | ||||
|             })) | ||||
|           ) | ||||
|         } | ||||
|         notify().catch(e => console.error(e)) | ||||
| 
 | ||||
|         return rItem | ||||
|         item = await createItem(parent, item, { me, models, lnd, hash, hmac }) | ||||
|         notifyItemParents({ item, me, models }) | ||||
|         return item | ||||
|       } | ||||
|     }, | ||||
|     pollVote: async (parent, { id, hash, hmac }, { me, models, lnd }) => { | ||||
| @ -707,56 +692,7 @@ export default { | ||||
|         { me, models, lnd, hash, hmac, enforceFee: sats } | ||||
|       ) | ||||
| 
 | ||||
|       const notify = async () => { | ||||
|         try { | ||||
|           const updatedItem = await models.item.findUnique({ where: { id: Number(id) } }) | ||||
|           const forwards = await models.itemForward.findMany({ where: { itemId: Number(id) } }) | ||||
|           const userPromises = forwards.map(fwd => models.user.findUnique({ where: { id: fwd.userId } })) | ||||
|           const userResults = await Promise.allSettled(userPromises) | ||||
|           const mappedForwards = forwards.map((fwd, index) => ({ ...fwd, user: userResults[index].value ?? null })) | ||||
|           let forwardedSats = 0 | ||||
|           let forwardedUsers = '' | ||||
|           if (mappedForwards.length) { | ||||
|             forwardedSats = Math.floor(msatsToSats(updatedItem.msats) * mappedForwards.map(fwd => fwd.pct).reduce((sum, cur) => sum + cur) / 100) | ||||
|             forwardedUsers = mappedForwards.map(fwd => `@${fwd.user.name}`).join(', ') | ||||
|           } | ||||
|           let notificationTitle | ||||
|           if (updatedItem.title) { | ||||
|             if (forwards.length > 0) { | ||||
|               notificationTitle = `your post forwarded ${numWithUnits(forwardedSats)} to ${forwardedUsers}` | ||||
|             } else { | ||||
|               notificationTitle = `your post stacked ${numWithUnits(msatsToSats(updatedItem.msats))}` | ||||
|             } | ||||
|           } else { | ||||
|             if (forwards.length > 0) { | ||||
|               // I don't think this case is possible
 | ||||
|               notificationTitle = `your reply forwarded ${numWithUnits(forwardedSats)} to ${forwardedUsers}` | ||||
|             } else { | ||||
|               notificationTitle = `your reply stacked ${numWithUnits(msatsToSats(updatedItem.msats))}` | ||||
|             } | ||||
|           } | ||||
|           await sendUserNotification(updatedItem.userId, { | ||||
|             title: notificationTitle, | ||||
|             body: updatedItem.title ? updatedItem.title : updatedItem.text, | ||||
|             item: updatedItem, | ||||
|             tag: `TIP-${updatedItem.id}` | ||||
|           }) | ||||
| 
 | ||||
|           // send push notifications to forwarded recipients
 | ||||
|           if (mappedForwards.length) { | ||||
|             await Promise.allSettled(mappedForwards.map(forward => sendUserNotification(forward.user.id, { | ||||
|               title: `you were forwarded ${numWithUnits(msatsToSats(updatedItem.msats) * forward.pct / 100)}`, | ||||
|               body: updatedItem.title ?? updatedItem.text, | ||||
|               item: updatedItem, | ||||
|               tag: `FORWARDEDTIP-${updatedItem.id}` | ||||
|             }))) | ||||
|           } | ||||
|         } catch (err) { | ||||
|           console.error(err) | ||||
|         } | ||||
|       } | ||||
| 
 | ||||
|       notify() | ||||
|       notifyZapped({ models, id }) | ||||
| 
 | ||||
|       return { | ||||
|         vote, | ||||
| @ -1115,29 +1051,7 @@ export const createItem = async (parent, { forward, options, ...item }, { me, mo | ||||
| 
 | ||||
|   await createMentions(item, models) | ||||
| 
 | ||||
|   const notifyUserSubscribers = async () => { | ||||
|     try { | ||||
|       const isPost = !!item.title | ||||
|       const userSubs = await models.userSubscription.findMany({ | ||||
|         where: { | ||||
|           followeeId: Number(item.userId), | ||||
|           [isPost ? 'postsSubscribedAt' : 'commentsSubscribedAt']: { not: null } | ||||
|         }, | ||||
|         include: { | ||||
|           followee: true | ||||
|         } | ||||
|       }) | ||||
|       await Promise.allSettled(userSubs.map(({ followerId, followee }) => sendUserNotification(followerId, { | ||||
|         title: `@${followee.name} ${isPost ? 'created a post' : 'replied to a post'}`, | ||||
|         body: isPost ? item.title : item.text, | ||||
|         item, | ||||
|         tag: 'FOLLOW' | ||||
|       }))) | ||||
|     } catch (err) { | ||||
|       console.error(err) | ||||
|     } | ||||
|   } | ||||
|   notifyUserSubscribers() | ||||
|   notifyUserSubscribers({ models, item }) | ||||
| 
 | ||||
|   item.comments = [] | ||||
|   return item | ||||
|  | ||||
							
								
								
									
										94
									
								
								lib/push-notifications.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										94
									
								
								lib/push-notifications.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,94 @@ | ||||
| import { sendUserNotification } from '../api/webPush' | ||||
| import { ANON_USER_ID } from './constants' | ||||
| import { msatsToSats, numWithUnits } from './format' | ||||
| 
 | ||||
| export const notifyUserSubscribers = async ({ models, item }) => { | ||||
|   try { | ||||
|     const isPost = !!item.title | ||||
|     const userSubs = await models.userSubscription.findMany({ | ||||
|       where: { | ||||
|         followeeId: Number(item.userId), | ||||
|         [isPost ? 'postsSubscribedAt' : 'commentsSubscribedAt']: { not: null } | ||||
|       }, | ||||
|       include: { | ||||
|         followee: true | ||||
|       } | ||||
|     }) | ||||
|     await Promise.allSettled(userSubs.map(({ followerId, followee }) => sendUserNotification(followerId, { | ||||
|       title: `@${followee.name} ${isPost ? 'created a post' : 'replied to a post'}`, | ||||
|       body: isPost ? item.title : item.text, | ||||
|       item, | ||||
|       tag: 'FOLLOW' | ||||
|     }))) | ||||
|   } catch (err) { | ||||
|     console.error(err) | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| export const notifyItemParents = async ({ models, item, me }) => { | ||||
|   try { | ||||
|     const user = await models.user.findUnique({ where: { id: me?.id || ANON_USER_ID } }) | ||||
|     const parents = await models.$queryRawUnsafe( | ||||
|       'SELECT DISTINCT p."userId" FROM "Item" i JOIN "Item" p ON p.path @> i.path WHERE i.id = $1 and p."userId" <> $2', | ||||
|       Number(item.parentId), Number(user.id)) | ||||
|     Promise.allSettled( | ||||
|       parents.map(({ userId }) => sendUserNotification(userId, { | ||||
|         title: `@${user.name} replied to you`, | ||||
|         body: item.text, | ||||
|         item, | ||||
|         tag: 'REPLY' | ||||
|       })) | ||||
|     ) | ||||
|   } catch (err) { | ||||
|     console.error(err) | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| export const notifyZapped = async ({ models, id }) => { | ||||
|   try { | ||||
|     const updatedItem = await models.item.findUnique({ where: { id: Number(id) } }) | ||||
|     const forwards = await models.itemForward.findMany({ where: { itemId: Number(id) } }) | ||||
|     const userPromises = forwards.map(fwd => models.user.findUnique({ where: { id: fwd.userId } })) | ||||
|     const userResults = await Promise.allSettled(userPromises) | ||||
|     const mappedForwards = forwards.map((fwd, index) => ({ ...fwd, user: userResults[index].value ?? null })) | ||||
|     let forwardedSats = 0 | ||||
|     let forwardedUsers = '' | ||||
|     if (mappedForwards.length) { | ||||
|       forwardedSats = Math.floor(msatsToSats(updatedItem.msats) * mappedForwards.map(fwd => fwd.pct).reduce((sum, cur) => sum + cur) / 100) | ||||
|       forwardedUsers = mappedForwards.map(fwd => `@${fwd.user.name}`).join(', ') | ||||
|     } | ||||
|     let notificationTitle | ||||
|     if (updatedItem.title) { | ||||
|       if (forwards.length > 0) { | ||||
|         notificationTitle = `your post forwarded ${numWithUnits(forwardedSats)} to ${forwardedUsers}` | ||||
|       } else { | ||||
|         notificationTitle = `your post stacked ${numWithUnits(msatsToSats(updatedItem.msats))}` | ||||
|       } | ||||
|     } else { | ||||
|       if (forwards.length > 0) { | ||||
|         // I don't think this case is possible
 | ||||
|         notificationTitle = `your reply forwarded ${numWithUnits(forwardedSats)} to ${forwardedUsers}` | ||||
|       } else { | ||||
|         notificationTitle = `your reply stacked ${numWithUnits(msatsToSats(updatedItem.msats))}` | ||||
|       } | ||||
|     } | ||||
|     await sendUserNotification(updatedItem.userId, { | ||||
|       title: notificationTitle, | ||||
|       body: updatedItem.title ? updatedItem.title : updatedItem.text, | ||||
|       item: updatedItem, | ||||
|       tag: `TIP-${updatedItem.id}` | ||||
|     }) | ||||
| 
 | ||||
|     // send push notifications to forwarded recipients
 | ||||
|     if (mappedForwards.length) { | ||||
|       await Promise.allSettled(mappedForwards.map(forward => sendUserNotification(forward.user.id, { | ||||
|         title: `you were forwarded ${numWithUnits(msatsToSats(updatedItem.msats) * forward.pct / 100)}`, | ||||
|         body: updatedItem.title ?? updatedItem.text, | ||||
|         item: updatedItem, | ||||
|         tag: `FORWARDEDTIP-${updatedItem.id}` | ||||
|       }))) | ||||
|     } | ||||
|   } catch (err) { | ||||
|     console.error(err) | ||||
|   } | ||||
| } | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user