Skip to content

Commit

Permalink
Merge pull request #164 from poap-xyz/release/v1.9.0
Browse files Browse the repository at this point in the history
Release v1.9.0
  • Loading branch information
jm42 authored Mar 31, 2024
2 parents 5801290 + ba3d1c2 commit cf41e0c
Show file tree
Hide file tree
Showing 6 changed files with 30 additions and 131 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@poap-xyz/poap-family",
"version": "1.8.7",
"version": "1.9.0",
"author": {
"name": "POAP",
"url": "https://poap.xyz"
Expand Down
75 changes: 2 additions & 73 deletions src/loaders/api.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,37 +2,15 @@ import axios from 'axios'
import { FAMILY_API_KEY, FAMILY_API_URL } from '../models/api'
import { encodeExpiryDates, Event } from '../models/event'

async function putEventAndOwners(event, owners) {
if (!FAMILY_API_KEY) {
return
}
const response = await fetch(`${FAMILY_API_URL}/event/${event.id}`, {
method: 'PUT',
headers: {
'x-api-key': FAMILY_API_KEY,
'content-type': 'application/json',
},
body: JSON.stringify({ event, owners }),
})
if (response.status === 400) {
throw new Error(`Event ${event.id} save failed: incorrect data given`)
}
if (response.status === 503) {
throw new Error(`Event ${event.id} save failed: server cannot fetch data`)
}
if (response.status !== 200 && response.status !== 201) {
throw new Error(`Event ${event.id} save failed (status ${response.status})`)
}
}

async function getEventAndOwners(eventId, includeMetrics = true, fresh = true) {
async function getEventAndOwners(eventId, abortSignal, includeMetrics = true, fresh = true) {
if (!FAMILY_API_KEY) {
return null
}
const response = await fetch(
`${FAMILY_API_URL}/event/${eventId}?metrics=${encodeURIComponent(includeMetrics)}` +
`${fresh ? '&fresh=true' : ''}`,
{
signal: abortSignal instanceof AbortSignal ? abortSignal : undefined,
headers: {
'x-api-key': FAMILY_API_KEY,
},
Expand Down Expand Up @@ -98,29 +76,6 @@ async function getEventAndOwners(eventId, includeMetrics = true, fresh = true) {
}
}

async function patchEvents(events) {
if (!FAMILY_API_KEY) {
return
}
const response = await fetch(`${FAMILY_API_URL}/events`, {
method: 'PATCH',
headers: {
'x-api-key': FAMILY_API_KEY,
'content-type': 'application/json',
},
body: JSON.stringify(events),
})
if (response.status === 400) {
throw new Error(`Events save failed: incorrect data given`)
}
if (response.status === 503) {
throw new Error(`Events save failed: server cannot fetch data`)
}
if (response.status !== 200 && response.status !== 201) {
throw new Error(`Events save failed (status ${response.status})`)
}
}

async function putEventInCommon(eventId, inCommon) {
if (!FAMILY_API_KEY) {
return
Expand Down Expand Up @@ -331,29 +286,6 @@ async function getEventsOwners(eventIds, abortSignal, expiryDates, fresh = true)
return body
}

async function putEventOwners(eventId, owners) {
if (!FAMILY_API_KEY) {
return
}
const response = await fetch(`${FAMILY_API_URL}/event/${eventId}/owners`, {
method: 'PUT',
headers: {
'x-api-key': FAMILY_API_KEY,
'content-type': 'application/json',
},
body: JSON.stringify(owners),
})
if (response.status === 400) {
throw new Error(`Event ${eventId} save owners failed: incorrect data given`)
}
if (response.status === 503) {
throw new Error(`Event ${eventId} save owners failed: server cannot fetch data`)
}
if (response.status !== 200 && response.status !== 201) {
throw new Error(`Event ${eventId} save owners failed (status ${response.status})`)
}
}

async function getEventMetrics(eventId, abortSignal, refresh = false) {
if (!FAMILY_API_KEY) {
throw new Error(`Event ${eventId} metrics could not be fetched, configure Family API key`)
Expand Down Expand Up @@ -491,16 +423,13 @@ async function delFeedback(id, passphrase) {
}

export {
putEventAndOwners,
getEventAndOwners,
patchEvents,
putEventInCommon,
getInCommonEventsWithProgress,
getInCommonEvents,
getLastEvents,
getEvents,
getEventsOwners,
putEventOwners,
getEventMetrics,
getEventsMetrics,
auth,
Expand Down
10 changes: 2 additions & 8 deletions src/loaders/event.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { IGNORED_OWNERS } from '../models/address'
import { Event, parseEventIds } from '../models/event'
import { POAP_API_URL, POAP_API_KEY } from '../models/poap'
import { getEventAndOwners, getEventMetrics, getEvents, patchEvents, putEventAndOwners } from './api'
import { getEventAndOwners, getEventMetrics, getEvents } from './api'
import { fetchPOAPs } from './poap'

async function searchEvents(query, abortSignal, offset = 0, limit = 10) {
Expand Down Expand Up @@ -149,7 +149,7 @@ async function eventLoader({ params, request }) {
const force = new URL(request.url).searchParams.get('force')
if (!force) {
try {
const eventAndOwners = await getEventAndOwners(params.eventId, /*includeMetrics*/true, /*fresh*/true)
const eventAndOwners = await getEventAndOwners(params.eventId, /*abortSignal*/undefined, /*includeMetrics*/true, /*fresh*/true)
if (eventAndOwners) {
return {
event: eventAndOwners.event,
Expand Down Expand Up @@ -183,9 +183,6 @@ async function eventLoader({ params, request }) {
const owners = tokens.map((token) => token.owner.id)
const uniqueOwners = owners.filter((value, index, all) => all.indexOf(value) === index)
const filteredOwners = uniqueOwners.filter((owner) => !IGNORED_OWNERS.includes(owner))
putEventAndOwners(event, filteredOwners).catch((err) => {
console.error(err)
})
return {
event,
owners: filteredOwners,
Expand Down Expand Up @@ -307,9 +304,6 @@ async function eventsLoader({ params, request }) {
})
}
}
patchEvents(Object.values(events)).catch((err) => {
console.error(err)
})
return events
}

Expand Down
17 changes: 7 additions & 10 deletions src/models/event.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,6 @@ function Event(event) {
}
}

function filterCacheEventsByInCommonEventIds(events, inCommonEventIds) {
return Object.fromEntries(
Object.entries(events).filter(
([eventId, inCommonEvent]) => inCommonEventIds.indexOf(String(inCommonEvent.id)) !== -1
)
)
}

function parseEventIds(rawIds) {
let eventIds = (rawIds ?? '').split(',')
.filter((value, index, all) => all.indexOf(value) === index)
Expand Down Expand Up @@ -57,16 +49,21 @@ function encodeExpiryDates(expiryDates) {
}
return Object.entries(expiryDates)
.map(
([eventId, expiryDate]) => `expiry[${encodeURIComponent(eventId)}]=${encodeURIComponent(Math.trunc(expiryDate.getTime() / 1000))}`
([eventId, expiryDate]) => {
if (!(expiryDate instanceof Date) || isNaN(expiryDate.getTime())) {
return null
}
return `expiry[${encodeURIComponent(eventId)}]=${encodeURIComponent(Math.trunc(expiryDate.getTime() / 1000))}`
}
)
.filter((param) => param != null)
.join('&')
}

const SEARCH_LIMIT = 10

export {
Event,
filterCacheEventsByInCommonEventIds,
parseEventIds,
joinEventIds,
parseExpiryDates,
Expand Down
11 changes: 2 additions & 9 deletions src/pages/Event.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@ import { HTMLContext } from '../stores/html'
import { SettingsContext } from '../stores/cache'
import { ReverseEnsContext } from '../stores/ethereum'
import { scanAddress } from '../loaders/poap'
import { getInCommonEventsWithProgress, patchEvents, putEventInCommon } from '../loaders/api'
import { getInCommonEventsWithProgress, putEventInCommon } from '../loaders/api'
import { findEventsCollections } from '../loaders/collection'
import { filterCacheEventsByInCommonEventIds, parseEventIds } from '../models/event'
import { parseEventIds } from '../models/event'
import { filterAndSortInCommon } from '../models/in-common'
import { POAP_MOMENTS_URL } from '../models/poap'
import Timestamp from '../components/Timestamp'
Expand Down Expand Up @@ -115,15 +115,8 @@ function Event() {
)
const inCommonProcessedEventIds = Object.keys(inCommonProcessed)
if (inCommonProcessedEventIds.length > 0) {
const eventsProcessed = filterCacheEventsByInCommonEventIds(
events,
inCommonProcessedEventIds
)
setCaching(true)
setCachingError(null)
patchEvents(Object.values(eventsProcessed)).catch((err) => {
console.error(err)
})
putEventInCommon(event.id, inCommonProcessed).then(
() => {
setCaching(false)
Expand Down
46 changes: 16 additions & 30 deletions src/pages/Events.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,12 @@ import { formatStat } from '../utils/number'
import { SettingsContext } from '../stores/cache'
import { HTMLContext } from '../stores/html'
import { ReverseEnsContext } from '../stores/ethereum'
import { getEventMetrics, getEventsMetrics, getEventsOwners, getInCommonEventsWithProgress, patchEvents, putEventInCommon, putEventOwners } from '../loaders/api'
import { getEventAndOwners, getEventMetrics, getEventsMetrics, getEventsOwners, getInCommonEventsWithProgress, putEventInCommon } from '../loaders/api'
import { fetchPOAPs, scanAddress } from '../loaders/poap'
import { findEventsCollections } from '../loaders/collection'
import { IGNORED_OWNERS } from '../models/address'
import { filterAndSortInCommon, mergeEventsInCommon } from '../models/in-common'
import { filterCacheEventsByInCommonEventIds, parseEventIds, parseExpiryDates } from '../models/event'
import { parseEventIds, parseExpiryDates } from '../models/event'
import Timestamp from '../components/Timestamp'
import Card from '../components/Card'
import EventButtons from '../components/EventButtons'
Expand Down Expand Up @@ -114,26 +114,21 @@ function Events() {
})
}

const loadOwners = useCallback(
const loadCahedOwnersAndMetrics = useCallback(
(eventId, abortSignal) => {
if (eventId in owners) {
return Promise.resolve()
}
removeErrors(eventId)
setLoading((alsoLoading) => ({ ...alsoLoading, [eventId]: LOADING_OWNERS }))
return fetchPOAPs(eventId, abortSignal).then(
(eventOwnerTokens) => {
return getEventAndOwners(eventId, abortSignal, /*includeMetrics*/true, /*fresh*/true).then(
(eventAndOwners) => {
removeLoading(eventId)
if (eventOwnerTokens) {
const newOwners = [...new Set(eventOwnerTokens.map((token) => token.owner.id))]
const newOwnersFilters = newOwners.filter((owner) => !IGNORED_OWNERS.includes(owner))
setOwners((prevOwners) => ({ ...prevOwners, [eventId]: newOwnersFilters }))
putEventOwners(eventId, newOwnersFilters).catch((err) => {
console.error(err)
})
return Promise.resolve()
setOwners((prevOwners) => ({ ...prevOwners, [eventId]: eventAndOwners.owners }))
if (eventAndOwners.metrics) {
setMetrics((oldReservations) => ({ ...oldReservations, [eventId]: eventAndOwners.metrics }))
}
return Promise.reject(new Error(`Tokens for drop '${eventId}' missing`))
return Promise.resolve()
},
(err) => {
removeLoading(eventId)
Expand Down Expand Up @@ -165,10 +160,8 @@ function Events() {
const eventOwnerTokens = eventOwnerTokensResult.value
if (Array.isArray(eventOwnerTokens)) {
const newOwners = [...new Set(eventOwnerTokens.map((token) => token.owner.id))]
setOwners((prevOwners) => ({ ...prevOwners, [eventId]: newOwners }))
putEventOwners(eventId, newOwners).catch((err) => {
console.error(err)
})
const newOwnersFilters = newOwners.filter((owner) => !IGNORED_OWNERS.includes(owner))
setOwners((prevOwners) => ({ ...prevOwners, [eventId]: newOwnersFilters }))
} else {
return Promise.reject(new Error(`Tokens for drop '${eventId}' missing`))
}
Expand Down Expand Up @@ -339,7 +332,7 @@ function Events() {
const controller = new AbortController()
const expiryDates = parseExpiryDates(events)
Promise.all([
getEventsOwners(eventIds, controller.signal, expiryDates, /*fresh*/true),
getEventsOwners(eventIds, controller.signal, expiryDates, /*fresh*/false),
getEventsMetrics(eventIds, controller.signal),
]).then(
([newOwners, eventsMetrics]) => {
Expand Down Expand Up @@ -384,8 +377,8 @@ function Events() {
for (const eventId of eventIds) {
const controller = new AbortController()
promise = promise.then(
() => force ? loadOwnersAndMetrics(eventId, controller.signal) : loadOwners(eventId, controller.signal),
() => force ? loadOwnersAndMetrics(eventId, controller.signal) : loadOwners(eventId, controller.signal)
() => force ? loadOwnersAndMetrics(eventId, controller.signal) : loadCahedOwnersAndMetrics(eventId, controller.signal),
() => force ? loadOwnersAndMetrics(eventId, controller.signal) : loadCahedOwnersAndMetrics(eventId, controller.signal)
)
requests.push(controller)
}
Expand All @@ -398,7 +391,7 @@ function Events() {
}
}
},
[events, status, loadOwners, loadOwnersAndMetrics, resolveEnsNames, searchParams]
[events, status, loadCahedOwnersAndMetrics, loadOwnersAndMetrics, resolveEnsNames, searchParams]
)

useEffect(
Expand Down Expand Up @@ -526,15 +519,8 @@ function Events() {
)
const inCommonProcessedEventIds = Object.keys(inCommonProcessed)
if (inCommonProcessedEventIds.length > 0) {
const eventsProcessed = filterCacheEventsByInCommonEventIds(
eventData[eventId].events,
inCommonProcessedEventIds
)
removeErrors(eventId)
setLoading((alsoLoading) => ({ ...alsoLoading, [eventId]: LOADING_CACHING }))
patchEvents(Object.values(eventsProcessed)).catch((err) => {
console.error(err)
})
putEventInCommon(eventId, inCommonProcessed).then(
() => {
setEventData((prevEventData) => ({
Expand Down Expand Up @@ -596,7 +582,7 @@ function Events() {

const retryLoadOwners = (eventId) => {
removeErrors(eventId)
loadOwners(eventId)
loadCahedOwnersAndMetrics(eventId)
}

const retryEventAddress = (eventId, address) => {
Expand Down

0 comments on commit cf41e0c

Please sign in to comment.