« get me outta code hell

listArtistsByGroup.js « dependencies « content « src - hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
path: root/src/content/dependencies/listArtistsByGroup.js
blob: 30884d244a0c5b39cba2b204f4687a5255e5b918 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
import {sortAlphabetically} from '#sort';
import {empty, filterMultipleArrays, stitchArrays, unique} from '#sugar';
import {getArtistNumContributions} from '#wiki-data';

export default {
  contentDependencies: ['generateListingPage', 'linkArtist', 'linkGroup'],
  extraDependencies: ['language', 'wikiData'],

  sprawl({artistData, wikiInfo}) {
    return {artistData, wikiInfo};
  },

  query(sprawl, spec) {
    const artists =
      sortAlphabetically(
        sprawl.artistData.filter(artist => !artist.isAlias));

    const groups =
      sprawl.wikiInfo.divideTrackListsByGroups;

    if (empty(groups)) {
      return {spec, artists};
    }

    const artistGroups =
      artists.map(artist =>
        unique(
          unique([
            ...artist.albumsAsAny,
            ...artist.tracksAsAny.map(track => track.album),
          ]).flatMap(album => album.groups)))

    const artistsByGroup =
      groups.map(group =>
        artists.filter((artist, index) => artistGroups[index].includes(group)));

    filterMultipleArrays(groups, artistsByGroup,
      (group, artists) => !empty(artists));

    return {spec, groups, artistsByGroup};
  },

  relations(relation, query) {
    const relations = {};

    relations.page =
      relation('generateListingPage', query.spec);

    if (query.artists) {
      relations.artistLinks =
        query.artists
          .map(artist => relation('linkArtist', artist));
    }

    if (query.artistsByGroup) {
      relations.groupLinks =
        query.groups
          .map(group => relation('linkGroup', group));

      relations.artistLinksByGroup =
        query.artistsByGroup
          .map(artists => artists
            .map(artist => relation('linkArtist', artist)));
    }

    return relations;
  },

  data(query) {
    const data = {};

    if (query.artists) {
      data.counts =
        query.artists
          .map(artist => getArtistNumContributions(artist));
    }

    if (query.artistsByGroup) {
      data.groupDirectories =
        query.groups
          .map(group => group.directory);

      data.countsByGroup =
        query.artistsByGroup
          .map(artists => artists
            .map(artist => getArtistNumContributions(artist)));
    }

    return data;
  },

  generate(data, relations, {language}) {
    return (
      (relations.artistLinksByGroup
        ? relations.page.slots({
            type: 'chunks',

            showSkipToSection: true,
            chunkIDs:
              data.groupDirectories
                .map(directory => `contributed-to-${directory}`),

            chunkTitles:
              relations.groupLinks.map(groupLink => ({
                group: groupLink,
              })),

            chunkRows:
              stitchArrays({
                artistLinks: relations.artistLinksByGroup,
                counts: data.countsByGroup,
              }).map(({artistLinks, counts}) =>
                  stitchArrays({
                    link: artistLinks,
                    count: counts,
                  }).map(({link, count}) => ({
                      artist: link,
                      contributions: language.countContributions(count, {unit: true}),
                    }))),
          })
        : relations.page.slots({
            type: 'rows',
            rows:
              stitchArrays({
                link: relations.artistLinks,
                count: data.counts,
              }).map(({link, count}) => ({
                  artist: link,
                  contributions: language.countContributions(count, {unit: true}),
                })),
          })));
  },
};