@@ -32,7 +32,7 @@ import {
3232 type SchemaLog ,
3333 type SchemaPolicy ,
3434} from '../../api/src/shared/entities' ;
35- import { batch } from '../../api/src/shared/helpers' ;
35+ import { batch , batchBy } from '../../api/src/shared/helpers' ;
3636import {
3737 alert_channels ,
3838 alerts ,
@@ -1398,18 +1398,30 @@ export async function createStorage(
13981398
13991399 return result . rows . map ( transformProject ) ;
14001400 } ,
1401- async findProjectsByIds ( ids ) {
1402- const result = await pool . query < Slonik < projects > > (
1403- sql `/* findProjectsByIds */ SELECT * FROM projects WHERE id = ANY(${ sql . array ( ids , 'uuid' ) } ) AND type != 'CUSTOM'` ,
1404- ) ;
1401+ findProjectsByIds : batch < { projectIds : Array < string > } , Map < string , Project > > (
1402+ async function FindProjectByIdsBatchHandler ( args ) {
1403+ const allProjectIds = args . flatMap ( args => args . projectIds ) ;
1404+ const result = await pool . query < Slonik < projects > > (
1405+ sql `/* findProjectsByIds */ SELECT * FROM projects WHERE id = ANY(${ sql . array ( allProjectIds , 'uuid' ) } ) AND type != 'CUSTOM'` ,
1406+ ) ;
14051407
1406- const map = new Map < string , Project > ( ) ;
1407- result . rows . forEach ( row => {
1408- const project = transformProject ( row ) ;
1409- map . set ( project . id , project ) ;
1410- } ) ;
1411- return map ;
1412- } ,
1408+ const allProjectsLookupMap = new Map < string , Project > ( ) ;
1409+ result . rows . forEach ( row => {
1410+ const project = transformProject ( row ) ;
1411+ allProjectsLookupMap . set ( project . id , project ) ;
1412+ } ) ;
1413+ return args . map ( async arg => {
1414+ const map = new Map < string , Project > ( ) ;
1415+ for ( const projectId of arg . projectIds ) {
1416+ const project = allProjectsLookupMap . get ( projectId ) ;
1417+ if ( ! project ) continue ;
1418+ map . set ( projectId , project ) ;
1419+ }
1420+
1421+ return map ;
1422+ } ) ;
1423+ } ,
1424+ ) ,
14131425 async updateProjectSlug ( { slug, organizationId : organization , projectId : project } ) {
14141426 return pool . transaction ( async t => {
14151427 const projectSlugExists = await t . exists (
@@ -1701,29 +1713,50 @@ export async function createStorage(
17011713 orgId : organization ,
17021714 } ) ) ;
17031715 } ,
1704- async findTargetsByIds ( organizationId , targetIds ) {
1705- const map = new Map < string , Target > ( ) ;
1716+ findTargetsByIds : batchBy <
1717+ {
1718+ organizationId : string ;
1719+ targetIds : Array < string > ;
1720+ } ,
1721+ Map < string , Target >
1722+ > (
1723+ org => org . organizationId ,
1724+ async function FindTargetsByIdsBatchHandler ( args ) {
1725+ const resultLookupMap = new Map < string , Target > ( ) ;
17061726
1707- if ( targetIds . length === 0 ) {
1708- return map ;
1709- }
1727+ const allTargetIds = args . flatMap ( arg => arg . targetIds ) ;
17101728
1711- const results = await pool . query < unknown > ( sql `/* getTargets */
1712- SELECT
1729+ if ( allTargetIds . length === 0 ) {
1730+ return args . map ( async ( ) => resultLookupMap ) ;
1731+ }
1732+
1733+ const orgId = args [ 0 ] . organizationId ;
1734+
1735+ const results = await pool . query < unknown > ( sql `/* getTargets */
1736+ SELECT
17131737 ${ targetSQLFields }
1714- FROM
1738+ FROM
17151739 "targets"
1716- WHERE
1717- "id" = ANY(${ sql . array ( targetIds , 'uuid' ) } )
1718- ` ) ;
1740+ WHERE
1741+ "id" = ANY(${ sql . array ( allTargetIds , 'uuid' ) } )
1742+ ` ) ;
17191743
1720- for ( const row of results . rows ) {
1721- const target : Target = { ...TargetModel . parse ( row ) , orgId : organizationId } ;
1722- map . set ( target . id , target ) ;
1723- }
1744+ for ( const row of results . rows ) {
1745+ const target : Target = { ...TargetModel . parse ( row ) , orgId } ;
1746+ resultLookupMap . set ( target . id , target ) ;
1747+ }
17241748
1725- return map ;
1726- } ,
1749+ return args . map ( async arg => {
1750+ const map = new Map < string , Target > ( ) ;
1751+ for ( const targetId of arg . targetIds ) {
1752+ const target = resultLookupMap . get ( targetId ) ;
1753+ if ( ! target ) continue ;
1754+ map . set ( targetId , target ) ;
1755+ }
1756+ return map ;
1757+ } ) ;
1758+ } ,
1759+ ) ,
17271760 async getTargetIdsOfOrganization ( { organizationId : organization } ) {
17281761 const results = await pool . query < Slonik < Pick < targets , 'id' > > > (
17291762 sql `/* getTargetIdsOfOrganization */
0 commit comments