Backend: - schema.js: add document_templates, template_versions, document_versions tables; migrate documents with template_id/template_version_id columns; auto-seed Version 1 for all 190 existing documents - templateController.js (NEW): full CRUD + file upload/download for templates and template versions - templates.js route (NEW): /api/templates endpoints - documentController.js: add getDocumentVersions, uploadDocumentVersion, downloadDocumentVersion; uploadDocument now seeds Version 1 on creation - documents.js: wire GET /:id/versions, POST /:id/upload-version - backupController.js: upgrade backup to ZIP archive (DB + student files + template files + SHA-256 manifest); restore handles ZIP and legacy .db; safety backup taken before every restore - package.json: add archiver + unzipper dependencies Frontend: - template_model.dart (NEW): DocumentTemplateModel + TemplateVersionModel entities - document_version_model.dart (NEW): DocumentVersionModel entity - template_repository.dart (NEW): Dio-based template API client - document_repository.dart: add getDocumentVersions, uploadDocumentVersion, downloadDocumentVersion methods - document_preview_modal.dart: add Open / Open With (Windows rundll32 OpenAs_RunDLL / Android chooser) / Edit (download-temp -> open -> upload prompt) / Upload New Version (FilePicker) / Version History actions - document_version_history_sheet.dart (NEW): draggable bottom sheet listing all document versions with per-version Preview + Download - file_folder_card.dart: add Open With, Edit, Upload New Version, Version History items to context menu - documents_screen.dart: wire open_with, edit, upload_version, version_history, restore action cases; import version history sheet Bugfix: - student_profile_modal.dart: remove enrollment.status access that caused NoSuchMethodError (enrollments table has no status column)
47 lines
1.2 KiB
JSON
47 lines
1.2 KiB
JSON
{
|
|
"name": "backend",
|
|
"version": "1.0.0",
|
|
"description": "",
|
|
"main": "index.js",
|
|
"scripts": {
|
|
"start": "node index.js",
|
|
"dev": "nodemon index.js",
|
|
"test": "echo \"Error: no test specified\" && exit 1",
|
|
"service:install": "install_service.bat",
|
|
"service:uninstall": "uninstall_service.bat",
|
|
"service:start": "bin\\nssm.exe start TIS.RMS.ServerService",
|
|
"service:stop": "bin\\nssm.exe stop TIS.RMS.ServerService",
|
|
"service:restart": "bin\\nssm.exe restart TIS.RMS.ServerService",
|
|
"service:status": "sc query TIS.RMS.ServerService"
|
|
},
|
|
"keywords": [],
|
|
"author": "",
|
|
"license": "ISC",
|
|
"type": "commonjs",
|
|
"dependencies": {
|
|
"archiver": "^8.0.0",
|
|
"bcrypt": "^6.0.0",
|
|
"better-sqlite3": "^12.9.0",
|
|
"cors": "^2.8.6",
|
|
"dotenv": "^17.4.2",
|
|
"exceljs": "^4.4.0",
|
|
"express": "^5.2.1",
|
|
"firebase-admin": "^14.2.0",
|
|
"jsonwebtoken": "^9.0.3",
|
|
"morgan": "^1.10.1",
|
|
"multer": "^2.1.1",
|
|
"nodemailer": "^9.0.6",
|
|
"sharp": "^0.35.4",
|
|
"unzipper": "^0.12.5"
|
|
},
|
|
"devDependencies": {
|
|
"nodemon": "^3.1.14"
|
|
},
|
|
"allowScripts": {
|
|
"@firebase/util@1.15.2": true,
|
|
"bcrypt@6.0.0": true,
|
|
"better-sqlite3@12.9.0": true,
|
|
"protobufjs@7.6.5": true
|
|
}
|
|
}
|