249 lines
5.3 KiB
JavaScript
Executable File
249 lines
5.3 KiB
JavaScript
Executable File
import { graphql } from '../api';
|
|
// import { sitesFragment, releaseFields } from '../fragments';
|
|
import { releaseFields, batchFragment, campaignsFragment } from '../fragments';
|
|
import { curateEntity } from '../curate';
|
|
import getDateRange from '../get-date-range';
|
|
|
|
function initEntitiesActions(store, router) {
|
|
async function fetchEntityBySlugAndType({ _commit }, {
|
|
entitySlug,
|
|
entityType,
|
|
limit = 10,
|
|
pageNumber = 1,
|
|
range = 'latest',
|
|
}) {
|
|
const { before, after, orderBy } = getDateRange(range);
|
|
|
|
const { entity, connection, batches: [lastBatch] } = await graphql(`
|
|
query Entity(
|
|
$entitySlug: String!
|
|
$entityType: String! = "channel"
|
|
$limit: Int = 10,
|
|
$offset: Int = 0,
|
|
$after: Datetime = "1900-01-01",
|
|
$before: Datetime = "2100-01-01",
|
|
$orderBy: [ReleasesSummariesOrderBy!]
|
|
$exclude: [String!]
|
|
$hasAuth: Boolean!
|
|
$userId: Int
|
|
) {
|
|
entity: entityBySlugAndType(slug: $entitySlug, type: $entityType) {
|
|
id
|
|
name
|
|
slug
|
|
url
|
|
independent
|
|
hasLogo
|
|
tags: entitiesTags {
|
|
tag {
|
|
id
|
|
name
|
|
slug
|
|
}
|
|
}
|
|
sceneTags {
|
|
id
|
|
name
|
|
slug
|
|
}
|
|
children: childEntitiesConnection(
|
|
orderBy: [PRIORITY_DESC, NAME_ASC],
|
|
filter: {
|
|
type: {
|
|
notEqualTo: "info"
|
|
}
|
|
visible: {
|
|
equalTo: true
|
|
}
|
|
}
|
|
) {
|
|
nodes {
|
|
id
|
|
name
|
|
slug
|
|
url
|
|
type
|
|
priority
|
|
independent
|
|
hasLogo
|
|
${campaignsFragment}
|
|
children: childEntitiesConnection {
|
|
totalCount
|
|
}
|
|
}
|
|
}
|
|
${campaignsFragment}
|
|
parent {
|
|
id
|
|
name
|
|
slug
|
|
type
|
|
url
|
|
independent
|
|
hasLogo
|
|
${campaignsFragment}
|
|
}
|
|
}
|
|
connection: releasesSummariesConnection(
|
|
first: $limit
|
|
offset: $offset
|
|
orderBy: $orderBy
|
|
filter: {
|
|
not: { tags: { overlaps: $exclude } }
|
|
effectiveDate: { lessThan: $before, greaterThan: $after }
|
|
showcased: { equalTo: true }
|
|
or: [
|
|
{
|
|
channelSlug: { equalTo: $entitySlug }
|
|
channelType: { equalTo: $entityType }
|
|
}
|
|
{
|
|
networkSlug: { equalTo: $entitySlug }
|
|
networkType: { equalTo: $entityType }
|
|
}
|
|
{
|
|
parentNetworkSlug: { equalTo: $entitySlug }
|
|
parentNetworkType: { equalTo: $entityType }
|
|
}
|
|
]
|
|
}
|
|
) {
|
|
releases: nodes {
|
|
release {
|
|
${releaseFields}
|
|
}
|
|
}
|
|
totalCount
|
|
}
|
|
${batchFragment}
|
|
}
|
|
`, {
|
|
entitySlug,
|
|
entityType,
|
|
limit,
|
|
offset: Math.max(0, (pageNumber - 1)) * limit,
|
|
after,
|
|
before,
|
|
orderBy,
|
|
exclude: store.state.ui.tagFilter,
|
|
hasAuth: !!store.state.auth.user,
|
|
userId: store.state.auth.user?.id,
|
|
});
|
|
|
|
if (!entity) {
|
|
router.replace('/not-found');
|
|
return null;
|
|
}
|
|
|
|
return {
|
|
entity: curateEntity(entity, null, connection.releases.map(({ release }) => release), { lastBatch: lastBatch?.id }),
|
|
totalCount: connection.totalCount,
|
|
};
|
|
}
|
|
|
|
async function fetchEntities({ _commit }, { type, entitySlugs }) {
|
|
const { entities } = await graphql(`
|
|
query Entities(
|
|
$entitySlugs: [String!] = []
|
|
) {
|
|
entities(
|
|
orderBy: SLUG_ASC
|
|
filter: {
|
|
or: [
|
|
{
|
|
type: {
|
|
equalTo: "network"
|
|
}
|
|
childEntitiesConnection: {
|
|
some: {
|
|
type: {
|
|
equalTo: "channel"
|
|
}
|
|
independent: {
|
|
notEqualTo: true
|
|
}
|
|
}
|
|
}
|
|
}
|
|
{
|
|
independent: {
|
|
equalTo: true
|
|
}
|
|
}
|
|
{
|
|
type: {
|
|
equalTo: "channel"
|
|
}
|
|
parentExists: false
|
|
}
|
|
{
|
|
slug: {
|
|
in: $entitySlugs
|
|
}
|
|
}
|
|
],
|
|
}
|
|
) {
|
|
id
|
|
name
|
|
slug
|
|
type
|
|
url
|
|
independent
|
|
hasLogo
|
|
children: childEntitiesConnection {
|
|
totalCount
|
|
}
|
|
}
|
|
}
|
|
`, {
|
|
type,
|
|
entitySlugs,
|
|
});
|
|
|
|
return entities.map((entity) => curateEntity(entity));
|
|
}
|
|
|
|
async function searchEntities({ _commit }, { query, limit = 20 }) {
|
|
const { entities } = await graphql(`
|
|
query SearchEntities(
|
|
$query: String!
|
|
$limit: Int = 20,
|
|
) {
|
|
entities: searchEntities(
|
|
search: $query
|
|
first: $limit
|
|
) {
|
|
id
|
|
name
|
|
slug
|
|
type
|
|
url
|
|
independent
|
|
hasLogo
|
|
parent {
|
|
name
|
|
slug
|
|
type
|
|
url
|
|
hasLogo
|
|
}
|
|
}
|
|
}
|
|
`, {
|
|
query,
|
|
limit,
|
|
});
|
|
|
|
return entities.map((entity) => curateEntity(entity));
|
|
}
|
|
|
|
return {
|
|
fetchEntityBySlugAndType,
|
|
fetchEntities,
|
|
searchEntities,
|
|
};
|
|
}
|
|
|
|
export default initEntitiesActions;
|