Skip to content

Commit cc39864

Browse files
committed
feat: add getFileUploadUrl method
1 parent 99d7e19 commit cc39864

File tree

1 file changed

+43
-34
lines changed

1 file changed

+43
-34
lines changed

index.ts

Lines changed: 43 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)