@@ -23,6 +23,8 @@ export default class UploadPlugin extends AdminForthPlugin {
2323
2424 getFileDownloadUrl : ( ( path : string ) => Promise < string > ) ;
2525
26+ getFileUploadUrl : ( originalFilename , contentType , size , originalExtension , recordPk ) => Promise < { uploadUrl : string , tagline ?: string , filePath ?: string , uploadExtraParams ?: Record < string , string > , previewUrl ?: string , error ?: string } | { error : string } > ;
27+
2628 constructor ( options : PluginOptions ) {
2729 super ( options , import . meta. url ) ;
2830 this . options = options ;
@@ -36,6 +38,46 @@ export default class UploadPlugin extends AdminForthPlugin {
3638 }
3739 return this . options . storageAdapter . getDownloadUrl ( path , expiresInSeconds ) ;
3840 }
41+
42+ this . getFileUploadUrl = async ( originalFilename , contentType , size , originalExtension , recordPk ) : Promise < { uploadUrl : string , tagline ?: string , filePath ?: string , uploadExtraParams ?: Record < string , string > , previewUrl ?: string , error ?: string } | { error : string } > => {
43+
44+ if ( this . options . allowedFileExtensions && ! this . options . allowedFileExtensions . includes ( originalExtension . toLowerCase ( ) ) ) {
45+ return {
46+ error : `File extension "${ originalExtension } " is not allowed, allowed extensions are: ${ this . options . allowedFileExtensions . join ( ', ' ) } `
47+ } ;
48+ }
49+
50+ let record = undefined ;
51+ if ( recordPk ) {
52+ // get record by recordPk
53+ const pkName = this . resourceConfig . columns . find ( ( column : any ) => column . primaryKey ) ?. name ;
54+ record = await this . adminforth . resource ( this . resourceConfig . resourceId ) . get (
55+ [ Filters . EQ ( pkName , recordPk ) ]
56+ )
57+ }
58+
59+ const filePath : string = this . options . filePath ( { originalFilename, originalExtension, contentType, record } ) ;
60+ if ( filePath . startsWith ( '/' ) ) {
61+ throw new Error ( 's3Path should not start with /, please adjust s3path function to not return / at the start of the path' ) ;
62+ }
63+ const { uploadUrl, uploadExtraParams } = await this . options . storageAdapter . getUploadSignedUrl ( filePath , contentType , 1800 ) ;
64+ let previewUrl ;
65+ if ( this . options . preview ?. previewUrl ) {
66+ previewUrl = this . options . preview . previewUrl ( { filePath } ) ;
67+ } else {
68+ previewUrl = await this . options . storageAdapter . getDownloadUrl ( filePath , 1800 ) ;
69+ }
70+ const tagline = `${ ADMINFORTH_NOT_YET_USED_TAG } =true` ;
71+
72+ return {
73+ uploadUrl,
74+ tagline,
75+ filePath,
76+ uploadExtraParams,
77+ previewUrl,
78+ } ;
79+ } ;
80+
3981 if ( this . options . generation ?. rateLimit ?. limit ) {
4082 this . rateLimiter = new RateLimiter ( this . options . generation . rateLimit ?. limit )
4183 }
@@ -369,41 +411,8 @@ export default class UploadPlugin extends AdminForthPlugin {
369411 handler : async ( { body } ) => {
370412 const { originalFilename, contentType, size, originalExtension, recordPk } = body ;
371413
372- if ( this . options . allowedFileExtensions && ! this . options . allowedFileExtensions . includes ( originalExtension . toLowerCase ( ) ) ) {
373- return {
374- error : `File extension "${ originalExtension } " is not allowed, allowed extensions are: ${ this . options . allowedFileExtensions . join ( ', ' ) } `
375- } ;
376- }
377-
378- let record = undefined ;
379- if ( recordPk ) {
380- // get record by recordPk
381- const pkName = this . resourceConfig . columns . find ( ( column : any ) => column . primaryKey ) ?. name ;
382- record = await this . adminforth . resource ( this . resourceConfig . resourceId ) . get (
383- [ Filters . EQ ( pkName , recordPk ) ]
384- )
385- }
386-
387- const filePath : string = this . options . filePath ( { originalFilename, originalExtension, contentType, record } ) ;
388- if ( filePath . startsWith ( '/' ) ) {
389- throw new Error ( 's3Path should not start with /, please adjust s3path function to not return / at the start of the path' ) ;
390- }
391- const { uploadUrl, uploadExtraParams } = await this . options . storageAdapter . getUploadSignedUrl ( filePath , contentType , 1800 ) ;
392- let previewUrl ;
393- if ( this . options . preview ?. previewUrl ) {
394- previewUrl = this . options . preview . previewUrl ( { filePath } ) ;
395- } else {
396- previewUrl = await this . options . storageAdapter . getDownloadUrl ( filePath , 1800 ) ;
397- }
398- const tagline = `${ ADMINFORTH_NOT_YET_USED_TAG } =true` ;
414+ return this . getFileUploadUrl ( originalFilename , contentType , size , originalExtension , recordPk ) ;
399415
400- return {
401- uploadUrl,
402- tagline,
403- filePath,
404- uploadExtraParams,
405- previewUrl,
406- } ;
407416 }
408417 } ) ;
409418
0 commit comments