(config: { apiKey: string })
| 83 | } |
| 84 | |
| 85 | export function createGravityProvider(config: { apiKey: string }): AdProvider { |
| 86 | return { |
| 87 | id: 'gravity', |
| 88 | fetchAd: async (input: FetchAdInput): Promise<FetchAdResult> => { |
| 89 | const { |
| 90 | userId, |
| 91 | userEmail, |
| 92 | sessionId, |
| 93 | clientIp, |
| 94 | device, |
| 95 | messages = [], |
| 96 | testMode, |
| 97 | logger, |
| 98 | fetch, |
| 99 | } = input |
| 100 | |
| 101 | const filteredMessages = prepareGravityMessages(messages) |
| 102 | |
| 103 | const placementIds = |
| 104 | input.surface === 'waiting_room' |
| 105 | ? WAITING_ROOM_PLACEMENT_IDS |
| 106 | : CHOICE_PLACEMENT_IDS |
| 107 | |
| 108 | const placements = placementIds.map((id) => ({ |
| 109 | placement: 'below_response', |
| 110 | placement_id: id, |
| 111 | })) |
| 112 | |
| 113 | const deviceBody = clientIp |
| 114 | ? { |
| 115 | ip: clientIp, |
| 116 | ...(device?.os ? { os: device.os } : {}), |
| 117 | ...(device?.timezone ? { timezone: device.timezone } : {}), |
| 118 | ...(device?.locale ? { locale: device.locale } : {}), |
| 119 | } |
| 120 | : undefined |
| 121 | |
| 122 | const requestBody = { |
| 123 | messages: filteredMessages, |
| 124 | sessionId: sessionId ?? userId, |
| 125 | placements, |
| 126 | testAd: testMode, |
| 127 | relevancy: 0, |
| 128 | ...(deviceBody ? { device: deviceBody } : {}), |
| 129 | user: { |
| 130 | id: userId, |
| 131 | email: userEmail ?? undefined, |
| 132 | }, |
| 133 | } |
| 134 | |
| 135 | const response = await fetch(GRAVITY_URL, { |
| 136 | method: 'POST', |
| 137 | headers: { |
| 138 | Authorization: `Bearer ${config.apiKey}`, |
| 139 | 'Content-Type': 'application/json', |
| 140 | }, |
| 141 | body: JSON.stringify(requestBody), |
| 142 | }) |
no test coverage detected