55 * generate RESTful CRUD endpoints for your ObjectStack application.
66 */
77
8- import { RestServer } from '@objectstack/runtime' ;
9- import type { IProtocolProvider } from '@objectstack/runtime ' ;
8+ import { RestServer , RouteEntry } from '@objectstack/runtime' ;
9+ import type { ObjectStackProtocol } from '@objectstack/spec/api ' ;
1010
1111/**
1212 * Example: Mock Protocol Provider
1313 *
1414 * In a real application, this would be provided by your ObjectQL engine
1515 * or data layer implementation.
1616 */
17- class MockProtocolProvider implements IProtocolProvider {
17+ class MockProtocolProvider {
1818 private data : Map < string , any [ ] > = new Map ( ) ;
1919
2020 getDiscovery ( ) {
@@ -105,13 +105,68 @@ class MockProtocolProvider implements IProtocolProvider {
105105 return { success : true } ;
106106 }
107107
108+ async getMetaItemCached ( req : any ) {
109+ return {
110+ type : req . type ,
111+ name : req . name ,
112+ item : await this . getMetaItem ( req . type , req . name ) ,
113+ cached : false
114+ } ;
115+ }
116+
117+ async batchData ( req : any ) {
118+ const results = [ ] ;
119+ for ( const op of req . operations || [ ] ) {
120+ try {
121+ let result ;
122+ if ( op . operation === 'create' ) {
123+ result = await this . createData ( op . object , op . data ) ;
124+ } else if ( op . operation === 'update' ) {
125+ result = await this . updateData ( op . object , op . id , op . data ) ;
126+ } else if ( op . operation === 'delete' ) {
127+ result = await this . deleteData ( op . object , op . id ) ;
128+ }
129+ results . push ( { success : true , data : result } ) ;
130+ } catch ( error ) {
131+ results . push ( { success : false , error : ( error as Error ) . message } ) ;
132+ }
133+ }
134+ return { results } ;
135+ }
136+
108137 async createManyData ( object : string , records : any [ ] ) {
109138 const existing = this . data . get ( object ) || [ ] ;
110139 const newRecords = records . map ( r => ( { id : Date . now ( ) . toString ( ) , ...r } ) ) ;
111140 existing . push ( ...newRecords ) ;
112141 this . data . set ( object , existing ) ;
113142 return newRecords ;
114143 }
144+
145+ async updateManyData ( req : any ) {
146+ const results = [ ] ;
147+ for ( const id of req . ids || [ ] ) {
148+ try {
149+ const result = await this . updateData ( req . object , id , req . data ) ;
150+ results . push ( { success : true , data : result } ) ;
151+ } catch ( error ) {
152+ results . push ( { success : false , error : ( error as Error ) . message } ) ;
153+ }
154+ }
155+ return { results } ;
156+ }
157+
158+ async deleteManyData ( req : any ) {
159+ const results = [ ] ;
160+ for ( const id of req . ids || [ ] ) {
161+ try {
162+ const result = await this . deleteData ( req . object , id ) ;
163+ results . push ( { success : true , data : result } ) ;
164+ } catch ( error ) {
165+ results . push ( { success : false , error : ( error as Error ) . message } ) ;
166+ }
167+ }
168+ return { results } ;
169+ }
115170}
116171
117172/**
@@ -123,7 +178,7 @@ async function setupRestServer() {
123178 const httpServer = { } as any ; // Placeholder - use actual server in production
124179
125180 // 2. Create a protocol provider
126- const protocol = new MockProtocolProvider ( ) ;
181+ const protocol = new MockProtocolProvider ( ) as any as ObjectStackProtocol ;
127182
128183 // 3. Create REST server with configuration
129184 const restServer = new RestServer ( httpServer , protocol , {
@@ -137,6 +192,7 @@ async function setupRestServer() {
137192 } ,
138193 crud : {
139194 dataPrefix : '/data' ,
195+ objectParamStyle : 'path' as const ,
140196 operations : {
141197 create : true ,
142198 read : true ,
@@ -148,10 +204,12 @@ async function setupRestServer() {
148204 metadata : {
149205 prefix : '/meta' ,
150206 enableCache : true ,
207+ cacheTtl : 300 , // 5 minutes
151208 } ,
152209 batch : {
153210 maxBatchSize : 200 ,
154211 enableBatchEndpoint : true ,
212+ defaultAtomic : true ,
155213 operations : {
156214 createMany : true ,
157215 updateMany : true ,
@@ -167,7 +225,7 @@ async function setupRestServer() {
167225 // 5. Get route information (useful for debugging)
168226 const routes = restServer . getRoutes ( ) ;
169227 console . log ( `Registered ${ routes . length } routes:` ) ;
170- routes . forEach ( route => {
228+ routes . forEach ( ( route : RouteEntry ) => {
171229 console . log ( ` ${ route . method } ${ route . path } ` ) ;
172230 } ) ;
173231
@@ -214,7 +272,7 @@ async function exampleApiUsage() {
214272 email : 'john@example.com'
215273 } )
216274 } ) ;
217- const newUser = await createResponse . json ( ) ;
275+ const newUser = await createResponse . json ( ) as { id : string ; name : string ; email : string } ;
218276 console . log ( 'Created user:' , newUser ) ;
219277
220278 // List users
0 commit comments