« get me outta code hell

data: Artwork.referencedArtworks - hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
path: root/src/data
diff options
context:
space:
mode:
author(quasar) nebula <qznebula@protonmail.com>2025-04-06 17:57:07 -0300
committer(quasar) nebula <qznebula@protonmail.com>2025-04-10 16:02:41 -0300
commit14551bb44ec3389ced8ce673e5b7a3057556bf3f (patch)
tree896a0d4f289b23044e6f4ca225b733d5373b365b /src/data
parenta446ecc747e7919f6dee4bc3b073e7edb6156a91 (diff)
data: Artwork.referencedArtworks
Diffstat (limited to 'src/data')
-rw-r--r--src/data/things/artwork.js79
-rw-r--r--src/data/yaml.js2
2 files changed, 76 insertions, 5 deletions
diff --git a/src/data/things/artwork.js b/src/data/things/artwork.js
index 66a3c1ae..e4714095 100644
--- a/src/data/things/artwork.js
+++ b/src/data/things/artwork.js
@@ -1,13 +1,24 @@
 import {inspect} from 'node:util';
 
 import {input} from '#composite';
+import find from '#find';
 import Thing from '#thing';
-import {isContributionList, isDate, isFileExtension, validateReferenceList}
-  from '#validators';
-import {parseContributors, parseDate} from '#yaml';
+import {parseAnnotatedReferences, parseContributors, parseDate} from '#yaml';
+
+import {
+  isContentString,
+  isContributionList,
+  isDate,
+  isFileExtension,
+  optional,
+  validateArrayItems,
+  validateProperties,
+  validateReference,
+  validateReferenceList,
+} from '#validators';
 
 import {withPropertyFromObject} from '#composite/data';
-import {contentString, directory, simpleString, soupyFind, thing}
+import {contentString, directory, simpleString, soupyFind, thing, wikiData}
   from '#composite/wiki-properties';
 
 import {
@@ -20,6 +31,7 @@ import {
 
 import {
   withRecontextualizedContributionList,
+  withResolvedAnnotatedReferenceList,
   withResolvedContribs,
   withResolvedReferenceList,
 } from '#composite/wiki-data';
@@ -157,9 +169,63 @@ export class Artwork extends Thing {
       }),
     ],
 
+    referencedArtworks: [
+      {
+        compute: (continuation) => continuation({
+          ['#find']:
+            find.mixed({
+              track: find.trackPrimaryArtwork,
+              album: find.albumPrimaryArtwork,
+            }),
+        }),
+      },
+
+      withResolvedAnnotatedReferenceList({
+        list: input.updateValue({
+          validate:
+            // TODO: It's annoying to hardcode this when it's really the
+            // same behavior as through annotatedReferenceList and through
+            // referenceListUpdateDescription, the latter of which isn't
+            // available outside of #composite/wiki-data internals.
+            validateArrayItems(
+              validateProperties({
+                reference: validateReference(['album', 'track']),
+                annotation: optional(isContentString),
+              })),
+        }),
+
+        data: 'artworkData',
+        find: '#find',
+        date: input.value(null),
+      }),
+
+      exposeDependencyOrContinue({
+        dependency: '#resolvedAnnotatedReferenceList',
+        mode: input.value('empty'),
+      }),
+
+      withPropertyFromObject({
+        object: 'thing',
+        property: input.value('referencedArtworks'),
+      }),
+
+      exposeDependencyOrContinue({
+        dependency: '#thing.referencedArtworks',
+      }),
+
+      exposeConstant({
+        value: input.value([]),
+      }),
+    ],
+
     // Update only
 
     find: soupyFind(),
+
+    // used for referencedArtworks (mixedFind)
+    artworkData: wikiData({
+      class: input.value(Artwork),
+    }),
   });
 
   static [Thing.yamlDocumentSpec] = {
@@ -181,6 +247,11 @@ export class Artwork extends Thing {
       },
 
       'Tags': {property: 'artTags'},
+
+      'Referenced Artworks': {
+        property: 'referencedArtworks',
+        transform: parseAnnotatedReferences,
+      },
     },
   };
 
diff --git a/src/data/yaml.js b/src/data/yaml.js
index 24f58f36..c875c34f 100644
--- a/src/data/yaml.js
+++ b/src/data/yaml.js
@@ -1488,7 +1488,7 @@ export function linkWikiDataArrays(wikiData, {bindFind, bindReverse}) {
 
     ['artistData', [/* find, reverse */]],
 
-    ['artworkData', [/* find */]],
+    ['artworkData', ['artworkData']],
 
     ['flashData', [
       'wikiInfo',