Skip to content
Merged
Show file tree
Hide file tree
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
36 changes: 9 additions & 27 deletions packages/common/src/adapters/accessConditionsFromSDK.ts
Original file line number Diff line number Diff line change
@@ -1,46 +1,28 @@
import type { AccessGate, full } from '@audius/sdk'
import type { full } from '@audius/sdk'
import {
instanceOfExtendedPurchaseGate,
instanceOfFollowGate,
instanceOfTokenGate
} from '@audius/sdk'
instanceOfPurchaseGate,
instanceOfTokenGate,
instanceOfNftGate
} from '@audius/sdk/src/sdk/api/generated/full'

import { AccessConditions } from '~/models'

/** Accepts default API AccessGate or full API AccessGate (e.g. from playlists). */
export const accessConditionsFromSDK = (
input: AccessGate | full.AccessGate
input: full.AccessGate
): AccessConditions | null => {
if (instanceOfFollowGate(input)) {
return { follow_user_id: input.followUserId }
} else if (instanceOfExtendedPurchaseGate(input)) {
const purchase = input.usdcPurchase
const splits = Array.isArray(purchase.splits)
? purchase.splits.map((s) => ({
user_id: s.userId,
percentage: s.percentage,
payout_wallet: s.payoutWallet,
amount: s.amount,
...(s.ethWallet != null && { eth_wallet: s.ethWallet })
}))
: []
const albumTrackPrice = (purchase as { albumTrackPrice?: number })
.albumTrackPrice
return {
usdc_purchase: {
price: purchase.price,
...(albumTrackPrice != null && { albumTrackPrice }),
splits
}
}
} else if (instanceOfPurchaseGate(input)) {
return { usdc_purchase: input.usdcPurchase }
} else if (instanceOfTokenGate(input)) {
return {
token_gate: {
token_mint: input.tokenGate.tokenMint,
token_amount: input.tokenGate.tokenAmount
}
}
} else if ('nftCollection' in input && input.nftCollection != null) {
} else if (instanceOfNftGate(input)) {
return null
} else {
throw new Error(`Unsupported access gate type: ${JSON.stringify(input)}`)
Expand Down
42 changes: 5 additions & 37 deletions packages/common/src/adapters/accessConditionsToSDK.ts
Original file line number Diff line number Diff line change
@@ -1,46 +1,12 @@
import type { CreateAlbumMetadata, TrackMetadata } from '@audius/sdk'
import type { TrackMetadata } from '@audius/sdk'

import {
AccessConditions,
isContentFollowGated,
isContentTokenGated,
isContentUSDCPurchaseGated,
type PaymentSplit,
type USDCPurchaseConditions
isContentUSDCPurchaseGated
} from '~/models'

/** Maps common USDC conditions to SDK format. Use for albums (stream conditions are USDC-only). */
export const usdcPurchaseConditionsToSDK = (
input: USDCPurchaseConditions
): NonNullable<CreateAlbumMetadata['streamConditions']> => {
const splits = input.usdc_purchase.splits ?? []
return {
usdcPurchase: {
price: input.usdc_purchase.price,
...(input.usdc_purchase.albumTrackPrice != null && {
albumTrackPrice: input.usdc_purchase.albumTrackPrice
}),
splits: splits.map(
(
s: PaymentSplit & {
userId?: number
payoutWallet?: string
ethWallet?: string
}
) => ({
userId: s.user_id ?? s.userId,
percentage: s.percentage,
payoutWallet: s.payout_wallet ?? s.payoutWallet ?? '',
amount: s.amount,
...((s.eth_wallet ?? s.ethWallet) != null && {
ethWallet: s.eth_wallet ?? s.ethWallet
})
})
)
}
}
}

export const accessConditionsToSDK = (
input: AccessConditions
): TrackMetadata['downloadConditions'] => {
Expand All @@ -49,7 +15,9 @@ export const accessConditionsToSDK = (
followUserId: input.follow_user_id
}
} else if (isContentUSDCPurchaseGated(input)) {
return usdcPurchaseConditionsToSDK(input)
return {
usdcPurchase: input.usdc_purchase
}
} else if (isContentTokenGated(input)) {
return {
tokenGate: {
Expand Down
73 changes: 29 additions & 44 deletions packages/common/src/adapters/collection.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,11 @@
import {
type CreateAlbumRequestBody,
type CreatePlaylistRequestBody,
CreateAlbumMetadata,
CreatePlaylistMetadata,
full,
Id,
OptionalHashId,
type Playlist,
type PlaylistAddedTimestamp,
UpdateAlbumRequest,
type UpdateAlbumRequestBody,
type UpdatePlaylistRequestBody
UpdatePlaylistRequest
} from '@audius/sdk'
import dayjs from 'dayjs'
import { omit } from 'lodash'
Expand All @@ -21,11 +18,10 @@ import {
UserCollectionMetadata,
Variant
} from '~/models/Collection'
import { Copyright, isContentUSDCPurchaseGated } from '~/models/Track'
import { Copyright } from '~/models/Track'
import type { AlbumValues, PlaylistValues } from '~/schemas'

import { accessConditionsFromSDK } from './accessConditionsFromSDK'
import { usdcPurchaseConditionsToSDK } from './accessConditionsToSDK'
import { resourceContributorFromSDK } from './attribution'
import { favoriteFromSDK } from './favorite'
import { coverArtSizesCIDsFromSDK } from './imageSize'
Expand All @@ -38,13 +34,13 @@ const addedTimestampToPlaylistTrackId = ({
timestamp,
trackId,
metadataTimestamp
}: PlaylistAddedTimestamp): PlaylistTrackId | null => {
}: full.PlaylistAddedTimestamp): PlaylistTrackId | null => {
const decoded = OptionalHashId.parse(trackId)
if (decoded) {
return {
track: decoded,
time: timestamp,
metadata_time: metadataTimestamp ?? 0
metadata_time: metadataTimestamp
}
}
return null
Expand All @@ -55,14 +51,11 @@ export const userCollectionMetadataFromSDK = (
| full.PlaylistFullWithoutTracks
| full.SearchPlaylistFull
| full.PlaylistFull
| Playlist
): UserCollectionMetadata | undefined => {
try {
const decodedPlaylistId = OptionalHashId.parse(input.id)
const decodedOwnerId = OptionalHashId.parse(
'userId' in input && input.userId != null ? input.userId : input.user.id
)
const user = userMetadataFromSDK(input.user as unknown as full.UserFull)
const decodedOwnerId = OptionalHashId.parse(input.userId ?? input.user.id)
const user = userMetadataFromSDK(input.user)
if (!decodedPlaylistId || !decodedOwnerId || !user) {
return undefined
}
Expand All @@ -81,7 +74,7 @@ export const userCollectionMetadataFromSDK = (
'150x150': input.artwork._150x150,
'480x480': input.artwork._480x480,
'1000x1000': input.artwork._1000x1000,
mirrors: (input.artwork as { mirrors?: string[] }).mirrors ?? []
mirrors: input.artwork.mirrors
}
: {},
variant: Variant.USER_GENERATED,
Expand All @@ -105,11 +98,11 @@ export const userCollectionMetadataFromSDK = (
? coverArtSizesCIDsFromSDK(input.coverArtCids)
: null,
followee_reposts: transformAndCleanList(
'followeeReposts' in input ? (input.followeeReposts ?? []) : [],
input.followeeReposts,
repostFromSDK
),
followee_saves: transformAndCleanList(
'followeeFavorites' in input ? (input.followeeFavorites ?? []) : [],
input.followeeFavorites,
favoriteFromSDK
),
playlist_contents: {
Expand All @@ -118,30 +111,21 @@ export const userCollectionMetadataFromSDK = (
addedTimestampToPlaylistTrackId
)
},
producer_copyright_line:
'producerCopyrightLine' in input && input.producerCopyrightLine
? (snakecaseKeys(input.producerCopyrightLine) as Copyright)
: null,
stream_conditions:
'streamConditions' in input && input.streamConditions
? accessConditionsFromSDK(input.streamConditions)
: null,
tracks: transformAndCleanList(
('tracks' in input ? (input.tracks ?? []) : []) as unknown as (
| full.TrackFull
| full.SearchTrackFull
)[],
userTrackMetadataFromSDK
),
producer_copyright_line: input.producerCopyrightLine
? (snakecaseKeys(input.producerCopyrightLine) as Copyright)
: null,
stream_conditions: input.streamConditions
? accessConditionsFromSDK(input.streamConditions)
: null,
tracks: transformAndCleanList(input.tracks, userTrackMetadataFromSDK),
user,

// Retypes / Renames
save_count: input.favoriteCount,

// Nullable fields
cover_art: 'coverArt' in input ? (input.coverArt ?? null) : null,
cover_art_sizes:
'coverArtSizes' in input ? (input.coverArtSizes ?? null) : null,
cover_art: input.coverArt ?? null,
cover_art_sizes: input.coverArtSizes ?? null,
description: input.description ?? null
}

Expand Down Expand Up @@ -175,7 +159,7 @@ export const accountCollectionFromSDK = (

export const playlistMetadataForCreateWithSDK = (
input: Collection | PlaylistValues
): CreatePlaylistRequestBody => {
): CreatePlaylistMetadata => {
return {
playlistName: input.playlist_name ?? '',
description: input.description ?? '',
Expand All @@ -187,7 +171,7 @@ export const playlistMetadataForCreateWithSDK = (
artists: input.artists ?? null,
copyrightLine: input.copyright_line ?? null,
producerCopyrightLine: input.producer_copyright_line ?? null,
parentalWarningType: input.parental_warning_type ?? undefined,
parentalWarningType: input.parental_warning_type ?? null,
...('cover_art_sizes' in input
? {
coverArtCid: input.cover_art_sizes ?? '',
Expand All @@ -199,7 +183,7 @@ export const playlistMetadataForCreateWithSDK = (

export const playlistMetadataForUpdateWithSDK = (
input: Collection
): UpdatePlaylistRequestBody => {
): UpdatePlaylistRequest['metadata'] => {
return {
...playlistMetadataForCreateWithSDK(input),
playlistContents: input.playlist_contents
Expand All @@ -218,12 +202,13 @@ export const playlistMetadataForUpdateWithSDK = (

export const albumMetadataForCreateWithSDK = (
input: Collection | AlbumValues
): CreateAlbumRequestBody => {
): CreateAlbumMetadata => {
return {
streamConditions:
input.stream_conditions != null &&
isContentUSDCPurchaseGated(input.stream_conditions)
? usdcPurchaseConditionsToSDK(input.stream_conditions)
input.stream_conditions && 'usdc_purchase' in input.stream_conditions
? {
usdcPurchase: input.stream_conditions.usdc_purchase
}
: null,
isStreamGated: input.is_stream_gated ?? false,
isScheduledRelease: input.is_scheduled_release ?? false,
Expand All @@ -244,7 +229,7 @@ export const albumMetadataForCreateWithSDK = (

export const albumMetadataForUpdateWithSDK = (
input: Collection
): UpdateAlbumRequestBody => {
): UpdateAlbumRequest['metadata'] => {
return {
...albumMetadataForCreateWithSDK(input),
playlistContents: input.playlist_contents
Expand Down
Loading
Loading