|
1 | 1 | import { Injectable } from '@nestjs/common';
|
2 | 2 | import { inArray, node, or, Query, relation } from 'cypher-query-builder';
|
3 |
| -import { RequireAtLeastOne } from 'type-fest'; |
| 3 | +import { Except, RequireAtLeastOne } from 'type-fest'; |
4 | 4 | import {
|
5 | 5 | EnhancedResource,
|
6 | 6 | generateId,
|
@@ -47,20 +47,39 @@ export class MediaRepository extends CommonRepository {
|
47 | 47 |
|
48 | 48 | protected hydrate() {
|
49 | 49 | return (query: Query) =>
|
50 |
| - query.return<{ dto: AnyMedia }>( |
51 |
| - merge('node', { |
52 |
| - __typename: 'node.type', |
53 |
| - file: 'fv.id', |
54 |
| - dimensions: { |
55 |
| - width: 'node.width', |
56 |
| - height: 'node.height', |
57 |
| - }, |
58 |
| - }).as('dto'), |
59 |
| - ); |
| 50 | + query |
| 51 | + .subQuery('fv', (sub) => |
| 52 | + sub |
| 53 | + .comment('Find root file node') |
| 54 | + .subQuery('fv', (sub2) => |
| 55 | + sub2 |
| 56 | + .raw('MATCH p=(fv)-[:parent*]->(node:FileNode)') |
| 57 | + .return('node as root') |
| 58 | + .orderBy('length(p)', 'DESC') |
| 59 | + .raw('LIMIT 1'), |
| 60 | + ) |
| 61 | + .comment('Get resource holding root file node') |
| 62 | + .raw('MATCH (resource:BaseNode)-[rel]->(root)') |
| 63 | + .raw('WHERE not resource:FileNode') |
| 64 | + .return('[resource, type(rel)] as attachedTo') |
| 65 | + .raw('LIMIT 1'), |
| 66 | + ) |
| 67 | + .return<{ dto: AnyMedia }>( |
| 68 | + merge('node', { |
| 69 | + __typename: 'node.type', |
| 70 | + file: 'fv.id', |
| 71 | + dimensions: { |
| 72 | + width: 'node.width', |
| 73 | + height: 'node.height', |
| 74 | + }, |
| 75 | + attachedTo: 'attachedTo', |
| 76 | + }).as('dto'), |
| 77 | + ); |
60 | 78 | }
|
61 | 79 |
|
62 | 80 | async save(
|
63 |
| - input: RequireAtLeastOne<Pick<AnyMedia, 'id' | 'file'>> & Partial<AnyMedia>, |
| 81 | + input: RequireAtLeastOne<Pick<AnyMedia, 'id' | 'file'>> & |
| 82 | + Partial<Except<AnyMedia, 'attachedTo'>>, |
64 | 83 | ) {
|
65 | 84 | const res = input.__typename
|
66 | 85 | ? EnhancedResource.of(resolveMedia(input as AnyMedia))
|
|
0 commit comments