# Стратегия по email

![](../_resources/Папка%20в%20почте%20с%20уведомлениями%20из%20Redmine.png)

1. В задаче в redmine делается любое изменение - смена статуса, обновление описания, добавление нового комментария.
2. Redmine отправляет сообщение о факте обновления задачи по email
3. Pinkmine читает новые письма протоколу imap, находит в заголовках номер задачи с помощью регулярного выражения
4. Pinkmine помещает номер задачи в очередь для выполнения обновления

Параметры работы стратегии задаются в конфигурационном файле `configs/issue-event-emitter-config.jsonc` в секции `mailListener`:

```json
{

  // ...

  "mailListener": {

    // регулярное выражение для определения номера задачи в заголовке письма:
    "issueNumberParser": "\\b(?<=#)\\d+\\b",

    // параметры для доступа к почте через протокол imap:
    "imapSimpleConfig": {
      "imap": {
        "user": "",
        "password": "",
        "host": "",
        "port": 143,
        // tls: true,
        "autotls": "always",
        "authTimeout": 5000
      }
    },

    // интервал через который происходит проверка почты:
    "updateInterval": 180000, // 3 min

    // имя папки в которой следует искать входящие письма
    "boxName": "INBOX"
  },

  // ...

}
```

# Стратегия через cron-таски

![Преднастроенный фильтр в Redmine](../_resources/Преднастроенный%20фильтр%20в%20Redmine.png)

1. Pinkmine загружает данные из преднастроенных query-запросов в redmine в формате csv. Выбирает данные по двум полям - id задачи и "обновлено" (дата+время обновления задачи)
2. Pinkmine проверяет какие задачи в своём кеше (CouchDB) уже успели устареть
3. Номера устаревших задач кладёт в очередь для дальнейшего обновления

Параметры работы стратегии задаются в конфигурационном файле `configs/issue-event-emitter-config.jsonc` в секциях `csvListener` и `rootIssueListener`:

```json
{
  
  // ...
  
  // таски для синхронизации по преднастроенным запросам:
  "csvListener": {
    "tasks": [
      {
        // расписание для выполнения задачи (синтаксис crontab)
        "schedule": "* * * * *",
        
        // поле в csv-файле с датой и временем обновления задачи
        "updatedAtFieldName": "Обновлено",
        
        // формат даты и времени
        "dateTimeFormat": "dd.MM.yyyy HH:mm",
        
        // ссылки на предстароенные запросы выборки задач в формате csv
        "csvLinks": [
          "https://<redmine_host>/projects/proj/issues.csv?utf8=%E2%9C%93&query_id=2"
        ]
      }
    ]
  },
  
  // таски для синхронизации корневых и суммирующих задач:
  "rootIssueListener": {
    "tasks": [
      {
        // расписание для выполнения задачи (синтаксис crontab)
        "schedule": "15 6,12 * * *",
        
        // номера задач
        "rootIssues": [
          1,
          3,
          7,
          11
        ]
      }
    ]
  },
  
  // ...
  
}
```

Эта стратегия позволяет догружать данные, которые не пришли по email рассылке: закрытые задачи, shady-mode, изменение структуры дерева при смене привязки к родительской задаче и т.п.