# Operations

## InsertOperation

Operation defaults are bypassCreateAcl(false), dryRun(false), grant(null), lean(true), skipAcl(false).

bypassCreateAcl(bool = true)\
dryRun(bool = true)\
execute()\
grant(level)\
lean(bool = true)\
locale(identifier)\
skipAcl(bool = true)

```
const Items = org.objects.c_items;

const _id = Items.insertOne({c_key: 'unique key'}).execute();
  
return Items.find({_id: _id}).paths('c_key').next();
```

### InsertOperation.bypassCreateAcl(bool = true)

Skips createAcl checks.

**Arguments**

* `bool` (Boolean)

**Returns**

this

### InsertOperation.dryRun(bool = true)

The operation performs a dry run. Though no documents are inserted, before triggers are called.

**Arguments**

* `bool` (Boolean)

**Returns**

this

### InsertOperation.execute()

Executes the operation.

**Returns**

ObjectID|Object If the lean option is turned off, the inserted document is returned. When true, only the inserted identifier is returned.

### InsertOperation.grant(level)

Sets the grant level for the operation.

**Arguments**

* `level` (Number)

**Returns**

this

### InsertOperation.lean(bool = true)

On by default, turning off this option reads the entire inserted document after execution.

**Arguments**

* `bool` (Boolean)

**Returns**

this

### InsertOperation.locale(identifier)

Specifies the locale of the operation for any localized strings.

**Arguments**

* `identifier` (String) The locale identifier, which consists of a 2 or 3 letter language tag optionally followed by a region separated by `_`. For example, `en`, `en_US`, `en_UK`, etc.

**Returns**

this

### InsertOperation.skipAcl(bool = true)

Skips acl checks.

**Arguments**

* `bool` (Boolean)

**Returns**

this

## class BulkOperation

### add(operation, options)

*Arguments*

* `operation` { Object }
* `options` { Object }
  * `operation` { String } The operation (insertMany, bulk, etc.)
  * `object` { String } New object
  * `name` { String } Custom name for wrapping
  * `as` { String } Account, safe, principal, acl, or module
  * `privileged` { Boolean } Also pass the user options as privileged options
  * `cursor` { Object }
  * `wrap` { Boolean }
  * `halt` { Boolean }
  * `depth` { Number }
  * `memo` { Object }

*Returns*

* { Object } The Operation instance.

### async(options)

*Arguments*

* `options` { Object }
  * `onComplete` { String } Adhoc script that runs when async operation completes
  * `lock` { Object }
    * `name` { String } env unique lock name
    * `restart` { Boolean } If true, either starts a new op or signal an existing lock of the same name to restart. If false and a lock exists, throws cortex.conflict.lockExists
    * `onSignal` { String } Adhoc script that runs if the lock is signalled. (restart, cancel, shutdown, error)

*Returns*

* { Object } The Operation instance.

**onComplete** receives 3 script arguments

* `err` { Object } A fault caught during the bulk operation or null if there was none
* `operation` { Object } the current operation state (same as the return value of the initial next())
* `memo` { Object } the shared bulk memo object

**onSignal** receives 1 script argument

* `signal` { String } The signal restart, cancel, shutdown, error

```javascript
const { bulk, Account } = org.objects
return bulk().add(
    Account.find(),
    { privileged: true }
)
.async({
    onComplete: `
      const { err, operation, memo } = script.arguments
      console.log({ err, operation, memo })
    `,
    lock: {
      onSignal: `
        const { signal } = script.arguments`
    }
  }).next()
```

### transform(options)

*Arguments*

* `options` { String } Transform script
  * `script` { string | id | export | model } Transform script
  * `compiled` { String } Pre-compiled script
  * `autoPrefix` { Boolean }
  * `memo` { Object }
  * `required` { String\[] } Pre-existing list
  * `label` { String } Transform label. Defaults to 'Transform'

*Returns*

* { Object } The Operation instance

## UpdateOperation

Operation defaults are dryRun(false), grant(null), lean(true), skipAcl(false).

```
const Items = org.objects.c_items;

const _id = Items.updateOne({c_key: 'unique key'}, {c_key: 'very unique'})
  .skipAcl()
  .grant(consts.accessLevels.update)  
  .execute();
  
return Items.find({_id: _id}).paths('c_key').next();
```

### UpdateOperation.dryRun(bool = true)

The operation performs a dry run. Though no documents are updated, before triggers are called.

**Arguments**

* `bool` (Boolean)

**Returns**

this

### UpdateOperation.execute()

Executes the operation.

**Returns**

ObjectID|Object If the lean option is turned off, the entire updated document is returned. When true, only the identifier is returned.

### UpdateOperation.grant(level)

Sets the grant level for the operation.

**Arguments**

* `level` (Number)

**Returns**

this

### UpdateOperation.lean(bool = true)

True by default, disabling this option reads and returns the entire updated document after execution. `"modified"` may also be used to return an object containing just the modified properties. Otherwise, simply the `_id` of the updated document is returned.

**Arguments**

* `bool` (Boolean)

**Returns**

this

### UpdateOperation.locale(identifier)

Specifies the locale of the operation for any localized strings.

**Arguments**

* `identifier` (String) The locale identifier, which consists of a 2 or 3 letter language tag optionally followed by a region separated by `_`. For example, `en`, `en_US`, `en_UK`, etc.

**Returns**

this

### UpdateOperation.merge(bool)

Enabling this option allows for an update operation on an array to include elements with and without identifiers. Elements with identifiers will update the existing array elements while those without identifiers will be pushed into the array as new elements. If disabled, and the update operation includes a mix of elements with and without identifiers, a `kInvalidArgument` will be returned with the reason "Pushed document has an \_id and/or updated document is missing an \_id."

**Arguments**

* `bool` (Boolean)

**Returns**

this

### UpdateOperation.pathDelete(path = null)

Deletes a single property or array value using the current cursor options. Passing a path argument overwrites the `pathPrefix()` option. For example, `org.objects.c_object.updateOne({_id: _id}).pathDelete("c_docs.5a2c44f836412438e4c372c2.c_array.bar");` removes "bar" from the c\_array string array in the c\_docs document array.

**Arguments**

* `path` (String) Optional. Overrides `pathPrefix()`.

**Returns**

Object

### UpdateOperation.pathPrefix(path = null)

Sets or removes the operation path prefix. When a prefix is present the operation can target documents in a write-through list or nested document array. For example, `c_parent.updateOne({_id: parentId}, {$push: [{c_name: 'new child'}]}).pathPrefix('c_children').execute()` creates a new c\_child instance through the c\_parent object's c\_children list property.

**Arguments**

* `path` (String)

**Returns**

this

### UpdateOperation.pathPush(path = null, body)

Shortcut for updateOne(..., {$push: \[body]}).pathPrefix(path).execute()

**Arguments**

* `path` (String) Optional. Overrides `pathPrefix()`.
* `body` (Object) The value(s) to push.

**Returns**

Object

### UpdateOperation.pathUpdate(path = null, body)

Shortcut for updateOne(..., {$set: \[body]}).pathPrefix(path).execute()

**Arguments**

* `path` (String) Optional. Overrides `pathPrefix()`.
* `body` (Object) The value(s) to update.

**Returns**

Object

### UpdateOperation.skipAcl(bool = true)

Skips property acl checks.

**Arguments**

* `bool` (Boolean)

**Returns**

this

## DeleteOperation

Operation defaults are dryRun(false), grant(null), skipAcl(false).

[dryRun(bool = true)](https://docs.medable.com/reference#section-deleteoperation-dryrun-bool-true-)\
[execute()](https://docs.medable.com/reference#section-deleteoperation-execute-)\
[grant(level)](https://docs.medable.com/reference#section-deleteoperation-grant-level-)\
[skipAcl(bool = true)](https://docs.medable.com/reference#section-deleteoperation-skipacl-bool-true-)JavaScript

```
const Items = org.objects.c_items;

return Items.deleteOne({c_key: 'unique key'})
  .skipAcl()
  .grant(consts.accessLevels.delete)
  .execute();
```

### DeleteOperation.dryRun(bool = true)

The operation performs a dry run. Though no documents are deleted, before triggers are called.

**Arguments**

* `bool` (Boolean)

**Returns**

this

### DeleteOperation.execute()

Executes the operation.

**Returns**

Boolean true if the instance was deleted.

### DeleteOperation.grant(level)

Sets the grant level for the operation.

**Arguments**

* `level` (Number)

**Returns**

this

### DeleteOperation.skipAcl(bool = true)

Skips acl checks.

**Arguments**

* `bool` (Boolean)

**Returns**

this
