11import { status } from '@grpc/grpc-js' ;
2- import { Inject , Injectable , OnModuleInit } from '@nestjs/common' ;
2+ import { Inject , Injectable , Logger , OnModuleInit } from '@nestjs/common' ;
33import { ClientGrpc , RpcException } from '@nestjs/microservices' ;
44import { FileBucketProto , FileProviderProto } from 'juno-proto' ;
55import { lastValueFrom } from 'rxjs' ;
@@ -8,6 +8,7 @@ import { S3BucketHandler } from './s3_handler';
88
99@Injectable ( )
1010export class FileBucketService implements OnModuleInit {
11+ private readonly logger = new Logger ( FileBucketService . name ) ;
1112 private fileBucketDBService : FileBucketProto . BucketDbServiceClient ;
1213 private fileProviderDBService : FileProviderProto . FileProviderDbServiceClient ;
1314
@@ -134,4 +135,73 @@ export class FileBucketService implements OnModuleInit {
134135 } ) ;
135136 }
136137 }
138+
139+ async getAllFiles (
140+ request : FileBucketProto . GetAllFilesRequest ,
141+ ) : Promise < FileBucketProto . GetAllFilesResponse > {
142+ try {
143+ const buckets = await lastValueFrom (
144+ this . fileBucketDBService . getBucketsByConfigIdAndEnv ( {
145+ configId : request . configId ,
146+ configEnv : request . configEnv ,
147+ } ) ,
148+ ) ;
149+
150+ const results = await Promise . all (
151+ ( buckets . buckets ?? [ ] ) . map ( async ( bucket ) => {
152+ try {
153+ const provider = await this . getProvider ( bucket . fileProviderName ) ;
154+ const bucketRequest : FileBucketProto . GetBucketRequest = {
155+ name : bucket . name ,
156+ configId : bucket . configId ,
157+ configEnv : bucket . configEnv ,
158+ } ;
159+
160+ let fileList : string [ ] ;
161+ switch ( provider . providerType ) {
162+ case FileProviderProto . ProviderType . S3 : {
163+ const handler = new S3BucketHandler ( provider ) ;
164+ fileList = await handler . listFiles ( bucketRequest ) ;
165+ break ;
166+ }
167+ case FileProviderProto . ProviderType . AZURE : {
168+ const handler = new AzureBucketHandler ( provider ) ;
169+ fileList = await handler . listFiles ( bucketRequest ) ;
170+ break ;
171+ }
172+ default :
173+ throw new RpcException ( {
174+ code : status . FAILED_PRECONDITION ,
175+ message : `Unsupported provider type: ${ provider . providerType } ` ,
176+ } ) ;
177+ }
178+
179+ return {
180+ bucketName : bucket . name ,
181+ files : fileList ,
182+ } ;
183+ } catch ( error ) {
184+ this . logger . error (
185+ `Failed to list files for bucket "${ bucket . name } ": ${ error ?. message } ` ,
186+ ) ;
187+ return null ;
188+ }
189+ } ) ,
190+ ) ;
191+
192+ const files = results . filter (
193+ ( result ) : result is FileBucketProto . Files => result !== null ,
194+ ) ;
195+
196+ return { files } ;
197+ } catch ( error ) {
198+ if ( error instanceof RpcException ) {
199+ throw error ;
200+ }
201+ throw new RpcException ( {
202+ code : status . FAILED_PRECONDITION ,
203+ message : `Failed to get all files: ${ error . message } ` ,
204+ } ) ;
205+ }
206+ }
137207}
0 commit comments