feishin/src/renderer/features/playlists/utils.ts

130 lines
3.7 KiB
TypeScript
Raw Normal View History

2023-01-04 15:54:25 -08:00
import { nanoid } from 'nanoid/non-secure';
2025-05-20 19:23:36 -07:00
import { NDSongQueryFields } from '/@/shared/api/navidrome.types';
import { QueryBuilderGroup } from '/@/shared/types/types';
2023-01-04 15:54:25 -08:00
export const parseQueryBuilderChildren = (groups: QueryBuilderGroup[], data: any[]) => {
2023-07-01 19:10:05 -07:00
if (groups.length === 0) {
return data;
}
2023-01-04 15:54:25 -08:00
2023-07-01 19:10:05 -07:00
const filterGroups: any[] = [];
for (const group of groups) {
const rootType = group.type;
const query: any = {
[rootType]: [],
};
for (const rule of group.rules) {
if (rule.field && rule.operator) {
const [table, field] = rule.field.split('.');
const operator = rule.operator;
const value = field !== 'releaseDate' ? rule.value : new Date(rule.value);
switch (table) {
default:
query[rootType].push({
[operator]: {
[table]: value,
},
});
break;
}
}
}
2023-01-04 15:54:25 -08:00
2023-07-01 19:10:05 -07:00
if (group.group.length > 0) {
const b = parseQueryBuilderChildren(group.group, data);
b.forEach((c) => query[rootType].push(c));
2023-01-04 15:54:25 -08:00
}
2023-07-01 19:10:05 -07:00
data.push(query);
filterGroups.push(query);
2023-01-04 15:54:25 -08:00
}
2023-07-01 19:10:05 -07:00
return filterGroups;
2023-01-04 15:54:25 -08:00
};
// Convert QueryBuilderGroup to default query
export const convertQueryGroupToNDQuery = (filter: QueryBuilderGroup) => {
2023-07-01 19:10:05 -07:00
const rootQueryType = filter.type;
const rootQuery = {
[rootQueryType]: [] as any[],
};
for (const rule of filter.rules) {
if (rule.field && rule.operator) {
const [field] = rule.field.split('.');
const operator = rule.operator;
let value = rule.value;
const booleanFields = NDSongQueryFields.filter(
(queryField) => queryField.type === 'boolean',
).map((field) => field.value);
// Convert string values to boolean
if (booleanFields.includes(field)) {
value = value === 'true';
}
switch (field) {
default:
rootQuery[rootQueryType].push({
[operator]: {
[field]: value,
},
});
break;
}
}
2023-01-04 15:54:25 -08:00
}
2023-07-01 19:10:05 -07:00
const groups = parseQueryBuilderChildren(filter.group, []);
for (const group of groups) {
rootQuery[rootQueryType].push(group);
}
2023-01-04 15:54:25 -08:00
2023-07-01 19:10:05 -07:00
return rootQuery;
2023-01-04 15:54:25 -08:00
};
// Convert default query to QueryBuilderGroup
export const convertNDQueryToQueryGroup = (query: Record<string, any>) => {
2023-07-01 19:10:05 -07:00
const rootType = Object.keys(query)[0];
const rootGroup: QueryBuilderGroup = {
group: [],
rules: [],
type: rootType as 'all' | 'any',
2023-01-04 15:54:25 -08:00
uniqueId: nanoid(),
2023-07-01 19:10:05 -07:00
};
for (const rule of query[rootType]) {
if (rule.any || rule.all) {
const group = convertNDQueryToQueryGroup(rule);
rootGroup.group.push(group);
} else {
const operator = Object.keys(rule)[0];
const field = Object.keys(rule[operator])[0];
let value = rule[operator][field];
const booleanFields = NDSongQueryFields.filter(
(queryField) => queryField.type === 'boolean',
).map((field) => field.value);
// Convert boolean values to string
if (booleanFields.includes(field)) {
value = value.toString();
}
rootGroup.rules.push({
field,
operator,
uniqueId: nanoid(),
value,
});
}
2023-01-04 15:54:25 -08:00
}
2023-07-01 19:10:05 -07:00
return rootGroup;
2023-01-04 15:54:25 -08:00
};