# Migration of page body

> **Warning**
> **Migration in this way is applied only to the latest revision. Past revisions are not applied.**

## Usage
```
git clone https://github.com/weseek/growi
cd growi/bin/data-migrations

NETWORK=growi_devcontainer_default
MONGO_URI=mongodb://growi_devcontainer_mongo_1/growi

docker run --rm \
  --network $NETWORK \
  -v "$(pwd)"/src:/opt \
  -w /opt \
  -e MIGRATION_MODULE=v60x \
  mongo:6.0 \
  /bin/mongosh $MONGO_URI index.js
```

## Variables
| Variable              | Description                                                                    | Default |
| --------------------- | ------------------------------------------------------------------------------ | ------- |
| NETWORK     | Network in docker compose of MongoDB server                                                         | -       |
| MONGO_URI| URI that can connect to MongoDB                                                     | -       |

## Environment variables
### Required

| Variable              | Description                                                                    | Default |
| --------------------- | ------------------------------------------------------------------------------ | ------- |
| MIGRATION_MODULE     | Specify migration module                                                       | -       |

The value of `MIGRATION_MODULE` is one of the following.
- `v60x/drawio`: Migration for Draw.io notation only([
reference](https://docs.growi.org/ja/admin-guide/upgrading/60x.html#%E4%BB%95%E6%A7%98%E5%A4%89%E6%9B%B4-draw-io-diagrams-net-%E8%A8%98%E6%B3%95))
- `v60x/plantuml`: Migration for PlantUML notation only([
reference](https://docs.growi.org/ja/admin-guide/upgrading/60x.html#%E4%BB%95%E6%A7%98%E5%A4%89%E6%9B%B4-plantuml-%E8%A8%98%E6%B3%95))
- `v60x/tsv`: Migration for table notation by TSV only([
reference](https://docs.growi.org/ja/admin-guide/upgrading/60x.html#%E4%BB%95%E6%A7%98%E5%A4%89%E6%9B%B4-csv-tsv-%E3%81%AB%E3%82%88%E3%82%8B%E3%83%86%E3%83%BC%E3%83%95%E3%82%99%E3%83%AB%E6%8F%8F%E7%94%BB%E8%A8%98%E6%B3%95))
- `v60x/csv`: Migration for table notation by CSV only([
reference](https://docs.growi.org/ja/admin-guide/upgrading/60x.html#%E4%BB%95%E6%A7%98%E5%A4%89%E6%9B%B4-csv-tsv-%E3%81%AB%E3%82%88%E3%82%8B%E3%83%86%E3%83%BC%E3%83%95%E3%82%99%E3%83%AB%E6%8F%8F%E7%94%BB%E8%A8%98%E6%B3%95))
- `v60x/bracketlink`: Migration for only page links within GROWI([
reference](https://docs.growi.org/ja/admin-guide/upgrading/60x.html#%E6%9C%AA%E5%AE%9F%E8%A3%85-%E5%BB%83%E6%AD%A2%E6%A4%9C%E8%A8%8E%E4%B8%AD-growi-%E7%8B%AC%E8%87%AA%E8%A8%98%E6%B3%95%E3%81%AE%E3%83%98%E3%82%9A%E3%83%BC%E3%82%B7%E3%82%99%E3%83%AA%E3%83%B3%E3%82%AF))
- `v60x` or `v60x/index`: Migration for all notations in v6.0.x series
- `v61x/mdcont`: Migration for mdcont notation only([reference](https://docs.growi.org/ja/admin-guide/upgrading/61x.html#%E4%BB%95%E6%A7%98%E5%A4%89%E6%9B%B4-%E3%82%A2%E3%83%B3%E3%82%AB%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%AF%E3%81%AB%E8%87%AA%E5%8B%95%E4%BB%98%E4%B8%8E%E3%81%95%E3%82%8C%E3%82%8B-mdcont-%E3%83%95%E3%82%9A%E3%83%AC%E3%83%95%E3%82%A3%E3%82%AF%E3%82%B9%E3%81%AE%E5%BB%83%E6%AD%A2))
- `v61x` or `v61x/index`: Migration for all notations in v6.1.x series
- `v70x/bootstrap5`: Migration for Bootstrap4 to Bootstrap5 
- `v70x` or `v70x/index`: Migration for all notations in v7.0.x series
- `custom`: You can define your own processors and apply them to `revision` (see "Advanced" below for details)

### Optional

| Variable              | Description                                                                    | Default |
| --------------------- | ------------------------------------------------------------------------------ | ------- |
| BATCH_SIZE     | Number of revisions to be processed at one time（revision）                                                         | 100       |
| BATCH_INTERVAL| Interval after batch processing（ms）                                                     | 3000       |

※The `BATCH_INTERVAL` is for server load control. If you don't mind the load of the MongoDB, there is no problem to reduce it.

## Advanced

By creating a function in `growi/bin/data-migrations/src/migrations/custom.js` that replaces a specific regular expression, you can replace all specific strings in the latest revisions for all pages.

The following function replaces the string `foo` with the string `bar`.

``` javascript
module.exports = [
  (body) => {
  var fooRegExp = /foo/g; // foo regex
  return body.replace(fooRegExp, 'bar'); // replace to bar
  },
];
```

By passing `custom` in the environment variable `MIGRATION_MODULE` and executing it, you can apply the `custom.js` to all the latest `revisions`.
```
git clone https://github.com/weseek/growi
cd growi/bin/data-migrations

NETWORK=growi_devcontainer_default \
MONGO_URI=mongodb://growi_devcontainer_mongo_1/growi \
docker run --rm \
  --network $NETWORK \
  -v "$(pwd)"/src:/opt \
  -w /opt \
  -e MIGRATION_MODULE=custom \
  mongo:6.0 \
  /bin/mongosh $MONGO_URI index.js
```