feat: allow configuring attachment upload limit (#12835)
## Summary - add a configurable MAXIMUM_FILE_UPLOAD_SIZE installation setting and surface it through super admin and global config payloads - apply the configurable limit to attachment validations and shared upload helpers on dashboard and widget - introduce a reusable helper with unit tests for parsing the limit and extend attachment specs for configurability ------ [Codex Task](https://chatgpt.com/codex/tasks/task_e_6912644786b08326bc8dee9401af6d0a) --------- Co-authored-by: Sivin Varghese <64252451+iamsivin@users.noreply.github.com> Co-authored-by: iamsivin <iamsivin@gmail.com>
This commit is contained in:
@@ -3,27 +3,48 @@ import { useAlert } from 'dashboard/composables';
|
||||
import { checkFileSizeLimit } from 'shared/helpers/FileHelper';
|
||||
import { getMaxUploadSizeByChannel } from '@chatwoot/utils';
|
||||
import { DirectUpload } from 'activestorage';
|
||||
import { MAXIMUM_FILE_UPLOAD_SIZE } from 'shared/constants/messages';
|
||||
import {
|
||||
DEFAULT_MAXIMUM_FILE_UPLOAD_SIZE,
|
||||
resolveMaximumFileUploadSize,
|
||||
} from 'shared/helpers/FileHelper';
|
||||
import { INBOX_TYPES } from 'dashboard/helper/inbox';
|
||||
|
||||
export default {
|
||||
computed: {
|
||||
...mapGetters({
|
||||
accountId: 'getCurrentAccountId',
|
||||
}),
|
||||
installationLimit() {
|
||||
return resolveMaximumFileUploadSize(
|
||||
this.globalConfig.maximumFileUploadSize
|
||||
);
|
||||
},
|
||||
},
|
||||
|
||||
methods: {
|
||||
maxSizeFor(mime) {
|
||||
// Use default file size limit for private notes
|
||||
// Use default/installation limit for private notes
|
||||
if (this.isOnPrivateNote) {
|
||||
return MAXIMUM_FILE_UPLOAD_SIZE;
|
||||
return this.installationLimit;
|
||||
}
|
||||
|
||||
return getMaxUploadSizeByChannel({
|
||||
channelType: this.inbox?.channel_type,
|
||||
const channelType = this.inbox?.channel_type;
|
||||
|
||||
if (!channelType || channelType === INBOX_TYPES.WEB) {
|
||||
return this.installationLimit;
|
||||
}
|
||||
|
||||
const channelLimit = getMaxUploadSizeByChannel({
|
||||
channelType,
|
||||
medium: this.inbox?.medium, // e.g. 'sms' | 'whatsapp'
|
||||
mime, // e.g. 'image/png'
|
||||
});
|
||||
|
||||
if (channelLimit === DEFAULT_MAXIMUM_FILE_UPLOAD_SIZE) {
|
||||
return this.installationLimit;
|
||||
}
|
||||
|
||||
return Math.min(channelLimit, this.installationLimit);
|
||||
},
|
||||
alertOverLimit(maxSizeMB) {
|
||||
useAlert(
|
||||
|
||||
@@ -6,6 +6,8 @@ import { reactive } from 'vue';
|
||||
|
||||
vi.mock('shared/helpers/FileHelper', () => ({
|
||||
checkFileSizeLimit: vi.fn(),
|
||||
resolveMaximumFileUploadSize: vi.fn(value => Number(value) || 40),
|
||||
DEFAULT_MAXIMUM_FILE_UPLOAD_SIZE: 40,
|
||||
}));
|
||||
|
||||
vi.mock('activestorage', () => ({
|
||||
@@ -27,6 +29,7 @@ describe('FileUploadMixin', () => {
|
||||
beforeEach(() => {
|
||||
mockGlobalConfig = reactive({
|
||||
directUploadsEnabled: true,
|
||||
maximumFileUploadSize: 40,
|
||||
});
|
||||
|
||||
mockCurrentChat = reactive({
|
||||
|
||||
Reference in New Issue
Block a user