Skip to content

Commit

Permalink
Refactor files extract
Browse files Browse the repository at this point in the history
  • Loading branch information
ptrckvzn committed Apr 20, 2023
1 parent e7ab663 commit 64586c9
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 34 deletions.
8 changes: 4 additions & 4 deletions src/extract.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { Resource, Transformations } from '@/types'
// import { blocks } from '@/extract/blocks'
import { relatedItems } from '@/extract/related-items'
import { files } from '@/extract/files'
// import { files } from '@/extract/files'
// import { media } from '@/extract/media'

export const extract = (resource: Resource) => {
Expand All @@ -19,9 +19,9 @@ export const extract = (resource: Resource) => {
extracted.relatedItems = relatedItems(resource)
}

if (Array.isArray(resource.files)) {
extracted.files = files(resource)
}
// if (Array.isArray(resource.files)) {
// extracted.files = files(resource)
// }

return extracted
}
71 changes: 41 additions & 30 deletions src/extract/files.ts
Original file line number Diff line number Diff line change
@@ -1,42 +1,53 @@
import { ExtractedResource, Fileable, FileResource, Resource } from '@/types'
import { camelCaseKeys } from '@/utils/camel-case-keys'
import { unique } from '@/utils/unique'

export function filesByRole<Type extends Fileable>(
resource: Type,
role: string,
): FileResource[] {
const filesByUUID: Record<string, FileResource> = {}

if (Array.isArray(resource.files)) {
resource.files
.filter((fileable) => {
return fileable.meta.role === role
})
.map((fileable: FileResource) => {
filesByUUID[fileable.meta.uuid as string] = fileable
})
import {camelCaseKeys} from '@/utils/camel-case-keys'
import {DResource, DResourceRelationship} from './blocks'

interface FileDResource extends DResource {
type: 'files';
attributes: {
createdAt: string
updatedAt: string
uuid: string
filename: string
role: string
size: string
originalSrc: string
}
meta: {
role: string
uuid: string
}
}

return Object.values(filesByUUID)
interface FileDRelationship extends DResourceRelationship<FileDResource[]> {
meta: {
roles: Record<string, string[]>;
}
}

export function files(
resource: Resource | Fileable,
): ExtractedResource<FileResource> {
if (!resource.files) {
resource: DResource,
role: string | null = null
): Record<string, FileDResource[]> {
if (!resource.relationships?.files) {
return {}
}

const roles: string[] = Array.isArray(resource.files)
? (unique(resource.files, 'meta.role') as string[])
: []
const relationship = resource.relationships.files as FileDRelationship
const files: Record<string, FileDResource[]> = {}
let roles = relationship.meta.roles

const files: ExtractedResource<FileResource> = {}
if (role) {
roles = { [role]: relationship.meta.roles[role] }
}

roles.map((role) => {
files[role] = filesByRole(resource as Fileable, role)
})
for (const [key, value] of Object.entries(roles)) {
files[key] = value.map<FileDResource | null>((id) => {
if (typeof relationship.data === 'undefined' || !relationship.data) {
return null
}
return relationship.data.find((file: FileDResource) => file.id === id) as FileDResource
}).filter(n => n) as FileDResource[]
}

return camelCaseKeys(files) as ExtractedResource<FileResource>
return camelCaseKeys(files) as Record<string, FileDResource[]>
}
2 changes: 2 additions & 0 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { deserialize } from '@/deserialize'
// import { extract } from '@/extract'
import { blocks } from '@/extract/blocks'
import { media } from '@/extract/media'
import { files } from '@/extract/files'

export * from '@/types'

Expand Down Expand Up @@ -95,6 +96,7 @@ export const Twill = (options: TwillOptions) => {
helpers: {
getBlocks: blocks,
getMedia: media,
getFiles: files,
},
transform,
}
Expand Down

0 comments on commit 64586c9

Please sign in to comment.