diff --git a/.gitignore b/.gitignore index 003fb62a0..42c6d98b8 100644 --- a/.gitignore +++ b/.gitignore @@ -68,6 +68,8 @@ minio-data/ postgres-data/ redis-data/ +packages/fileimport-service/src/ifc-dotnet/output + .tshy-build obj/ bin/ diff --git a/packages/fileimport-service/README.md b/packages/fileimport-service/README.md index 2efde3e9a..09c9b38d5 100644 --- a/packages/fileimport-service/README.md +++ b/packages/fileimport-service/README.md @@ -11,3 +11,35 @@ The File Import service can parse either STL, OBJ, or IFC files using external p The parsers are responsible for extracting the necessary data from the files and storing it in the database. They are also responsible for creating a new Speckle model if necessary. The service is then responsible for updating the status of the `file_uploads` table, and for posting a Postgres notification. + +## Dev setup + +### Building/Running the .NET importer + +Requirements: + +- Ubuntu 24+ + +Do this on Ubuntu/OSX to install dotnet: + +```bash +# Add microsoft package repo +sudo apt update && sudo apt install -y wget apt-transport-https +wget https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/packages-microsoft-prod.deb -O packages-microsoft-prod.deb +sudo dpkg -i packages-microsoft-prod.deb + +# Install dotnet sdk 8 +sudo apt update +sudo apt install -y dotnet-sdk-8.0 + +# Verify version +dotnet --version +``` + +Do this to build: + +```bash +cd ./packages/fileimport-service/src/ifc-dotnet + +dotnet publish ifc-converter.csproj -c Release -o output/ +``` diff --git a/packages/fileimport-service/src/controller/daemon.ts b/packages/fileimport-service/src/controller/daemon.ts index c904a1b4c..a43bf982d 100644 --- a/packages/fileimport-service/src/controller/daemon.ts +++ b/packages/fileimport-service/src/controller/daemon.ts @@ -16,6 +16,7 @@ import { logger } from '@/observability/logging.js' import { Nullable, Scopes, wait } from '@speckle/shared' import { Knex } from 'knex' import { Logger } from 'pino' +import { getIfcDllPath, useLegacyIfcImporter } from '@/controller/helpers/env.js' const HEALTHCHECK_FILE_PATH = '/tmp/last_successful_query' @@ -153,7 +154,10 @@ async function doTask( taskLogger.info('Triggering importer for {fileType}') if (info.fileType.toLowerCase() === 'ifc') { - if (info.fileName.toLowerCase().endsWith('.legacyimporter.ifc')) { + if ( + info.fileName.toLowerCase().endsWith('.legacyimporter.ifc') || + useLegacyIfcImporter() + ) { await runProcessWithTimeout( taskLogger, process.env['NODE_BINARY_PATH'] || 'node', @@ -181,8 +185,7 @@ async function doTask( taskLogger, process.env['DOTNET_BINARY_PATH'] || 'dotnet', [ - process.env['IFC_DOTNET_DLL_PATH'] || - '/speckle-server/packages/fileimport-service/src/ifc-dotnet/ifc-converter.dll', + getIfcDllPath(), TMP_FILE_PATH, TMP_RESULTS_PATH, info.streamId, diff --git a/packages/fileimport-service/src/controller/helpers/env.ts b/packages/fileimport-service/src/controller/helpers/env.ts new file mode 100644 index 000000000..ba010df8d --- /dev/null +++ b/packages/fileimport-service/src/controller/helpers/env.ts @@ -0,0 +1,61 @@ +import path from 'node:path' +import url from 'node:url' +import file from 'node:fs' + +export const isDevEnv = () => { + return process.env.NODE_ENV === 'development' +} + +export const isTestEnv = () => { + return process.env.NODE_ENV === 'test' +} + +export const isDevOrTestEnv = () => isDevEnv() || isTestEnv() + +export const useLegacyIfcImporter = () => { + return ['true', '1'].includes(process.env.USE_LEGACY_IFC_IMPORTER || 'false') +} + +export const getPackageRootDirPath = () => { + const __filename = url.fileURLToPath(import.meta.url) + const __dirname = path.dirname(__filename) + + let root = path.resolve(__dirname, '../../../') + if (root.endsWith('dist')) { + // Resolved path may differ depending on whether running from dist or src (w/ ts-node) + root = path.resolve(root, '../') + } + + return root +} + +let cachedIfcDllPath: string | undefined = undefined +export const getIfcDllPath = () => { + if (cachedIfcDllPath) return cachedIfcDllPath + + const absolutePath = process.env['IFC_DOTNET_DLL_PATH'] + if (absolutePath && file.existsSync(absolutePath)) { + cachedIfcDllPath = absolutePath + return absolutePath + } + + if (isDevOrTestEnv()) { + const possiblePath = path.resolve( + getPackageRootDirPath(), + './src/ifc-dotnet/output/ifc-converter.dll' + ) + if (file.existsSync(possiblePath)) { + cachedIfcDllPath = absolutePath + return possiblePath + } + } + + const fallback = + '/speckle-server/packages/fileimport-service/src/ifc-dotnet/ifc-converter.dll' + if (file.existsSync(fallback)) { + cachedIfcDllPath = fallback + return fallback + } + + throw new Error('Could not resolve .NET IFC DLL') +} diff --git a/packages/fileimport-service/src/observability/logging.ts b/packages/fileimport-service/src/observability/logging.ts index 6ef8bca14..65cbc6741 100644 --- a/packages/fileimport-service/src/observability/logging.ts +++ b/packages/fileimport-service/src/observability/logging.ts @@ -4,7 +4,7 @@ import Observability from '@speckle/shared/dist/commonjs/observability/index.js' export const logger = Observability.extendLoggerComponent( Observability.getLogger( process.env.LOG_LEVEL || 'info', - process.env.LOG_PRETTY === 'true' + process.env.LOG_PRETTY === 'true' && !process.env.FORCE_NO_PRETTY ), 'fileimport-service' ) diff --git a/packages/frontend-2/components/billing/TransitionCards.vue b/packages/frontend-2/components/billing/TransitionCards.vue index 5a4edb10a..01197b935 100644 --- a/packages/frontend-2/components/billing/TransitionCards.vue +++ b/packages/frontend-2/components/billing/TransitionCards.vue @@ -2,18 +2,7 @@
-
-
- -
-
-
{{ currentState.title }}
-
- {{ currentState.description }} -
-
-
Current
-
+
@@ -25,36 +14,11 @@ -
-
- -
-
-
{{ newState.title }}
-
- {{ newState.description }} -
-
- -
+
diff --git a/packages/frontend-2/components/header/WorkspaceSwitcher/header/Projects.vue b/packages/frontend-2/components/header/WorkspaceSwitcher/header/Projects.vue index 6778161cd..c165946ca 100644 --- a/packages/frontend-2/components/header/WorkspaceSwitcher/header/Projects.vue +++ b/packages/frontend-2/components/header/WorkspaceSwitcher/header/Projects.vue @@ -1,9 +1,21 @@ diff --git a/packages/frontend-2/components/header/nav/notifications/WorkspaceInvite.vue b/packages/frontend-2/components/header/nav/notifications/WorkspaceInvite.vue index dcb12c11c..89fb32ecb 100644 --- a/packages/frontend-2/components/header/nav/notifications/WorkspaceInvite.vue +++ b/packages/frontend-2/components/header/nav/notifications/WorkspaceInvite.vue @@ -2,6 +2,7 @@