Skip to content

Commit

Permalink
Feat: CDOGS file size validation (bcgov#1485)
Browse files Browse the repository at this point in the history
* added file size validation on cdogs template uploads

* updated test

* fix errors

* update test
  • Loading branch information
vijaivir committed Aug 23, 2024
1 parent eecbf22 commit eabf469
Show file tree
Hide file tree
Showing 22 changed files with 107 additions and 37 deletions.
35 changes: 30 additions & 5 deletions app/frontend/src/components/forms/PrintOptions.vue
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<script setup>
import { storeToRefs } from 'pinia';
import { useI18n } from 'vue-i18n';
import { onBeforeUnmount, computed, ref, watch } from 'vue';
import { onBeforeUnmount, computed, ref, watch, nextTick } from 'vue';
import { createDownload } from '~/composables/printOptions';
import { formService, utilsService } from '~/services';
Expand Down Expand Up @@ -51,6 +51,8 @@ const defaultTemplateFilename = ref('');
const defaultTemplateExtension = ref('');
const displayTemplatePrintButton = ref(false);
const isValidFile = ref(true);
const isValidSize = ref(true);
const fileInput = ref(null);
const fileInputKey = ref(0);
const validFileExtensions = ref(['txt', 'docx', 'html', 'odt', 'pptx', 'xlsx']);
const defaultExportFileTypes = ref(['pdf']);
Expand All @@ -64,6 +66,7 @@ const { isRTL, form } = storeToRefs(formStore);
const files = computed(() => templateForm.value.files);
const formId = computed(() => (properties.f ? properties.f : form.value.id));
const validationRules = computed(() => [
isValidSize.value || t('trans.documentTemplate.fileSizeError'),
isValidFile.value || t('trans.documentTemplate.invalidFileMessage'),
]);
Expand Down Expand Up @@ -268,8 +271,16 @@ async function fetchDefaultTemplate() {
}
}
function validateFileExtension(event) {
function validateFile(event) {
if (event.length > 0) {
// validate file size
if (event[0].size > 25000000) {
isValidSize.value = false;
} else {
isValidSize.value = true;
}
// validate file extension
const fileExtension = event[0].name.split('.').pop();
// reset the outputFileName when a new file is uploaded
templateForm.value.outputFileName = event[0].name
Expand All @@ -294,25 +305,34 @@ function validateFileExtension(event) {
);
}
isValidFile.value = true;
isValidSize.value = true;
}
}
function handleFileUpload(event) {
fileInputKey.value += 1;
templateForm.value.files = event;
validateFileExtension(event);
validateFile(event);
//force immediate validation as the v-file-input is bound to the :key
nextTick(() => {
if (fileInput.value) {
fileInput.value.validate();
}
});
}
defineExpose({
createBody,
createDownload,
fetchDefaultTemplate,
isValidFile,
isValidSize,
selectedOption,
templateForm,
timeout,
uploadExportFileTypes,
validateFileExtension,
validateFile,
});
</script>
Expand Down Expand Up @@ -446,6 +466,7 @@ defineExpose({
value="upload"
></v-radio>
<v-file-input
ref="fileInput"
:key="fileInputKey"
v-model="templateForm.files"
:class="{ label: isRTL }"
Expand Down Expand Up @@ -482,7 +503,11 @@ defineExpose({
id="file-input-submit"
variant="flat"
class="btn-file-input-submit px-4"
:disabled="!displayTemplatePrintButton || !isValidFile"
:disabled="
!displayTemplatePrintButton ||
!isValidFile ||
!isValidSize
"
color="primary"
:loading="loading"
v-bind="props"
Expand Down
39 changes: 32 additions & 7 deletions app/frontend/src/components/forms/manage/DocumentTemplate.vue
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ const headers = ref([
const loading = ref(true);
const isFileInputEmpty = ref(true);
const isValidFile = ref(true);
const isValidSize = ref(true);
const techdocsLinkTemplateUpload = ref(
'https://developer.gov.bc.ca/docs/default/component/chefs-techdocs/Capabilities/Functionalities/CDOGS-Template-Upload/'
);
Expand All @@ -38,6 +39,7 @@ const notificationStore = useNotificationStore();
const { form, isRTL } = storeToRefs(useFormStore());
const validationRules = computed(() => [
isValidSize.value || t('trans.documentTemplate.fileSizeError'),
isValidFile.value || t('trans.documentTemplate.invalidFileMessage'),
]);
Expand Down Expand Up @@ -83,6 +85,15 @@ function handleFileInput(event) {
if (event && event.length > 0) {
isFileInputEmpty.value = false;
uploadedFile = event[0];
// validate file size
if (uploadedFile.size > 25000000) {
isValidSize.value = false;
} else {
isValidSize.value = true;
}
// validate file extension
const fileExtension = event[0].name.split('.').pop();
if (validFileExtensions.includes(fileExtension)) {
isValidFile.value = true;
Expand All @@ -92,6 +103,7 @@ function handleFileInput(event) {
} else {
isFileInputEmpty.value = true;
isValidFile.value = true;
isValidSize.value = true;
}
}
Expand Down Expand Up @@ -120,12 +132,21 @@ async function handleFileUpload() {
...NotificationTypes.SUCCESS,
});
} catch (e) {
notificationStore.addNotification({
text: t('trans.documentTemplate.uploadError'),
consoleError: t('trans.documentTemplate.uploadError', {
error: e.message,
}),
});
if (e.response.status === 413) {
notificationStore.addNotification({
text: t('trans.documentTemplate.fileSizeError'),
consoleError: t('trans.documentTemplate.fileSizeError', {
error: e.message,
}),
});
} else {
notificationStore.addNotification({
text: t('trans.documentTemplate.uploadError'),
consoleError: t('trans.documentTemplate.uploadError', {
error: e.message,
}),
});
}
} finally {
loading.value = false;
}
Expand Down Expand Up @@ -196,6 +217,7 @@ defineExpose({
handleFileInput,
isFileInputEmpty,
isValidFile,
isValidSize,
uploadedFile,
});
</script>
Expand Down Expand Up @@ -322,7 +344,10 @@ defineExpose({
</v-file-input>
<v-btn
:disabled="
!isValidFile || isFileInputEmpty || documentTemplates.length >= 1
!isValidFile ||
!isValidSize ||
isFileInputEmpty ||
documentTemplates.length >= 1
"
color="primary"
:title="$t('trans.documentTemplate.upload')"
Expand Down
3 changes: 2 additions & 1 deletion app/frontend/src/internationalization/trans/chefs/ar/ar.json
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,8 @@
"deleteSuccess": "تم حذف القالب بنجاح.",
"deleteError": "حدث خطأ أثناء حذف القالب.",
"fetchError": "حدث خطأ أثناء جلب القالب.",
"info": "قم بتحميل قالب لاستخدام خدمة توليد الوثائق المشتركة (CDOGS)"
"info": "قم بتحميل قالب لاستخدام خدمة توليد الوثائق المشتركة (CDOGS)",
"fileSizeError": "يجب أن يكون حجم الملف أقل من 25 ميغابايت."
},
"formSettings": {
"pressToAddMultiEmail": "اضغط على <kbd>مفتاح الإدخال</kbd> أو <kbd>،</kbd> أو <kbd>مسافة</kbd> لإضافة عناوين بريد إلكتروني متعددة",
Expand Down
3 changes: 2 additions & 1 deletion app/frontend/src/internationalization/trans/chefs/de/de.json
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,8 @@
"deleteSuccess": "Vorlage erfolgreich gelöscht.",
"deleteError": "Beim Löschen der Vorlage ist ein Fehler aufgetreten.",
"fetchError": "Beim Abrufen der Vorlage ist ein Fehler aufgetreten.",
"info": "Laden Sie eine Vorlage hoch, um den Gemeinsamen Dokumenterstellungsdienst (CDOGS) zu verwenden"
"info": "Laden Sie eine Vorlage hoch, um den Gemeinsamen Dokumenterstellungsdienst (CDOGS) zu verwenden",
"fileSizeError": "Die Dateigröße muss weniger als 25 MB betragen."
},
"formSettings": {
"pressToAddMultiEmail": "Drücken Sie <kbd>die Eingabetaste</kbd> oder <kbd>die Leertaste</kbd> oder <kbd>,</kbd> um mehrere E-Mail-Adressen hinzuzufügen",
Expand Down
3 changes: 2 additions & 1 deletion app/frontend/src/internationalization/trans/chefs/en/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,8 @@
"deleteSuccess": "Template deleted successfully.",
"deleteError": "An error occurred while deleting the template.",
"fetchError": "An error occurred while fetching the template.",
"info": "Upload a template to use the Common Document Generation Service (CDOGS)"
"info": "Upload a template to use the Common Document Generation Service (CDOGS)",
"fileSizeError": "File size must be less than 25MB."
},
"externalAPI": {
"info": "Configure External APIs for use in your form.",
Expand Down
3 changes: 2 additions & 1 deletion app/frontend/src/internationalization/trans/chefs/es/es.json
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,8 @@
"deleteSuccess": "Plantilla eliminada exitosamente.",
"deleteError": "Ocurrió un error al eliminar la plantilla.",
"fetchError": "Ocurrió un error al obtener la plantilla.",
"info": "Sube una plantilla para usar el Servicio de Generación de Documentos Comunes (CDOGS)"
"info": "Sube una plantilla para usar el Servicio de Generación de Documentos Comunes (CDOGS)",
"fileSizeError": "El tamaño del archivo debe ser menor de 25 MB."
},
"formSettings": {
"pressToAddMultiEmail": "Presiona <kbd>enter</kbd> o <kbd>,</kbd> o <kbd>espacio</kbd> para agregar varias direcciones de correo electrónico",
Expand Down
3 changes: 2 additions & 1 deletion app/frontend/src/internationalization/trans/chefs/fa/fa.json
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,8 @@
"deleteSuccess": "قالب با موفقیت حذف شد.",
"deleteError": "خطایی در هنگام حذف قالب رخ داد.",
"fetchError": "خطایی در هنگام دریافت قالب رخ داد.",
"info": "قالبی را بارگذاری کنید تا از خدمات تولید سند مشترک (CDOGS) استفاده کنید"
"info": "قالبی را بارگذاری کنید تا از خدمات تولید سند مشترک (CDOGS) استفاده کنید",
"fileSizeError": "اندازه فایل باید کمتر از 25 مگابایت باشد."
},
"formSettings": {
"pressToAddMultiEmail": "برای افزودن چندین آدرس ایمیل، <kbd>اینتر</kbd> یا <kbd>،</kbd> یا <kbd>فاصله</kbd> را فشار دهید",
Expand Down
3 changes: 2 additions & 1 deletion app/frontend/src/internationalization/trans/chefs/fr/fr.json
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,8 @@
"deleteSuccess": "Modèle supprimé avec succès.",
"deleteError": "Une erreur s'est produite lors de la suppression du modèle.",
"fetchError": "Une erreur s'est produite lors de la récupération du modèle.",
"info": "Téléchargez un modèle pour utiliser le Service de Génération de Documents Communs (CDOGS)"
"info": "Téléchargez un modèle pour utiliser le Service de Génération de Documents Communs (CDOGS)",
"fileSizeError": "La taille du fichier doit être inférieure à 25 Mo."
},
"formSettings": {
"pressToAddMultiEmail": "Appuyez sur <kbd>entrée</kbd> ou <kbd>,</kbd> ou <kbd>espace</kbd> pour ajouter plusieurs adresses e-mail",
Expand Down
3 changes: 2 additions & 1 deletion app/frontend/src/internationalization/trans/chefs/hi/hi.json
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,8 @@
"deleteSuccess": "टेम्पलेट सफलतापूर्वक हटाया गया।",
"deleteError": "टेम्पलेट हटाते समय एक त्रुटि हुई।",
"fetchError": "टेम्पलेट प्राप्त करते समय एक त्रुटि हुई।",
"info": "कॉमन डॉक्युमेंट जनरेशन सर्विस (CDOGS) का उपयोग करने के लिए एक टेम्पलेट अपलोड करें"
"info": "कॉमन डॉक्युमेंट जनरेशन सर्विस (CDOGS) का उपयोग करने के लिए एक टेम्पलेट अपलोड करें",
"fileSizeError": "फ़ाइल का आकार 25MB से कम होना चाहिए।"
},
"formSettings": {
"pressToAddMultiEmail": "एकाधिक ईमेल पते जोड़ने के लिए <kbd>एंटर</kbd> या <kbd>,</kbd> या <kbd>स्पेस</kbd> दबाएँ",
Expand Down
3 changes: 2 additions & 1 deletion app/frontend/src/internationalization/trans/chefs/it/it.json
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,8 @@
"deleteSuccess": "Template eliminato con successo.",
"deleteError": "Si è verificato un errore durante l'eliminazione del template.",
"fetchError": "Si è verificato un errore durante il recupero del template.",
"info": "Carica un template per utilizzare il Servizio di Generazione Documenti Comuni (CDOGS)"
"info": "Carica un template per utilizzare il Servizio di Generazione Documenti Comuni (CDOGS)",
"fileSizeError": "La dimensione del file deve essere inferiore a 25 MB."
},
"formSettings": {
"pressToAddMultiEmail": "Premi <kbd>invio</kbd> o <kbd>,</kbd> o <kbd>spazio</kbd> per aggiungere più indirizzi email",
Expand Down
3 changes: 2 additions & 1 deletion app/frontend/src/internationalization/trans/chefs/ja/ja.json
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,8 @@
"deleteSuccess": "テンプレートが正常に削除されました。",
"deleteError": "テンプレートの削除中にエラーが発生しました。",
"fetchError": "テンプレートの取得中にエラーが発生しました。",
"info": "共通ドキュメント生成サービス(CDOGS)を使用するためのテンプレートをアップロードしてください"
"info": "共通ドキュメント生成サービス(CDOGS)を使用するためのテンプレートをアップロードしてください",
"fileSizeError": "ファイルサイズは25MB以下でなければなりません。"
},
"formSettings": {
"pressToAddMultiEmail": "<kbd>Enter</kbd>または<kbd>、</kbd>または<kbd>スペース</kbd>を押して複数の電子メール アドレスを追加します",
Expand Down
3 changes: 2 additions & 1 deletion app/frontend/src/internationalization/trans/chefs/ko/ko.json
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,8 @@
"deleteSuccess": "템플릿이 성공적으로 삭제되었습니다.",
"deleteError": "템플릿 삭제 중 오류가 발생했습니다.",
"fetchError": "템플릿 가져오기 중 오류가 발생했습니다.",
"info": "공통 문서 생성 서비스(CDOGS)를 사용하기 위해 템플릿을 업로드하십시오"
"info": "공통 문서 생성 서비스(CDOGS)를 사용하기 위해 템플릿을 업로드하십시오",
"fileSizeError": "파일 크기는 25MB 이하여야 합니다."
},
"formSettings": {
"pressToAddMultiEmail": "여러 이메일 주소를 추가하려면 <kbd>enter</kbd> 또는 <kbd>,</kbd> 또는 <kbd>space를</kbd> 누르십시오.",
Expand Down
3 changes: 2 additions & 1 deletion app/frontend/src/internationalization/trans/chefs/pa/pa.json
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,8 @@
"deleteSuccess": "ਟੈਂਪਲੇਟ ਸਫਲਤਾਪੂਰਵਕ ਮਿਟਾਈ ਗਈ।",
"deleteError": "ਟੈਂਪਲੇਟ ਮਿਟਾਉਣ ਸਮੇਂ ਇੱਕ ਗਲਤੀ ਆਈ।",
"fetchError": "ਟੈਂਪਲੇਟ ਲਿਆਉਣ ਸਮੇਂ ਇੱਕ ਗਲਤੀ ਆਈ।",
"info": "ਕੌਮਨ ਦਸਤਾਵੇਜ਼ ਜਨਰੇਸ਼ਨ ਸਰਵਿਸ (CDOGS) ਵਰਤਣ ਲਈ ਇੱਕ ਟੈਂਪਲੇਟ ਅੱਪਲੋਡ ਕਰੋ"
"info": "ਕੌਮਨ ਦਸਤਾਵੇਜ਼ ਜਨਰੇਸ਼ਨ ਸਰਵਿਸ (CDOGS) ਵਰਤਣ ਲਈ ਇੱਕ ਟੈਂਪਲੇਟ ਅੱਪਲੋਡ ਕਰੋ",
"fileSizeError": "ਫਾਈਲ ਦਾ ਆਕਾਰ 25MB ਤੋਂ ਘੱਟ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ।"
},
"formSettings": {
"pressToAddMultiEmail": "ਕਈ ਈਮੇਲ ਪਤੇ ਜੋੜਨ ਲਈ <kbd>ਐਂਟਰ</kbd> <kbd>ਜਾਂ</kbd> <kbd>ਸਪੇਸ</kbd> ਦਬਾਓ",
Expand Down
3 changes: 2 additions & 1 deletion app/frontend/src/internationalization/trans/chefs/pt/pt.json
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,8 @@
"deleteSuccess": "Modelo excluído com sucesso.",
"deleteError": "Ocorreu um erro ao excluir o modelo.",
"fetchError": "Ocorreu um erro ao buscar o modelo.",
"info": "Carregue um modelo para usar o Serviço de Geração de Documentos Comuns (CDOGS)"
"info": "Carregue um modelo para usar o Serviço de Geração de Documentos Comuns (CDOGS)",
"fileSizeError": "O tamanho do arquivo deve ser menor que 25 MB."
},
"formSettings": {
"pressToAddMultiEmail": "Pressione <kbd>enter</kbd> ou <kbd>,</kbd> ou <kbd>espaço</kbd> para adicionar vários endereços de e-mail",
Expand Down
3 changes: 2 additions & 1 deletion app/frontend/src/internationalization/trans/chefs/ru/ru.json
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,8 @@
"deleteSuccess": "Шаблон успешно удален.",
"deleteError": "Произошла ошибка при удалении шаблона.",
"fetchError": "Произошла ошибка при получении шаблона.",
"info": "Загрузите шаблон для использования Общей службы генерации документов (CDOGS)"
"info": "Загрузите шаблон для использования Общей службы генерации документов (CDOGS)",
"fileSizeError": "Размер файла должен быть менее 25 МБ."
},
"formSettings": {
"pressToAddMultiEmail": "Нажмите <kbd>Enter</kbd> или <kbd>пробел</kbd> <kbd>,</kbd> чтобы добавить несколько адресов электронной почты.",
Expand Down
3 changes: 2 additions & 1 deletion app/frontend/src/internationalization/trans/chefs/tl/tl.json
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,8 @@
"deleteSuccess": "Matagumpay na natanggal ang template.",
"deleteError": "Nagkaroon ng error habang tinatanggal ang template.",
"fetchError": "Nagkaroon ng error habang kinukuha ang template.",
"info": "Mag-upload ng template upang gamitin ang Common Document Generation Service (CDOGS)"
"info": "Mag-upload ng template upang gamitin ang Common Document Generation Service (CDOGS)",
"fileSizeError": "Ang laki ng file ay dapat mas mababa sa 25MB."
},
"formSettings": {
"pressToAddMultiEmail": "Pindutin <kbd>ang enter</kbd> o <kbd>,</kbd> o <kbd>space</kbd> para magdagdag ng maraming email address",
Expand Down
3 changes: 2 additions & 1 deletion app/frontend/src/internationalization/trans/chefs/uk/uk.json
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,8 @@
"deleteSuccess": "Шаблон успішно видалено.",
"deleteError": "Під час видалення шаблону сталася помилка.",
"fetchError": "Під час отримання шаблону сталася помилка.",
"info": "Завантажте шаблон, щоб використовувати Спільний сервіс генерації документів (CDOGS)"
"info": "Завантажте шаблон, щоб використовувати Спільний сервіс генерації документів (CDOGS)",
"fileSizeError": "Розмір файлу має бути менше 25 МБ."
},
"formSettings": {
"pressToAddMultiEmail": "Щоб додати кілька електронних адрес, натисніть <kbd>enter</kbd> або <kbd>,</kbd> або <kbd>пробіл</kbd>",
Expand Down
3 changes: 2 additions & 1 deletion app/frontend/src/internationalization/trans/chefs/vi/vi.json
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,8 @@
"deleteSuccess": "Xóa mẫu thành công.",
"deleteError": "Có lỗi xảy ra khi xóa mẫu.",
"fetchError": "Có lỗi xảy ra khi lấy mẫu.",
"info": "Tải lên một mẫu để sử dụng Dịch vụ Tạo Tài liệu Chung (CDOGS)"
"info": "Tải lên một mẫu để sử dụng Dịch vụ Tạo Tài liệu Chung (CDOGS)",
"fileSizeError": "Kích thước tệp phải nhỏ hơn 25MB."
},
"formSettings": {
"pressToAddMultiEmail": "Nhấn <kbd>enter</kbd> hoặc <kbd>,</kbd> hoặc <kbd>dấu cách</kbd> để thêm nhiều địa chỉ email",
Expand Down
3 changes: 2 additions & 1 deletion app/frontend/src/internationalization/trans/chefs/zh/zh.json
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,8 @@
"deleteSuccess": "模板删除成功。",
"deleteError": "删除模板时发生错误。",
"fetchError": "获取模板时发生错误。",
"info": "上传模板以使用公共文档生成服务(CDOGS)"
"info": "上传模板以使用公共文档生成服务(CDOGS)",
"fileSizeError": "文件大小必须小于25MB。"
},
"formSettings": {
"pressToAddMultiEmail": "按<kbd>Enter</kbd>或<kbd>,</kbd>或<kbd>空格键</kbd>添加多个电子邮件地址",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,8 @@
"deleteSuccess": "範本成功刪除。",
"deleteError": "刪除範本時發生錯誤。",
"fetchError": "獲取範本時發生錯誤。",
"info": "上傳範本以使用公共文檔生成服務(CDOGS)"
"info": "上傳範本以使用公共文檔生成服務(CDOGS)",
"fileSizeError": "檔案大小必須小於25MB。"
},
"formSettings": {
"pressToAddMultiEmail": "按<kbd>Enter</kbd>或<kbd>,</kbd>或<kbd>空格鍵</kbd>添加多個電子郵件地址",
Expand Down
Loading

0 comments on commit eabf469

Please sign in to comment.