@@ -44,7 +44,6 @@ export class ObjectStackProtocolImplementation implements ObjectStackProtocol {
4444 websockets : false ,
4545 files : true ,
4646 analytics : false ,
47- hub : false ,
4847 ai : false ,
4948 workflow : false ,
5049 notifications : false ,
@@ -276,12 +275,84 @@ export class ObjectStackProtocolImplementation implements ObjectStackProtocol {
276275 // Batch Operations
277276 // ==========================================
278277
279- async batchData ( _request : { object : string , request : BatchUpdateRequest } ) : Promise < BatchUpdateResponse > {
280- // Map high-level batch request to DataEngine batch if available
281- // Or implement loop here.
282- // For now, let's just fail or implement basic loop to satisfying interface
283- // since full batch mapping requires careful type handling.
284- throw new Error ( 'Batch operations not yet fully implemented in protocol adapter' ) ;
278+ async batchData ( request : { object : string , request : BatchUpdateRequest } ) : Promise < BatchUpdateResponse > {
279+ const { object, request : batchReq } = request ;
280+ const { operation, records, options } = batchReq ;
281+ const results : Array < { id ?: string ; success : boolean ; error ?: string ; record ?: any } > = [ ] ;
282+ let succeeded = 0 ;
283+ let failed = 0 ;
284+
285+ for ( const record of records ) {
286+ try {
287+ switch ( operation ) {
288+ case 'create' : {
289+ const created = await this . engine . insert ( object , record . data || record ) ;
290+ results . push ( { id : created . _id || created . id , success : true , record : created } ) ;
291+ succeeded ++ ;
292+ break ;
293+ }
294+ case 'update' : {
295+ if ( ! record . id ) throw new Error ( 'Record id is required for update' ) ;
296+ const updated = await this . engine . update ( object , record . data || { } , { filter : { _id : record . id } } ) ;
297+ results . push ( { id : record . id , success : true , record : updated } ) ;
298+ succeeded ++ ;
299+ break ;
300+ }
301+ case 'upsert' : {
302+ // Try update first, then create if not found
303+ if ( record . id ) {
304+ try {
305+ const existing = await this . engine . findOne ( object , { filter : { _id : record . id } } ) ;
306+ if ( existing ) {
307+ const updated = await this . engine . update ( object , record . data || { } , { filter : { _id : record . id } } ) ;
308+ results . push ( { id : record . id , success : true , record : updated } ) ;
309+ } else {
310+ const created = await this . engine . insert ( object , { _id : record . id , ...( record . data || { } ) } ) ;
311+ results . push ( { id : created . _id || created . id , success : true , record : created } ) ;
312+ }
313+ } catch {
314+ const created = await this . engine . insert ( object , { _id : record . id , ...( record . data || { } ) } ) ;
315+ results . push ( { id : created . _id || created . id , success : true , record : created } ) ;
316+ }
317+ } else {
318+ const created = await this . engine . insert ( object , record . data || record ) ;
319+ results . push ( { id : created . _id || created . id , success : true , record : created } ) ;
320+ }
321+ succeeded ++ ;
322+ break ;
323+ }
324+ case 'delete' : {
325+ if ( ! record . id ) throw new Error ( 'Record id is required for delete' ) ;
326+ await this . engine . delete ( object , { filter : { _id : record . id } } ) ;
327+ results . push ( { id : record . id , success : true } ) ;
328+ succeeded ++ ;
329+ break ;
330+ }
331+ default :
332+ results . push ( { id : record . id , success : false , error : `Unknown operation: ${ operation } ` } ) ;
333+ failed ++ ;
334+ }
335+ } catch ( err : any ) {
336+ results . push ( { id : record . id , success : false , error : err . message } ) ;
337+ failed ++ ;
338+ if ( options ?. atomic ) {
339+ // Abort remaining operations on first failure in atomic mode
340+ break ;
341+ }
342+ if ( ! options ?. continueOnError ) {
343+ break ;
344+ }
345+ }
346+ }
347+
348+ return {
349+ success : failed === 0 ,
350+ operation,
351+ total : records . length ,
352+ succeeded,
353+ failed,
354+ results : options ?. returnRecords !== false ? results : results . map ( r => ( { id : r . id , success : r . success , error : r . error } ) ) ,
355+ } as BatchUpdateResponse ;
285356 }
286357
287358 async createManyData ( request : { object : string , records : any [ ] } ) : Promise < any > {
@@ -293,33 +364,46 @@ export class ObjectStackProtocolImplementation implements ObjectStackProtocol {
293364 } ;
294365 }
295366
296- async updateManyData ( _request : UpdateManyDataRequest ) : Promise < any > {
297- // TODO: Implement proper updateMany in DataEngine
298- throw new Error ( 'updateManyData not implemented' ) ;
367+ async updateManyData ( request : UpdateManyDataRequest ) : Promise < BatchUpdateResponse > {
368+ const { object, records, options } = request ;
369+ const results : Array < { id ?: string ; success : boolean ; error ?: string ; record ?: any } > = [ ] ;
370+ let succeeded = 0 ;
371+ let failed = 0 ;
372+
373+ for ( const record of records ) {
374+ try {
375+ const updated = await this . engine . update ( object , record . data , { filter : { _id : record . id } } ) ;
376+ results . push ( { id : record . id , success : true , record : updated } ) ;
377+ succeeded ++ ;
378+ } catch ( err : any ) {
379+ results . push ( { id : record . id , success : false , error : err . message } ) ;
380+ failed ++ ;
381+ if ( ! options ?. continueOnError ) {
382+ break ;
383+ }
384+ }
385+ }
386+
387+ return {
388+ success : failed === 0 ,
389+ operation : 'update' ,
390+ total : records . length ,
391+ succeeded,
392+ failed,
393+ results,
394+ } as BatchUpdateResponse ;
299395 }
300396
301397 async analyticsQuery ( _request : any ) : Promise < any > {
302- throw new Error ( 'analyticsQuery not implemented ' ) ;
398+ throw new Error ( 'analyticsQuery requires plugin-analytics service. Install and register a plugin that provides the "analytics" service. ' ) ;
303399 }
304400
305401 async getAnalyticsMeta ( _request : any ) : Promise < any > {
306- throw new Error ( 'getAnalyticsMeta not implemented ' ) ;
402+ throw new Error ( 'getAnalyticsMeta requires plugin-analytics service. Install and register a plugin that provides the "analytics" service. ' ) ;
307403 }
308404
309405 async triggerAutomation ( _request : any ) : Promise < any > {
310- throw new Error ( 'triggerAutomation not implemented' ) ;
311- }
312-
313- async listSpaces ( _request : any ) : Promise < any > {
314- throw new Error ( 'listSpaces not implemented' ) ;
315- }
316-
317- async createSpace ( _request : any ) : Promise < any > {
318- throw new Error ( 'createSpace not implemented' ) ;
319- }
320-
321- async installPlugin ( _request : any ) : Promise < any > {
322- throw new Error ( 'installPlugin not implemented' ) ;
406+ throw new Error ( 'triggerAutomation requires plugin-automation service. Install and register a plugin that provides the "automation" service.' ) ;
323407 }
324408
325409 async deleteManyData ( request : DeleteManyDataRequest ) : Promise < any > {
0 commit comments