11import { injectable } from 'inversify' ;
22import { S3 } from 'aws-sdk' ;
33import { AwsRegion } from '../enums/AwsRegion' ;
4+ import { GetObjectOutput } from 'aws-sdk/clients/s3' ;
45
56@injectable ( )
67export default class S3Service {
@@ -10,31 +11,89 @@ export default class S3Service {
1011 accessKeyId : accessKeyId ,
1112 secretAccessKey : secretAccessKey ,
1213 } ,
13- region : region . toLowerCase ( ) . replace ( / _ / g , '-' ) ,
14+ region : this . getRegionFromAwsRegion ( region ) ,
1415 } ) ;
1516 }
1617
18+ public getRegionFromAwsRegion ( region : AwsRegion ) : string {
19+ return region . toLowerCase ( ) . replace ( / _ / g, '-' ) ;
20+ }
21+
22+ public getSafeBucketName ( bucketName : string ) {
23+ return bucketName . replace ( / [ ^ a - z 0 - 9 ] + / g, '-' ) ;
24+ }
25+
1726 public async bucketExists ( s3Client : S3 , bucketName : string ) : Promise < boolean > {
1827 return new Promise ( ( resolve ) => {
1928 s3Client . headBucket (
2029 {
21- Bucket : bucketName ,
30+ Bucket : this . getSafeBucketName ( bucketName ) ,
2231 } ,
2332 ( err ) => resolve ( err === null ) ,
2433 ) ;
2534 } ) ;
2635 }
2736
37+ public async createBucket (
38+ s3Client : S3 ,
39+ bucketName : string ,
40+ region : AwsRegion ,
41+ ) : Promise < boolean > {
42+ const params = {
43+ Bucket : this . getSafeBucketName ( bucketName ) ,
44+ CreateBucketConfiguration : {
45+ LocationConstraint : this . getRegionFromAwsRegion ( region ) ,
46+ } ,
47+ } ;
48+ return new Promise ( ( resolve , reject ) => {
49+ s3Client . createBucket ( params , ( err ) => {
50+ console . log ( JSON . stringify ( params ) ) ;
51+ err === null ? resolve ( true ) : reject ( err ) ;
52+ } ) ;
53+ } ) ;
54+ }
55+
2856 public async isWriteable ( s3Client : S3 , bucketName : string ) : Promise < boolean > {
2957 return new Promise ( ( resolve ) => {
3058 s3Client . upload (
3159 {
32- Bucket : bucketName ,
60+ Bucket : this . getSafeBucketName ( bucketName ) ,
3361 Key : '/credential-check.txt' ,
3462 Body : 's8' ,
3563 } ,
3664 ( err ) => resolve ( err === null ) ,
3765 ) ;
3866 } ) ;
3967 }
68+
69+ public async get ( s3Client : S3 , bucketName : string , key : string ) : Promise < GetObjectOutput > {
70+ return new Promise ( ( resolve , reject ) => {
71+ s3Client . getObject (
72+ {
73+ Bucket : this . getSafeBucketName ( bucketName ) ,
74+ Key : key ,
75+ } ,
76+ ( err , data ) => {
77+ if ( err === null ) {
78+ resolve ( data ) ;
79+ } else {
80+ reject ( err ) ;
81+ }
82+ } ,
83+ ) ;
84+ } ) ;
85+ }
86+
87+ public async put ( s3Client : S3 , params : S3 . Types . PutObjectRequest ) : Promise < any > {
88+ params . Bucket = this . getSafeBucketName ( params . Bucket ) ;
89+ return new Promise ( ( resolve , reject ) => {
90+ s3Client . upload ( params , ( err : any ) => {
91+ if ( err === null ) {
92+ resolve ( true ) ;
93+ } else {
94+ reject ( err ) ;
95+ }
96+ } ) ;
97+ } ) ;
98+ }
4099}
0 commit comments