Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
73 changes: 60 additions & 13 deletions packages/common/src/adapters/activity.ts
Original file line number Diff line number Diff line change
@@ -1,22 +1,56 @@
import type { Activity, Playlist, Track } from '@audius/sdk'
import { ActivityItemTypeEnum } from '@audius/sdk'
import type {
Activity,
Playlist,
PlaylistWithoutTracks,
Track
} from '@audius/sdk'
import {
ActivityItemTypeEnum,
PlaylistWithoutTracksFromJSON,
TrackFromJSON
} from '@audius/sdk'

import { userCollectionMetadataFromSDK } from './collection'
import { userTrackMetadataFromSDK } from './track'

/**
* Activity.item from getRepostsByHandle can be raw API JSON (snake_case) when
* the response discriminator isn't used. Normalize to SDK shape (camelCase)
* using the SDK's FromJSON before passing to our adapters.
*/
function normalizeActivityItem(
item: object,
itemType:
| typeof ActivityItemTypeEnum.Track
| typeof ActivityItemTypeEnum.Playlist
): Track | PlaylistWithoutTracks {
const isRaw = 'user_id' in item && !('userId' in item)
if (!isRaw) {
return item as Track | PlaylistWithoutTracks
}
if (itemType === ActivityItemTypeEnum.Track) {
return TrackFromJSON(item as Parameters<typeof TrackFromJSON>[0])
}
return PlaylistWithoutTracksFromJSON(
item as Parameters<typeof PlaylistWithoutTracksFromJSON>[0]
)
}

export const activityFromSDK = (input: Activity) => {
const { timestamp, itemType: item_type, item } = input
if (item_type === ActivityItemTypeEnum.Track) {
const normalized = normalizeActivityItem(item as object, item_type)
return {
timestamp,
item_type,
item: userTrackMetadataFromSDK(item as Track)
item: userTrackMetadataFromSDK(normalized as Track)
}
} else if (item_type === ActivityItemTypeEnum.Playlist) {
const normalized = normalizeActivityItem(item as object, item_type)
return {
timestamp,
item_type,
item: userCollectionMetadataFromSDK(item as Playlist)
item: userCollectionMetadataFromSDK(normalized as Playlist)
}
}
return undefined
Expand All @@ -25,10 +59,11 @@ export const activityFromSDK = (input: Activity) => {
export const trackActivityFromSDK = (input: Activity) => {
const { timestamp, itemType: item_type, item } = input
if (item_type === ActivityItemTypeEnum.Track) {
const normalized = normalizeActivityItem(item as object, item_type)
return {
timestamp,
item_type,
item: userTrackMetadataFromSDK(item as Track)
item: userTrackMetadataFromSDK(normalized as Track)
}
}
return undefined
Expand All @@ -37,16 +72,28 @@ export const trackActivityFromSDK = (input: Activity) => {
export const repostActivityFromSDK = (input: Activity) => {
const { timestamp, itemType: item_type, item } = input
if (item_type === ActivityItemTypeEnum.Track) {
return {
timestamp,
item_type,
item: userTrackMetadataFromSDK(item as Track)
try {
const normalized = normalizeActivityItem(item as object, item_type)
return {
timestamp,
item_type,
item: userTrackMetadataFromSDK(normalized as Track)
}
} catch (error) {
console.error('repostActivityFromSDK track error', error)
return undefined
}
} else if (item_type === ActivityItemTypeEnum.Playlist) {
return {
timestamp,
item_type,
item: userCollectionMetadataFromSDK(item as Playlist)
try {
const normalized = normalizeActivityItem(item as object, item_type)
return {
timestamp,
item_type,
item: userCollectionMetadataFromSDK(normalized as Playlist)
}
} catch (error) {
console.error('repostActivityFromSDK playlist error', error)
return undefined
}
}
return undefined
Expand Down