| 94 | } |
| 95 | |
| 96 | async function persistAdImpressions(params: { |
| 97 | ads: NormalizedAd[] |
| 98 | providerId: AdProviderId |
| 99 | userId: string |
| 100 | logger: Logger |
| 101 | }) { |
| 102 | const { ads, providerId, userId, logger } = params |
| 103 | |
| 104 | try { |
| 105 | await Promise.all( |
| 106 | ads.map((ad) => |
| 107 | db |
| 108 | .insert(schema.adImpression) |
| 109 | .values({ |
| 110 | user_id: userId, |
| 111 | provider: providerId, |
| 112 | ad_text: ad.adText, |
| 113 | title: ad.title, |
| 114 | cta: ad.cta, |
| 115 | url: ad.url, |
| 116 | favicon: ad.favicon, |
| 117 | click_url: ad.clickUrl, |
| 118 | imp_url: ad.impUrl, |
| 119 | extra_pixels: ad.extraPixels ?? null, |
| 120 | payout: ad.payout != null ? String(ad.payout) : null, |
| 121 | credits_granted: 0, |
| 122 | }) |
| 123 | .onConflictDoNothing(), |
| 124 | ), |
| 125 | ) |
| 126 | } catch (dbError) { |
| 127 | logger.warn( |
| 128 | { |
| 129 | userId, |
| 130 | provider: providerId, |
| 131 | adCount: ads.length, |
| 132 | error: |
| 133 | dbError instanceof Error |
| 134 | ? { name: dbError.name, message: dbError.message } |
| 135 | : dbError, |
| 136 | }, |
| 137 | '[ads] Failed to persist ad_impression rows, serving anyway', |
| 138 | ) |
| 139 | } |
| 140 | } |
| 141 | |
| 142 | function toClientAd(ad: NormalizedAd) { |
| 143 | const { payout: _p, extraPixels: _e, ...rest } = ad |