# Server-side globals

When action logic runs on the server, several global objects are injected into the execution context. These are available in any server-side action handler - see [Actions](/developer-guide/building-blocks/actions.md) for how to define them.

## Record context[​](#record-context "Direct link to Record context")

These globals provide access to the record(s) being processed. They are always available.

| Global      | Type             | Description                                                               |
| ----------- | ---------------- | ------------------------------------------------------------------------- |
| `entity`    | mutable record   | The current record being processed. Changes to this object are persisted. |
| `entityOld` | read-only record | The previous state of the record, before the current action.              |
| `records`   | array            | Array of records when processing bulk operations.                         |

## currentUser[​](#currentuser "Direct link to currentUser")

Identity and role information for the user who triggered the action. Typed as `CurrentUserServer`.

| Member                             | Description                                               |
| ---------------------------------- | --------------------------------------------------------- |
| `.id`                              | User ID                                                   |
| `.email`                           | Email address                                             |
| `.name`                            | Display name                                              |
| `.timeZone`                        | User's timezone                                           |
| `.companyId`                       | Company ID                                                |
| `.isGlobalAdmin`                   | Whether the user is a global admin                        |
| `.isWorkspaceAdmin`                | Whether the user is an admin of the current workspace     |
| `.isInGroup(groupIdOrName)`        | Check membership in a specific group                      |
| `.isInAnyOfGroups(groups)`         | Check membership in any of the given groups               |
| `.isInField(fieldName, entity?)`   | Check if the user appears in a people field on the record |
| `.isDefaultUnAuthUser()`           | Returns `true` for unauthenticated users                  |
| `.isWorkspaceAdminOf(workspaceId)` | Check admin role in a different workspace                 |

## ComindServer[​](#comindserver "Direct link to ComindServer")

The main platform API for server-side logic.

### Record queries[​](#record-queries "Direct link to Record queries")

| Method                                              | Description                                                                                                 |
| --------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- |
| `.queryApp(wksApp, relex, fields?)`                 | Fetch a single record matching a relex expression                                                           |
| `.queryAppRecords(wksApp, relex, fields?, sortBy?)` | Fetch multiple records. Also accepts a params object with `limitRecords`, `skipRecords`, and other options. |
| `.queryAppCached(...)`                              | Cached variant of `.queryApp()`                                                                             |
| `.queryAppRecordsCached(...)`                       | Cached variant of `.queryAppRecords()`                                                                      |

### Record mutations[​](#record-mutations "Direct link to Record mutations")

| Method                                                 | Description                                                             |
| ------------------------------------------------------ | ----------------------------------------------------------------------- |
| `.createAppRecord(appAlias, data, runAsUser?)`         | Create a record. Optional `runAsUser` for impersonation.                |
| `.updateAppRecord(id, transition, values, runAsUser?)` | Update a record by executing the specified transition (action) on it.   |
| `.deleteAppRecord(id, runAsUser?)`                     | Delete a record                                                         |
| `.bulkCreateAppRecords(wksApp, dataList)`              | Create multiple records in one call                                     |
| `.bulkDeleteAppRecords(ids)`                           | Delete multiple records in one call                                     |
| `.importData({data, keyFields, ...})`                  | Import data with full options - duplicate handling, field mapping, etc. |

### Utilities[​](#utilities "Direct link to Utilities")

| Method                                  | Description                                                                          |
| --------------------------------------- | ------------------------------------------------------------------------------------ |
| `.Acls`                                 | Permission helpers: `.workspaceAdmin`, `.workspaceTeam`, `.group(name)`, `.user(id)` |
| `.action`                               | Name of the currently executing action                                               |
| `.sleep(ms)`                            | Pause execution for the given number of milliseconds                                 |
| `.resolveLookup(fieldName)`             | Resolve a lookup field's display caption                                             |
| `.matchLookup(fieldName, captionValue)` | Find a lookup ID by its caption text                                                 |
| `.generateUniqueIdForPrefix(prefix)`    | Generate an auto-numbered ID with the given prefix                                   |
| `.getAccessPass(...)`                   | Obtain an impersonation access token                                                 |
| `.htmlToText(html)`                     | Strip HTML tags and return plain text                                                |

## RestApi[​](#restapi "Direct link to RestApi")

HTTP client for calling external services. Typed as `RestApiServer`.

**Typical usage:**

```
RestApi.createClient('https://api.example.com');
RestApi.createRequest('/endpoint', 'POST');
RestApi.addHeader('Authorization', 'Bearer ...');
RestApi.addJsonBody({ key: 'value' });
const result = RestApi.executeRequest();
```

| Method                                   | Description                              |
| ---------------------------------------- | ---------------------------------------- |
| `.createClient(baseUrl)`                 | Initialize a client with a base URL      |
| `.createRequest(path, method)`           | Set up a request                         |
| `.addHeader(name, value)`                | Add a request header                     |
| `.addJsonBody(body)`                     | Attach a JSON body                       |
| `.executeRequest()`                      | Send the request and return the response |
| `.setHttpBasicAuth(...)`                 | Use HTTP Basic authentication            |
| `.setOAuth2AuthorizationHeaderAuth(...)` | Use OAuth 2 bearer token authentication  |
| `.addFile(...)`                          | Attach a file to the request             |
| `.downloadFile(...)`                     | Download a file from the response        |
| `.setRequestTimeout(seconds)`            | Set a timeout in seconds                 |

## Files[​](#files "Direct link to Files")

File operations - reading, writing, and converting files. Typed as `FilesServer`.

| Method                                              | Description                                 |
| --------------------------------------------------- | ------------------------------------------- |
| `.getFileRef(fileRecordId)`                         | Get a file reference from a file record ID  |
| `.persistFileRef(ref)`                              | Save a temporary file reference permanently |
| `.readExcelFileRef(ref, rows, skip?, sheet?)`       | Read rows from an Excel file                |
| `.writeExcelFileRef({sourceRef, updateCells, ...})` | Write or modify an Excel file               |
| `.readCsvFileRef(ref, rows, skip?)`                 | Read rows from a CSV file                   |
| `.writeCsvFileRef({rows, delimiter?})`              | Write a CSV file                            |
| `.writePdfFileRef({html})`                          | Generate a PDF from an HTML string          |
| `.mergePdfFileRefs(refs)`                           | Merge multiple PDF files into one           |
| `.zipFileRefs(refs)`                                | Create a ZIP archive from file references   |
| `.readFileRefAsBase64(ref)`                         | Read a file's contents as a base64 string   |
| `.useBase64DataAsFileRef(base64)`                   | Create a file reference from base64 data    |

## AppSchema[​](#appschema "Direct link to AppSchema")

App installation and configuration. Typed as `AppSchemaServer`. See [Settings model](/developer-guide/building-blocks/settings-model.md) for how app variables and secrets are defined.

| Method                                    | Description                                                  |
| ----------------------------------------- | ------------------------------------------------------------ |
| `.install({appId, position?, wksAlias?})` | Install an app into a workspace                              |
| `.uninstall({appId, wksAlias})`           | Remove an app from a workspace                               |
| `.load({appId})`                          | Load an app's schema definition                              |
| `.getVars()`                              | Get app variables defined in settings                        |
| `.getSecrets()`                           | Get app secrets from `COMIND_SECRET_*` environment variables |
| `.getWorkspaceAdmins()`                   | List workspace admin user IDs                                |

## Utils[​](#utils "Direct link to Utils")

General-purpose utilities. Typed as `UtilsServer`.

| Method                                     | Description                                |
| ------------------------------------------ | ------------------------------------------ |
| `.formatString(template, obj?)`            | Format a string with interpolation         |
| `.formatDateTime(date, format)`            | Format a date using a format string        |
| `.formatNumber(number, format)`            | Format a number using a format string      |
| `.getDatesDiff(date1, date2)`              | Get the time span between two dates        |
| `.generateGuid()`                          | Generate a UUID                            |
| `.generateSha256(data)`                    | Generate a SHA-256 hash                    |
| `.generateMd5(data)`                       | Generate an MD5 hash                       |
| `.parseJwt(jwt)`                           | Parse a JWT token and return its payload   |
| `.dateTimeToAnotherTimeZone(dt, targetTz)` | Convert a datetime to a different timezone |
| `.writeCsvString(data, delimiter?)`        | Serialize data to a CSV string             |
| `.parseCsvString(csv, delimiter?)`         | Parse a CSV string into structured data    |

## console[​](#console "Direct link to console")

Logging interface for debugging server-side logic. Typed as `ConsoleServer`.

| Method                         | Description                        |
| ------------------------------ | ---------------------------------- |
| `.log()`                       | General log output                 |
| `.debug()`                     | Debug-level output                 |
| `.info()`                      | Informational output               |
| `.warn()`                      | Warning output                     |
| `.error()`                     | Error output                       |
| `.profile()` / `.profileEnd()` | Start and stop a performance timer |

## Additional globals[​](#additional-globals "Direct link to Additional globals")

These globals are available for specialized use cases.

| Global         | Description                                                                                          |
| -------------- | ---------------------------------------------------------------------------------------------------- |
| `parser`       | HTML parser for processing markup                                                                    |
| `JsRequire`    | Dynamic module loading within server-side scripts                                                    |
| `LiquidParser` | Liquid template parsing and rendering                                                                |
| `runContext`   | Execution context with `.invokedTransition` - the alias of the action that triggered the current run |
