Files
speckle-server/packages/server/modules/viewer/graph/dataloaders/index.ts
T
Kristaps Fabians Geikins a6287fc06d feat(fe2 & server): saved views foundation (list & view) + bits n bobs (#5163)
* init db migration

* WIP store view

* create service call

* WIP insertion

* insert sort of works

* moving code arounmd

* creation tests

* avoid duplicate entries

* fixes from main

* basic group retrieval works

* group filtering works

* WIP view listing

* filter by acl

* fixes + WIP single group retrieval

* wip pivot

* more pivot query fixes

* tests fixed after pivot

* views list tests

* fixing test command

* business plan only checks

* more tests for coverage

* .dts import fix

* cli fix

* anutha one

* auth policy tests for business plan access

* WIP saved views panel base

* BE listing adjustments

* WIP group rendering

* group render done

* WIP post create cache updates

* listing fine?

* my vs theirs

* auto open

* minor fixes

* click load omg

* nicely loading views

* type fix

* less spammy loading

* another type fix:

* more lint fix

* test fix

* codecov disable

* moar coverage

* fix sidebar flashin

* more test coverage

* more test cvoverage

* minor adfjustments

* adj

* saved view wipe fixes

* CSR viewer

* more improvements

* extra feature flag checks

* lint fix

* feature flags fix

* more test fixes
2025-08-05 11:52:50 +03:00

62 lines
1.8 KiB
TypeScript

import { defineRequestDataloaders } from '@/modules/shared/helpers/graphqlHelper'
import type {
SavedView,
SavedViewGroup
} from '@/modules/viewer/domain/types/savedViews'
import {
getSavedViewGroupsFactory,
getSavedViewsFactory
} from '@/modules/viewer/repositories/savedViews'
import type { Nullable } from '@speckle/shared'
declare module '@/modules/core/loaders' {
interface ModularizedDataLoaders extends ReturnType<typeof dataLoadersDefinition> {}
}
const dataLoadersDefinition = defineRequestDataloaders(
({ createLoader, deps: { db } }) => {
const getSavedViewGroups = getSavedViewGroupsFactory({ db })
const getSavedViews = getSavedViewsFactory({ db })
return {
savedViews: {
/**
* Get a saved view group by ID. Can also handle unpersisted ungrouped groups, just make sure
* you use their encoded IDs.
*/
getSavedViewGroup: createLoader<
{ groupId: string; projectId: string },
Nullable<SavedViewGroup>,
string
>(
async (ids) => {
const groups = await getSavedViewGroups({ groupIds: ids.slice() })
return ids.map(({ groupId }) => groups[groupId] || null)
},
{
cacheKeyFn: ({ groupId, projectId }) => `${groupId}-${projectId}`
}
),
/**
* Get saved views by their IDs
*/
getSavedViews: createLoader<
{ viewId: string; projectId: string },
Nullable<SavedView>,
string
>(
async (ids) => {
const views = await getSavedViews({ viewIds: ids.slice() })
return ids.map(({ viewId }) => views[viewId] || null)
},
{
cacheKeyFn: ({ viewId, projectId }) => `${viewId}-${projectId}`
}
)
}
}
}
)
export default dataLoadersDefinition