feat(cms): improve catalog, editorial recovery and operations
This commit is contained in:
1 parent
2fead134e6
commit
c389c3893d
122 files changed
+8137
-703
No files matched your search
@@ -0,0 +1,42 @@
|
||||
export type OperationsSource =
|
||||
| "errors"
|
||||
| "imports"
|
||||
| "tickets"
|
||||
| "publications";
|
||||
export interface OperationsItem {
|
||||
id: string;
|
||||
source: OperationsSource;
|
||||
href: string;
|
||||
count: number;
|
||||
severity: number;
|
||||
}
|
||||
export interface OperationsLoader {
|
||||
source: OperationsSource;
|
||||
allowed: boolean;
|
||||
load: () => Promise<OperationsItem[]>;
|
||||
}
|
||||
/** Authorization precedes loading; a failed source is never reported as empty. */
|
||||
export async function collectOperations(loaders: OperationsLoader[]) {
|
||||
const available = loaders.filter((loader) => loader.allowed);
|
||||
const results = await Promise.allSettled(
|
||||
available.map((loader) => loader.load()),
|
||||
);
|
||||
const unique = new Map<string, OperationsItem>();
|
||||
const unavailable: OperationsSource[] = [];
|
||||
for (const [index, result] of results.entries()) {
|
||||
if (result.status === "rejected") {
|
||||
unavailable.push(available[index].source);
|
||||
continue;
|
||||
}
|
||||
for (const item of result.value) {
|
||||
const key = `${item.source}:${item.id}`;
|
||||
if (item.count > 0 && !unique.has(key)) unique.set(key, item);
|
||||
}
|
||||
}
|
||||
return {
|
||||
items: [...unique.values()]
|
||||
.sort((a, b) => b.severity - a.severity || a.id.localeCompare(b.id))
|
||||
.slice(0, 12),
|
||||
unavailable,
|
||||
};
|
||||
}
|
||||
Reference in new issue
Block a user